diff options
author | Sam Lantinga <slouken@libsdl.org> | 2006-07-10 21:04:37 +0000 |
---|---|---|
committer | Sam Lantinga <slouken@libsdl.org> | 2006-07-10 21:04:37 +0000 |
commit | 6bc598ea612c242fbcafd50b86b31feee01dada1 (patch) | |
tree | d6fe19c1f8605151b3b800a9158e26f979b96563 /src/audio/nas/SDL_nasaudio.c | |
parent | 8f3655506ae41dd1cdb45e1fc1df5b14875575c3 (diff) |
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Diffstat (limited to 'src/audio/nas/SDL_nasaudio.c')
-rw-r--r-- | src/audio/nas/SDL_nasaudio.c | 411 |
1 files changed, 213 insertions, 198 deletions
diff --git a/src/audio/nas/SDL_nasaudio.c b/src/audio/nas/SDL_nasaudio.c index b5d2a3bcfa..ba4cecf33e 100644 --- a/src/audio/nas/SDL_nasaudio.c +++ b/src/audio/nas/SDL_nasaudio.c @@ -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 @@ static void NAS_CloseAudio(_THIS); /* 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; - - /* 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; - - this->free = Audio_DeleteDevice; - - return 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)); + + /* 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; + + 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; - - /* 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; - + 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); + + 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 (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 (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; } 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; - - 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); - - 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); - } - - 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. */ - - /* Calculate the final parameters for this audio specification */ - SDL_CalculateAudioSpec(spec); - - 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); - - 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); - - /* 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); + AuElement elms[3]; + int buffer_size; + Uint16 test_format, format; + + 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); + + 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); + } + + 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. */ + + /* Calculate the final parameters for this audio specification */ + SDL_CalculateAudioSpec(spec); + + 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); + + 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); + + /* 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); } + +/* vi: set ts=4 sw=4 expandtab: */ |