changeset 1997:46319c67b3d7

Added int32 and float32 support (and some others!) to BeOS audio backend. Untested: No BeOS system here for compiling!
author Ryan C. Gordon <icculus@icculus.org>
date Thu, 31 Aug 2006 22:15:07 +0000
parents f25d771fe6f2
children cbac0f77a799
files src/audio/baudio/SDL_beaudio.cc
diffstat 1 files changed, 66 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/src/audio/baudio/SDL_beaudio.cc	Thu Aug 31 21:43:25 2006 +0000
+++ b/src/audio/baudio/SDL_beaudio.cc	Thu Aug 31 22:15:07 2006 +0000
@@ -156,37 +156,78 @@
     int BE_OpenAudio(_THIS, SDL_AudioSpec * spec)
     {
         media_raw_audio_format format;
+        SDL_AudioFormat test_format = SDL_FirstAudioFormat(spec->format);
+        int valid_datatype = 0;
+
+        /* Parse the audio format and fill the Be raw audio format */
+        memset(&format, '\0', sizeof (media_raw_audio_format));
+        format.byte_order = B_MEDIA_LITTLE_ENDIAN;
+        format.frame_rate = (float) spec->freq;
+        format.channel_count = spec->channels;  /* !!! FIXME: support > 2? */
+        while ((!valid_datatype) && (test_format)) {
+            spec->format = test_format;
+            switch (test_format) {
+                case AUDIO_S8:
+                    valid_datatype = 1;
+                    format.format = media_raw_audio_format::B_AUDIO_CHAR;
+                    break;
+
+                case AUDIO_U8:
+                    valid_datatype = 1;
+                    format.format = media_raw_audio_format::B_AUDIO_UCHAR;
+                    break;
+
+                case AUDIO_S16LSB:
+                    valid_datatype = 1;
+                    format.format = media_raw_audio_format::B_AUDIO_SHORT;
+                    break;
+
+                case AUDIO_S16MSB:
+                    valid_datatype = 1;
+                    format.format = media_raw_audio_format::B_AUDIO_SHORT;
+                    format.byte_order = B_MEDIA_BIG_ENDIAN;
+                    break;
+
+                case AUDIO_S32LSB:
+                    valid_datatype = 1;
+                    format.format = media_raw_audio_format::B_AUDIO_INT;
+                    break;
+
+                case AUDIO_S32MSB:
+                    valid_datatype = 1;
+                    format.format = media_raw_audio_format::B_AUDIO_INT;
+                    format.byte_order = B_MEDIA_BIG_ENDIAN;
+                    break;
+
+                case AUDIO_F32LSB:
+                    valid_datatype = 1;
+                    format.format = media_raw_audio_format::B_AUDIO_FLOAT;
+                    break;
+
+                case AUDIO_F32MSB:
+                    valid_datatype = 1;
+                    format.format = media_raw_audio_format::B_AUDIO_FLOAT;
+                    format.byte_order = B_MEDIA_BIG_ENDIAN;
+                    break;
+
+                default:
+                    test_format = SDL_NextAudioFormat();
+                    break;
+            }
+        }
+
+        format.buffer_size = spec->samples;
+
+        if (!valid_datatype) { /* shouldn't happen, but just in case... */
+            SDL_SetError("Unsupported audio format");
+            return (-1);
+        }
 
         /* Initialize the Be Application, if it's not already started */
         if (SDL_InitBeApp() < 0) {
             return (-1);
         }
 
-        /* Parse the audio format and fill the Be raw audio format */
-        format.frame_rate = (float) spec->freq;
-        format.channel_count = spec->channels;
-        switch (spec->format & ~0x1000) {
-        case AUDIO_S8:
-            /* Signed 8-bit audio unsupported, convert to U8 */
-            spec->format = AUDIO_U8;
-        case AUDIO_U8:
-            format.format = media_raw_audio_format::B_AUDIO_UCHAR;
-            format.byte_order = 0;
-            break;
-        case AUDIO_U16:
-            /* Unsigned 16-bit audio unsupported, convert to S16 */
-            spec->format ^= 0x8000;
-        case AUDIO_S16:
-            format.format = media_raw_audio_format::B_AUDIO_SHORT;
-            if (spec->format & 0x1000) {
-                format.byte_order = 1;  /* Big endian */
-            } else {
-                format.byte_order = 2;  /* Little endian */
-            }
-            break;
-        }
-        format.buffer_size = spec->samples;
-
         /* Calculate the final parameters for this audio specification */
         SDL_CalculateAudioSpec(spec);