33 #define GAIN_VALUE 100.0f
37 omx_audio_mixer_component_PrivateType* omx_audio_mixer_component_Private;
38 omx_audio_mixer_component_PortType *pPort;
44 openmaxStandComp->
pComponentPrivate = calloc(1,
sizeof(omx_audio_mixer_component_PrivateType));
53 omx_audio_mixer_component_Private->ports = NULL;
59 omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nStartPortNumber = 0;
63 if (omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts && !omx_audio_mixer_component_Private->ports) {
65 if (!omx_audio_mixer_component_Private->ports) {
68 for (i=0; i < omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts; i++) {
69 omx_audio_mixer_component_Private->ports[i] = calloc(1,
sizeof(omx_audio_mixer_component_PortType));
70 if (!omx_audio_mixer_component_Private->ports[i]) {
77 for(i=0;i<omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts-1;i++) {
85 for(i=0;i<omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts;i++) {
86 pPort = (omx_audio_mixer_component_PortType *) omx_audio_mixer_component_Private->ports[i];
92 pPort->pAudioPcmMode.nPortIndex = i;
93 pPort->pAudioPcmMode.nChannels = 2;
96 pPort->pAudioPcmMode.bInterleaved =
OMX_TRUE;
97 pPort->pAudioPcmMode.nBitPerSample = 16;
98 pPort->pAudioPcmMode.nSamplingRate = 44100;
102 pPort->sVolume.nPortIndex = i;
106 pPort->sVolume.sVolume.nMin = 0;
120 omx_audio_mixer_component_Private->currentQualityLevel = 1;
124 omx_audio_mixer_component_Private->multiResourceLevel[i]->CPUResourceRequested = mixerQualityLevels[i * 2];
125 omx_audio_mixer_component_Private->multiResourceLevel[i]->MemoryResourceRequested = mixerQualityLevels[i * 2 + 1];
136 omx_audio_mixer_component_PrivateType* omx_audio_mixer_component_Private = openmaxStandComp->
pComponentPrivate;
141 if (omx_audio_mixer_component_Private->ports) {
142 for (i=0; i < omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts; i++) {
143 if(omx_audio_mixer_component_Private->ports[i])
144 omx_audio_mixer_component_Private->ports[i]->PortDestructor(omx_audio_mixer_component_Private->ports[i]);
146 free(omx_audio_mixer_component_Private->ports);
147 omx_audio_mixer_component_Private->ports=NULL;
162 omx_audio_mixer_component_PrivateType* omx_audio_mixer_component_Private = openmaxStandComp->
pComponentPrivate;
163 omx_audio_mixer_component_PortType* pPort;
165 for(i=0;i<omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts-1;i++) {
166 pPort = (omx_audio_mixer_component_PortType*)omx_audio_mixer_component_Private->ports[i];
168 denominator+=pPort->sVolume.sVolume.nValue;
172 pPort = (omx_audio_mixer_component_PortType*)omx_audio_mixer_component_Private->ports[pInBuffer->
nInputPortIndex];
178 for (i = 0; i < sampleCount; i++) {
180 ((((
OMX_S16*) pInBuffer->
pBuffer)[i] * pPort->sVolume.sVolume.nValue ) / denominator);
183 for (i = 0; i < sampleCount; i++) {
185 ((((
OMX_S16*) pInBuffer->
pBuffer)[i] * pPort->sVolume.sVolume.nValue ) / denominator);
197 OMX_PTR pComponentConfigStructure) {
201 omx_audio_mixer_component_PrivateType* omx_audio_mixer_component_Private = openmaxStandComp->
pComponentPrivate;
202 omx_audio_mixer_component_PortType * pPort;
214 pPort= (omx_audio_mixer_component_PortType *)omx_audio_mixer_component_Private->ports[pVolume->
nPortIndex];
230 OMX_PTR pComponentConfigStructure) {
233 omx_audio_mixer_component_PrivateType *omx_audio_mixer_component_Private = openmaxStandComp->
pComponentPrivate;
234 omx_audio_mixer_component_PortType *pPort;
241 pPort= (omx_audio_mixer_component_PortType *)omx_audio_mixer_component_Private->ports[pVolume->
nPortIndex];
256 OMX_PTR ComponentParameterStructure) {
262 omx_audio_mixer_component_PortType *port;
266 omx_audio_mixer_component_PrivateType* omx_audio_mixer_component_Private = openmaxStandComp->
pComponentPrivate;
267 if (ComponentParameterStructure == NULL) {
272 switch(nParamIndex) {
281 if (portIndex <= omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts) {
282 port= (omx_audio_mixer_component_PortType *)omx_audio_mixer_component_Private->ports[portIndex];
292 DEBUG(
DEB_LEV_ERR,
"In %s Incorrect State=%x lineno=%d\n",__func__,omx_audio_mixer_component_Private->state,__LINE__);
313 OMX_PTR ComponentParameterStructure) {
319 omx_audio_mixer_component_PortType *port;
321 omx_audio_mixer_component_PrivateType *omx_audio_mixer_component_Private = openmaxStandComp->
pComponentPrivate;
322 if (ComponentParameterStructure == NULL) {
327 switch(nParamIndex) {
340 port= (omx_audio_mixer_component_PortType *)omx_audio_mixer_component_Private->ports[pAudioPortFormat->
nPortIndex];
353 port= (omx_audio_mixer_component_PortType *)omx_audio_mixer_component_Private->ports[pAudioPcmMode->
nPortIndex];
381 pthread_mutex_lock(&omx_audio_mixer_component_Private->flush_mutex);
382 for (i=0; i < omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts; i++) {
383 pPort = omx_audio_mixer_component_Private->ports[i];
389 pthread_mutex_unlock(&omx_audio_mixer_component_Private->flush_mutex);
401 omx_audio_mixer_component_PrivateType* omx_audio_mixer_component_Private = (omx_audio_mixer_component_PrivateType*)openmaxStandComp->
pComponentPrivate;
411 for(i=0;i<omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts;i++){
412 pPort[i] = omx_audio_mixer_component_Private->ports[i];
413 pSem[i] = pPort[i]->pBufferSem;
414 pQueue[i] = pPort[i]->pBufferQueue;
419 nOutputPortIndex = omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts - 1;
430 __func__,isBufferNeeded[0],isBufferNeeded[nOutputPortIndex],pSem[0]->semval,pSem[nOutputPortIndex]->semval);
432 for(i=0;i<omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts;i++){
434 pPort[i]->ReturnBufferFunction(pPort[i],pBuffer[i]);
442 __func__,isBufferNeeded[0],isBufferNeeded[nOutputPortIndex],pSem[0]->semval,pSem[nOutputPortIndex]->semval);
444 tsem_up(omx_audio_mixer_component_Private->flush_all_condition);
445 tsem_down(omx_audio_mixer_component_Private->flush_condition);
454 for(i=0;i<omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts;i++){
455 if((isBufferNeeded[i]==
OMX_TRUE && pSem[i]->semval==0) &&
460 tsem_down(omx_audio_mixer_component_Private->bMgmtSem);
473 for(i=0;i<omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts;i++){
477 if(pQueue[i]->nelem>0){
479 pBuffer[i] =
dequeue(pQueue[i]);
480 if(pBuffer[i] == NULL){
488 if(isBufferNeeded[nOutputPortIndex]==
OMX_FALSE) {
490 if(omx_audio_mixer_component_Private->pMark.hMarkTargetComponent != NULL){
491 pBuffer[nOutputPortIndex]->hMarkTargetComponent = omx_audio_mixer_component_Private->pMark.hMarkTargetComponent;
492 pBuffer[nOutputPortIndex]->pMarkData = omx_audio_mixer_component_Private->pMark.pMarkData;
493 omx_audio_mixer_component_Private->pMark.hMarkTargetComponent = NULL;
494 omx_audio_mixer_component_Private->pMark.pMarkData = NULL;
496 for(i=0;i<omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts-1;i++){
503 (*(omx_audio_mixer_component_Private->callbacks->EventHandler))
505 omx_audio_mixer_component_Private->callbackData,
509 pBuffer[i]->pMarkData);
510 }
else if(pBuffer[i]->hMarkTargetComponent!=NULL){
512 pBuffer[nOutputPortIndex]->hMarkTargetComponent = pBuffer[i]->hMarkTargetComponent;
513 pBuffer[nOutputPortIndex]->pMarkData = pBuffer[i]->pMarkData;
514 pBuffer[i]->pMarkData=NULL;
516 pBuffer[nOutputPortIndex]->nTimeStamp = pBuffer[i]->nTimeStamp;
519 if((pBuffer[i]->nFlags &
OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS && pBuffer[i]->nFilledLen==0) {
520 DEBUG(
DEB_LEV_FULL_SEQ,
"Detected EOS flags in input buffer %p of %i filled len=%d\n", pBuffer[i], (
int)i, (
int)pBuffer[i]->nFilledLen);
521 pBuffer[nOutputPortIndex]->nFlags = pBuffer[i]->nFlags;
522 pBuffer[i]->nFlags=0;
523 (*(omx_audio_mixer_component_Private->callbacks->EventHandler))
525 omx_audio_mixer_component_Private->callbackData,
528 pBuffer[nOutputPortIndex]->nFlags,
534 if (omx_audio_mixer_component_Private->BufferMgmtCallback && pBuffer[i]->nFilledLen != 0) {
535 (*(omx_audio_mixer_component_Private->BufferMgmtCallback))(openmaxStandComp, pBuffer[i], pBuffer[nOutputPortIndex]);
538 pBuffer[i]->nFilledLen = 0;
541 DEBUG(
DEB_LEV_ERR,
"In %s Received Buffer in non-Executing State(%x)\n", __func__, (
int)omx_audio_mixer_component_Private->state);
544 pBuffer[i]->nFilledLen = 0;
549 if(pBuffer[i]->nFilledLen==0) {
558 tsem_wait(omx_audio_mixer_component_Private->bStateSem);
562 if(pBuffer[nOutputPortIndex]->nFilledLen!=0 || (pBuffer[nOutputPortIndex]->nFlags &
OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS){
564 pPort[nOutputPortIndex]->ReturnBufferFunction(pPort[nOutputPortIndex],pBuffer[nOutputPortIndex]);
565 pBuffer[nOutputPortIndex]=NULL;
566 isBufferNeeded[nOutputPortIndex]=
OMX_TRUE;
575 tsem_wait(omx_audio_mixer_component_Private->bStateSem);
579 for(i=0;i<omx_audio_mixer_component_Private->sPortTypesParam[
OMX_PortDomainAudio].nPorts-1;i++){
581 pPort[i]->ReturnBufferFunction(pPort[i],pBuffer[i]);
OMX_ERRORTYPE omx_base_component_SetParameter(OMX_HANDLETYPE hComponent, OMX_INDEXTYPE nParamIndex, OMX_PTR ComponentParameterStructure)
Part of the standard OpenMAX function.
void tsem_wait(tsem_t *tsem)
OMX_ERRORTYPE(* SetConfig)(OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_INDEXTYPE nIndex, OMX_IN OMX_PTR pComponentConfigStructure)
OMX_ERRORTYPE omx_base_component_ParameterSanityCheck(OMX_HANDLETYPE hComponent, OMX_U32 nPortIndex, OMX_PTR pStructure, size_t size)
OMX_ERRORTYPE(* GetParameter)(OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_INDEXTYPE nParamIndex, OMX_INOUT OMX_PTR pComponentParameterStructure)
OMX_ERRORTYPE base_audio_port_Constructor(OMX_COMPONENTTYPE *openmaxStandComp, omx_base_PortType **openmaxStandPort, OMX_U32 nPortIndex, OMX_BOOL isInput)
The base constructor for the generic OpenMAX ST Audio port.
OMX_ERRORTYPE checkHeader(OMX_PTR header, OMX_U32 size)
Checks the header of a structure for consistency with size and spec version.
#define DEB_LEV_SIMPLE_SEQ
#define PORT_IS_BEING_FLUSHED(pPort)
OMX_ERRORTYPE omx_base_component_SetConfig(OMX_HANDLETYPE hComponent, OMX_INDEXTYPE nIndex, OMX_PTR pComponentConfigStructure)
base SetConfig function
int checkAnyPortBeingFlushed(omx_audio_mixer_component_PrivateType *omx_audio_mixer_component_Private)
OMX_ERRORTYPE omx_audio_mixer_component_Constructor(OMX_COMPONENTTYPE *openmaxStandComp, OMX_STRING cComponentName)
#define DEBUG(n, fmt, args...)
OMX_ERRORTYPE omx_audio_mixer_component_SetParameter(OMX_HANDLETYPE hComponent, OMX_INDEXTYPE nParamIndex, OMX_PTR ComponentParameterStructure)
OMX_ERRORTYPE omx_audio_mixer_component_SetConfig(OMX_HANDLETYPE hComponent, OMX_INDEXTYPE nIndex, OMX_PTR pComponentConfigStructure)
#define MAX_MIXER_COMPONENTS
OMX_ERRORTYPE(* SetParameter)(OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_INDEXTYPE nIndex, OMX_IN OMX_PTR pComponentParameterStructure)
OMX_ERRORTYPE omx_base_filter_Destructor(OMX_COMPONENTTYPE *openmaxStandComp)
the base filter destructor for ST OpenMAX components
void tsem_up(tsem_t *tsem)
void setHeader(OMX_PTR header, OMX_U32 size)
Simply fills the first two fields in any OMX structure with the size and the version.
void tsem_down(tsem_t *tsem)
#define DEFAULT_OUT_BUFFER_SIZE
OMX_ERRORTYPE omx_base_component_GetConfig(OMX_HANDLETYPE hComponent, OMX_INDEXTYPE nIndex, OMX_PTR pComponentConfigStructure)
base GetConfig function
OMX_ERRORTYPE RM_RegisterComponent(char *name, int max_components)
#define OMX_BUFFERFLAG_EOS
#define PORT_IS_ENABLED(pPort)
OMX_ERRORTYPE omx_audio_mixer_component_GetParameter(OMX_HANDLETYPE hComponent, OMX_INDEXTYPE nParamIndex, OMX_PTR ComponentParameterStructure)
OMX_ERRORTYPE omx_audio_mixer_component_Destructor(OMX_COMPONENTTYPE *openmaxStandComp)
OMX_ERRORTYPE omx_audio_mixer_component_GetConfig(OMX_HANDLETYPE hComponent, OMX_INDEXTYPE nIndex, OMX_PTR pComponentConfigStructure)
OMX_ERRORTYPE(* GetConfig)(OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_INDEXTYPE nIndex, OMX_INOUT OMX_PTR pComponentConfigStructure)
OMX_ERRORTYPE omx_base_filter_Constructor(OMX_COMPONENTTYPE *openmaxStandComp, OMX_STRING cComponentName)
The base filter contructor for the OpenMAX ST components.
void omx_audio_mixer_component_BufferMgmtCallback(OMX_COMPONENTTYPE *openmaxStandComp, OMX_BUFFERHEADERTYPE *pInBuffer, OMX_BUFFERHEADERTYPE *pOutBuffer)
OMX_PTR pComponentPrivate
#define DEB_LEV_FUNCTION_NAME
void * omx_audio_mixer_BufferMgmtFunction(void *param)
OMX_ERRORTYPE omx_base_component_GetParameter(OMX_HANDLETYPE hComponent, OMX_INDEXTYPE nParamIndex, OMX_PTR ComponentParameterStructure)
Part of the standard OpenMAX function.
#define MIXER_QUALITY_LEVELS
void * dequeue(queue_t *queue)