From 4dd585fb6241c019b041a6fb43fe2099ebac2c71 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
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: