]> code.delx.au - pulseaudio/commitdiff
volume: Handle varying channel count for shared volumes
authorArun Raghavan <arun.raghavan@collabora.co.uk>
Wed, 14 Sep 2011 07:40:52 +0000 (13:10 +0530)
committerArun Raghavan <arun.raghavan@collabora.co.uk>
Wed, 14 Sep 2011 08:45:01 +0000 (14:15 +0530)
This handles the case where a virtual sink/source and it's master have
different channel counts. The solution is not ideal because if the
former has fewer channels and the master has channel volumes that are
not all at the same level, it will lose this information and have all
channels at the same level.

This is not just a theoretical problem, since module-echo-cancel
prefers a mono virtual source/sink and will usually be sitting on top of
a stereo ALSA source/sink.

That said, I don't really see a good solution to this problem, so the
idea is to make volume sharing optional (on by default) in
module-echo-cancel, so that the few people who care can then disable it
if they so desire.

src/pulsecore/sink.c
src/pulsecore/source.c

index 0350284afad325ccbea3d63b9268130ce3049e96..a29d61db102dad7d51b699d35cfd0a0162c82696 100644 (file)
@@ -1863,6 +1863,9 @@ void pa_sink_set_volume(
 
         /* Let's 'push' the reference volume if necessary */
         pa_cvolume_merge(&new_reference_volume, &s->reference_volume, &root_sink->real_volume);
+        /* If the sink and it's root don't have the same number of channels, we need to remap */
+        if (s != root_sink && !pa_channel_map_equal(&s->channel_map, &root_sink->channel_map))
+            pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_sink->channel_map);
         update_reference_volume(root_sink, &new_reference_volume, &root_sink->channel_map, save);
 
         /* Now that the reference volume is updated, we can update the streams'
index 84c8edca070a0f9f248e9942b7c7143bc0539b16..5f57265c8496917089068821eb54b45db78e3ee4 100644 (file)
@@ -1439,6 +1439,9 @@ void pa_source_set_volume(
 
         /* 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 it's root don't have the same number of channels, we need to remap */
+        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'