Refactor : Better segregation and modularization of the audio backend functions

This commit is contained in:
Aaron Culliney 2015-06-14 14:46:15 -07:00
parent 7fd1b350c2
commit 33a13abbc2
6 changed files with 52 additions and 26 deletions

View File

@ -1377,7 +1377,7 @@ static bool MB_DSInit()
unsigned long dwDSLockedBufferSize = 0; // Size of the locked DirectSound buffer unsigned long dwDSLockedBufferSize = 0; // Size of the locked DirectSound buffer
int16_t* pDSLockedBuffer; int16_t* pDSLockedBuffer;
if(!soundcore_isAvailable) if(!audio_isAvailable)
return false; return false;
int hr = DSGetSoundBuffer(&MockingboardVoice, DSBCAPS_CTRLVOLUME, g_dwDSBufferSize, SAMPLE_RATE, 2); int hr = DSGetSoundBuffer(&MockingboardVoice, DSBCAPS_CTRLVOLUME, g_dwDSBufferSize, SAMPLE_RATE, 2);
@ -1763,7 +1763,7 @@ static void ResetState()
void MB_Reset() void MB_Reset()
{ {
if(!soundcore_isAvailable) if(!audio_isAvailable)
return; return;
for(int i=0; i<NUM_AY8910; i++) for(int i=0; i<NUM_AY8910; i++)

View File

View File

@ -70,6 +70,8 @@ typedef struct ALVoices {
static ALVoices *voices = NULL; static ALVoices *voices = NULL;
static audio_backend_s openal_audio_backend = { 0 };
static long OpenALCreateSoundBuffer(AudioParams_s *params, ALSoundBufferStruct **soundbuf_struct, void *extra_data); static long OpenALCreateSoundBuffer(AudioParams_s *params, ALSoundBufferStruct **soundbuf_struct, void *extra_data);
static long OpenALDestroySoundBuffer(ALSoundBufferStruct **soundbuf_struct); static long OpenALDestroySoundBuffer(ALSoundBufferStruct **soundbuf_struct);
@ -151,7 +153,7 @@ static void PlaylistDequeue(ALVoice *voice, ALPlayBuf *node)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
long SoundSystemCreate(const char *sound_device, SoundSystemStruct **sound_struct) static long openal_systemInit(const char *sound_device, SoundSystemStruct **sound_struct)
{ {
assert(*sound_struct == NULL); assert(*sound_struct == NULL);
assert(voices == NULL); assert(voices == NULL);
@ -197,9 +199,8 @@ long SoundSystemCreate(const char *sound_device, SoundSystemStruct **sound_struc
return -1; return -1;
} }
long SoundSystemDestroy(SoundSystemStruct **sound_struct) static long openal_systemShutdown(SoundSystemStruct **sound_struct)
{ {
// ugly assumption : this sets the extern g_lpDS ...
assert(*sound_struct != NULL); assert(*sound_struct != NULL);
ALCcontext *ctx = (ALCcontext*) (*sound_struct)->implementation_specific; ALCcontext *ctx = (ALCcontext*) (*sound_struct)->implementation_specific;
@ -212,7 +213,7 @@ long SoundSystemDestroy(SoundSystemStruct **sound_struct)
return 0; return 0;
} }
long SoundSystemEnumerate(char ***device_list, const int limit) static long openal_systemEnumerate(char ***device_list, const int limit)
{ {
assert(*device_list == NULL); assert(*device_list == NULL);
*device_list = malloc(sizeof(char*)*2); *device_list = malloc(sizeof(char*)*2);
@ -223,7 +224,7 @@ long SoundSystemEnumerate(char ***device_list, const int limit)
} }
// pause all audio // pause all audio
long SoundSystemPause() static long openal_systemPause(void)
{ {
ALVoices *vnode = NULL; ALVoices *vnode = NULL;
ALVoices *tmp = NULL; ALVoices *tmp = NULL;
@ -241,7 +242,7 @@ long SoundSystemPause()
return 0; return 0;
} }
long SoundSystemUnpause() static long openal_systemResume(void)
{ {
ALVoices *vnode = NULL; ALVoices *vnode = NULL;
ALVoices *tmp = NULL; ALVoices *tmp = NULL;
@ -820,3 +821,16 @@ static long OpenALDestroySoundBuffer(ALSoundBufferStruct **soundbuf_struct)
return 0; return 0;
} }
__attribute__((constructor(CTOR_PRIORITY_EARLY)))
static void _init_openal(void) {
LOG("Initializing OpenAL sound system");
openal_audio_backend.init = &openal_systemInit;
openal_audio_backend.shutdown = &openal_systemShutdown;
openal_audio_backend.pause = &openal_systemPause;
openal_audio_backend.resume = &openal_systemResume;
openal_audio_backend.enumerateDevices = &openal_systemEnumerate;
audio_backend = &openal_audio_backend;
}

View File

@ -50,7 +50,9 @@ static VOICE* g_pSpeakerVoice = NULL;
//------------------------------------- //-------------------------------------
bool soundcore_isAvailable = false; bool audio_isAvailable = false;
audio_backend_s *audio_backend = NULL;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -239,14 +241,14 @@ static void _destroy_enumerated_sound_devices(void) {
bool DSInit() bool DSInit()
{ {
if(soundcore_isAvailable) if(audio_isAvailable)
{ {
g_uDSInitRefCount++; g_uDSInitRefCount++;
return true; // Already initialised successfully return true; // Already initialised successfully
} }
_destroy_enumerated_sound_devices(); _destroy_enumerated_sound_devices();
num_sound_devices = SoundSystemEnumerate(&sound_devices, MAX_SOUND_DEVICES); num_sound_devices = audio_backend->enumerateDevices(&sound_devices, MAX_SOUND_DEVICES);
int hr = (num_sound_devices <= 0); int hr = (num_sound_devices <= 0);
if(hr) if(hr)
{ {
@ -261,9 +263,9 @@ bool DSInit()
{ {
if (g_lpDS) if (g_lpDS)
{ {
SoundSystemDestroy((SoundSystemStruct**)&g_lpDS); audio_backend->shutdown((SoundSystemStruct**)&g_lpDS);
} }
hr = (int)SoundSystemCreate(sound_devices[x], (SoundSystemStruct**)&g_lpDS); hr = (int)audio_backend->init(sound_devices[x], (SoundSystemStruct**)&g_lpDS);
if(hr == 0) if(hr == 0)
{ {
bCreatedOK = true; bCreatedOK = true;
@ -278,7 +280,7 @@ bool DSInit()
return false; return false;
} }
soundcore_isAvailable = true; audio_isAvailable = true;
g_uDSInitRefCount = 1; g_uDSInitRefCount = 1;
@ -291,7 +293,7 @@ void DSUninit()
{ {
_destroy_enumerated_sound_devices(); _destroy_enumerated_sound_devices();
if(!soundcore_isAvailable) if(!audio_isAvailable)
return; return;
assert(g_uDSInitRefCount); assert(g_uDSInitRefCount);
@ -308,8 +310,8 @@ void DSUninit()
assert(g_uNumVoices == 0); assert(g_uNumVoices == 0);
SoundSystemDestroy((SoundSystemStruct**)&g_lpDS); audio_backend->shutdown((SoundSystemStruct**)&g_lpDS);
soundcore_isAvailable = false; audio_isAvailable = false;
} }
//============================================================================= //=============================================================================

View File

@ -66,6 +66,7 @@ typedef struct IDirectSound {
int (*CreateSoundBuffer)(AudioParams_s *pcDSBufferDesc, LPDIRECTSOUNDBUFFER * ppDSBuffer, void *pUnkOuter); int (*CreateSoundBuffer)(AudioParams_s *pcDSBufferDesc, LPDIRECTSOUNDBUFFER * ppDSBuffer, void *pUnkOuter);
int (*DestroySoundBuffer)(LPDIRECTSOUNDBUFFER * ppDSBuffer); int (*DestroySoundBuffer)(LPDIRECTSOUNDBUFFER * ppDSBuffer);
} IDirectSound, *LPDIRECTSOUND; } IDirectSound, *LPDIRECTSOUND;
typedef struct IDirectSound SoundSystemStruct;
typedef struct typedef struct
{ {
@ -101,13 +102,22 @@ void SoundCore_SetErrorMax(const int nErrorMax);
bool DSInit(); bool DSInit();
void DSUninit(); void DSUninit();
extern bool soundcore_isAvailable; extern bool audio_isAvailable;
typedef struct IDirectSound SoundSystemStruct; typedef struct audio_backend_s {
long SoundSystemCreate(const char *sound_device, SoundSystemStruct **sound_struct);
long SoundSystemDestroy(SoundSystemStruct **sound_struct); // mandatory audio backend functions
long SoundSystemPause(); long (*init)(const char *sound_device, SoundSystemStruct **sound_struct);
long SoundSystemUnpause(); long (*shutdown)(SoundSystemStruct **sound_struct);
long SoundSystemEnumerate(char ***sound_devices, const int maxcount); long (*pause)(void);
long (*resume)(void);
long (*enumerateDevices)(char ***sound_devices, const int maxcount);
} audio_backend_s;
/*
* The registered audio backend (renderer).
*/
extern audio_backend_s *audio_backend;
#endif /* whole file */ #endif /* whole file */

View File

@ -1549,7 +1549,7 @@ static void *interface_thread(void *current_key)
{ {
pthread_mutex_lock(&interface_mutex); pthread_mutex_lock(&interface_mutex);
#ifdef AUDIO_ENABLED #ifdef AUDIO_ENABLED
SoundSystemPause(); audio_backend->pause();
#endif #endif
in_interface = true; in_interface = true;
@ -1593,7 +1593,7 @@ static void *interface_thread(void *current_key)
} }
#ifdef AUDIO_ENABLED #ifdef AUDIO_ENABLED
SoundSystemUnpause(); audio_backend->resume();
#endif #endif
pthread_mutex_unlock(&interface_mutex); pthread_mutex_unlock(&interface_mutex);
in_interface = false; in_interface = false;