omxilcomp/omxilaudioemulator/pcmrenderer/src/omxilpcmrendererapb0port.cpp
changeset 0 58be5850fb6c
child 1 e0d606d6e3b1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omxilcomp/omxilaudioemulator/pcmrenderer/src/omxilpcmrendererapb0port.cpp	Thu Sep 02 20:13:57 2010 +0300
@@ -0,0 +1,580 @@
+/*
+* Copyright (c) 2008-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:
+*
+*/
+
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <openmax/il/khronos/v1_x/OMX_Component.h>
+#include <openmax/il/common/omxilutil.h>
+#include "log.h"
+#include "omxilpcmrendererapb0port.h"
+#include "omxilpcmrendererconst.h"
+
+
+COmxILPcmRendererAPB0Port*
+COmxILPcmRendererAPB0Port::NewL(
+	const TOmxILCommonPortData& aCommonPortData,
+	const RArray<OMX_AUDIO_CODINGTYPE>& aSupportedAudioFormats,
+	const OMX_AUDIO_PARAM_PCMMODETYPE& aParamAudioPcm,
+	const OMX_AUDIO_CONFIG_VOLUMETYPE& aConfigAudioVolume,
+	const OMX_AUDIO_CONFIG_MUTETYPE& aConfigAudioMute)
+	{
+    DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::NewL"));
+
+	COmxILPcmRendererAPB0Port* self = new (ELeave)COmxILPcmRendererAPB0Port(
+		aParamAudioPcm,
+		aConfigAudioVolume,
+		aConfigAudioMute);
+	
+	CleanupStack::PushL(self);
+	self->ConstructL(aCommonPortData, aSupportedAudioFormats);
+	CleanupStack::Pop(self);
+	return self;
+
+	}
+
+
+void
+COmxILPcmRendererAPB0Port::ConstructL(const TOmxILCommonPortData& aCommonPortData, const RArray<OMX_AUDIO_CODINGTYPE>& aSupportedAudioFormats)
+	{
+    DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::ConstructL"));
+	COmxILAudioPort::ConstructL(aCommonPortData, aSupportedAudioFormats);
+	OMX_PARAM_PORTDEFINITIONTYPE& paramPortDefinition=GetParamPortDefinition();
+	// We have to finish with iParamPortDefinition
+	paramPortDefinition.eDomain = OMX_PortDomainAudio;
+	paramPortDefinition.format.audio.pNativeRender = 0;
+
+	iMimeTypeBuf.CreateL(KMimeTypeAudioPcm(), KMimeTypeAudioPcm().Length() + 1);
+
+	TUint8* pTUint2 = const_cast<TUint8*>(iMimeTypeBuf.PtrZ());
+	paramPortDefinition.format.audio.cMIMEType = reinterpret_cast<OMX_STRING>(pTUint2);
+
+	paramPortDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
+	paramPortDefinition.format.audio.eEncoding = OMX_AUDIO_CodingPCM;
+	
+	// Init iParamVolumeRamp here...
+	iConfigVolumeRamp.nSize			  = sizeof(OMX_SYMBIAN_AUDIO_CONFIG_PCM_VOLUMERAMP);
+	iConfigVolumeRamp.nVersion		  = TOmxILSpecVersion();
+	iConfigVolumeRamp.nPortIndex		  = paramPortDefinition.nPortIndex;
+	iConfigVolumeRamp.nRampDuration	  = 0;
+	}
+
+
+COmxILPcmRendererAPB0Port::COmxILPcmRendererAPB0Port(
+	const OMX_AUDIO_PARAM_PCMMODETYPE& aParamAudioPcm,
+	const OMX_AUDIO_CONFIG_VOLUMETYPE& aConfigAudioVolume,
+	const OMX_AUDIO_CONFIG_MUTETYPE& aConfigAudioMute)
+	:
+	iParamAudioPcm(aParamAudioPcm),
+	iConfigAudioVolume(aConfigAudioVolume),
+	iConfigAudioMute(aConfigAudioMute)
+	{
+    DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::COmxILPcmRendererAPB0Port"));
+	}
+
+
+COmxILPcmRendererAPB0Port::~COmxILPcmRendererAPB0Port()
+	{
+    DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::~COmxILPcmRendererAPB0Port"));
+
+	CleanUpPort();
+	iMimeTypeBuf.Close();
+
+	}
+
+
+OMX_ERRORTYPE
+COmxILPcmRendererAPB0Port::SetFormatInPortDefinition(
+	const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition,
+	TBool& aUpdateProcessingFunction)
+	{
+    DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::SetFormatInPortDefinition"));
+	// There's no point on chaging the cMIMEType type of this port
+	// Same thing for pNativeRender and eEncoding
+	GetParamPortDefinition().format.audio.bFlagErrorConcealment =
+		aPortDefinition.format.audio.bFlagErrorConcealment;
+	// Error concealment not currently needed at the processing function
+	aUpdateProcessingFunction = EFalse;
+
+	return OMX_ErrorNone;
+
+	}
+
+
+TBool
+COmxILPcmRendererAPB0Port::IsTunnelledPortCompatible(
+	const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition) const
+	{
+	DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::IsTunnelledPortCompatible"));
+
+	// First, the easy checks...
+	if(aPortDefinition.eDomain != GetParamPortDefinition().eDomain)
+		{
+		return EFalse;
+		}
+
+	if(aPortDefinition.format.audio.eEncoding != OMX_AUDIO_CodingPCM)
+		{
+		return EFalse;
+		}
+	
+    TBool retValue = ETrue;
+    
+#ifdef _OMXIL_PCMRENDERER_CHECK_MIME_TYPE_ON
+	RBuf8 tunnelMimeTypeBuf;
+	tunnelMimeTypeBuf.Create(KMimeTypeAudioPcm().Length() + 1);
+	tunnelMimeTypeBuf =
+		const_cast<const TUint8*>(
+			reinterpret_cast<TUint8*>(aPortDefinition.format.audio.cMIMEType));
+
+
+	if (iMimeTypeBuf != tunnelMimeTypeBuf)
+		{
+		retValue = EFalse;
+		}
+
+	tunnelMimeTypeBuf.Close();
+#endif
+
+	return retValue;
+	}
+
+
+OMX_ERRORTYPE
+COmxILPcmRendererAPB0Port::GetLocalOmxParamIndexes(RArray<TUint>& aIndexArray) const
+	{
+    DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::GetLocalOmxParamIndexes"));
+
+	// Always collect local indexes from parent
+	OMX_ERRORTYPE omxRetValue =
+		COmxILAudioPort::GetLocalOmxParamIndexes(aIndexArray);
+
+	if (OMX_ErrorNone != omxRetValue)
+		{
+		return omxRetValue;
+		}
+
+	TInt err = aIndexArray.InsertInOrder(OMX_IndexParamAudioPcm);
+
+	// Note that index duplication is OK.
+	if (KErrNone != err && KErrAlreadyExists != err)
+		{
+		return OMX_ErrorInsufficientResources;
+		}
+
+	return OMX_ErrorNone;
+
+	}
+
+OMX_ERRORTYPE
+COmxILPcmRendererAPB0Port::GetLocalOmxConfigIndexes(RArray<TUint>& aIndexArray) const
+	{
+    DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::GetLocalOmxConfigIndexes"));
+
+	// Always collect local indexes from parent
+	OMX_ERRORTYPE omxRetValue =
+		COmxILAudioPort::GetLocalOmxConfigIndexes(aIndexArray);
+
+	if (OMX_ErrorNone != omxRetValue)
+		{
+		return omxRetValue;
+		}
+
+	TInt err = aIndexArray.InsertInOrder(OMX_IndexConfigAudioVolume);
+
+	// Note that index duplication is OK.
+	if (KErrNone == err || KErrAlreadyExists == err)
+		{
+		err = aIndexArray.InsertInOrder(OMX_IndexConfigAudioMute);
+
+		if (KErrNone == err || KErrAlreadyExists == err)
+			{
+			err = aIndexArray.InsertInOrder(
+				OMX_SymbianIndexConfigAudioPcmVolumeRamp);
+			}
+
+		}
+
+	if (KErrNone != err && KErrAlreadyExists != err)
+		{
+		return OMX_ErrorInsufficientResources;
+		}
+
+	return OMX_ErrorNone;
+
+	}
+
+
+OMX_ERRORTYPE
+COmxILPcmRendererAPB0Port::GetParameter(OMX_INDEXTYPE aParamIndex,
+										TAny* apComponentParameterStructure) const
+	{
+    DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::GetParameter"));
+
+	OMX_ERRORTYPE omxRetValue = OMX_ErrorNone;
+	switch(aParamIndex)
+		{
+	case OMX_IndexParamAudioPcm:
+		{
+		if (OMX_ErrorNone !=
+			(omxRetValue =
+			 TOmxILUtil::CheckOmxStructSizeAndVersion(
+				 apComponentParameterStructure,
+				 sizeof(OMX_AUDIO_PARAM_PCMMODETYPE))))
+			{
+			return omxRetValue;
+			}
+
+		OMX_AUDIO_PARAM_PCMMODETYPE* pPcmMode
+			= static_cast<OMX_AUDIO_PARAM_PCMMODETYPE*>(
+				apComponentParameterStructure);
+
+		*pPcmMode = iParamAudioPcm;
+		}
+		break;
+
+	default:
+		{
+		// Try the parent's indexes
+		return COmxILAudioPort::GetParameter(aParamIndex,
+											 apComponentParameterStructure);
+		}
+		};
+
+	return OMX_ErrorNone;
+
+	}
+
+
+OMX_ERRORTYPE
+COmxILPcmRendererAPB0Port::SetParameter(OMX_INDEXTYPE aParamIndex,
+										const TAny* apComponentParameterStructure,
+										TBool& aUpdateProcessingFunction)
+	{
+    DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::SetParameter"));
+
+	aUpdateProcessingFunction = EFalse;
+
+	OMX_ERRORTYPE omxRetValue = OMX_ErrorNone;
+	switch(aParamIndex)
+		{
+	case OMX_IndexParamAudioPcm:
+		{
+		if (OMX_ErrorNone !=
+			(omxRetValue =
+			 TOmxILUtil::CheckOmxStructSizeAndVersion(
+				 const_cast<OMX_PTR>(apComponentParameterStructure),
+				 sizeof(OMX_AUDIO_PARAM_PCMMODETYPE))))
+			{
+			return omxRetValue;
+			}
+
+		const OMX_AUDIO_PARAM_PCMMODETYPE* pPcmMode
+			= static_cast<const OMX_AUDIO_PARAM_PCMMODETYPE*>(
+				apComponentParameterStructure);
+
+		switch (pPcmMode->nSamplingRate)
+			{
+			case 8000 :
+			case 11025 :
+			case 12000 :
+			case 16000 :
+			case 22050 :
+			case 24000 :
+			case 32000 :
+			case 44100 :
+			case 48000 :
+				break;
+			default:
+				return OMX_ErrorBadParameter;
+			}
+
+		switch (pPcmMode->nBitPerSample)
+			{
+			case 8 :
+			case 16 :
+				break;
+			default:
+				return OMX_ErrorBadParameter;
+			}
+
+		// Set the new default values
+		if (iParamAudioPcm.nChannels	 != pPcmMode->nChannels			||
+			iParamAudioPcm.eNumData		 != pPcmMode->eNumData			||
+			iParamAudioPcm.eEndian		 != pPcmMode->eEndian			||
+			iParamAudioPcm.bInterleaved	 != pPcmMode->bInterleaved		||
+			iParamAudioPcm.nBitPerSample != pPcmMode->nBitPerSample		||
+			iParamAudioPcm.nSamplingRate != pPcmMode->nSamplingRate		||
+			iParamAudioPcm.ePCMMode		 != pPcmMode->ePCMMode)
+			{
+			iParamAudioPcm.nChannels	 = pPcmMode->nChannels;
+			iParamAudioPcm.eNumData		 = pPcmMode->eNumData;
+			iParamAudioPcm.eEndian		 = pPcmMode->eEndian;
+			iParamAudioPcm.bInterleaved	 = pPcmMode->bInterleaved;
+			iParamAudioPcm.nBitPerSample = pPcmMode->nBitPerSample;
+		    iParamAudioPcm.nSamplingRate = pPcmMode->nSamplingRate;
+			iParamAudioPcm.ePCMMode		 = pPcmMode->ePCMMode;
+			// This is an indication to the PortManager that the processing
+			// function needs to get updated
+			aUpdateProcessingFunction = ETrue;
+			}
+
+		for (TInt i=0; i<OMX_AUDIO_MAXCHANNELS; i++)
+			{
+			if (iParamAudioPcm.eChannelMapping[i] != pPcmMode->eChannelMapping[i])
+				{
+				iParamAudioPcm.eChannelMapping[i] = pPcmMode->eChannelMapping[i];
+				// This is an indication to the PortManager that the processing
+				// function needs to get updated
+				aUpdateProcessingFunction = ETrue;
+				}
+			}
+
+		}
+		break;
+	default:
+		{
+		// Try the parent's indexes
+		return COmxILAudioPort::SetParameter(aParamIndex,
+											 apComponentParameterStructure,
+											 aUpdateProcessingFunction);
+		}
+		};
+
+	return OMX_ErrorNone;
+
+	}
+
+
+OMX_ERRORTYPE
+COmxILPcmRendererAPB0Port::GetConfig(OMX_INDEXTYPE aConfigIndex,
+									 TAny* apComponentConfigStructure) const
+	{
+    DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::GetConfig"));
+
+	OMX_ERRORTYPE omxRetValue = OMX_ErrorNone;
+	switch(aConfigIndex)
+		{
+	case OMX_SymbianIndexConfigAudioPcmVolumeRamp:
+		{
+		if (OMX_ErrorNone !=
+			(omxRetValue =
+			 TOmxILUtil::CheckOmxStructSizeAndVersion(
+				 apComponentConfigStructure,
+				 sizeof(OMX_SYMBIAN_AUDIO_CONFIG_PCM_VOLUMERAMP))))
+			{
+			return omxRetValue;
+			}
+
+		OMX_SYMBIAN_AUDIO_CONFIG_PCM_VOLUMERAMP*
+			pPcmVolumeRamp
+			= static_cast<
+			OMX_SYMBIAN_AUDIO_CONFIG_PCM_VOLUMERAMP*>(
+				apComponentConfigStructure);
+
+		*pPcmVolumeRamp = iConfigVolumeRamp;
+		}
+		break;
+				
+	case OMX_IndexConfigAudioVolume:
+		{
+		if (OMX_ErrorNone !=
+			(omxRetValue =
+			 TOmxILUtil::CheckOmxStructSizeAndVersion(
+				 apComponentConfigStructure,
+				 sizeof(OMX_AUDIO_CONFIG_VOLUMETYPE))))
+			{
+			return omxRetValue;
+			}
+
+		OMX_AUDIO_CONFIG_VOLUMETYPE* pConfigVolume
+			= static_cast<OMX_AUDIO_CONFIG_VOLUMETYPE*>(
+				apComponentConfigStructure);
+
+		*pConfigVolume = iConfigAudioVolume;
+		}
+		break;
+
+	case OMX_IndexConfigAudioMute:
+		{
+		if (OMX_ErrorNone !=
+			(omxRetValue =
+			 TOmxILUtil::CheckOmxStructSizeAndVersion(
+				 apComponentConfigStructure,
+				 sizeof(OMX_AUDIO_CONFIG_MUTETYPE))))
+			{
+			return omxRetValue;
+			}
+
+		OMX_AUDIO_CONFIG_MUTETYPE* pConfigMute
+			= static_cast<OMX_AUDIO_CONFIG_MUTETYPE*>(
+				apComponentConfigStructure);
+
+		*pConfigMute = iConfigAudioMute;
+		}
+		break;
+
+	default:
+		{
+		// There's no need to try the parent indexes as we know there isn't any
+		// other config in the parent audio classes
+		return OMX_ErrorUnsupportedIndex;
+		}
+		};
+
+	return OMX_ErrorNone;
+
+	}
+
+OMX_ERRORTYPE
+COmxILPcmRendererAPB0Port::SetConfig(OMX_INDEXTYPE aConfigIndex,
+									 const TAny* apComponentConfigStructure,
+									 TBool& aUpdateProcessingFunction)
+	{
+    DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::SetConfig"));
+
+	aUpdateProcessingFunction = EFalse;
+
+	OMX_ERRORTYPE omxRetValue = OMX_ErrorNone;
+	switch(aConfigIndex)
+		{
+	case OMX_SymbianIndexConfigAudioPcmVolumeRamp:
+		{
+		if (OMX_ErrorNone !=
+			(omxRetValue =
+			 TOmxILUtil::CheckOmxStructSizeAndVersion(
+				 const_cast<OMX_PTR>(apComponentConfigStructure),
+				 sizeof(OMX_SYMBIAN_AUDIO_CONFIG_PCM_VOLUMERAMP))))
+			{
+			return omxRetValue;
+			}
+
+		const OMX_SYMBIAN_AUDIO_CONFIG_PCM_VOLUMERAMP*
+			pPcmVolumeRamp
+			= static_cast<
+			const OMX_SYMBIAN_AUDIO_CONFIG_PCM_VOLUMERAMP*>(
+				apComponentConfigStructure);
+
+		if (iConfigVolumeRamp.nRampDuration != pPcmVolumeRamp->nRampDuration)
+			{
+			// This is an indication to the PortManager that the processing
+			// function needs to get updated
+			aUpdateProcessingFunction = ETrue;
+
+			iConfigVolumeRamp.nRampDuration = pPcmVolumeRamp->nRampDuration;
+			}
+
+		}
+		break;
+		
+	case OMX_IndexConfigAudioVolume:
+		{
+		if (OMX_ErrorNone !=
+			(omxRetValue =
+			 TOmxILUtil::CheckOmxStructSizeAndVersion(
+				 const_cast<OMX_PTR>(apComponentConfigStructure),
+				 sizeof(OMX_AUDIO_CONFIG_VOLUMETYPE))))
+			{
+			return omxRetValue;
+			}
+
+		const OMX_AUDIO_CONFIG_VOLUMETYPE* pConfigVolume
+			= static_cast<const OMX_AUDIO_CONFIG_VOLUMETYPE*>(
+				apComponentConfigStructure);
+
+		// Set the new default values
+		if (iConfigAudioVolume.bLinear		  != pConfigVolume->bLinear			||
+			iConfigAudioVolume.sVolume.nValue != pConfigVolume->sVolume.nValue	||
+			iConfigAudioVolume.sVolume.nMin	  != pConfigVolume->sVolume.nMin	||
+			iConfigAudioVolume.sVolume.nMax	  != pConfigVolume->sVolume.nMax)
+			{
+			iConfigAudioVolume.bLinear		  = pConfigVolume->bLinear;
+			iConfigAudioVolume.sVolume.nValue = pConfigVolume->sVolume.nValue;
+			iConfigAudioVolume.sVolume.nMin	  = pConfigVolume->sVolume.nMin;
+			iConfigAudioVolume.sVolume.nMax	  = pConfigVolume->sVolume.nMax;
+			// This is an indication to the PortManager that the processing
+			// function needs to get updated
+			aUpdateProcessingFunction = ETrue;
+			}
+
+		}
+		break;
+	case OMX_IndexConfigAudioMute:
+		{
+		if (OMX_ErrorNone !=
+			(omxRetValue =
+			 TOmxILUtil::CheckOmxStructSizeAndVersion(
+				 const_cast<OMX_PTR>(apComponentConfigStructure),
+				 sizeof(OMX_AUDIO_CONFIG_MUTETYPE))))
+			{
+			return omxRetValue;
+			}
+
+		const OMX_AUDIO_CONFIG_MUTETYPE* pConfigMute
+			= static_cast<const OMX_AUDIO_CONFIG_MUTETYPE*>(
+				apComponentConfigStructure);
+
+		if (iConfigAudioMute.bMute != pConfigMute->bMute)
+			{
+			iConfigAudioMute.bMute = pConfigMute->bMute;
+			// This is an indication to the PortManager that the processing
+			// function needs to get updated
+			aUpdateProcessingFunction = ETrue;
+			}
+
+		}
+		break;
+	default:
+		{
+		// There's no need to try the parent indexes as we know there isn't any
+		// other config in the parent audio classes
+		return OMX_ErrorUnsupportedIndex;
+		}
+		};
+
+	return OMX_ErrorNone;
+	}
+
+OMX_ERRORTYPE
+COmxILPcmRendererAPB0Port::GetExtensionIndex(
+	OMX_STRING aParameterName,
+	OMX_INDEXTYPE* apIndexType) const
+	{
+    DEBUG_PRINTF(_L8("COmxILPcmRendererAPB0Port::GetExtensionIndex"));
+
+	TPtrC8 requestedParameterNamePtr(
+		const_cast<const TUint8*>(
+			reinterpret_cast<TUint8*>(aParameterName)));
+
+	TPtrC8 parameterNamePtr(
+		reinterpret_cast<const TUint8*>(sOmxSymbianPcmVolumeRamp));
+
+	if (requestedParameterNamePtr == parameterNamePtr)
+		{
+		*apIndexType =
+			static_cast<OMX_INDEXTYPE>(
+					OMX_SymbianIndexConfigAudioPcmVolumeRamp);
+			
+		return OMX_ErrorNone;
+		}
+
+	*apIndexType = OMX_IndexMax;
+	return OMX_ErrorUnsupportedIndex;
+	}