Added support of AL_SOURCE_STATE_CALLBACK, and AL_SOURCE_STATE_CALLBACK_DATA Source... 86/73586/5 accepted/tizen/3.0/common/20161114.111400 accepted/tizen/3.0/ivi/20161011.055324 accepted/tizen/3.0/mobile/20161015.033923 accepted/tizen/3.0/tv/20161016.005413 accepted/tizen/3.0/wearable/20161015.083612 accepted/tizen/common/20160824.154738 accepted/tizen/ivi/20160825.050406 accepted/tizen/mobile/20160825.050222 accepted/tizen/tv/20160825.050320 accepted/tizen/wearable/20160825.050344 submit/tizen/20160824.052737 submit/tizen_3.0_common/20161104.104000 submit/tizen_3.0_ivi/20161010.000005 submit/tizen_3.0_mobile/20161015.000005 submit/tizen_3.0_tv/20161015.000004 submit/tizen_3.0_wearable/20161015.000004
authorIevgen Vagin <i.vagin@samsung.com>
Wed, 8 Jun 2016 18:31:43 +0000 (21:31 +0300)
committerIevgen Vagin <i.vagin@samsung.com>
Tue, 5 Jul 2016 07:12:34 +0000 (10:12 +0300)
Change-Id: I3a5b9a26384702536c8f9cd42835da8a59622c5d
Signed-off-by: Ievgen Vagin <i.vagin@samsung.com>
Alc/ALc.c
Alc/mixer.c
OpenAL32/Include/alSource.h
OpenAL32/alSource.c
include/AL/al.h

index 5114228..0c566d1 100644 (file)
--- 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),
index 636b8c8..d85540d 100644 (file)
@@ -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;
                 }
             }
index a47e4b2..5f5ce98 100644 (file)
@@ -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. */
index b54a68a..7840f46 100644 (file)
@@ -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
index 8feb73e..638936d 100644 (file)
@@ -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" */