khronosfws/openmax_al/src/vibra/xavibraitf.c
changeset 12 5a06f39ad45b
child 16 43d09473c595
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/khronosfws/openmax_al/src/vibra/xavibraitf.c	Fri Apr 16 15:29:42 2010 +0300
@@ -0,0 +1,280 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "xavibraitf.h"
+#ifdef _GSTREAMER_BACKEND_
+#include "XAVibraItfAdaptation.h"
+#endif
+#include "xathreadsafety.h"
+/* XAVibraItfImpl* GetImpl(XAVibraItf self)
+ * Description: Validate interface pointer and cast it to implementation pointer.
+*/
+static XAVibraItfImpl* GetImpl(XAVibraItf self)
+{
+    if( self )
+    {
+        XAVibraItfImpl* impl = (XAVibraItfImpl*)(*self);
+        if( impl && (impl == impl->self) )
+        {
+            return impl;
+        }
+    }
+    return NULL;
+}
+
+/*****************************************************************************
+ * Base interface XAVibraItf implementation
+ *****************************************************************************/
+/*
+ * XAresult XAVibraItfImpl_Vibrate ( XAVibraItf self, XAboolean vibrate )
+ * Description: Activates or deactivates vibration for the I/O device.
+ */
+XAresult XAVibraItfImpl_Vibrate ( XAVibraItf self,
+                                  XAboolean vibrate )
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAVibraItfImpl* impl = GetImpl(self);
+    DEBUG_API("->XAVibraItfImpl_Vibrate");
+    XA_IMPL_THREAD_SAFETY_ENTRY(XATSVibra);
+
+    if( !impl )
+    {
+        XA_IMPL_THREAD_SAFETY_EXIT(XATSVibra);
+        /* invalid parameter */
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAVibraItfImpl_Vibrate");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    /* check is vibrate mode changed */
+    if( impl->vibrate != vibrate )
+    {
+#ifdef _GSTREAMER_BACKEND_
+        ret = XAVibraItfAdapt_Vibrate( impl->adapCtx, vibrate );
+#endif
+        if ( ret == XA_RESULT_SUCCESS )
+        {
+            impl->vibrate = vibrate;
+        }
+    }
+
+    XA_IMPL_THREAD_SAFETY_EXIT(XATSVibra);
+    DEBUG_API("<-XAVibraItfImpl_Vibrate");
+    return ret;
+}
+/*
+ * XAresult XAVibraItfImpl_IsVibrating ( XAVibraItf self, XAboolean * pVibrating )
+ * Description: Returns whether the I/O device is vibrating.
+ */
+XAresult XAVibraItfImpl_IsVibrating ( XAVibraItf self, XAboolean * pVibrating )
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAVibraItfImpl* impl = GetImpl(self);
+    DEBUG_API("->XAVibraItfImpl_IsVibrating");
+
+    if( !impl || !pVibrating)
+    {
+        /* invalid parameter */
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAVibraItfImpl_IsVibrating");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    *pVibrating = impl->vibrate;
+
+    if( *pVibrating )
+    {
+        DEBUG_API("It's vibrating");
+    }
+    else
+    {
+        DEBUG_API("Vibrate is off.");
+    }
+
+    DEBUG_API("<-XAVibraItfImpl_IsVibrating");
+    return ret;
+}
+/*
+ * XAresult XAVibraItfImpl_SetFrequency ( XAVibraItf self,  XAmilliHertz frequency )
+ * Description: Sets the vibration frequency of the I/O device.
+ */
+XAresult XAVibraItfImpl_SetFrequency ( XAVibraItf self, XAmilliHertz frequency )
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAVibraItfImpl* impl = GetImpl(self);
+
+    DEBUG_API_A1("->XAVibraItfImpl_SetFrequency %ld", frequency);
+    XA_IMPL_THREAD_SAFETY_ENTRY(XATSVibra);
+
+    if( !impl || frequency < MIN_FREQUENCY || frequency > MAX_FREQUENCY)
+    {
+        XA_IMPL_THREAD_SAFETY_EXIT(XATSVibra);
+        /* invalid parameter */
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAVibraItfImpl_SetFrequency");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    /* check is vibration frequency changed */
+    if( impl->frequency != frequency )
+    {
+#ifdef _GSTREAMER_BACKEND_
+        ret = XAVibraItfAdapt_SetFrequency( impl->adapCtx, frequency );
+#endif
+        if( ret == XA_RESULT_SUCCESS )
+        {
+            impl->frequency = frequency;
+        }
+    }
+
+    XA_IMPL_THREAD_SAFETY_EXIT(XATSVibra);
+    DEBUG_API("<-XAVibraItfImpl_SetFrequency");
+    return ret;
+}
+/*
+ * XAresult XAVibraItfImpl_GetFrequency ( XAVibraItf self,  XAmilliHertz * pFrequency )
+ * Description: Returns the vibration frequency of the I/O device.
+ */
+XAresult XAVibraItfImpl_GetFrequency ( XAVibraItf self, XAmilliHertz * pFrequency )
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAVibraItfImpl* impl = GetImpl(self);
+    DEBUG_API("->XAVibraItfImpl_GetFrequency");
+    if( !impl || !pFrequency)
+    {
+        /* invalid parameter */
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAVibraItfImpl_GetFrequency");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    *pFrequency = impl->frequency;
+
+    DEBUG_API_A1("Frequency is %ld", *pFrequency);
+    DEBUG_API("<-XAVibraItfImpl_GetFrequency");
+    return ret;
+}
+/*
+ * XAresult XAVibraItfImpl_SetIntensity ( XAVibraItf self,  XApermille intensity )
+ * Description: Sets the vibration intensity of the Vibra I/O device.
+ */
+XAresult XAVibraItfImpl_SetIntensity ( XAVibraItf self, XApermille intensity )
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAVibraItfImpl* impl = GetImpl(self);
+    DEBUG_API_A1("->XAVibraItfImpl_SetIntensity %d", intensity);
+    XA_IMPL_THREAD_SAFETY_ENTRY(XATSVibra);
+
+    if( !impl || intensity < MIN_INTENSITY || intensity > MAX_INTENSITY )
+    {
+        /* invalid parameter */
+        XA_IMPL_THREAD_SAFETY_EXIT(XATSVibra);
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAVibraItfImpl_SetIntensity");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    /* check is vibration intensity changed */
+    if( impl->intensity != intensity )
+    {
+#ifdef _GSTREAMER_BACKEND_
+        ret = XAVibraItfAdapt_SetIntensity( impl->adapCtx, intensity );
+#endif
+        if( ret == XA_RESULT_SUCCESS )
+        {
+            impl->intensity = intensity;
+        }
+    }
+
+    XA_IMPL_THREAD_SAFETY_EXIT(XATSVibra);
+    DEBUG_API("<-XAVibraItfImpl_SetIntensity");
+    return ret;
+}
+/*
+ * XAresult XAVibraItfImpl_GetIntensity ( XAVibraItf self, XApermille * pIntensity )
+ * Description: Returns the vibration intensity of the Vibra I/O device.
+ */
+XAresult XAVibraItfImpl_GetIntensity ( XAVibraItf self, XApermille * pIntensity )
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAVibraItfImpl* impl = GetImpl(self);
+    DEBUG_API("->XAVibraItfImpl_GetIntensity");
+
+    if( !impl || !pIntensity)
+    {
+        /* invalid parameter */
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAVibraItfImpl_GetIntensity");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    *pIntensity = impl->intensity;
+
+    DEBUG_API_A1("Intensity is %d", *pIntensity);
+    DEBUG_API("<-XAVibraItfImpl_GetIntensity");
+    return ret;
+}
+
+#ifdef _GSTREAMER_BACKEND_
+
+/*****************************************************************************
+ * XAVibraItfImpl -specific methods
+ *****************************************************************************/
+/* XAVibraItfImpl* XAVibraItfImpl_Create()
+ * Description: Allocate and initialize VibraItfImpl
+ */
+XAVibraItfImpl* XAVibraItfImpl_Create( XAAdaptationBaseCtx *adapCtx )
+{
+    XAVibraItfImpl* self = (XAVibraItfImpl*) calloc(1,sizeof(XAVibraItfImpl));
+    DEBUG_API("->XAVibraItfImpl_Create");
+    if( self )
+    {
+        /* init itf default implementation*/
+        self->itf.Vibrate = XAVibraItfImpl_Vibrate;
+        self->itf.IsVibrating = XAVibraItfImpl_IsVibrating;
+        self->itf.SetFrequency = XAVibraItfImpl_SetFrequency;
+        self->itf.GetFrequency = XAVibraItfImpl_GetFrequency;
+        self->itf.SetIntensity = XAVibraItfImpl_SetIntensity;
+        self->itf.GetIntensity = XAVibraItfImpl_GetIntensity;
+
+        /* init variables*/
+        self->vibrate = XA_BOOLEAN_FALSE;
+        self->frequency = 0;
+        self->intensity = 0;
+        self->adapCtx = adapCtx;
+
+        self->self = self;
+    }
+
+    DEBUG_API("<-XAVibraItfImpl_Create");
+    return self;
+}
+#endif
+/* void XAVibraItfImpl_Free(XAVibraItfImpl* self)
+ * Description: Free all resources reserved at XAVibraItfImpl_Create
+ */
+void XAVibraItfImpl_Free(XAVibraItfImpl* self)
+{
+    DEBUG_API("->XAVibraItfImpl_Free");
+    assert( self==self->self );
+    free( self );
+    DEBUG_API("<-XAVibraItfImpl_Free");
+}
+