diff -r a36789189b53 -r 095bea5f582e khronosfws/openmax_al/src/adptcommon/xaadptbasectx.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/khronosfws/openmax_al/src/adptcommon/xaadptbasectx.c Tue Aug 31 15:43:02 2010 +0300 @@ -0,0 +1,239 @@ +/* + * 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: Base Adaptation Initialization Functionality + * + */ + +#include +#include +#include "xaadptbasectx.h" +#include "xathreadsafety.h" + +/* + * XAAdaptationBaseCtx* XAAdaptationBase_Create() + * 1st phase initialization function for Adaptation Base context structure. + * Reserves memory for base context and initializes GStreamer FW. + */ +XAresult XAAdaptationBase_Init(XAAdaptationBaseCtx* pSelf, XAuint32 ctxId) + { + DEBUG_API("->XAAdaptationBase_Init"); + + if (pSelf) + { + if (!pSelf->evtHdlrs) + { + pSelf->evtHdlrs = g_array_new(FALSE, FALSE, + sizeof(XAAdaptEvtHdlr)); + if (!pSelf->evtHdlrs) + { + DEBUG_ERR("Memory allocation failure in Base Ctx.") + return XA_RESULT_MEMORY_FAILURE; + } + } + pSelf->ctxId = ctxId; + } + else + { + DEBUG_ERR("Invalid Adaptation Base Context.") + return XA_RESULT_PARAMETER_INVALID; + } + + DEBUG_API("<-XAAdaptationBase_Init"); + return XA_RESULT_SUCCESS; + } + +/* + * XAresult XAAdaptationBase_PostInit() + * 2nd phase initialization for Adaptation Base. + */ +XAresult XAAdaptationBase_PostInit(XAAdaptationBaseCtx* ctx) + { + XAresult ret = XA_RESULT_SUCCESS; + DEBUG_API("->XAAdaptationBase_PostInit"); + DEBUG_API("<-XAAdaptationBase_PostInit"); + return ret; + } + +/* + * void XAAdaptationBase_Free( XAAdaptationBaseCtx* ctx ) + * Frees all Base context variables . + */ +void XAAdaptationBase_Free(XAAdaptationBaseCtx* ctx) + { + g_array_free(ctx->evtHdlrs, TRUE); + ctx->evtHdlrs = NULL; + DEBUG_API("<-XAAdaptationBase_Free"); + } + +/* + * XAresult XAAdaptationBase_AddEventHandler + * Adds event handler for certain event types. + */ +XAresult XAAdaptationBase_AddEventHandler(XAAdaptationBaseCtx* ctx, + xaAdaptEventHandler evtHandler, XAuint32 evtTypes, void *pHandlerCtx) + { + XAuint32 i; + XAAdaptEvtHdlr tmp; + DEBUG_API("->XAAdaptationBase_AddEventHandler"); + if (!ctx) + { + DEBUG_ERR("no context"); + return XA_RESULT_PARAMETER_INVALID; + } + + for (i = 0; i < ctx->evtHdlrs->len; i++) + { + if ((g_array_index(ctx->evtHdlrs, XAAdaptEvtHdlr, i)).handlerfunc + == evtHandler) + { + return XA_RESULT_PARAMETER_INVALID; + } + } + tmp.handlerfunc = evtHandler; + tmp.handlercontext = pHandlerCtx; + tmp.eventtypes = evtTypes; + g_array_append_val(ctx->evtHdlrs, tmp); + DEBUG_API("<-XAAdaptationBase_AddEventHandler"); + return XA_RESULT_SUCCESS; + } + +/* + * XAresult XAAdaptationBase_RemoveEventHandler + * Removes event handler for certain event types. + */ +XAresult XAAdaptationBase_RemoveEventHandler(XAAdaptationBaseCtx* ctx, + xaAdaptEventHandler evtHandler) + { + XAuint32 i; + DEBUG_API("->XAAdaptationBase_RemoveEventHandler"); + if (!ctx) + { + DEBUG_ERR("no context"); + return XA_RESULT_PARAMETER_INVALID; + } + for (i = 0; i < ctx->evtHdlrs->len; i++) + { + if ((g_array_index(ctx->evtHdlrs, XAAdaptEvtHdlr, i)).handlerfunc + == evtHandler) + { + g_array_remove_index(ctx->evtHdlrs, i); + return XA_RESULT_SUCCESS; + } + } + DEBUG_API("<-XAAdaptationBase_RemoveEventHandler"); + /*did not find, return error*/ + return XA_RESULT_PARAMETER_INVALID; + } + +void XAAdaptationBase_SendAdaptEvents(XAAdaptationBaseCtx* ctx, + XAAdaptEvent* event) + { + XAuint32 i; + XAAdaptEvtHdlr* tmp; + for (i = 0; i < ctx->evtHdlrs->len; i++) + { + tmp = &g_array_index(ctx->evtHdlrs, XAAdaptEvtHdlr, i); + if (tmp->eventtypes & event->eventtype) + { + (tmp->handlerfunc)(tmp->handlercontext, event); + } + } + } + +/* + * XAresult XAEqualizerItfAdapt_ThreadEntry(XAAdaptationGstCtx *adapCtx) + * Description: Safety thread entry + */ +XAresult XAAdaptationBase_ThreadEntry(XAAdaptationBaseCtx *adaptCtx) + { + XAresult res = XA_RESULT_SUCCESS; + DEBUG_API("->XAAdaptationBase_ThreadEntry"); + if (!adaptCtx) + { + DEBUG_ERR("XA_RESULT_PARAMETER_INVALID"); + DEBUG_API("<-XAAdaptationBase_ThreadEntry"); + /* invalid parameter */ + return XA_RESULT_PARAMETER_INVALID; + } + + switch (adaptCtx->ctxId) + { + case XAMediaPlayerAdaptation: + XA_IMPL_THREAD_SAFETY_ENTRY(XATSMediaPlayer); + break; + case XAMediaRecorderAdaptation: + XA_IMPL_THREAD_SAFETY_ENTRY(XATSMediaRecorder); + break; + case XARadioAdaptation: + XA_IMPL_THREAD_SAFETY_ENTRY(XATSRadio); + break; + case XAMDAdaptation: + XA_IMPL_THREAD_SAFETY_ENTRY(XATSMetaDataExtractor); + break; + case XAEngineAdaptation: + XA_IMPL_THREAD_SAFETY_ENTRY(XATSEngine); + break; + default: + DEBUG_ERR("XA_RESULT_PARAMETER_INVALID"); + /* invalid parameter */ + res = XA_RESULT_PARAMETER_INVALID; + break; + } + + DEBUG_API("<-XAAdaptationBase_ThreadEntry"); + return res; + } +/* + * XAresult XAEqualizerItfAdapt_ThreadExit(XAAdaptationGstCtx *adaptCtx) + * Description: Safety thread exit + */ +XAresult XAAdaptationBase_ThreadExit(XAAdaptationBaseCtx *adaptCtx) + { + XAresult res = XA_RESULT_SUCCESS; + DEBUG_API("->XAAdaptationBase_ThreadExit"); + if (!adaptCtx) + { + DEBUG_ERR("XA_RESULT_PARAMETER_INVALID"); + DEBUG_API("<-XAAdaptationBase_ThreadExit"); + /* invalid parameter */ + return XA_RESULT_PARAMETER_INVALID; + } + + switch (adaptCtx->ctxId) + { + case XAMediaPlayerAdaptation: + XA_IMPL_THREAD_SAFETY_EXIT(XATSMediaPlayer); + break; + case XAMediaRecorderAdaptation: + XA_IMPL_THREAD_SAFETY_EXIT(XATSMediaRecorder); + break; + case XARadioAdaptation: + XA_IMPL_THREAD_SAFETY_EXIT(XATSRadio); + break; + case XAMDAdaptation: + XA_IMPL_THREAD_SAFETY_EXIT(XATSMetaDataExtractor); + break; + case XAEngineAdaptation: + XA_IMPL_THREAD_SAFETY_EXIT(XATSEngine); + break; + default: + DEBUG_ERR("XA_RESULT_PARAMETER_INVALID"); + /* invalid parameter */ + res = XA_RESULT_PARAMETER_INVALID; + break; + } + + DEBUG_API("<-XAAdaptationBase_ThreadExit"); + return res; + }