diff --git a/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.c b/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.c index f29353919..4535a0881 100644 --- a/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.c +++ b/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.c @@ -36,12 +36,12 @@ #include #include // for memset() -#if 0 // Disabled for now +#define _THIS SDL_AudioDevice *this -#define ANDROIDAUD_DRIVER_NAME "android" +// TODO: make audio single-threaded, the same way as video /* Audio driver functions */ -static int ANDROIDAUD_OpenAudio(_THIS, SDL_AudioSpec *spec); +static int ANDROIDAUD_OpenAudio(_THIS, const char *devname, int iscapture); static void ANDROIDAUD_WaitAudio(_THIS); static void ANDROIDAUD_PlayAudio(_THIS); static Uint8 *ANDROIDAUD_GetAudioBuf(_THIS); @@ -53,47 +53,27 @@ static int ANDROIDAUD_Available(void) return(1); } -static void ANDROIDAUD_DeleteDevice(SDL_AudioDevice *device) +static void ANDROIDAUD_DeleteDevice() { - SDL_free(device->hidden); - SDL_free(device); } -static SDL_AudioDevice *ANDROIDAUD_CreateDevice(int devindex) +static int ANDROIDAUD_CreateDevice(SDL_AudioDriverImpl * impl) { - 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 = ANDROIDAUD_OpenAudio; - this->WaitAudio = ANDROIDAUD_WaitAudio; - this->PlayAudio = ANDROIDAUD_PlayAudio; - this->GetAudioBuf = ANDROIDAUD_GetAudioBuf; - this->CloseAudio = ANDROIDAUD_CloseAudio; + impl->OpenDevice = ANDROIDAUD_OpenAudio; + impl->WaitDevice = ANDROIDAUD_WaitAudio; + impl->PlayDevice = ANDROIDAUD_PlayAudio; + impl->GetDeviceBuf = ANDROIDAUD_GetAudioBuf; + impl->CloseDevice = ANDROIDAUD_CloseAudio; + impl->Deinitialize = ANDROIDAUD_DeleteDevice; + impl->OnlyHasDefaultOutputDevice = 1; - this->free = ANDROIDAUD_DeleteDevice; - - return this; + return 1; } AudioBootStrap ANDROIDAUD_bootstrap = { - ANDROIDAUD_DRIVER_NAME, "SDL Android audio driver", - ANDROIDAUD_Available, ANDROIDAUD_CreateDevice + "android", "SDL Android audio driver", + ANDROIDAUD_CreateDevice, 0 }; @@ -117,12 +97,6 @@ static void ANDROIDAUD_CloseAudio(_THIS) { SDL_mutex * audioMutex1; - /* - if ( this->hidden->mixbuf != NULL ) { - SDL_FreeAudioMem(this->hidden->mixbuf); - this->hidden->mixbuf = NULL; - } - */ if( audioMutex != NULL ) { audioMutex1 = audioMutex; @@ -149,17 +123,31 @@ static void ANDROIDAUD_CloseAudio(_THIS) SDL_DestroyMutex(audioMutex1); } + if ( this->hidden != NULL ) { + SDL_free(this->hidden); + this->hidden = NULL; + } } -static int ANDROIDAUD_OpenAudio(_THIS, SDL_AudioSpec *spec) +static int ANDROIDAUD_OpenAudio(_THIS, const char *devname, int iscapture) { - if( ! (spec->format == AUDIO_S8 || spec->format == AUDIO_S16) ) + this->hidden = (struct SDL_PrivateAudioData *) SDL_malloc((sizeof *this->hidden)); + if ( this->hidden == NULL ) { + SDL_OutOfMemory(); + return(-1); + } + SDL_memset(this->hidden, 0, (sizeof *this->hidden)); + + if( ! (this->spec.format == AUDIO_S8 || this->spec.format == AUDIO_S16) ) + { + __android_log_print(ANDROID_LOG_ERROR, "libSDL", "Application requested unsupported audio format - only S8 and S16 are supported"); return (-1); // TODO: enable format conversion? Don't know how to do that in SDL + } if( audioMutex == NULL ) { audioInitialized = 0; - audioFormat = spec; + audioFormat = &this->spec; audioMutex = SDL_CreateMutex(); audioCond = SDL_CreateCond(); audioCond2 = SDL_CreateCond(); @@ -170,7 +158,7 @@ static int ANDROIDAUD_OpenAudio(_THIS, SDL_AudioSpec *spec) while( !audioInitialized ) { - if( SDL_CondWaitTimeout( audioCond, audioMutex, 1000 ) != 0 ) + if( SDL_CondWaitTimeout( audioCond, audioMutex, 5000 ) != 0 ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "ANDROIDAUD_OpenAudio() failed! timeout when waiting callback"); SDL_mutexV(audioMutex); @@ -341,4 +329,3 @@ extern jint JAVA_EXPORT_NAME(AudioThread_nativeAudioBufferUnlock) ( JNIEnv * env return 0; } -#endif diff --git a/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.h b/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.h index 80a6129c1..53c32e67a 100644 --- a/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.h +++ b/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.h @@ -26,9 +26,6 @@ #include "../SDL_sysaudio.h" -/* Hidden "this" pointer for the video functions */ -#define _THIS SDL_AudioDevice *this - struct SDL_PrivateAudioData { /* The file descriptor for the audio device */ Uint8 *mixbuf;