diff options
Diffstat (limited to 'Alc')
-rw-r--r-- | Alc/backends/opensl.c | 93 |
1 files changed, 20 insertions, 73 deletions
diff --git a/Alc/backends/opensl.c b/Alc/backends/opensl.c index 76cbaf1a..619c9847 100644 --- a/Alc/backends/opensl.c +++ b/Alc/backends/opensl.c @@ -28,62 +28,9 @@ #include <SLES/OpenSLES.h> -#if 1 #include <SLES/OpenSLES_Android.h> -#else -extern SLAPIENTRY const SLInterfaceID SL_IID_ANDROIDSIMPLEBUFFERQUEUE; - -struct SLAndroidSimpleBufferQueueItf_; -typedef const struct SLAndroidSimpleBufferQueueItf_ * const * SLAndroidSimpleBufferQueueItf; - -typedef void (*slAndroidSimpleBufferQueueCallback)(SLAndroidSimpleBufferQueueItf caller, void *pContext); - -typedef struct SLAndroidSimpleBufferQueueState_ { - SLuint32 count; - SLuint32 index; -} SLAndroidSimpleBufferQueueState; - - -struct SLAndroidSimpleBufferQueueItf_ { - SLresult (*Enqueue) ( - SLAndroidSimpleBufferQueueItf self, - const void *pBuffer, - SLuint32 size - ); - SLresult (*Clear) ( - SLAndroidSimpleBufferQueueItf self - ); - SLresult (*GetState) ( - SLAndroidSimpleBufferQueueItf self, - SLAndroidSimpleBufferQueueState *pState - ); - SLresult (*RegisterCallback) ( - SLAndroidSimpleBufferQueueItf self, - slAndroidSimpleBufferQueueCallback callback, - void* pContext - ); -}; - -#define SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE ((SLuint32) 0x800007BD) - -typedef struct SLDataLocator_AndroidSimpleBufferQueue { - SLuint32 locatorType; - SLuint32 numBuffers; -} SLDataLocator_AndroidSimpleBufferQueue; - -#endif /* Helper macros */ -#define SLObjectItf_Realize(a,b) ((*(a))->Realize((a),(b))) -#define SLObjectItf_GetInterface(a,b,c) ((*(a))->GetInterface((a),(b),(c))) -#define SLObjectItf_Destroy(a) ((*(a))->Destroy((a))) - -#define SLEngineItf_CreateOutputMix(a,b,c,d,e) ((*(a))->CreateOutputMix((a),(b),(c),(d),(e))) -#define SLEngineItf_CreateAudioPlayer(a,b,c,d,e,f,g) ((*(a))->CreateAudioPlayer((a),(b),(c),(d),(e),(f),(g))) - -#define SLPlayItf_SetPlayState(a,b) ((*(a))->SetPlayState((a),(b))) - -/* Should start using these generic callers instead of the name-specific ones above. */ #define VCALL(obj, func) ((*(obj))->func((obj), EXTRACT_VCALL_ARGS #define VCALL0(obj, func) ((*(obj))->func((obj) EXTRACT_VCALL_ARGS @@ -186,7 +133,7 @@ static void opensl_callback(SLAndroidSimpleBufferQueueItf bq, void *context) buf = (ALbyte*)data->buffer + data->curBuffer*data->bufferSize; aluMixData(Device, buf, data->bufferSize/data->frameSize); - result = (*bq)->Enqueue(bq, buf, data->bufferSize); + result = VCALL(bq,Enqueue)(buf, data->bufferSize); PRINTERR(result, "bq->Enqueue"); data->curBuffer = (data->curBuffer+1) % Device->NumUpdates; @@ -212,33 +159,33 @@ static ALCenum opensl_open_playback(ALCdevice *Device, const ALCchar *deviceName PRINTERR(result, "slCreateEngine"); if(SL_RESULT_SUCCESS == result) { - result = SLObjectItf_Realize(data->engineObject, SL_BOOLEAN_FALSE); + result = VCALL(data->engineObject,Realize)(SL_BOOLEAN_FALSE); PRINTERR(result, "engine->Realize"); } if(SL_RESULT_SUCCESS == result) { - result = SLObjectItf_GetInterface(data->engineObject, SL_IID_ENGINE, &data->engine); + result = VCALL(data->engineObject,GetInterface)(SL_IID_ENGINE, &data->engine); PRINTERR(result, "engine->GetInterface"); } if(SL_RESULT_SUCCESS == result) { - result = SLEngineItf_CreateOutputMix(data->engine, &data->outputMix, 0, NULL, NULL); + result = VCALL(data->engine,CreateOutputMix)(&data->outputMix, 0, NULL, NULL); PRINTERR(result, "engine->CreateOutputMix"); } if(SL_RESULT_SUCCESS == result) { - result = SLObjectItf_Realize(data->outputMix, SL_BOOLEAN_FALSE); + result = VCALL(data->outputMix,Realize)(SL_BOOLEAN_FALSE); PRINTERR(result, "outputMix->Realize"); } if(SL_RESULT_SUCCESS != result) { if(data->outputMix != NULL) - SLObjectItf_Destroy(data->outputMix); + VCALL0(data->outputMix,Destroy)(); data->outputMix = NULL; if(data->engineObject != NULL) - SLObjectItf_Destroy(data->engineObject); + VCALL0(data->engineObject,Destroy)(); data->engineObject = NULL; data->engine = NULL; @@ -258,13 +205,13 @@ static void opensl_close_playback(ALCdevice *Device) osl_data *data = Device->ExtraData; if(data->bufferQueueObject != NULL) - SLObjectItf_Destroy(data->bufferQueueObject); + VCALL0(data->bufferQueueObject,Destroy)(); data->bufferQueueObject = NULL; - SLObjectItf_Destroy(data->outputMix); + VCALL0(data->outputMix,Destroy)(); data->outputMix = NULL; - SLObjectItf_Destroy(data->engineObject); + VCALL0(data->engineObject,Destroy)(); data->engineObject = NULL; data->engine = NULL; @@ -321,21 +268,21 @@ static ALCboolean opensl_reset_playback(ALCdevice *Device) if(data->bufferQueueObject != NULL) - SLObjectItf_Destroy(data->bufferQueueObject); + VCALL0(data->bufferQueueObject,Destroy)(); data->bufferQueueObject = NULL; - result = SLEngineItf_CreateAudioPlayer(data->engine, &data->bufferQueueObject, &audioSrc, &audioSnk, 1, &id, &req); + result = VCALL(data->engine,CreateAudioPlayer)(&data->bufferQueueObject, &audioSrc, &audioSnk, 1, &id, &req); PRINTERR(result, "engine->CreateAudioPlayer"); if(SL_RESULT_SUCCESS == result) { - result = SLObjectItf_Realize(data->bufferQueueObject, SL_BOOLEAN_FALSE); + result = VCALL(data->bufferQueueObject,Realize)(SL_BOOLEAN_FALSE); PRINTERR(result, "bufferQueue->Realize"); } if(SL_RESULT_SUCCESS != result) { if(data->bufferQueueObject != NULL) - SLObjectItf_Destroy(data->bufferQueueObject); + VCALL0(data->bufferQueueObject,Destroy)(); data->bufferQueueObject = NULL; return ALC_FALSE; @@ -352,11 +299,11 @@ static ALCboolean opensl_start_playback(ALCdevice *Device) SLresult result; ALuint i; - result = SLObjectItf_GetInterface(data->bufferQueueObject, SL_IID_BUFFERQUEUE, &bufferQueue); + result = VCALL(data->bufferQueueObject,GetInterface)(SL_IID_BUFFERQUEUE, &bufferQueue); PRINTERR(result, "bufferQueue->GetInterface"); if(SL_RESULT_SUCCESS == result) { - result = (*bufferQueue)->RegisterCallback(bufferQueue, opensl_callback, Device); + result = VCALL(bufferQueue,RegisterCallback)(opensl_callback, Device); PRINTERR(result, "bufferQueue->RegisterCallback"); } if(SL_RESULT_SUCCESS == result) @@ -376,26 +323,26 @@ static ALCboolean opensl_start_playback(ALCdevice *Device) if(SL_RESULT_SUCCESS == result) { ALvoid *buf = (ALbyte*)data->buffer + i*data->bufferSize; - result = (*bufferQueue)->Enqueue(bufferQueue, buf, data->bufferSize); + result = VCALL(bufferQueue,Enqueue)(buf, data->bufferSize); PRINTERR(result, "bufferQueue->Enqueue"); } } data->curBuffer = 0; if(SL_RESULT_SUCCESS == result) { - result = SLObjectItf_GetInterface(data->bufferQueueObject, SL_IID_PLAY, &player); + result = VCALL(data->bufferQueueObject,GetInterface)(SL_IID_PLAY, &player); PRINTERR(result, "bufferQueue->GetInterface"); } if(SL_RESULT_SUCCESS == result) { - result = SLPlayItf_SetPlayState(player, SL_PLAYSTATE_PLAYING); + result = VCALL(player,SetPlayState)(SL_PLAYSTATE_PLAYING); PRINTERR(result, "player->SetPlayState"); } if(SL_RESULT_SUCCESS != result) { if(data->bufferQueueObject != NULL) - SLObjectItf_Destroy(data->bufferQueueObject); + VCALL0(data->bufferQueueObject,Destroy)(); data->bufferQueueObject = NULL; free(data->buffer); |