From 2cae5c4585f3a9362ca87ca828f3a9c43a7f8f03 Mon Sep 17 00:00:00 2001 From: Ievgen Vagin Date: Wed, 8 Jun 2016 21:31:43 +0300 Subject: [PATCH] Added support of AL_SOURCE_STATE_CALLBACK, and AL_SOURCE_STATE_CALLBACK_DATA Source parameters Change-Id: I3a5b9a26384702536c8f9cd42835da8a59622c5d Signed-off-by: Ievgen Vagin --- Alc/ALc.c | 2 ++ Alc/mixer.c | 5 +++++ OpenAL32/Include/alSource.h | 9 +++++++++ OpenAL32/alSource.c | 49 ++++++++++++++++++++++++++++++++++++++++++++- include/AL/al.h | 15 ++++++++++++++ 5 files changed, 79 insertions(+), 1 deletion(-) diff --git a/Alc/ALc.c b/Alc/ALc.c index 5114228..0c566d1 100644 --- a/Alc/ALc.c +++ b/Alc/ALc.c @@ -381,6 +381,8 @@ static const ALCenums enumeration[] = { DECL(AL_LOOPING), #ifdef __TIZEN__ DECL(AL_LOOP_COUNT), + DECL(AL_SOURCE_STATE_CALLBACK), + DECL(AL_SOURCE_STATE_CALLBACK_DATA), #endif DECL(AL_BUFFER), DECL(AL_GAIN), diff --git a/Alc/mixer.c b/Alc/mixer.c index 636b8c8..d85540d 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -636,6 +636,11 @@ ALvoid MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALuint Sam BufferListItem = NULL; DataPosInt = 0; DataPosFrac = 0; +#ifdef __TIZEN__ + if (NULL != Source->StateCallBackInfo.CallBack) + Source->StateCallBackInfo.CallBack(Source->id, State, + Source->StateCallBackInfo.UserData); +#endif break; } } diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h index a47e4b2..5f5ce98 100644 --- a/OpenAL32/Include/alSource.h +++ b/OpenAL32/Include/alSource.h @@ -103,6 +103,15 @@ typedef struct ALsource { * Number of repeats Source should be played before finishing playback. */ ALuint LoopCount; + + /** + * Callback function will be called when stream state is changed, and + * user data to be transfered to the callback as parameter. + */ + struct { + LPALSOURCESTATECB CallBack; + ALvoid *UserData; + } StateCallBackInfo; #endif /** Source Buffer Queue info. */ diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c index b54a68a..7840f46 100644 --- a/OpenAL32/alSource.c +++ b/OpenAL32/alSource.c @@ -633,7 +633,7 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p Source->Looping = AL_TRUE; } return AL_TRUE; - } + } #endif case AL_BUFFER: @@ -1788,6 +1788,38 @@ AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *val } +#ifdef __TIZEN__ +AL_API void AL_APIENTRY alSourcep(ALuint source, ALenum param, ALvoid* value) +{ + ALCcontext *Context; + ALsource *Source; + + Context = GetContextRef(); + if(!Context) return; + + if((Source=LookupSource(Context, source)) == NULL) + alSetError(Context, AL_INVALID_NAME); + else if(!value) + alSetError(Context, AL_INVALID_VALUE); + else + switch(param) + { + case AL_SOURCE_STATE_CALLBACK_DATA: + Source->StateCallBackInfo.UserData = value; + break; + case AL_SOURCE_STATE_CALLBACK: + Source->StateCallBackInfo.CallBack = (LPALSOURCESTATECB)value; + break; + default: + alSetError(Context, AL_INVALID_ENUM); + break; + } + + ALCcontext_DecRef(Context); +} +#endif + + AL_API ALvoid AL_APIENTRY alSourcei64SOFT(ALuint source, ALenum param, ALint64SOFT value) { ALCcontext *Context; @@ -2604,6 +2636,11 @@ static ALvoid InitSourceParams(ALsource *Source) Source->DistanceModel = DefaultDistanceModel; +#ifdef __TIZEN__ + Source->StateCallBackInfo.CallBack = NULL; + Source->StateCallBackInfo.UserData = NULL; +#endif + Source->state = AL_INITIAL; Source->new_state = AL_NONE; Source->SourceType = AL_UNDETERMINED; @@ -2637,6 +2674,9 @@ static ALvoid InitSourceParams(ALsource *Source) ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state) { WriteLock(&Source->queue_lock); +#ifdef __TIZEN__ + ALenum prev_state = Source->state; +#endif if(state == AL_PLAYING) { ALCdevice *device = Context->Device; @@ -2763,6 +2803,13 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state) Source->Offset = -1.0; } WriteUnlock(&Source->queue_lock); +#ifdef __TIZEN__ + if (Source->StateCallBackInfo.CallBack) + { + Source->StateCallBackInfo.CallBack(Source->id, state, + Source->StateCallBackInfo.UserData); + } +#endif } /* GetSourceSampleOffset diff --git a/include/AL/al.h b/include/AL/al.h index 8feb73e..638936d 100644 --- a/include/AL/al.h +++ b/include/AL/al.h @@ -459,6 +459,14 @@ AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel); #define AL_EXPONENT_DISTANCE 0xD005 #define AL_EXPONENT_DISTANCE_CLAMPED 0xD006 +#ifdef __TIZEN__ +/** + * Source state callback. + */ +#define AL_SOURCE_STATE_CALLBACK 0xE000 +#define AL_SOURCE_STATE_CALLBACK_DATA 0xE001 +#endif + /** Renderer State management. */ AL_API void AL_APIENTRY alEnable(ALenum capability); AL_API void AL_APIENTRY alDisable(ALenum capability); @@ -525,6 +533,10 @@ AL_API void AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value); AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3); AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *values); +#ifdef __TIZEN__ +AL_API void AL_APIENTRY alSourcep(ALuint source, ALenum param, ALvoid* values); +#endif + /** Get Source parameters. */ AL_API void AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *value); AL_API void AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3); @@ -658,6 +670,9 @@ typedef void (AL_APIENTRY *LPALDOPPLERFACTOR)(ALfloat value); typedef void (AL_APIENTRY *LPALDOPPLERVELOCITY)(ALfloat value); typedef void (AL_APIENTRY *LPALSPEEDOFSOUND)(ALfloat value); typedef void (AL_APIENTRY *LPALDISTANCEMODEL)(ALenum distanceModel); +#ifdef __TIZEN__ +typedef void (AL_APIENTRY *LPALSOURCESTATECB)(ALuint source, ALenum state, ALvoid *data); +#endif #if defined(__cplusplus) } /* extern "C" */ -- 2.7.4