diff --git a/src/modules/meson.build b/src/modules/meson.build index 9b030a07b..af8dfb647 100644 --- a/src/modules/meson.build +++ b/src/modules/meson.build @@ -174,6 +174,7 @@ pipewire_module_protocol_pulse_sources = [ 'module-protocol-pulse/operation.c', 'module-protocol-pulse/pending-sample.c', 'module-protocol-pulse/pulse-server.c', + 'module-protocol-pulse/quirks.c', 'module-protocol-pulse/reply.c', 'module-protocol-pulse/sample.c', 'module-protocol-pulse/sample-play.c', diff --git a/src/modules/module-protocol-pulse/client.h b/src/modules/module-protocol-pulse/client.h index da0320748..88712eaa8 100644 --- a/src/modules/module-protocol-pulse/client.h +++ b/src/modules/module-protocol-pulse/client.h @@ -64,6 +64,8 @@ struct client { struct pw_properties *props; + uint64_t quirks; + struct pw_core *core; struct pw_manager *manager; struct spa_hook manager_listener; diff --git a/src/modules/module-protocol-pulse/pulse-server.c b/src/modules/module-protocol-pulse/pulse-server.c index 52b6cb84c..c79e2fd54 100644 --- a/src/modules/module-protocol-pulse/pulse-server.c +++ b/src/modules/module-protocol-pulse/pulse-server.c @@ -69,6 +69,7 @@ #include "module.h" #include "operation.h" #include "pending-sample.h" +#include "quirks.h" #include "reply.h" #include "sample.h" #include "sample-play.h" @@ -530,6 +531,9 @@ static int do_set_client_name(struct client *client, uint32_t command, uint32_t if (client->connect_tag == SPA_ID_INVALID) res = reply_set_client_name(client, tag); } + + client_update_quirks(client); + return res; error: pw_log_error(NAME" %p: failed to connect client: %s", impl, spa_strerror(res)); @@ -1706,6 +1710,9 @@ static int do_create_record_stream(struct client *client, uint32_t command, uint stream->muted_set = muted_set; stream->attr = attr; + if (client->quirks & QUIRK_REMOVE_CAPTURE_DONT_MOVE) + no_move = false; + if (peak_detect) pw_properties_set(props, PW_KEY_STREAM_MONITOR, "true"); if (no_remix) @@ -2929,7 +2936,10 @@ static int do_update_proplist(struct client *client, uint32_t command, uint32_t pw_stream_update_properties(stream->stream, &props->dict); } else { - pw_core_update_properties(client->core, &props->dict); + if (pw_properties_update(client->props, &props->dict) > 0) { + client_update_quirks(client); + pw_core_update_properties(client->core, &client->props->dict); + } } res = reply_simple_ack(client, tag); exit: @@ -3444,6 +3454,9 @@ static int fill_sink_info(struct client *client, struct message *m, if (SPA_FLAG_IS_SET(dev_info.volume_info.flags, VOLUME_HW_MUTE)) flags |= SINK_HW_MUTE_CTRL; + if (client->quirks & QUIRK_FORCE_S16_FORMAT) + dev_info.ss.format = SPA_AUDIO_FORMAT_S16; + message_put(m, TAG_U32, o->id, /* sink index */ TAG_STRING, name, @@ -3596,6 +3609,9 @@ static int fill_source_info(struct client *client, struct message *m, if (SPA_FLAG_IS_SET(dev_info.volume_info.flags, VOLUME_HW_MUTE)) flags |= SOURCE_HW_MUTE_CTRL; + if (client->quirks & QUIRK_FORCE_S16_FORMAT) + dev_info.ss.format = SPA_AUDIO_FORMAT_S16; + message_put(m, TAG_U32, is_monitor ? o->id | MONITOR_FLAG: o->id, /* source index */ TAG_STRING, is_monitor ? monitor_name : name, diff --git a/src/modules/module-protocol-pulse/quirks.c b/src/modules/module-protocol-pulse/quirks.c new file mode 100644 index 000000000..f17345c77 --- /dev/null +++ b/src/modules/module-protocol-pulse/quirks.c @@ -0,0 +1,42 @@ +/* PipeWire + * + * Copyright © 2021 Wim Taymans + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "quirks.h" + +#include + +int client_update_quirks(struct client *client) +{ + const char *str; + + if ((str = pw_properties_get(client->props, "application.process.binary")) != NULL && + spa_streq(str, "teams")) { + client->quirks |= QUIRK_FORCE_S16_FORMAT; + } + if ((str = pw_properties_get(client->props, "application.process.binary")) != NULL && + spa_streq(str, "firefox")) { + client->quirks |= QUIRK_REMOVE_CAPTURE_DONT_MOVE; + } + return 0; +} diff --git a/src/modules/module-protocol-pulse/quirks.h b/src/modules/module-protocol-pulse/quirks.h new file mode 100644 index 000000000..02290894a --- /dev/null +++ b/src/modules/module-protocol-pulse/quirks.h @@ -0,0 +1,36 @@ +/* PipeWire + * + * Copyright © 2021 Wim Taymans + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef PULSER_SERVER_QUIRKS_H +#define PULSER_SERVER_QUIRKS_H + +#include "client.h" + +#define QUIRK_FORCE_S16_FORMAT (1ull<<0) /** forces S16 sample format in sink and source + * info */ +#define QUIRK_REMOVE_CAPTURE_DONT_MOVE (1ull<<1) /** removes the capture stream DONT_MOVE flag */ + +int client_update_quirks(struct client *client); + +#endif /* PULSER_SERVER_QUIRKS_H */