khronosfws/openmax_al/src/outputmix/xaoutputmix.c
changeset 16 43d09473c595
parent 12 5a06f39ad45b
equal deleted inserted replaced
14:80975da52420 16:43d09473c595
    25 #include "xaconfigextensionsitf.h"
    25 #include "xaconfigextensionsitf.h"
    26 #include "xaequalizeritf.h"
    26 #include "xaequalizeritf.h"
    27 #include "xavolumeitf.h"
    27 #include "xavolumeitf.h"
    28 #include "xaoutputmixitf.h"
    28 #include "xaoutputmixitf.h"
    29 #include "xathreadsafety.h"
    29 #include "xathreadsafety.h"
       
    30 #include "xaoutputmixadaptctx.h"
       
    31 #include "xacapabilitiesmgr.h"
    30 
    32 
    31 /* Static mapping of enumeration XAOMixInterfaces to interface iids */
    33 /* Static mapping of enumeration XAOMixInterfaces to interface iids */
    32 static const XAInterfaceID* xaOMixItfIIDs[OMIX_ITFCOUNT]={
    34 static const XAInterfaceID* xaOMixItfIIDs[OMIX_ITFCOUNT]={
    33     &XA_IID_OBJECT,
    35     &XA_IID_OBJECT,
    34     &XA_IID_DYNAMICINTERFACEMANAGEMENT,
    36     &XA_IID_DYNAMICINTERFACEMANAGEMENT,
    48  *                                    XAuint32 numInterfaces,
    50  *                                    XAuint32 numInterfaces,
    49  *                                   const XAInterfaceID *pInterfaceIds,
    51  *                                   const XAInterfaceID *pInterfaceIds,
    50  *                                   const XAboolean *pInterfaceRequired)
    52  *                                   const XAboolean *pInterfaceRequired)
    51  * Description: Create object
    53  * Description: Create object
    52  */
    54  */
    53 XAresult XAOMixImpl_CreateOutputMix(XAObjectItf *pMix,
    55 XAresult XAOMixImpl_CreateOutputMix(FrameworkMap* mapper,
       
    56                                     XACapabilities* capabilities,
       
    57                                     XAObjectItf *pMix,
    54                                     XAuint32 numInterfaces,
    58                                     XAuint32 numInterfaces,
    55                                     const XAInterfaceID *pInterfaceIds,
    59                                     const XAInterfaceID *pInterfaceIds,
    56                                     const XAboolean *pInterfaceRequired)
    60                                     const XAboolean *pInterfaceRequired)
    57 {
    61 {
    58 
    62 
    59     XAObjectItfImpl* pBaseObj = NULL;
    63     XAObjectItfImpl* pBaseObj = NULL;
    60     XAOMixImpl* pImpl = NULL;
    64     XAOMixImpl* pImpl = NULL;
    61     XAuint32 itfIdx = 0;
    65     XAuint32 itfIdx = 0;
    62     DEBUG_API("->XAOMixImpl_CreateOutputMix");
    66     DEBUG_API("->XAOMixImpl_CreateOutputMix");
    63     XA_IMPL_THREAD_SAFETY_ENTRY(XATSOutputMix);
    67     XA_IMPL_THREAD_SAFETY_ENTRY(XATSOutputMix);
       
    68 
       
    69     
       
    70     
    64     if(!pMix)
    71     if(!pMix)
    65     {
    72     {
    66         XA_IMPL_THREAD_SAFETY_EXIT(XATSOutputMix);
    73         XA_IMPL_THREAD_SAFETY_EXIT(XATSOutputMix);
    67         /* invalid parameter */
    74         /* invalid parameter */
    68         DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
    75         DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
   124             }
   131             }
   125         }
   132         }
   126     }
   133     }
   127     /* Mark interfaces that can be handled dynamically */
   134     /* Mark interfaces that can be handled dynamically */
   128     pBaseObj->interfaceMap[OMIX_EQUALIZERITF].isDynamic = XA_BOOLEAN_TRUE;
   135     pBaseObj->interfaceMap[OMIX_EQUALIZERITF].isDynamic = XA_BOOLEAN_TRUE;
   129 #ifdef _GSTREAMER_BACKEND_
   136 
   130     /* Create outputmix adaptation context */
       
   131     pImpl->adaptationCtx = XAOutputMixAdapt_Create();
       
   132 #endif 
       
   133     
       
   134     /* This code is put here to return Feature Not Supported since adaptation is not present*/
   137     /* This code is put here to return Feature Not Supported since adaptation is not present*/
   135     /*************************************************/
   138     /*************************************************/
   136     XAObjectItfImpl_Destroy((XAObjectItf)&(pBaseObj));
   139     XAObjectItfImpl_Destroy((XAObjectItf)&(pBaseObj));
   137     XA_IMPL_THREAD_SAFETY_EXIT(XATSOutputMix);
   140     XA_IMPL_THREAD_SAFETY_EXIT(XATSOutputMix);
   138     DEBUG_ERR("Required interface not found - abort creation!");
   141     DEBUG_ERR("Required interface not found - abort creation!");
   139     return XA_RESULT_FEATURE_UNSUPPORTED;
   142     return XA_RESULT_FEATURE_UNSUPPORTED;
   140     /*************************************************/
   143     /*************************************************/    
   141     
   144     
   142     /* Set ObjectItf to point to newly created object */
   145 /*    // Create outputmix adaptation context 
   143 /*
   146     pImpl->adaptationCtx = XAOutputMixAdapt_Create();
       
   147  
       
   148      //Set ObjectItf to point to newly created object 
   144     *pMix = (XAObjectItf)&(pBaseObj->self);
   149     *pMix = (XAObjectItf)&(pBaseObj->self);
   145 
   150 
   146     XA_IMPL_THREAD_SAFETY_EXIT(XATSOutputMix);
   151     XA_IMPL_THREAD_SAFETY_EXIT(XATSOutputMix);
   147    
   152    
   148     DEBUG_API("<-XAOMixImpl_CreateOutputMix");
   153     DEBUG_API("<-XAOMixImpl_CreateOutputMix");
   149     return XA_RESULT_SUCCESS;
   154     return XA_RESULT_SUCCESS;*/
   150 */
       
   151 }
   155 }
   152 
   156 
   153 /*
   157 /*
   154  * XAresult XAOMixImpl_QueryNumSupportedInterfaces(XAuint32 * pNumSupportedInterfaces)
   158  * XAresult XAOMixImpl_QueryNumSupportedInterfaces(XAuint32 * pNumSupportedInterfaces)
   155  * Description: Query number of supported interfaces
   159  * Description: Query number of supported interfaces
   185         DEBUG_API("<-XAOMixImpl_QuerySupportedInterfaces");
   189         DEBUG_API("<-XAOMixImpl_QuerySupportedInterfaces");
   186         return XA_RESULT_PARAMETER_INVALID;
   190         return XA_RESULT_PARAMETER_INVALID;
   187     }
   191     }
   188     else
   192     else
   189     {
   193     {
   190 #ifdef _GSTREAMER_BACKEND_
   194 
   191         *pInterfaceId = *(xaOMixItfIIDs[index]);
   195         *pInterfaceId = *(xaOMixItfIIDs[index]);
   192 #endif
   196 
   193         DEBUG_API("<-XAOMixImpl_QuerySupportedInterfaces");
   197         DEBUG_API("<-XAOMixImpl_QuerySupportedInterfaces");
   194         return XA_RESULT_SUCCESS;
   198         return XA_RESULT_SUCCESS;
   195     }
   199     }
   196 }
   200 }
   197 
   201 
   204  * Create and initialize implementation-specific variables.
   208  * Create and initialize implementation-specific variables.
   205  * Called from base object XAObjectItfImpl
   209  * Called from base object XAObjectItfImpl
   206  */
   210  */
   207 XAresult XAOMixImpl_DoRealize(XAObjectItf self)
   211 XAresult XAOMixImpl_DoRealize(XAObjectItf self)
   208 {
   212 {
   209 #ifdef _GSTREAMER_BACKEND_
   213 
   210     XAObjectItfImpl* pObj = (XAObjectItfImpl*)(*self);
   214     XAObjectItfImpl* pObj = (XAObjectItfImpl*)(*self);
   211     XAresult ret = XA_RESULT_SUCCESS;
   215     XAresult ret = XA_RESULT_SUCCESS;
   212     DEBUG_API("->XAOMixImpl_DoRealize");
       
   213     XAOMixImpl* pMixImpl = (XAOMixImpl*)(pObj);
   216     XAOMixImpl* pMixImpl = (XAOMixImpl*)(pObj);
   214     XAuint8 itfIdx = 0;
   217     XAuint8 itfIdx = 0;
       
   218     DEBUG_API("->XAOMixImpl_DoRealize");
   215     XA_IMPL_THREAD_SAFETY_ENTRY(XATSOutputMix);
   219     XA_IMPL_THREAD_SAFETY_ENTRY(XATSOutputMix);
   216 
   220 
   217     /* check casting from correct pointer type */
   221     /* check casting from correct pointer type */
   218     if( !pMixImpl || pObj != pMixImpl->baseObj.self )
   222     if( !pMixImpl || pObj != pMixImpl->baseObj.self )
   219     {
   223     {
   223         DEBUG_API("<-XAOMixImpl_DoRealize");
   227         DEBUG_API("<-XAOMixImpl_DoRealize");
   224         return XA_RESULT_PARAMETER_INVALID;
   228         return XA_RESULT_PARAMETER_INVALID;
   225     }
   229     }
   226 
   230 
   227     /* Initialize adaptation */
   231     /* Initialize adaptation */
   228     ret = XAOutputMixAdapt_PostInit( pMixImpl->adaptationCtx );
   232     ret = XAOutputMixAdapt_PostInit( (XAAdaptationGstCtx*)pMixImpl->adaptationCtx );
   229     if( ret != XA_RESULT_SUCCESS )
   233     if( ret != XA_RESULT_SUCCESS )
   230     {
   234     {
   231         XA_IMPL_THREAD_SAFETY_EXIT(XATSOutputMix);
   235         XA_IMPL_THREAD_SAFETY_EXIT(XATSOutputMix);
   232         DEBUG_API("<-XAOMixImpl_DoRealize");
   236         DEBUG_API("<-XAOMixImpl_DoRealize");
   233         return ret;
   237         return ret;
   281         }
   285         }
   282     }
   286     }
   283 
   287 
   284     pObj->state = XA_OBJECT_STATE_REALIZED;
   288     pObj->state = XA_OBJECT_STATE_REALIZED;
   285     XA_IMPL_THREAD_SAFETY_EXIT(XATSOutputMix);
   289     XA_IMPL_THREAD_SAFETY_EXIT(XATSOutputMix);
   286 #endif    
   290     
   287     DEBUG_API("<-XAOMixImpl_DoRealize");
   291     DEBUG_API("<-XAOMixImpl_DoRealize");
   288     return XA_RESULT_SUCCESS;
   292     return XA_RESULT_SUCCESS;
   289 }
   293 }
   290 
   294 
   291 /*
   295 /*
   304  * void XAOMixImpl_FreeResources(XAObjectItf self)
   308  * void XAOMixImpl_FreeResources(XAObjectItf self)
   305  * Description: Free all resources reserved at XACameraDeviceImpl_DoRealize()
   309  * Description: Free all resources reserved at XACameraDeviceImpl_DoRealize()
   306  */
   310  */
   307 void XAOMixImpl_FreeResources(XAObjectItf self)
   311 void XAOMixImpl_FreeResources(XAObjectItf self)
   308 {
   312 {
   309 #ifdef _GSTREAMER_BACKEND_
   313 
   310     XAObjectItfImpl* pObj = (XAObjectItfImpl*)(*self);
   314     XAObjectItfImpl* pObj = (XAObjectItfImpl*)(*self);
   311     XAOMixImpl* pImpl = (XAOMixImpl*)(*self);
   315     XAOMixImpl* pImpl = (XAOMixImpl*)(*self);
   312     XAuint8 itfIdx = 0;
   316     XAuint8 itfIdx = 0;
   313     DEBUG_API("->XAOMixImpl_FreeResources");
   317     DEBUG_API("->XAOMixImpl_FreeResources");
   314     XA_IMPL_THREAD_SAFETY_ENTRY_FOR_VOID_FUNCTIONS(XATSOutputMix);
   318     XA_IMPL_THREAD_SAFETY_ENTRY_FOR_VOID_FUNCTIONS(XATSOutputMix);
   315     assert( pObj && pImpl && pObj == pObj->self );
   319     assert( pObj && pImpl && pObj == pObj->self );
   316 
   320 
   317     if ( pImpl->adaptationCtx != NULL )
   321     if ( pImpl->adaptationCtx != NULL )
   318     {
   322     {
   319         XAOutputMixAdapt_Destroy( pImpl->adaptationCtx );
   323         XAOutputMixAdapt_Destroy( (XAAdaptationGstCtx*)pImpl->adaptationCtx );
   320         pImpl->adaptationCtx = NULL;
   324         pImpl->adaptationCtx = NULL;
   321     }
   325     }
   322 
   326 
   323     /* free all allocated interfaces */
   327     /* free all allocated interfaces */
   324     for(itfIdx = 0; itfIdx < OMIX_ITFCOUNT; itfIdx++)
   328     for(itfIdx = 0; itfIdx < OMIX_ITFCOUNT; itfIdx++)
   350          }
   354          }
   351      }
   355      }
   352 
   356 
   353     if ( pImpl->adaptationCtx != NULL )
   357     if ( pImpl->adaptationCtx != NULL )
   354     {
   358     {
   355         XAOutputMixAdapt_Destroy( pImpl->adaptationCtx );
   359         XAOutputMixAdapt_Destroy( (XAAdaptationGstCtx*)pImpl->adaptationCtx );
   356         pImpl->adaptationCtx = NULL;
   360         pImpl->adaptationCtx = NULL;
   357     }
   361     }
   358 
   362 
   359     XA_IMPL_THREAD_SAFETY_EXIT_FOR_VOID_FUNCTIONS(XATSOutputMix);
   363     XA_IMPL_THREAD_SAFETY_EXIT_FOR_VOID_FUNCTIONS(XATSOutputMix);
   360 #endif    
   364     
   361     DEBUG_API("<-XAOMixImpl_FreeResources");
   365     DEBUG_API("<-XAOMixImpl_FreeResources");
   362 }
   366 }
   363 
   367 
   364 /*****************************************************************************
   368 /*****************************************************************************
   365  * MediaRecorderImpl -specific methods
   369  * MediaRecorderImpl -specific methods
   368 /* XAOMixImpl_DoAddItf
   372 /* XAOMixImpl_DoAddItf
   369  * Dynamically add an interface, object specific parts
   373  * Dynamically add an interface, object specific parts
   370  */
   374  */
   371 XAresult XAOMixImpl_DoAddItf(XAObjectItf self, XAObjItfMapEntry *mapEntry  )
   375 XAresult XAOMixImpl_DoAddItf(XAObjectItf self, XAObjItfMapEntry *mapEntry  )
   372 {
   376 {
   373 #ifdef _GSTREAMER_BACKEND_
   377 
   374     XAObjectItfImpl* pObj = (XAObjectItfImpl*)(*self);
   378     XAObjectItfImpl* pObj = (XAObjectItfImpl*)(*self);
   375     XAOMixImpl* pImpl = (XAOMixImpl*)(pObj);
   379     XAOMixImpl* pImpl = (XAOMixImpl*)(pObj);
   376 #endif
   380 
   377     XAresult ret = XA_RESULT_SUCCESS;
   381     XAresult ret = XA_RESULT_SUCCESS;
   378     DEBUG_API("->XAOMixImpl_DoAddItf");
   382     DEBUG_API("->XAOMixImpl_DoAddItf");
   379     if(mapEntry)
   383     if(mapEntry)
   380     {
   384     {
   381         switch( mapEntry->mapIdx )
   385         switch( mapEntry->mapIdx )
   382         {
   386         {
   383         case OMIX_EQUALIZERITF:
   387         case OMIX_EQUALIZERITF:
   384 #ifdef _GSTREAMER_BACKEND_
   388 
   385             mapEntry->pItf = XAEqualizerItfImpl_Create( pImpl->adaptationCtx );
   389             mapEntry->pItf = XAEqualizerItfImpl_Create( pImpl->adaptationCtx );
   386 #endif
   390 
   387             break;
   391             break;
   388         default:
   392         default:
   389             DEBUG_ERR("XAOMixImpl_DoAddItf unknown id");
   393             DEBUG_ERR("XAOMixImpl_DoAddItf unknown id");
   390             ret = XA_RESULT_FEATURE_UNSUPPORTED;
   394             ret = XA_RESULT_FEATURE_UNSUPPORTED;
   391             break;
   395             break;