Mercurial > sdl-ios-xcode
diff src/audio/nas/SDL_nasaudio.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 | d910939febfa |
children | 3b4ce57c6215 |
line wrap: on
line diff
--- a/src/audio/nas/SDL_nasaudio.c Thu Jul 06 18:01:37 2006 +0000 +++ b/src/audio/nas/SDL_nasaudio.c Mon Jul 10 21:04:37 2006 +0000 @@ -43,7 +43,7 @@ static struct SDL_PrivateAudioData *this2 = NULL; /* Audio driver functions */ -static int NAS_OpenAudio(_THIS, SDL_AudioSpec *spec); +static int NAS_OpenAudio(_THIS, SDL_AudioSpec * spec); static void NAS_WaitAudio(_THIS); static void NAS_PlayAudio(_THIS); static Uint8 *NAS_GetAudioBuf(_THIS); @@ -51,249 +51,264 @@ /* Audio driver bootstrap functions */ -static int Audio_Available(void) +static int +Audio_Available(void) { - AuServer *aud = AuOpenServer("", 0, NULL, 0, NULL, NULL); - if (!aud) return 0; + AuServer *aud = AuOpenServer("", 0, NULL, 0, NULL, NULL); + if (!aud) + return 0; - AuCloseServer(aud); - return 1; + AuCloseServer(aud); + return 1; } -static void Audio_DeleteDevice(SDL_AudioDevice *device) +static void +Audio_DeleteDevice(SDL_AudioDevice * device) { - SDL_free(device->hidden); - SDL_free(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; + SDL_AudioDevice *this; - /* Initialize all variables that we clean on shutdown */ - 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)); - } - if ( (this == NULL) || (this->hidden == NULL) ) { - SDL_OutOfMemory(); - if ( this ) { - SDL_free(this); - } - return(0); - } - SDL_memset(this->hidden, 0, (sizeof *this->hidden)); + /* Initialize all variables that we clean on shutdown */ + 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)); + } + if ((this == NULL) || (this->hidden == NULL)) { + SDL_OutOfMemory(); + if (this) { + SDL_free(this); + } + return (0); + } + SDL_memset(this->hidden, 0, (sizeof *this->hidden)); - /* Set the function pointers */ - this->OpenAudio = NAS_OpenAudio; - this->WaitAudio = NAS_WaitAudio; - this->PlayAudio = NAS_PlayAudio; - this->GetAudioBuf = NAS_GetAudioBuf; - this->CloseAudio = NAS_CloseAudio; + /* Set the function pointers */ + this->OpenAudio = NAS_OpenAudio; + this->WaitAudio = NAS_WaitAudio; + this->PlayAudio = NAS_PlayAudio; + this->GetAudioBuf = NAS_GetAudioBuf; + this->CloseAudio = NAS_CloseAudio; - this->free = Audio_DeleteDevice; + this->free = Audio_DeleteDevice; - return this; + return this; } AudioBootStrap NAS_bootstrap = { - NAS_DRIVER_NAME, "Network Audio System", - Audio_Available, Audio_CreateDevice + NAS_DRIVER_NAME, "Network Audio System", + Audio_Available, Audio_CreateDevice }; /* This function waits until it is possible to write a full sound buffer */ -static void NAS_WaitAudio(_THIS) +static void +NAS_WaitAudio(_THIS) { - while ( this->hidden->buf_free < this->hidden->mixlen ) { - AuEvent ev; - AuNextEvent(this->hidden->aud, AuTrue, &ev); - AuDispatchEvent(this->hidden->aud, &ev); - } + while (this->hidden->buf_free < this->hidden->mixlen) { + AuEvent ev; + AuNextEvent(this->hidden->aud, AuTrue, &ev); + AuDispatchEvent(this->hidden->aud, &ev); + } } -static void NAS_PlayAudio(_THIS) +static void +NAS_PlayAudio(_THIS) { - while (this->hidden->mixlen > this->hidden->buf_free) { /* We think the buffer is full? Yikes! Ask the server for events, - in the hope that some of them is LowWater events telling us more - of the buffer is free now than what we think. */ - AuEvent ev; - AuNextEvent(this->hidden->aud, AuTrue, &ev); - AuDispatchEvent(this->hidden->aud, &ev); - } - this->hidden->buf_free -= this->hidden->mixlen; + while (this->hidden->mixlen > this->hidden->buf_free) { /* We think the buffer is full? Yikes! Ask the server for events, + in the hope that some of them is LowWater events telling us more + of the buffer is free now than what we think. */ + AuEvent ev; + AuNextEvent(this->hidden->aud, AuTrue, &ev); + AuDispatchEvent(this->hidden->aud, &ev); + } + this->hidden->buf_free -= this->hidden->mixlen; - /* Write the audio data */ - AuWriteElement(this->hidden->aud, this->hidden->flow, 0, this->hidden->mixlen, this->hidden->mixbuf, AuFalse, NULL); + /* Write the audio data */ + AuWriteElement(this->hidden->aud, this->hidden->flow, 0, + this->hidden->mixlen, this->hidden->mixbuf, AuFalse, NULL); - this->hidden->written += this->hidden->mixlen; - + this->hidden->written += this->hidden->mixlen; + #ifdef DEBUG_AUDIO - fprintf(stderr, "Wrote %d bytes of audio data\n", this->hidden->mixlen); + fprintf(stderr, "Wrote %d bytes of audio data\n", this->hidden->mixlen); #endif } -static Uint8 *NAS_GetAudioBuf(_THIS) +static Uint8 * +NAS_GetAudioBuf(_THIS) { - return(this->hidden->mixbuf); + return (this->hidden->mixbuf); } -static void NAS_CloseAudio(_THIS) +static void +NAS_CloseAudio(_THIS) { - if ( this->hidden->mixbuf != NULL ) { - SDL_FreeAudioMem(this->hidden->mixbuf); - this->hidden->mixbuf = NULL; - } - if ( this->hidden->aud ) { - AuCloseServer(this->hidden->aud); - this->hidden->aud = 0; - } + if (this->hidden->mixbuf != NULL) { + SDL_FreeAudioMem(this->hidden->mixbuf); + this->hidden->mixbuf = NULL; + } + if (this->hidden->aud) { + AuCloseServer(this->hidden->aud); + this->hidden->aud = 0; + } } -static unsigned char sdlformat_to_auformat(unsigned int fmt) +static unsigned char +sdlformat_to_auformat(unsigned int fmt) { - switch (fmt) - { + switch (fmt) { case AUDIO_U8: - return AuFormatLinearUnsigned8; + return AuFormatLinearUnsigned8; case AUDIO_S8: - return AuFormatLinearSigned8; + return AuFormatLinearSigned8; case AUDIO_U16LSB: - return AuFormatLinearUnsigned16LSB; + return AuFormatLinearUnsigned16LSB; case AUDIO_U16MSB: - return AuFormatLinearUnsigned16MSB; + return AuFormatLinearUnsigned16MSB; case AUDIO_S16LSB: - return AuFormatLinearSigned16LSB; + return AuFormatLinearSigned16LSB; case AUDIO_S16MSB: - return AuFormatLinearSigned16MSB; + return AuFormatLinearSigned16MSB; } - return AuNone; + return AuNone; } static AuBool -event_handler(AuServer* aud, AuEvent* ev, AuEventHandlerRec* hnd) +event_handler(AuServer * aud, AuEvent * ev, AuEventHandlerRec * hnd) { - switch (ev->type) { - case AuEventTypeElementNotify: { - AuElementNotifyEvent* event = (AuElementNotifyEvent *)ev; + switch (ev->type) { + case AuEventTypeElementNotify: + { + AuElementNotifyEvent *event = (AuElementNotifyEvent *) ev; - switch (event->kind) { - case AuElementNotifyKindLowWater: - if (this2->buf_free >= 0) { - this2->really += event->num_bytes; - gettimeofday(&this2->last_tv, 0); - this2->buf_free += event->num_bytes; - } else { - this2->buf_free = event->num_bytes; - } - break; - case AuElementNotifyKindState: - switch (event->cur_state) { - case AuStatePause: - if (event->reason != AuReasonUser) { - if (this2->buf_free >= 0) { - this2->really += event->num_bytes; - gettimeofday(&this2->last_tv, 0); - this2->buf_free += event->num_bytes; - } else { - this2->buf_free = event->num_bytes; - } - } - break; - } - } - } - } - return AuTrue; + switch (event->kind) { + case AuElementNotifyKindLowWater: + if (this2->buf_free >= 0) { + this2->really += event->num_bytes; + gettimeofday(&this2->last_tv, 0); + this2->buf_free += event->num_bytes; + } else { + this2->buf_free = event->num_bytes; + } + break; + case AuElementNotifyKindState: + switch (event->cur_state) { + case AuStatePause: + if (event->reason != AuReasonUser) { + if (this2->buf_free >= 0) { + this2->really += event->num_bytes; + gettimeofday(&this2->last_tv, 0); + this2->buf_free += event->num_bytes; + } else { + this2->buf_free = event->num_bytes; + } + } + break; + } + } + } + } + return AuTrue; } static AuDeviceID find_device(_THIS, int nch) { - int i; - for (i = 0; i < AuServerNumDevices(this->hidden->aud); i++) { - if ((AuDeviceKind(AuServerDevice(this->hidden->aud, i)) == - AuComponentKindPhysicalOutput) && - AuDeviceNumTracks(AuServerDevice(this->hidden->aud, i)) == nch) { - return AuDeviceIdentifier(AuServerDevice(this->hidden->aud, i)); - } - } - return AuNone; + int i; + for (i = 0; i < AuServerNumDevices(this->hidden->aud); i++) { + if ((AuDeviceKind(AuServerDevice(this->hidden->aud, i)) == + AuComponentKindPhysicalOutput) && + AuDeviceNumTracks(AuServerDevice(this->hidden->aud, i)) == nch) { + return AuDeviceIdentifier(AuServerDevice(this->hidden->aud, i)); + } + } + return AuNone; } -static int NAS_OpenAudio(_THIS, SDL_AudioSpec *spec) +static int +NAS_OpenAudio(_THIS, SDL_AudioSpec * spec) { - AuElement elms[3]; - int buffer_size; - Uint16 test_format, format; + AuElement elms[3]; + int buffer_size; + Uint16 test_format, format; + + this->hidden->mixbuf = NULL; - this->hidden->mixbuf = NULL; + /* Try for a closest match on audio format */ + format = 0; + for (test_format = SDL_FirstAudioFormat(spec->format); + !format && test_format;) { + format = sdlformat_to_auformat(test_format); - /* Try for a closest match on audio format */ - format = 0; - for ( test_format = SDL_FirstAudioFormat(spec->format); - ! format && test_format; ) { - format = sdlformat_to_auformat(test_format); + if (format == AuNone) { + test_format = SDL_NextAudioFormat(); + } + } + if (format == 0) { + SDL_SetError("Couldn't find any hardware audio formats"); + return (-1); + } + spec->format = test_format; - if (format == AuNone) { - test_format = SDL_NextAudioFormat(); - } - } - if ( format == 0 ) { - SDL_SetError("Couldn't find any hardware audio formats"); - return(-1); - } - spec->format = test_format; + this->hidden->aud = AuOpenServer("", 0, NULL, 0, NULL, NULL); + if (this->hidden->aud == 0) { + SDL_SetError("Couldn't open connection to NAS server"); + return (-1); + } + + this->hidden->dev = find_device(this, spec->channels); + if ((this->hidden->dev == AuNone) + || (!(this->hidden->flow = AuCreateFlow(this->hidden->aud, NULL)))) { + AuCloseServer(this->hidden->aud); + this->hidden->aud = 0; + SDL_SetError("Couldn't find a fitting playback device on NAS server"); + return (-1); + } - this->hidden->aud = AuOpenServer("", 0, NULL, 0, NULL, NULL); - if (this->hidden->aud == 0) - { - SDL_SetError("Couldn't open connection to NAS server"); - return (-1); - } - - this->hidden->dev = find_device(this, spec->channels); - if ((this->hidden->dev == AuNone) || (!(this->hidden->flow = AuCreateFlow(this->hidden->aud, NULL)))) { - AuCloseServer(this->hidden->aud); - this->hidden->aud = 0; - SDL_SetError("Couldn't find a fitting playback device on NAS server"); - return (-1); - } - - buffer_size = spec->freq; - if (buffer_size < 4096) - buffer_size = 4096; + buffer_size = spec->freq; + if (buffer_size < 4096) + buffer_size = 4096; - if (buffer_size > 32768) - buffer_size = 32768; /* So that the buffer won't get unmanageably big. */ + if (buffer_size > 32768) + buffer_size = 32768; /* So that the buffer won't get unmanageably big. */ - /* Calculate the final parameters for this audio specification */ - SDL_CalculateAudioSpec(spec); + /* Calculate the final parameters for this audio specification */ + SDL_CalculateAudioSpec(spec); + + this2 = this->hidden; - this2 = this->hidden; + AuMakeElementImportClient(elms, spec->freq, format, spec->channels, + AuTrue, buffer_size, buffer_size / 4, 0, NULL); + AuMakeElementExportDevice(elms + 1, 0, this->hidden->dev, spec->freq, + AuUnlimitedSamples, 0, NULL); + AuSetElements(this->hidden->aud, this->hidden->flow, AuTrue, 2, elms, + NULL); + AuRegisterEventHandler(this->hidden->aud, AuEventHandlerIDMask, 0, + this->hidden->flow, event_handler, + (AuPointer) NULL); - AuMakeElementImportClient(elms, spec->freq, format, spec->channels, AuTrue, - buffer_size, buffer_size / 4, 0, NULL); - AuMakeElementExportDevice(elms+1, 0, this->hidden->dev, spec->freq, - AuUnlimitedSamples, 0, NULL); - AuSetElements(this->hidden->aud, this->hidden->flow, AuTrue, 2, elms, NULL); - AuRegisterEventHandler(this->hidden->aud, AuEventHandlerIDMask, 0, this->hidden->flow, - event_handler, (AuPointer) NULL); - - AuStartFlow(this->hidden->aud, this->hidden->flow, NULL); + AuStartFlow(this->hidden->aud, this->hidden->flow, NULL); - /* Allocate mixing buffer */ - this->hidden->mixlen = spec->size; - this->hidden->mixbuf = (Uint8 *)SDL_AllocAudioMem(this->hidden->mixlen); - if ( this->hidden->mixbuf == NULL ) { - return(-1); - } - SDL_memset(this->hidden->mixbuf, spec->silence, spec->size); + /* Allocate mixing buffer */ + this->hidden->mixlen = spec->size; + this->hidden->mixbuf = (Uint8 *) SDL_AllocAudioMem(this->hidden->mixlen); + if (this->hidden->mixbuf == NULL) { + return (-1); + } + SDL_memset(this->hidden->mixbuf, spec->silence, spec->size); - /* Get the parent process id (we're the parent of the audio thread) */ - this->hidden->parent = getpid(); + /* Get the parent process id (we're the parent of the audio thread) */ + this->hidden->parent = getpid(); - /* We're ready to rock and roll. :-) */ - return(0); + /* We're ready to rock and roll. :-) */ + return (0); } + +/* vi: set ts=4 sw=4 expandtab: */