Browse Source

openslES: OpenSL ES on Android only supports two formats, limit to that.

(Three with the floating point extension, which we use.)

This is according to:

https://developer.android.com/ndk/guides/audio/opensl/opensl-for-android

Previously, this would accept a request for Sint8 or Sint32 and disaster
would ensue.

Fixes #13779.

(cherry picked from commit 0b2a003a3549aac85f06ba3cde180879fd48ba25)
(cherry picked from commit 7323104f970162c4a400a255ab77463532202392)
Ryan C. Gordon 1 week ago
parent
commit
b8c802632b
1 changed files with 13 additions and 8 deletions
  1. 13 8
      src/audio/openslES/SDL_openslES.c

+ 13 - 8
src/audio/openslES/SDL_openslES.c

@@ -413,27 +413,32 @@ static int openslES_CreatePCMPlayer(_THIS)
     SLresult result;
     int i;
 
-    /* If we want to add floating point audio support (requires API level 21)
-       it can be done as described here:
-        https://developer.android.com/ndk/guides/audio/opensl/android-extensions.html#floating-point
-    */
+    /* according to https://developer.android.com/ndk/guides/audio/opensl/opensl-for-android,
+       Android's OpenSL ES only supports Uint8 and _littleendian_ Sint16.
+       (and float32, with an extension we use, below.) */
     if (SDL_GetAndroidSDKVersion() >= 21) {
         SDL_AudioFormat test_format;
         for (test_format = SDL_FirstAudioFormat(this->spec.format); test_format; test_format = SDL_NextAudioFormat()) {
-            if (SDL_AUDIO_ISSIGNED(test_format)) {
+            switch (test_format) {
+            case SDL_AUDIO_U8:
+            case SDL_AUDIO_S16LE:
+            case SDL_AUDIO_F32:
                 break;
+            default:
+                continue;
             }
+            break;
         }
 
         if (!test_format) {
             /* Didn't find a compatible format : */
-            LOGI("No compatible audio format, using signed 16-bit audio");
-            test_format = AUDIO_S16SYS;
+            LOGI("No compatible audio format, using signed 16-bit LE audio");
+            test_format = AUDIO_S16LSB;
         }
         this->spec.format = test_format;
     } else {
         /* Just go with signed 16-bit audio as it's the most compatible */
-        this->spec.format = AUDIO_S16SYS;
+        this->spec.format = AUDIO_S16LSB;
     }
 
     /* Update the fragment size as size in bytes */