Mercurial > sdl-ios-xcode
diff src/audio/macrom/SDL_romaudio.c @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | f12379c41042 |
children | c27292a690b7 |
line wrap: on
line diff
--- a/src/audio/macrom/SDL_romaudio.c Thu Jul 06 18:01:37 2006 +0000 +++ b/src/audio/macrom/SDL_romaudio.c Mon Jul 10 21:04:37 2006 +0000 @@ -26,13 +26,13 @@ #elif TARGET_API_MAC_CARBON && (UNIVERSAL_INTERFACES_VERSION > 0x0335) # include <Carbon.h> #else -# include <Sound.h> /* SoundManager interface */ +# include <Sound.h> /* SoundManager interface */ # include <Gestalt.h> # include <DriverServices.h> #endif #if !defined(NewSndCallBackUPP) && (UNIVERSAL_INTERFACES_VERSION < 0x0335) -#if !defined(NewSndCallBackProc) /* avoid circular redefinition... */ +#if !defined(NewSndCallBackProc) /* avoid circular redefinition... */ #define NewSndCallBackUPP NewSndCallBackProc #endif #if !defined(NewSndCallBackUPP) @@ -48,61 +48,64 @@ /* Audio driver functions */ static void Mac_CloseAudio(_THIS); -static int Mac_OpenAudio(_THIS, SDL_AudioSpec *spec); +static int Mac_OpenAudio(_THIS, SDL_AudioSpec * spec); static void Mac_LockAudio(_THIS); static void Mac_UnlockAudio(_THIS); /* Audio driver bootstrap functions */ -static int Audio_Available(void) +static int +Audio_Available(void) { - return(1); + return (1); } -static void Audio_DeleteDevice(SDL_AudioDevice *device) +static void +Audio_DeleteDevice(SDL_AudioDevice * device) { SDL_free(device->hidden); SDL_free(device); } -static SDL_AudioDevice *Audio_CreateDevice(int devindex) +static SDL_AudioDevice * +Audio_CreateDevice(int devindex) { SDL_AudioDevice *this; /* Initialize all variables that we clean on shutdown */ - this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice)); - if ( this ) { + this = (SDL_AudioDevice *) SDL_malloc(sizeof(SDL_AudioDevice)); + if (this) { SDL_memset(this, 0, (sizeof *this)); this->hidden = (struct SDL_PrivateAudioData *) - SDL_malloc((sizeof *this->hidden)); + SDL_malloc((sizeof *this->hidden)); } - if ( (this == NULL) || (this->hidden == NULL) ) { + if ((this == NULL) || (this->hidden == NULL)) { SDL_OutOfMemory(); - if ( this ) { + if (this) { SDL_free(this); } - return(0); + return (0); } SDL_memset(this->hidden, 0, (sizeof *this->hidden)); /* Set the function pointers */ - this->OpenAudio = Mac_OpenAudio; - this->CloseAudio = Mac_CloseAudio; - this->LockAudio = Mac_LockAudio; + this->OpenAudio = Mac_OpenAudio; + this->CloseAudio = Mac_CloseAudio; + this->LockAudio = Mac_LockAudio; this->UnlockAudio = Mac_UnlockAudio; - this->free = Audio_DeleteDevice; + this->free = Audio_DeleteDevice; -#ifdef __MACOSX__ /* Mac OS X uses threaded audio, so normal thread code is okay */ - this->LockAudio = NULL; +#ifdef __MACOSX__ /* Mac OS X uses threaded audio, so normal thread code is okay */ + this->LockAudio = NULL; this->UnlockAudio = NULL; #endif return this; } AudioBootStrap SNDMGR_bootstrap = { - "sndmgr", "MacOS SoundManager 3.0", - Audio_Available, Audio_CreateDevice + "sndmgr", "MacOS SoundManager 3.0", + Audio_Available, Audio_CreateDevice }; #if defined(TARGET_API_MAC_CARBON) || defined(USE_RYANS_SOUNDCODE) @@ -113,200 +116,211 @@ static volatile SInt32 audio_is_locked = 0; static volatile SInt32 need_to_mix = 0; -static UInt8 *buffer[2]; +static UInt8 *buffer[2]; static volatile UInt32 running = 0; static CmpSoundHeader header; static volatile Uint32 fill_me = 0; -static void mix_buffer(SDL_AudioDevice *audio, UInt8 *buffer) +static void +mix_buffer(SDL_AudioDevice * audio, UInt8 * buffer) { - if ( ! audio->paused ) { + if (!audio->paused) { #ifdef __MACOSX__ SDL_mutexP(audio->mixer_lock); #endif - if ( audio->convert.needed ) { + if (audio->convert.needed) { audio->spec.callback(audio->spec.userdata, - (Uint8 *)audio->convert.buf,audio->convert.len); + (Uint8 *) audio->convert.buf, + audio->convert.len); SDL_ConvertAudio(&audio->convert); - if ( audio->convert.len_cvt != audio->spec.size ) { - /* Uh oh... probably crashes here */; + if (audio->convert.len_cvt != audio->spec.size) { + /* Uh oh... probably crashes here */ ; } SDL_memcpy(buffer, audio->convert.buf, audio->convert.len_cvt); } else { - audio->spec.callback(audio->spec.userdata, buffer, audio->spec.size); + audio->spec.callback(audio->spec.userdata, buffer, + audio->spec.size); } #ifdef __MACOSX__ SDL_mutexV(audio->mixer_lock); #endif } - DecrementAtomic((SInt32 *) &need_to_mix); + DecrementAtomic((SInt32 *) & need_to_mix); } -static void Mac_LockAudio(_THIS) +static void +Mac_LockAudio(_THIS) { - IncrementAtomic((SInt32 *) &audio_is_locked); + IncrementAtomic((SInt32 *) & audio_is_locked); } -static void Mac_UnlockAudio(_THIS) +static void +Mac_UnlockAudio(_THIS) { SInt32 oldval; - - oldval = DecrementAtomic((SInt32 *) &audio_is_locked); - if ( oldval != 1 ) /* != 1 means audio is still locked. */ + + oldval = DecrementAtomic((SInt32 *) & audio_is_locked); + if (oldval != 1) /* != 1 means audio is still locked. */ return; /* Did we miss the chance to mix in an interrupt? Do it now. */ - if ( BitAndAtomic (0xFFFFFFFF, (UInt32 *) &need_to_mix) ) { + if (BitAndAtomic(0xFFFFFFFF, (UInt32 *) & need_to_mix)) { /* * Note that this could be a problem if you missed an interrupt * while the audio was locked, and get preempted by a second * interrupt here, but that means you locked for way too long anyhow. */ - mix_buffer (this, buffer[fill_me]); + mix_buffer(this, buffer[fill_me]); } } -static void callBackProc (SndChannel *chan, SndCommand *cmd_passed ) { - UInt32 play_me; - SndCommand cmd; - SDL_AudioDevice *audio = (SDL_AudioDevice *)chan->userInfo; +static void +callBackProc(SndChannel * chan, SndCommand * cmd_passed) +{ + UInt32 play_me; + SndCommand cmd; + SDL_AudioDevice *audio = (SDL_AudioDevice *) chan->userInfo; - IncrementAtomic((SInt32 *) &need_to_mix); + IncrementAtomic((SInt32 *) & need_to_mix); - fill_me = cmd_passed->param2; /* buffer that has just finished playing, so fill it */ - play_me = ! fill_me; /* filled buffer to play _now_ */ + fill_me = cmd_passed->param2; /* buffer that has just finished playing, so fill it */ + play_me = !fill_me; /* filled buffer to play _now_ */ + + if (!audio->enabled) { + return; + } - if ( ! audio->enabled ) { - return; - } - - /* queue previously mixed buffer for playback. */ - header.samplePtr = (Ptr)buffer[play_me]; - cmd.cmd = bufferCmd; - cmd.param1 = 0; - cmd.param2 = (long)&header; - SndDoCommand (chan, &cmd, 0); + /* queue previously mixed buffer for playback. */ + header.samplePtr = (Ptr) buffer[play_me]; + cmd.cmd = bufferCmd; + cmd.param1 = 0; + cmd.param2 = (long) &header; + SndDoCommand(chan, &cmd, 0); - memset (buffer[fill_me], 0, audio->spec.size); + memset(buffer[fill_me], 0, audio->spec.size); - /* - * if audio device isn't locked, mix the next buffer to be queued in - * the memory block that just finished playing. - */ - if ( ! BitAndAtomic(0xFFFFFFFF, (UInt32 *) &audio_is_locked) ) { - mix_buffer (audio, buffer[fill_me]); - } + /* + * if audio device isn't locked, mix the next buffer to be queued in + * the memory block that just finished playing. + */ + if (!BitAndAtomic(0xFFFFFFFF, (UInt32 *) & audio_is_locked)) { + mix_buffer(audio, buffer[fill_me]); + } - /* set this callback to run again when current buffer drains. */ - if ( running ) { - cmd.cmd = callBackCmd; - cmd.param1 = 0; - cmd.param2 = play_me; - - SndDoCommand (chan, &cmd, 0); - } + /* set this callback to run again when current buffer drains. */ + if (running) { + cmd.cmd = callBackCmd; + cmd.param1 = 0; + cmd.param2 = play_me; + + SndDoCommand(chan, &cmd, 0); + } } -static int Mac_OpenAudio(_THIS, SDL_AudioSpec *spec) { +static int +Mac_OpenAudio(_THIS, SDL_AudioSpec * spec) +{ - SndCallBackUPP callback; - int sample_bits; - int i; - long initOptions; - - /* Very few conversions are required, but... */ + SndCallBackUPP callback; + int sample_bits; + int i; + long initOptions; + + /* Very few conversions are required, but... */ switch (spec->format) { - case AUDIO_S8: + case AUDIO_S8: spec->format = AUDIO_U8; break; - case AUDIO_U16LSB: + case AUDIO_U16LSB: spec->format = AUDIO_S16LSB; break; - case AUDIO_U16MSB: + case AUDIO_U16MSB: spec->format = AUDIO_S16MSB; break; } SDL_CalculateAudioSpec(spec); - + /* initialize bufferCmd header */ - memset (&header, 0, sizeof(header)); - callback = (SndCallBackUPP) NewSndCallBackUPP (callBackProc); + memset(&header, 0, sizeof(header)); + callback = (SndCallBackUPP) NewSndCallBackUPP(callBackProc); sample_bits = spec->size / spec->samples / spec->channels * 8; #ifdef DEBUG_AUDIO fprintf(stderr, - "Audio format 0x%x, channels = %d, sample_bits = %d, frequency = %d\n", - spec->format, spec->channels, sample_bits, spec->freq); + "Audio format 0x%x, channels = %d, sample_bits = %d, frequency = %d\n", + spec->format, spec->channels, sample_bits, spec->freq); #endif /* DEBUG_AUDIO */ - + header.numChannels = spec->channels; - header.sampleSize = sample_bits; - header.sampleRate = spec->freq << 16; - header.numFrames = spec->samples; - header.encode = cmpSH; - + header.sampleSize = sample_bits; + header.sampleRate = spec->freq << 16; + header.numFrames = spec->samples; + header.encode = cmpSH; + /* Note that we install the 16bitLittleEndian Converter if needed. */ - if ( spec->format == 0x8010 ) { + if (spec->format == 0x8010) { header.compressionID = fixedCompression; header.format = k16BitLittleEndianFormat; } - + /* allocate 2 buffers */ - for (i=0; i<2; i++) { - buffer[i] = (UInt8*)malloc (sizeof(UInt8) * spec->size); - if (buffer[i] == NULL) { - SDL_OutOfMemory(); - return (-1); - } - memset (buffer[i], 0, spec->size); - } - - /* Create the sound manager channel */ - channel = (SndChannelPtr)SDL_malloc(sizeof(*channel)); - if ( channel == NULL ) { + for (i = 0; i < 2; i++) { + buffer[i] = (UInt8 *) malloc(sizeof(UInt8) * spec->size); + if (buffer[i] == NULL) { + SDL_OutOfMemory(); + return (-1); + } + memset(buffer[i], 0, spec->size); + } + + /* Create the sound manager channel */ + channel = (SndChannelPtr) SDL_malloc(sizeof(*channel)); + if (channel == NULL) { SDL_OutOfMemory(); - return(-1); + return (-1); } - if ( spec->channels >= 2 ) { + if (spec->channels >= 2) { initOptions = initStereo; } else { initOptions = initMono; } - channel->userInfo = (long)this; + channel->userInfo = (long) this; channel->qLength = 128; - if ( SndNewChannel(&channel, sampledSynth, initOptions, callback) != noErr ) { + if (SndNewChannel(&channel, sampledSynth, initOptions, callback) != noErr) { SDL_SetError("Unable to create audio channel"); SDL_free(channel); channel = NULL; - return(-1); + return (-1); } - - /* start playback */ - { - SndCommand cmd; - cmd.cmd = callBackCmd; - cmd.param2 = 0; - running = 1; - SndDoCommand (channel, &cmd, 0); - } - - return 1; + + /* start playback */ + { + SndCommand cmd; + cmd.cmd = callBackCmd; + cmd.param2 = 0; + running = 1; + SndDoCommand(channel, &cmd, 0); + } + + return 1; } -static void Mac_CloseAudio(_THIS) { - - int i; - - running = 0; - - if (channel) { - SndDisposeChannel (channel, true); - channel = NULL; - } - - for ( i=0; i<2; ++i ) { - if ( buffer[i] ) { +static void +Mac_CloseAudio(_THIS) +{ + + int i; + + running = 0; + + if (channel) { + SndDisposeChannel(channel, true); + channel = NULL; + } + + for (i = 0; i < 2; ++i) { + if (buffer[i]) { SDL_free(buffer[i]); buffer[i] = NULL; } @@ -315,12 +329,14 @@ #else /* !TARGET_API_MAC_CARBON && !USE_RYANS_SOUNDCODE */ -static void Mac_LockAudio(_THIS) +static void +Mac_LockAudio(_THIS) { /* no-op. */ } -static void Mac_UnlockAudio(_THIS) +static void +Mac_UnlockAudio(_THIS) { /* no-op. */ } @@ -330,38 +346,41 @@ the buffers, so we'll zero it to silence and fill it with audio if we're not paused. */ -static pascal -void sndDoubleBackProc (SndChannelPtr chan, SndDoubleBufferPtr newbuf) +static pascal void +sndDoubleBackProc(SndChannelPtr chan, SndDoubleBufferPtr newbuf) { - SDL_AudioDevice *audio = (SDL_AudioDevice *)newbuf->dbUserInfo[0]; + SDL_AudioDevice *audio = (SDL_AudioDevice *) newbuf->dbUserInfo[0]; /* If audio is quitting, don't do anything */ - if ( ! audio->enabled ) { + if (!audio->enabled) { return; } - memset (newbuf->dbSoundData, 0, audio->spec.size); + memset(newbuf->dbSoundData, 0, audio->spec.size); newbuf->dbNumFrames = audio->spec.samples; - if ( ! audio->paused ) { - if ( audio->convert.needed ) { + if (!audio->paused) { + if (audio->convert.needed) { audio->spec.callback(audio->spec.userdata, - (Uint8 *)audio->convert.buf,audio->convert.len); + (Uint8 *) audio->convert.buf, + audio->convert.len); SDL_ConvertAudio(&audio->convert); #if 0 - if ( audio->convert.len_cvt != audio->spec.size ) { - /* Uh oh... probably crashes here */; + if (audio->convert.len_cvt != audio->spec.size) { + /* Uh oh... probably crashes here */ ; } #endif SDL_memcpy(newbuf->dbSoundData, audio->convert.buf, - audio->convert.len_cvt); + audio->convert.len_cvt); } else { audio->spec.callback(audio->spec.userdata, - (Uint8 *)newbuf->dbSoundData, audio->spec.size); + (Uint8 *) newbuf->dbSoundData, + audio->spec.size); } } - newbuf->dbFlags |= dbBufferReady; + newbuf->dbFlags |= dbBufferReady; } -static int DoubleBufferAudio_Available(void) +static int +DoubleBufferAudio_Available(void) { int available; NumVersion sndversion; @@ -369,40 +388,42 @@ available = 0; sndversion = SndSoundManagerVersion(); - if ( sndversion.majorRev >= 3 ) { - if ( Gestalt(gestaltSoundAttr, &response) == noErr ) { - if ( (response & (1 << gestaltSndPlayDoubleBuffer)) ) { + if (sndversion.majorRev >= 3) { + if (Gestalt(gestaltSoundAttr, &response) == noErr) { + if ((response & (1 << gestaltSndPlayDoubleBuffer))) { available = 1; } } } else { - if ( Gestalt(gestaltSoundAttr, &response) == noErr ) { - if ( (response & (1 << gestaltHasASC)) ) { + if (Gestalt(gestaltSoundAttr, &response) == noErr) { + if ((response & (1 << gestaltHasASC))) { available = 1; } } } - return(available); + return (available); } -static void Mac_CloseAudio(_THIS) +static void +Mac_CloseAudio(_THIS) { int i; - if ( channel != NULL ) { + if (channel != NULL) { /* Clean up the audio channel */ SndDisposeChannel(channel, true); channel = NULL; } - for ( i=0; i<2; ++i ) { - if ( audio_buf[i] ) { + for (i = 0; i < 2; ++i) { + if (audio_buf[i]) { SDL_free(audio_buf[i]); audio_buf[i] = NULL; } } } -static int Mac_OpenAudio(_THIS, SDL_AudioSpec *spec) +static int +Mac_OpenAudio(_THIS, SDL_AudioSpec * spec) { SndDoubleBufferHeader2 audio_dbh; int i; @@ -411,20 +432,20 @@ SndDoubleBackUPP doubleBackProc; /* Check to make sure double-buffered audio is available */ - if ( ! DoubleBufferAudio_Available() ) { + if (!DoubleBufferAudio_Available()) { SDL_SetError("Sound manager doesn't support double-buffering"); - return(-1); + return (-1); } /* Very few conversions are required, but... */ switch (spec->format) { - case AUDIO_S8: + case AUDIO_S8: spec->format = AUDIO_U8; break; - case AUDIO_U16LSB: + case AUDIO_U16LSB: spec->format = AUDIO_S16LSB; break; - case AUDIO_U16MSB: + case AUDIO_U16MSB: spec->format = AUDIO_S16MSB; break; } @@ -432,65 +453,65 @@ /* initialize the double-back header */ SDL_memset(&audio_dbh, 0, sizeof(audio_dbh)); - doubleBackProc = NewSndDoubleBackProc (sndDoubleBackProc); + doubleBackProc = NewSndDoubleBackProc(sndDoubleBackProc); sample_bits = spec->size / spec->samples / spec->channels * 8; - + audio_dbh.dbhNumChannels = spec->channels; - audio_dbh.dbhSampleSize = sample_bits; + audio_dbh.dbhSampleSize = sample_bits; audio_dbh.dbhCompressionID = 0; - audio_dbh.dbhPacketSize = 0; - audio_dbh.dbhSampleRate = spec->freq << 16; - audio_dbh.dbhDoubleBack = doubleBackProc; - audio_dbh.dbhFormat = 0; + audio_dbh.dbhPacketSize = 0; + audio_dbh.dbhSampleRate = spec->freq << 16; + audio_dbh.dbhDoubleBack = doubleBackProc; + audio_dbh.dbhFormat = 0; /* Note that we install the 16bitLittleEndian Converter if needed. */ - if ( spec->format == 0x8010 ) { + if (spec->format == 0x8010) { audio_dbh.dbhCompressionID = fixedCompression; audio_dbh.dbhFormat = k16BitLittleEndianFormat; } /* allocate the 2 double-back buffers */ - for ( i=0; i<2; ++i ) { - audio_buf[i] = SDL_calloc(1, sizeof(SndDoubleBuffer)+spec->size); - if ( audio_buf[i] == NULL ) { + for (i = 0; i < 2; ++i) { + audio_buf[i] = SDL_calloc(1, sizeof(SndDoubleBuffer) + spec->size); + if (audio_buf[i] == NULL) { SDL_OutOfMemory(); - return(-1); + return (-1); } audio_buf[i]->dbNumFrames = spec->samples; audio_buf[i]->dbFlags = dbBufferReady; - audio_buf[i]->dbUserInfo[0] = (long)this; + audio_buf[i]->dbUserInfo[0] = (long) this; audio_dbh.dbhBufferPtr[i] = audio_buf[i]; } /* Create the sound manager channel */ - channel = (SndChannelPtr)SDL_malloc(sizeof(*channel)); - if ( channel == NULL ) { + channel = (SndChannelPtr) SDL_malloc(sizeof(*channel)); + if (channel == NULL) { SDL_OutOfMemory(); - return(-1); + return (-1); } - if ( spec->channels >= 2 ) { + if (spec->channels >= 2) { initOptions = initStereo; } else { initOptions = initMono; } channel->userInfo = 0; channel->qLength = 128; - if ( SndNewChannel(&channel, sampledSynth, initOptions, 0L) != noErr ) { + if (SndNewChannel(&channel, sampledSynth, initOptions, 0L) != noErr) { SDL_SetError("Unable to create audio channel"); SDL_free(channel); channel = NULL; - return(-1); + return (-1); } - + /* Start playback */ - if ( SndPlayDoubleBuffer(channel, (SndDoubleBufferHeaderPtr)&audio_dbh) - != noErr ) { + if (SndPlayDoubleBuffer(channel, (SndDoubleBufferHeaderPtr) & audio_dbh) + != noErr) { SDL_SetError("Unable to play double buffered audio"); - return(-1); + return (-1); } - + return 1; } #endif /* TARGET_API_MAC_CARBON || USE_RYANS_SOUNDCODE */ - +/* vi: set ts=4 sw=4 expandtab: */