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.
This commit is contained in:
Steven Newbury 2014-10-16 23:06:27 +01:00 committed by Max Kellermann
parent 4000390dcd
commit 76f277eeb4
2 changed files with 7 additions and 1 deletions

2
NEWS
View File

@ -1,4 +1,6 @@
ver 0.20 (not yet released)
* output
- pulse: set channel map to WAVE-EX
ver 0.19.2 (not yet released)
* decoder

View File

@ -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;