From c944ce1320f539968694cbbd9c6099a02468bfb1 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Thu, 31 Aug 2006 22:15:07 +0000 Subject: [PATCH] Added int32 and float32 support (and some others!) to BeOS audio backend. Untested: No BeOS system here for compiling! --- src/audio/baudio/SDL_beaudio.cc | 89 ++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 24 deletions(-) diff --git a/src/audio/baudio/SDL_beaudio.cc b/src/audio/baudio/SDL_beaudio.cc index 5b72932d6..68e7ccf51 100644 --- a/src/audio/baudio/SDL_beaudio.cc +++ b/src/audio/baudio/SDL_beaudio.cc @@ -156,37 +156,78 @@ extern "C" int BE_OpenAudio(_THIS, SDL_AudioSpec * spec) { media_raw_audio_format format; - - /* Initialize the Be Application, if it's not already started */ - if (SDL_InitBeApp() < 0) { - return (-1); - } + 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; - 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 */ + 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; } - 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); + } + /* Calculate the final parameters for this audio specification */ SDL_CalculateAudioSpec(spec);