Mercurial > sdl-ios-xcode
changeset 3801:e17a59e6aff6 SDL-ryan-multiple-audio-device
Removed AmigaOS audio driver from 1.3; it hasn't compiled for years, and it
adds a lot of cruft to the core.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Wed, 04 Oct 2006 21:54:57 +0000 |
parents | 2d77a732bd20 |
children | cef5d927591f |
files | src/audio/SDL_audio.c src/audio/amigaos/SDL_ahiaudio.c src/audio/amigaos/SDL_ahiaudio.h |
diffstat | 3 files changed, 0 insertions(+), 500 deletions(-) [+] |
line wrap: on
line diff
--- a/src/audio/SDL_audio.c Wed Oct 04 21:39:45 2006 +0000 +++ b/src/audio/SDL_audio.c Wed Oct 04 21:54:57 2006 +0000 @@ -67,7 +67,6 @@ extern AudioBootStrap BAUDIO_bootstrap; extern AudioBootStrap COREAUDIO_bootstrap; extern AudioBootStrap SNDMGR_bootstrap; -extern AudioBootStrap AHI_bootstrap; extern AudioBootStrap MINTAUDIO_GSXB_bootstrap; extern AudioBootStrap MINTAUDIO_MCSN_bootstrap; extern AudioBootStrap MINTAUDIO_STFA_bootstrap; @@ -128,9 +127,6 @@ #if SDL_AUDIO_DRIVER_SNDMGR &SNDMGR_bootstrap, #endif -#if SDL_AUDIO_DRIVER_AHI - &AHI_bootstrap, -#endif #if SDL_AUDIO_DRIVER_MINT &MINTAUDIO_GSXB_bootstrap, &MINTAUDIO_MCSN_bootstrap, @@ -156,10 +152,6 @@ NULL }; -#if SDL_AUDIO_DRIVER_AHI -static int audio_configured = 0; -#endif - static SDL_AudioDevice *get_audio_device(SDL_AudioDeviceID id) { id--; @@ -252,23 +244,6 @@ void (SDLCALL * fill) (void *userdata, Uint8 * stream, int len); int silence; -/* !!! FIXME: can we push this into the Amiga driver? */ -#if SDL_AUDIO_DRIVER_AHI -#error this is probably broken. - int started = 0; - -/* AmigaOS NEEDS that the audio driver is opened in the thread that uses it! */ - - D(bug("Task audio started audio struct:<%lx>...\n", audiop)); - - D(bug("Before Openaudio...")); - if (audio->OpenAudio(audio, &audio->spec) == -1) { - D(bug("Open audio failed...\n")); - return (-1); - } - D(bug("OpenAudio...OK\n")); -#endif - /* Perform any thread setup */ device->threadid = SDL_ThreadID(); current_audio.impl.ThreadInit(device); @@ -277,14 +252,6 @@ fill = device->spec.callback; udata = device->spec.userdata; -#if SDL_AUDIO_DRIVER_AHI - audio_configured = 1; - - D(bug("Audio configured... Checking for conversion\n")); - SDL_mutexP(audio->mixer_lock); - D(bug("Semaphore obtained...\n")); -#endif - if (device->convert.needed) { if (device->convert.src_format == AUDIO_U8) { silence = 0x80; @@ -297,11 +264,6 @@ stream_len = device->spec.size; } -#if SDL_AUDIO_DRIVER_AHI - SDL_mutexV(device->mixer_lock); - D(bug("Entering audio loop...\n")); -#endif - /* Loop, filling the audio buffers */ while (device->enabled) { @@ -356,15 +318,6 @@ /* Wait for the audio to drain.. */ current_audio.impl.WaitDone(device); -/* !!! FIXME: get this out of core. */ -#if SDL_AUDIO_DRIVER_AHI - D(bug("WaitDevice...Done\n")); - current_audio.impl.CloseDevice(device); - device->opened = 0; - D(bug("CloseDevice..Done, subtask exiting...\n")); - audio_configured = 0; -#endif - return (0); } @@ -748,34 +701,11 @@ } } -/* !!! FIXME: Get this #if out of the core. */ -/* AmigaOS opens audio inside the main loop */ -#if !SDL_AUDIO_DRIVER_AHI if (!current_audio.impl.OpenDevice(device, devname, iscapture)) { close_audio_device(device); return 0; } device->opened = 1; -#else -# error needs to be fixed for new internal API. Email Ryan for details. - - D(bug("Locking semaphore...")); - SDL_mutexP(audio->mixer_lock); - - - audio->thread = SDL_CreateThread(SDL_RunAudio, audio); - D(bug("Created thread...\n")); - - if (audio->thread == NULL) { - SDL_mutexV(audio->mixer_lock); - SDL_CloseAudio(); - SDL_SetError("Couldn't create audio thread"); - return 0; - } - - while (!audio_configured) - SDL_Delay(100); -#endif /* If the audio driver changes the buffer size, accept it */ if (device->spec.samples != desired.samples) { @@ -834,8 +764,6 @@ return 0; } -/* !!! FIXME: get this out of core. */ -#if !SDL_AUDIO_DRIVER_AHI /* Start the audio thread if necessary */ if (!current_audio.impl.ProvidesOwnCallbackThread) { /* Start the audio thread */ @@ -853,12 +781,6 @@ } } -#else - SDL_mutexV(audio->mixer_lock); - D(bug("SDL_OpenAudio USCITA...\n")); - -#endif - return id+1; }
--- a/src/audio/amigaos/SDL_ahiaudio.c Wed Oct 04 21:39:45 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,360 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* Allow access to a raw mixing buffer (for AmigaOS) */ - -#include "SDL_audio.h" -#include "../SDL_audio_c.h" -#include "SDL_ahiaudio.h" - -/* Audio driver functions */ -static int AHI_OpenAudio(_THIS, SDL_AudioSpec * spec); -static void AHI_WaitAudio(_THIS); -static void AHI_PlayAudio(_THIS); -static Uint8 *AHI_GetAudioBuf(_THIS); -static void AHI_CloseAudio(_THIS); - -#ifndef __SASC -#define mymalloc(x) AllocVec(x,MEMF_PUBLIC) -#define myfree FreeVec -#else -#define mymalloc malloc -#define myfree free -#endif - -/* Audio driver bootstrap functions */ - -static int -Audio_Available(void) -{ - int ok = 0; - struct MsgPort *p; - struct AHIRequest *req; - - if (p = CreateMsgPort()) { - if (req = - (struct AHIRequest *) CreateIORequest(p, - sizeof(struct - AHIRequest))) { - req->ahir_Version = 4; - - if (!OpenDevice(AHINAME, 0, (struct IORequest *) req, NULL)) { - D(bug("AHI available.\n")); - ok = 1; - CloseDevice((struct IORequest *) req); - } - DeleteIORequest((struct IORequest *) req); - } - DeleteMsgPort(p); - } - - D(if (!ok) bug("AHI not available\n")); - return ok; -} - -static void -Audio_DeleteDevice(SDL_AudioDevice * device) -{ - SDL_free(device->hidden); - SDL_free(device); -} - -static SDL_AudioDevice * -Audio_CreateDevice(int devindex) -{ - SDL_AudioDevice *this; - -#ifndef NO_AMIGADEBUG - D(bug("AHI created...\n")); -#endif - - /* 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 = AHI_OpenAudio; - this->WaitAudio = AHI_WaitAudio; - this->PlayAudio = AHI_PlayAudio; - this->GetAudioBuf = AHI_GetAudioBuf; - this->CloseAudio = AHI_CloseAudio; - - this->free = Audio_DeleteDevice; - - return this; -} - -AudioBootStrap AHI_bootstrap = { - "AHI", Audio_Available, Audio_CreateDevice -}; - - -void static -AHI_WaitAudio(_THIS) -{ - if (!CheckIO((struct IORequest *) audio_req[current_buffer])) { - WaitIO((struct IORequest *) audio_req[current_buffer]); -// AbortIO((struct IORequest *)audio_req[current_buffer]); - } -} - -static void -AHI_PlayAudio(_THIS) -{ - if (playing > 1) - WaitIO((struct IORequest *) audio_req[current_buffer]); - - /* Write the audio data out */ - audio_req[current_buffer]->ahir_Std.io_Message.mn_Node.ln_Pri = 60; - audio_req[current_buffer]->ahir_Std.io_Data = mixbuf[current_buffer]; - audio_req[current_buffer]->ahir_Std.io_Length = this->hidden->size; - audio_req[current_buffer]->ahir_Std.io_Offset = 0; - audio_req[current_buffer]->ahir_Std.io_Command = CMD_WRITE; - audio_req[current_buffer]->ahir_Frequency = this->hidden->freq; - audio_req[current_buffer]->ahir_Volume = 0x10000; - audio_req[current_buffer]->ahir_Type = this->hidden->type; - audio_req[current_buffer]->ahir_Position = 0x8000; - audio_req[current_buffer]->ahir_Link = - (playing > 0 ? audio_req[current_buffer ^ 1] : NULL); - - SendIO((struct IORequest *) audio_req[current_buffer]); - current_buffer ^= 1; - - playing++; -} - -static Uint8 * -AHI_GetAudioBuf(_THIS) -{ - return (mixbuf[current_buffer]); -} - -static void -AHI_CloseAudio(_THIS) -{ - D(bug("Closing audio...\n")); - - playing = 0; - - if (audio_req[0]) { - if (audio_req[1]) { - D(bug("Break req[1]...\n")); - - AbortIO((struct IORequest *) audio_req[1]); - WaitIO((struct IORequest *) audio_req[1]); - } - - D(bug("Break req[0]...\n")); - - AbortIO((struct IORequest *) audio_req[0]); - WaitIO((struct IORequest *) audio_req[0]); - - if (audio_req[1]) { - D(bug("Break AGAIN req[1]...\n")); - AbortIO((struct IORequest *) audio_req[1]); - WaitIO((struct IORequest *) audio_req[1]); - } -// Double abort to be sure to break the dbuffering process. - - SDL_Delay(200); - - D(bug("Reqs breaked, closing device...\n")); - CloseDevice((struct IORequest *) audio_req[0]); - D(bug("Device closed, freeing memory...\n")); - myfree(audio_req[1]); - D(bug("Memory freed, deleting IOReq...\n")); - DeleteIORequest((struct IORequest *) audio_req[0]); - audio_req[0] = audio_req[1] = NULL; - } - - D(bug("Freeing mixbuf[0]...\n")); - if (mixbuf[0] != NULL) { - myfree(mixbuf[0]); -// SDL_FreeAudioMem(mixbuf[0]); - mixbuf[0] = NULL; - } - - D(bug("Freeing mixbuf[1]...\n")); - if (mixbuf[1] != NULL) { - myfree(mixbuf[1]); -// SDL_FreeAudioMem(mixbuf[1]); - mixbuf[1] = NULL; - } - - D(bug("Freeing audio_port...\n")); - - if (audio_port != NULL) { - DeleteMsgPort(audio_port); - audio_port = NULL; - } - D(bug("...done!\n")); -} - -static int -AHI_OpenAudio(_THIS, SDL_AudioSpec * spec) -{ -// int width; - SDL_AudioFormat test_format = SDL_FirstAudioFormat(spec->format); - int valid_datatype = 1; - - D(bug("AHI opening...\n")); - - /* Determine the audio parameters from the AudioSpec */ - while ((!valid_datatype) && (test_format)) { - valid_datatype = 1; - switch (test_format) { - case AUDIO_S8: - D(bug("AUDIO_S8...\n")); - spec->format = AUDIO_S8; - this->hidden->bytespersample = 1; - if (spec->channels < 2) - this->hidden->type = AHIST_M8S; - else - this->hidden->type = AHIST_S8S; - break; - - case AUDIO_S16MSB: - D(bug("AUDIO_S16MSB...\n")); - spec->format = AUDIO_S16MSB; - this->hidden->bytespersample = 2; - if (spec->channels < 2) - this->hidden->type = AHIST_M16S; - else - this->hidden->type = AHIST_S16S; - break; - - case AUDIO_S32MSB: - D(bug("AUDIO_S32MSB...\n")); - spec->format = AUDIO_S32MSB; - this->hidden->bytespersample = 4; - if (spec->channels < 2) - this->hidden->type = AHIST_M32S; - else - this->hidden->type = AHIST_S32S; - 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); - } - - if (spec->channels > 2) { - spec->channels = 2; /* will convert at higher level. */ - } - - D(bug("Before CalculateAudioSpec\n")); - /* Update the fragment size as size in bytes */ - SDL_CalculateAudioSpec(spec); - - D(bug("Before CreateMsgPort\n")); - - if (!(audio_port = CreateMsgPort())) { - SDL_SetError("Unable to create a MsgPort"); - return -1; - } - - D(bug("Before CreateIORequest\n")); - - if (! - (audio_req[0] = - (struct AHIRequest *) CreateIORequest(audio_port, - sizeof(struct AHIRequest)))) { - SDL_SetError("Unable to create an AHIRequest"); - DeleteMsgPort(audio_port); - return -1; - } - - audio_req[0]->ahir_Version = 4; - - if (OpenDevice(AHINAME, 0, (struct IORequest *) audio_req[0], NULL)) { - SDL_SetError("Unable to open AHI device!\n"); - DeleteIORequest((struct IORequest *) audio_req[0]); - DeleteMsgPort(audio_port); - return -1; - } - - D(bug("AFTER opendevice\n")); - - /* Set output frequency and size */ - this->hidden->freq = spec->freq; - this->hidden->size = spec->size; - - D(bug("Before buffer allocation\n")); - - /* Allocate mixing buffer */ - mixbuf[0] = (Uint8 *) mymalloc(spec->size); - mixbuf[1] = (Uint8 *) mymalloc(spec->size); - - D(bug("Before audio_req allocation\n")); - - if (!(audio_req[1] = mymalloc(sizeof(struct AHIRequest)))) { - SDL_OutOfMemory(); - return (-1); - } - - D(bug("Before audio_req memcpy\n")); - - SDL_memcpy(audio_req[1], audio_req[0], sizeof(struct AHIRequest)); - - if (mixbuf[0] == NULL || mixbuf[1] == NULL) { - SDL_OutOfMemory(); - return (-1); - } - - D(bug("Before mixbuf memset\n")); - - SDL_memset(mixbuf[0], spec->silence, spec->size); - SDL_memset(mixbuf[1], spec->silence, spec->size); - - current_buffer = 0; - playing = 0; - - D(bug - ("AHI opened: freq:%ld mixbuf:%lx/%lx buflen:%ld bits:%ld channels:%ld\n", - spec->freq, mixbuf[0], mixbuf[1], spec->size, - this->hidden->bytespersample * 8, spec->channels)); - - /* We're ready to rock and roll. :-) */ - return (0); -} - -/* vi: set ts=4 sw=4 expandtab: */
--- a/src/audio/amigaos/SDL_ahiaudio.h Wed Oct 04 21:39:45 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#ifndef _SDL_ahiaudio_h -#define _SDL_ahiaudio_h - -#include <exec/exec.h> -#include <dos/dos.h> -#ifdef __SASC -#include <proto/exec.h> -#else -#include <inline/exec.h> -#endif - -#include <devices/ahi.h> -#include "mydebug.h" - -#include "../SDL_sysaudio.h" - -/* Hidden "this" pointer for the audio functions */ -#define _THIS SDL_AudioDevice *this - -struct SDL_PrivateAudioData -{ - /* The handle for the audio device */ - struct AHIRequest *audio_req[2]; - struct MsgPort *audio_port; - Sint32 freq, type, bytespersample, size; - Uint8 *mixbuf[2]; /* The app mixing buffer */ - int current_buffer; - Uint32 playing; -}; - -/* Old variable names */ -#define audio_port (this->hidden->audio_port) -#define audio_req (this->hidden->audio_req) -#define mixbuf (this->hidden->mixbuf) -#define current_buffer (this->hidden->current_buffer) -#define playing (this->hidden->playing) - -#endif /* _SDL_ahiaudio_h */ -/* vi: set ts=4 sw=4 expandtab: */