mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-03 09:01:50 -05:00
core: rework how stream volumes affect sink volumes
This commit is contained in:
parent
30f28ebf36
commit
0d1154d078
1 changed files with 41 additions and 1 deletions
|
|
@ -1162,6 +1162,46 @@ pa_usec_t pa_sink_get_latency_within_thread(pa_sink *s) {
|
||||||
return usec;
|
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 */
|
/* Called from main context */
|
||||||
static void compute_reference_ratios(pa_sink *s) {
|
static void compute_reference_ratios(pa_sink *s) {
|
||||||
uint32_t idx;
|
uint32_t idx;
|
||||||
|
|
@ -1289,7 +1329,7 @@ static void compute_real_volume(pa_sink *s) {
|
||||||
pa_cvolume remapped;
|
pa_cvolume remapped;
|
||||||
|
|
||||||
remapped = i->volume;
|
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);
|
pa_cvolume_merge(&s->real_volume, &s->real_volume, &remapped);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue