From 8c601814ff9f0de8be77ae58538774e3d97a1b31 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 14 Jan 2025 21:22:14 -0800 Subject: [PATCH] coreaudio: convert MPEG channel layout to WAVE channel layout --- src/audio/coreaudio/SDL_coreaudio.m | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/audio/coreaudio/SDL_coreaudio.m b/src/audio/coreaudio/SDL_coreaudio.m index f18fffef02b90..3652709e06da1 100644 --- a/src/audio/coreaudio/SDL_coreaudio.m +++ b/src/audio/coreaudio/SDL_coreaudio.m @@ -769,10 +769,17 @@ static bool PrepareAudioQueue(SDL_AudioDevice *device) // L R C LFE Cs Ls Rs layout.mChannelLayoutTag = kAudioChannelLayoutTag_WAVE_6_1; } else { - // FIXME: We need to manually swizzle channels into a supported layout // L R C LFE Ls Rs Cs - //layout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_6_1_A; - return SDL_SetError("Unsupported audio channels"); + layout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_6_1_A; + + // Convert from SDL channel layout to kAudioChannelLayoutTag_MPEG_6_1_A + static const int swizzle_map[7] = { + 0, 1, 2, 3, 6, 4, 5 + }; + device->chmap = SDL_ChannelMapDup(swizzle_map, SDL_arraysize(swizzle_map)); + if (!device->chmap) { + return false; + } } break; case 8: @@ -780,10 +787,17 @@ static bool PrepareAudioQueue(SDL_AudioDevice *device) // L R C LFE Rls Rrs Ls Rs layout.mChannelLayoutTag = kAudioChannelLayoutTag_WAVE_7_1; } else { - // FIXME: We need to manually swizzle channels into a supported layout // L R C LFE Ls Rs Rls Rrs - //layout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_7_1_C; - return SDL_SetError("Unsupported audio channels"); + layout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_7_1_C; + + // Convert from SDL channel layout to kAudioChannelLayoutTag_MPEG_7_1_C + static const int swizzle_map[8] = { + 0, 1, 2, 3, 6, 7, 4, 5 + }; + device->chmap = SDL_ChannelMapDup(swizzle_map, SDL_arraysize(swizzle_map)); + if (!device->chmap) { + return false; + } } break; default: