aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSteven Newbury <steve@snewbury.org.uk>2014-10-16 23:06:27 +0100
committerMax Kellermann <max@duempel.org>2014-10-25 01:08:09 +0200
commit76f277eeb471285aa6893480599512952e12d385 (patch)
treee92505d81b8db3a04319450463a90cb1507c73a3 /src
parent4000390dcdbbc07973c9686fb29c2130a3aebd4c (diff)
downloadmpd-76f277eeb471285aa6893480599512952e12d385.tar.gz
mpd-76f277eeb471285aa6893480599512952e12d385.tar.xz
mpd-76f277eeb471285aa6893480599512952e12d385.zip
Set pulseaudio channel map to WAVE-EX
Pulseaudio expects clients to specify their channel-map if the default (ALSA) map does not route the audio to the expected speakers. Many Google results suggest dealing with this by re-routing the audio channels with the appropriate ALSA plugin, but this will then simply break any clients which expect the default ALSA mapping. Virtually all media files and codecs, certainly flac, dca, a52, and of course anything based on Microsoft's WAVEFORMAT_EXTENSIBLE specification, assume the layout in the table here: http://en.wikipedia.org/wiki/Surround_sound#Standard_speaker_channels Fortunately, pulseaudio directly addresses this with a built-in channel map for WAVE-EX which can be set automatically in the stream sample-spec.
Diffstat (limited to 'src')
-rw-r--r--src/output/plugins/PulseOutputPlugin.cxx6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/output/plugins/PulseOutputPlugin.cxx b/src/output/plugins/PulseOutputPlugin.cxx
index 120bad090..5dc733383 100644
--- a/src/output/plugins/PulseOutputPlugin.cxx
+++ b/src/output/plugins/PulseOutputPlugin.cxx
@@ -523,7 +523,11 @@ pulse_output_setup_stream(PulseOutput *po, const pa_sample_spec *ss,
assert(po != nullptr);
assert(po->context != nullptr);
- po->stream = pa_stream_new(po->context, po->name, ss, nullptr);
+ /* WAVE-EX is been adopted as the speaker map for most media files */
+ pa_channel_map chan_map;
+ pa_channel_map_init_auto(&chan_map, ss->channels,
+ PA_CHANNEL_MAP_WAVEEX);
+ po->stream = pa_stream_new(po->context, po->name, ss, &chan_map);
if (po->stream == nullptr) {
SetError(error, po->context, "pa_stream_new() has failed");
return false;