SDL: coreaudio: convert MPEG channel layout to WAVE channel layout

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: