[pulseaudio-discuss] [PATCH] source: Deal with filter having more channels than the master
arun at accosted.net
arun at accosted.net
Wed Nov 4 01:48:38 PST 2015
From: Arun Raghavan <git at arunraghavan.net>
Without this, we hit an assert because the channel count in
new_reference (which was inherited from the master) is lower than the
channel count of the filter.
---
src/pulsecore/source.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
index b553a2d..f4b96ab 100644
--- a/src/pulsecore/source.c
+++ b/src/pulsecore/source.c
@@ -1573,7 +1573,7 @@ void pa_source_set_volume(
bool send_msg,
bool save) {
- pa_cvolume new_reference_volume;
+ pa_cvolume new_reference_volume, root_real_volume;
pa_source *root_source;
pa_source_assert_ref(s);
@@ -1630,11 +1630,21 @@ void pa_source_set_volume(
/* Ok, let's determine the new real volume */
compute_real_volume(root_source);
- /* Let's 'push' the reference volume if necessary */
- pa_cvolume_merge(&new_reference_volume, &s->reference_volume, &root_source->real_volume);
- /* If the source and its root don't have the same number of channels, we need to remap */
+ /* To propagate the reference volume from the filter to the root source,
+ * we first take the real volume from the root source and remap it to
+ * match the filter. Then, we merge in the reference volume from the
+ * filter on top of this, and remap it back to the root source channel
+ * count and map */
+ root_real_volume = root_source->real_volume;
+ /* First we remap root's real volume to filter channel count and map if needed */
+ if (s != root_source && !pa_channel_map_equal(&s->channel_map, &root_source->channel_map))
+ pa_cvolume_remap(&root_real_volume, &root_source->channel_map, &s->channel_map);
+ /* Then let's 'push' the reference volume if necessary */
+ pa_cvolume_merge(&new_reference_volume, &s->reference_volume, &root_real_volume);
+ /* If the source and its root don't have the same number of channels, we need to remap back */
if (s != root_source && !pa_channel_map_equal(&s->channel_map, &root_source->channel_map))
pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_source->channel_map);
+
update_reference_volume(root_source, &new_reference_volume, &root_source->channel_map, save);
/* Now that the reference volume is updated, we can update the streams'
--
2.4.3
More information about the pulseaudio-discuss
mailing list