diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-02-23 18:41:18 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-02-23 18:41:18 +0100 |
commit | 616a8997b3650027bcf25c825b1f25dc4f767982 (patch) | |
tree | 48273dab048319217abf1d9a37c4272c16c268ec | |
parent | d11cd33e3aff14fdd66826b3252d90b1b0e38c48 (diff) |
core: rework how stream volumes affect sink volumes
-rw-r--r-- | src/pulsecore/sink.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index 24fad34dd..d69f03882 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -1162,6 +1162,46 @@ pa_usec_t pa_sink_get_latency_within_thread(pa_sink *s) { return usec; } +static pa_cvolume* cvolume_remap_minimal_impact( + pa_cvolume *v, + const pa_cvolume *template, + const pa_channel_map *from, + const pa_channel_map *to) { + + pa_cvolume t; + + pa_assert(v); + pa_assert(template); + pa_assert(from); + pa_assert(to); + + pa_return_val_if_fail(pa_cvolume_compatible_with_channel_map(v, from), NULL); + pa_return_val_if_fail(pa_cvolume_compatible_with_channel_map(template, to), NULL); + + /* Much like pa_cvolume_remap(), but tries to minimize impact when + * mapping from sink input to sink volumes: + * + * If template is a possible remapping from v it is used instead + * of remapping anew. + * + * If the channel maps don't match we set an all-channel volume on + * the sink to ensure that changing a volume on one stream has no + * effect that cannot be compensated for in another stream that + * does not have the same channel map as the sink. */ + + if (pa_channel_map_equal(from, to)) + return v; + + t = *template; + if (pa_cvolume_equal(pa_cvolume_remap(&t, to, from), v)) { + *v = *template; + return v; + } + + pa_cvolume_set(v, to->channels, pa_cvolume_max(v)); + return v; +} + /* Called from main context */ static void compute_reference_ratios(pa_sink *s) { uint32_t idx; @@ -1289,7 +1329,7 @@ static void compute_real_volume(pa_sink *s) { pa_cvolume remapped; remapped = i->volume; - pa_cvolume_remap(&remapped, &i->channel_map, &s->channel_map); + cvolume_remap_minimal_impact(&remapped, &s->real_volume, &i->channel_map, &s->channel_map); pa_cvolume_merge(&s->real_volume, &s->real_volume, &remapped); } |