khronosfws/openmax_al/src/vibra/xavibraitf.c
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 14 May 2010 16:22:35 +0300
changeset 16 43d09473c595
parent 12 5a06f39ad45b
permissions -rw-r--r--
Revision: 201017 Kit: 201019

/*
* 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"

#include "xavibraitfadaptation.h"

#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 )
    {

        ret = XAVibraItfAdapt_Vibrate( (XAAdaptationGstCtx*)impl->adapCtx, vibrate );

        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 )
    {

        ret = XAVibraItfAdapt_SetFrequency( (XAAdaptationGstCtx*)impl->adapCtx, frequency );

        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 )
    {

        ret = XAVibraItfAdapt_SetIntensity( (XAAdaptationGstCtx*)impl->adapCtx, intensity );

        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;
}



/*****************************************************************************
 * 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;
}

/* 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");
}