From 2fa276182f5a53a9c86cc81e1402586b11a48b31 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 24 Jul 2021 15:35:27 -0500 Subject: [PATCH] Fix ALSA and PA mappings for 7.1 surround sound --- src/audio/alsa.c | 8 +++++--- src/audio/pulse.c | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/audio/alsa.c b/src/audio/alsa.c index 8e08256..46911b2 100644 --- a/src/audio/alsa.c +++ b/src/audio/alsa.c @@ -33,18 +33,20 @@ static int alsa_renderer_init(int audioConfiguration, POPUS_MULTISTREAM_CONFIGUR int rc; unsigned char alsaMapping[MAX_CHANNEL_COUNT]; - /* The supplied mapping array has order: FL-FR-C-LFE-RL-RR - * ALSA expects the order: FL-FR-RL-RR-C-LFE + /* The supplied mapping array has order: FL-FR-C-LFE-RL-RR-SL-SR + * ALSA expects the order: FL-FR-RL-RR-C-LFE-SL-SR * We need copy the mapping locally and swap the channels around. */ alsaMapping[0] = opusConfig->mapping[0]; alsaMapping[1] = opusConfig->mapping[1]; - if (opusConfig->channelCount == 6) { + if (opusConfig->channelCount >= 6) { alsaMapping[2] = opusConfig->mapping[4]; alsaMapping[3] = opusConfig->mapping[5]; alsaMapping[4] = opusConfig->mapping[2]; alsaMapping[5] = opusConfig->mapping[3]; } + alsaMapping[6] = opusConfig->mapping[6]; + alsaMapping[7] = opusConfig->mapping[7]; decoder = opus_multistream_decoder_create(opusConfig->sampleRate, opusConfig->channelCount, opusConfig->streams, opusConfig->coupledStreams, alsaMapping, &rc); diff --git a/src/audio/pulse.c b/src/audio/pulse.c index eff5d19..0b86d4d 100644 --- a/src/audio/pulse.c +++ b/src/audio/pulse.c @@ -53,18 +53,20 @@ static int pulse_renderer_init(int audioConfiguration, POPUS_MULTISTREAM_CONFIGU channelCount = opusConfig->channelCount; - /* The supplied mapping array has order: FL-FR-C-LFE-RL-RR - * ALSA expects the order: FL-FR-RL-RR-C-LFE + /* The supplied mapping array has order: FL-FR-C-LFE-RL-RR-SL-SR + * ALSA expects the order: FL-FR-RL-RR-C-LFE-SL-SR * We need copy the mapping locally and swap the channels around. */ alsaMapping[0] = opusConfig->mapping[0]; alsaMapping[1] = opusConfig->mapping[1]; - if (opusConfig->channelCount == 6) { + if (opusConfig->channelCount >= 6) { alsaMapping[2] = opusConfig->mapping[4]; alsaMapping[3] = opusConfig->mapping[5]; alsaMapping[4] = opusConfig->mapping[2]; alsaMapping[5] = opusConfig->mapping[3]; } + alsaMapping[6] = opusConfig->mapping[6]; + alsaMapping[7] = opusConfig->mapping[7]; decoder = opus_multistream_decoder_create(opusConfig->sampleRate, opusConfig->channelCount, opusConfig->streams, opusConfig->coupledStreams, alsaMapping, &rc);