diff --git a/src/daemon/pipewire-pulse.conf.in b/src/daemon/pipewire-pulse.conf.in index a8d1aea7f..fe1210c9f 100644 --- a/src/daemon/pipewire-pulse.conf.in +++ b/src/daemon/pipewire-pulse.conf.in @@ -129,6 +129,8 @@ pulse.rules = [ # Possible quirks:" # force-s16-info forces sink and source info as S16 format # remove-capture-dont-move removes the capture DONT_MOVE flag + # block-source-volume blocks updates to source volume + # block-sink-volume blocks updates to sink volume #quirks = [ ] } } @@ -158,4 +160,8 @@ pulse.rules = [ } } } + #{ + # matches = [ { application.process.binary = "Discord" } ] + # actions = { quirks = [ block-source-volume ] } + #} ] diff --git a/src/modules/module-protocol-pulse/pulse-server.c b/src/modules/module-protocol-pulse/pulse-server.c index 89e4908fd..7de42c86a 100644 --- a/src/modules/module-protocol-pulse/pulse-server.c +++ b/src/modules/module-protocol-pulse/pulse-server.c @@ -2911,10 +2911,15 @@ static int do_set_volume(struct client *client, uint32_t command, uint32_t tag, (index != SPA_ID_INVALID && name != NULL)) return -EINVAL; - if (command == COMMAND_SET_SINK_VOLUME) + if (command == COMMAND_SET_SINK_VOLUME) { + if (client->quirks & QUIRK_BLOCK_SINK_VOLUME) + return -EPERM; direction = PW_DIRECTION_OUTPUT; - else + } else { + if (client->quirks & QUIRK_BLOCK_SOURCE_VOLUME) + return -EPERM; direction = PW_DIRECTION_INPUT; + } o = find_device(client, index, name, direction == PW_DIRECTION_OUTPUT, &is_monitor); if (o == NULL || (info = o->info) == NULL || info->props == NULL) diff --git a/src/modules/module-protocol-pulse/quirks.c b/src/modules/module-protocol-pulse/quirks.c index 46a398188..e2e972e93 100644 --- a/src/modules/module-protocol-pulse/quirks.c +++ b/src/modules/module-protocol-pulse/quirks.c @@ -17,6 +17,8 @@ static uint64_t parse_quirks(const char *str) static const struct { const char *key; uint64_t value; } quirk_keys[] = { { "force-s16-info", QUIRK_FORCE_S16_FORMAT }, { "remove-capture-dont-move", QUIRK_REMOVE_CAPTURE_DONT_MOVE }, + { "block-source-volume", QUIRK_BLOCK_SOURCE_VOLUME }, + { "block-sink-volume", QUIRK_BLOCK_SINK_VOLUME }, }; SPA_FOR_EACH_ELEMENT_VAR(quirk_keys, i) { if (spa_streq(str, i->key)) diff --git a/src/modules/module-protocol-pulse/quirks.h b/src/modules/module-protocol-pulse/quirks.h index 9f61b151b..e817d0b8f 100644 --- a/src/modules/module-protocol-pulse/quirks.h +++ b/src/modules/module-protocol-pulse/quirks.h @@ -10,6 +10,8 @@ #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 */ +#define QUIRK_BLOCK_SOURCE_VOLUME (1ull<<2) /** block volume changes to sources */ +#define QUIRK_BLOCK_SINK_VOLUME (1ull<<3) /** block volume changes to sinks */ int client_update_quirks(struct client *client);