diff src/audio/baudio/SDL_beaudio.cc @ 3851:405a192b68e7 SDL-1.2

Backport from 1.3: most of the audio drivers can now handle data conversion at a higher level when they can't open the hardware in the exact format requested.
author Ryan C. Gordon <icculus@icculus.org>
date Fri, 01 Sep 2006 22:50:24 +0000
parents 376665398b25
children 5b5e549382b3
line wrap: on
line diff
--- a/src/audio/baudio/SDL_beaudio.cc	Wed Aug 02 21:26:31 2006 +0000
+++ b/src/audio/baudio/SDL_beaudio.cc	Fri Sep 01 22:50:24 2006 +0000
@@ -152,38 +152,55 @@
 
 int BE_OpenAudio(_THIS, SDL_AudioSpec *spec)
 {
-	media_raw_audio_format format;
+    int valid_datatype = 0;
+    media_raw_audio_format format;
+    SDL_AudioFormat test_format = SDL_FirstAudioFormat(spec->format);
 
-	/* 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 */
+    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)) {
+        valid_datatype = 1;
+        spec->format = test_format;
+        switch (test_format) {
+            case AUDIO_S8:
+                format.format = media_raw_audio_format::B_AUDIO_CHAR;
+                break;
+
+            case AUDIO_U8:
+                format.format = media_raw_audio_format::B_AUDIO_UCHAR;
+                break;
+
+            case AUDIO_S16LSB:
+                format.format = media_raw_audio_format::B_AUDIO_SHORT;
+                break;
 
-	/* 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;
-	
+            case AUDIO_S16MSB:
+                format.format = media_raw_audio_format::B_AUDIO_SHORT;
+                format.byte_order = B_MEDIA_BIG_ENDIAN;
+                break;
+
+            default:
+                valid_datatype = 0;
+                test_format = SDL_NextAudioFormat();
+                break;
+        }
+    }
+
+    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);
+    }
+
+    format.buffer_size = spec->samples;
+
 	/* Calculate the final parameters for this audio specification */
 	SDL_CalculateAudioSpec(spec);