Parcourir la source

coreaudio: convert MPEG channel layout to WAVE channel layout

Sam Lantinga il y a 3 mois
Parent
commit
4dd585fb62
1 fichiers modifiés avec 20 ajouts et 6 suppressions
  1. 20 6
      src/audio/coreaudio/SDL_coreaudio.m

+ 20 - 6
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: