mmhais/a3fdevsoundcustomisation/src/devsoundadaptationinfo/devsoundadaptationinfoimplbody.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmhais/a3fdevsoundcustomisation/src/devsoundadaptationinfo/devsoundadaptationinfoimplbody.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,462 @@
+// Copyright (c) 2006-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:
+// devsoundadaptationinfoimpl.cpp
+//
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <e32std.h>
+#include <mmf/plugin/mmfplugininterfaceuids.hrh> // for KMmfUidPluginInterfaceHwDevice
+#include <mm/mmcleanup.h> 						//needed for CleanupResetAndDestroyPushL()
+#include "devsoundadaptationinfoimplbody.h"
+#include "devsoundadaptationinfoconsts.h"
+#include <a3f/mdevsoundadaptationinfoobserver.h>
+#include <a3f/audioformatuids.h>
+
+const TInt KHwDeviceDefaultDataLength= 9;
+
+
+//-------------------------------------------------------------------
+// 	CA3FDevSoundAdaptationInfoImpl::CA3FDevSoundAdaptationInfoImpl
+//	C++ default constructor.
+//-------------------------------------------------------------------
+//
+CA3FDevSoundAdaptationInfoImpl::CBody* CA3FDevSoundAdaptationInfoImpl::CBody::NewL(MA3FDevSoundAdaptationInfoObserver& aAdaptationInfoObserver, CFourCCConvertor& aFourCcConvertor)
+	{
+	CBody* self = new (ELeave) CBody;
+	CleanupStack::PushL(self);
+	self->ConstructL(aAdaptationInfoObserver, aFourCcConvertor);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+//-------------------------------------------------------------------
+// 	CA3FDevSoundAdaptationInfoImpl::CA3FDevSoundAdaptationInfoImpl
+//	C++ default constructor.
+//-------------------------------------------------------------------
+//
+CA3FDevSoundAdaptationInfoImpl::CBody::CBody(): CActive(EPriorityStandard)
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody()::CBody() *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	CActiveScheduler::Add(this);
+	DP_OUT();
+	}
+
+//----------------------------------------------------
+// 	CA3FDevSoundAdaptationInfoImpl::ConstructL
+// 	Symbian 2nd phase constructor can leave.
+//----------------------------------------------------
+//
+void CA3FDevSoundAdaptationInfoImpl::CBody::ConstructL(MA3FDevSoundAdaptationInfoObserver& aAdaptationInfoObserver, CFourCCConvertor& aFourCcConvertor)
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::ConstructL *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	iAdaptationInfoObserver = &aAdaptationInfoObserver;
+	iFourCcConvertor = &aFourCcConvertor;
+	DP_OUT();
+	}
+
+//--------------------------------------------------------------
+//	CA3FDevSoundAdaptationInfoImpl::~CA3FDevSoundAdaptationInfoImpl
+//	Destructor
+//--------------------------------------------------------------
+//
+CA3FDevSoundAdaptationInfoImpl::CBody::~CBody()
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::~CBody *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	DP_OUT();
+	}
+
+//---------------------------------------------------------
+// 	CA3FDevSoundAdaptationInfoImpl::CBody::RequestMaxGain
+// 	Retrieves Maximum Valid Gain/Volume
+//---------------------------------------------------------
+//
+TInt CA3FDevSoundAdaptationInfoImpl::CBody::RequestMaxGain(TUid aCodecType)
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::RequestMaxGain *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	
+	iCodecType = aCodecType;
+	iMaxGainRequested = ETrue;
+	
+	// Simulate an asyncronous response
+	if (!IsActive())
+		{
+		TRequestStatus* status = &iStatus;
+		User::RequestComplete(status, KErrNone);
+		SetActive();
+		}
+
+	DP0_RET(KErrNone, "%d");
+	}
+
+//-----------------------------------------------------
+// 	CA3FDevSoundAdaptationInfoImpl::CBody::RequestSupportedFormatsL
+//  Retrieves supported formats (in this version hwDevices).
+//-----------------------------------------------------
+//
+TInt CA3FDevSoundAdaptationInfoImpl::CBody::RequestSupportedFormats(TUid aCodecType, RArray<TUid>& aSupportedFormats)
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::RequestSupportedFormats *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	
+	TInt err=KErrNone;
+	
+	iCodecType = aCodecType;
+	
+	TRAP(err, ReadSupportedFormatsL(aCodecType, aSupportedFormats));
+	
+	if(err==KErrNone)
+		{
+		iFormatsRequested = ETrue;
+	
+		// Simulate an asyncronous response
+		if (!IsActive())
+			{
+			TRequestStatus* status = &iStatus;
+			User::RequestComplete(status, KErrNone);
+			SetActive();
+			}
+		}
+				
+	DP0_RET(err, "%d");
+	}
+
+
+TInt CA3FDevSoundAdaptationInfoImpl::CBody::Extension_(TUint aExtensionId, TAny*& aExtPtr, TAny*)
+	{
+	if (aExtensionId == KTruePauseCustomInterfaceTypeUid.iUid)
+		{
+		aExtPtr = static_cast<MTruePauseCustomInterface*>(this);
+		return KErrNone;
+		}
+	else
+		{
+		return CActive::Extension_(aExtensionId, aExtPtr, NULL);
+		}
+	}
+
+// from MTruePauseCustomInterface
+// ---------------------------------------------------------------------------
+// CA3FDevSoundAdaptationInfoImpl::CBody::IsResumeSupported
+// ---------------------------------------------------------------------------
+TBool CA3FDevSoundAdaptationInfoImpl::CBody::IsResumeSupported(TUid aCodecType, TUid aFormat)
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::IsTruePauseSupported *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+
+	
+	const TUid supportedDecoders [] = 
+		{
+		KUidFormatPCM16, 
+		KUidFormatPCMU16B, 
+		KUidFormatPCMU16,
+		KUidFormatPCM16B, 
+		KUidFormatPCM8, 
+		KUidFormatPCMU8, 
+		KUidFormatAlaw,
+		KUidFormatMulaw,
+		KUidFormatGSM610,
+		KUidFormatIMAADPCM,
+		KUidFormatTone,
+		KNullUid,  // Indicates end of array
+		};
+	
+	TBool supported = EFalse;
+
+	// PCM16 Encoder
+	if(aFormat == KUidFormatPCM16 && aCodecType == KUidAudioEncoder)
+		{
+		supported = ETrue;
+		}
+	// Only certain decoders
+	else if(aCodecType == KUidAudioDecoder)
+		{
+		TInt i = 0;
+		TUid supportedDecoderUid = supportedDecoders[i];
+		do
+			{
+			if (supportedDecoderUid == aFormat)
+				{
+				supported = ETrue;
+				break;
+				}
+			supportedDecoderUid = supportedDecoders[i++];
+			}
+		while(supportedDecoderUid != KNullUid);
+		}
+	DP0_RET(supported, "%d");
+	}
+
+//From CActive
+// ---------------------------------------------------------------------------
+// CA3FDevSoundAdaptationInfoImpl::CBody::RunL
+// ---------------------------------------------------------------------------
+void CA3FDevSoundAdaptationInfoImpl::CBody::RunL()
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::RunL *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	
+	TInt err = KErrNone;
+	
+	if(iMaxGainRequested)
+		{
+		
+		TInt maxgain = 0;
+	
+		if (iCodecType == KUidAudioDecoder)
+			{
+			maxgain = DevSoundAdaptationInfoConsts::MaxVolume();
+			}
+		else if (iCodecType == KUidAudioEncoder)
+			{
+			maxgain = DevSoundAdaptationInfoConsts::MaxGain();
+			}
+		else
+			{
+			err = KErrArgument;
+			}
+
+		iMaxGainRequested = EFalse;
+		
+		// Send the callback
+		iAdaptationInfoObserver->RequestMaxGainComplete(iCodecType, err, maxgain);
+		
+		}
+
+	if(iFormatsRequested)
+		{
+		err = KErrNone;
+	
+		if(iCodecType != KUidAudioDecoder && iCodecType != KUidAudioEncoder)
+			{
+			err = KErrArgument;
+			}
+
+		iFormatsRequested = EFalse;
+		
+		// Send the callback
+		iAdaptationInfoObserver->RequestSupportedFormatsComplete(iCodecType, err);
+		}
+
+	DP_OUT();
+	}
+
+// ---------------------------------------------------------------------------
+// CA3FDevSoundAdaptationInfoImpl::CBody::RunError
+// ---------------------------------------------------------------------------
+TInt CA3FDevSoundAdaptationInfoImpl::CBody::RunError(TInt aError)
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::RunError *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	DP0_RET(aError, "%d");
+	}
+
+// ---------------------------------------------------------------------------
+// CA3FDevSoundAdaptationInfoImpl::CBody::DoCancel
+// ---------------------------------------------------------------------------
+void CA3FDevSoundAdaptationInfoImpl::CBody::DoCancel()
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::DoCancel *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	DP_OUT();
+	}
+	
+// ---------------------------------------------------------------------------
+// CA3FDevSoundAdaptationInfoImpl::CBody::ReadSupportedFormats
+// ---------------------------------------------------------------------------
+void CA3FDevSoundAdaptationInfoImpl::CBody::ReadSupportedFormatsL(TUid aCodecType, RArray<TUid>& aSupportedFormats)
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::ReadSupportedFormatsL *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	
+	RArray<TFourCC> supportedDataTypes;
+	CleanupClosePushL(supportedDataTypes);
+	
+	SeekHwDevicePluginsL(supportedDataTypes, aCodecType);
+
+	TInt maxFourCCElements = supportedDataTypes.Count();
+		
+	//clear any existing data in iSupportedFormats array
+	aSupportedFormats.Reset();
+
+	for(TInt typeIndex=0; typeIndex<maxFourCCElements; typeIndex++)
+		{
+		TUid format;
+		
+		TInt error = iFourCcConvertor->FourCCToFormat(supportedDataTypes[typeIndex], format);
+		if(error == KErrNone)
+			{
+			aSupportedFormats.AppendL(format);
+			}
+		}
+				
+	CleanupStack::PopAndDestroy(&supportedDataTypes);
+	
+	DP_OUT();
+	}
+
+
+// -----------------------------------------------------------------------------
+// CA3FDevSoundAdaptationInfoImpl::SeekHwDevicePluginsL
+// This method looks for hwDevicePlugins that support the codec given in aCodecType
+// which must be either EMMFStatePlaying or EMMFStateRecording.
+// For each HwDevice plugin found the datatype as indicated by its fourCC code
+// from the default_data field in the resource file is added to the array of
+// aSupportedDataTypes
+// -----------------------------------------------------------------------------
+//
+void CA3FDevSoundAdaptationInfoImpl::CBody::SeekHwDevicePluginsL(
+	RArray<TFourCC>& aSupportedDataTypes,
+	TUid aCodecType)
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::SeekHwDevicePluginsL *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	
+	ASSERT(aCodecType == KUidAudioDecoder || aCodecType == KUidAudioEncoder);
+	
+	//clear any existing data in aSupportedDataTypes array
+	aSupportedDataTypes.Reset();
+
+	// Array to return hw device plugin resource info(place on cleanupstack
+	// _after_ ListImplementationsL() )
+	RImplInfoPtrArray plugInArray;
+	CleanupResetAndDestroyPushL(plugInArray);
+	
+	TUid KUidMmfHWPluginInterfaceCodec = {KMmfUidPluginInterfaceHwDevice};
+	
+	REComSession::ListImplementationsL(KUidMmfHWPluginInterfaceCodec, plugInArray);
+
+	TUint numberOfHwDevicePlugins = plugInArray.Count();
+
+	// if there are hwdevice plugin resource entries then scan entries
+	// matching on a datatype of pcm16 as the destination datatype for play and
+	// the source datatype for record. If a match is found and isn't already in
+	// the list of supported data types, then add it to the list
+	if (numberOfHwDevicePlugins > 0)
+		{
+		CImplementationInformation* hwDeviceResourceEntry = NULL;
+		_LIT8(KPCM16FourCCString, " P16");
+
+		// check each resource entry for dst 4CC = P16 for play and
+		// src 4CC = P16 for record
+		for (TUint hwDeviceEntry = 0; hwDeviceEntry<numberOfHwDevicePlugins; hwDeviceEntry++)
+			{
+			hwDeviceResourceEntry = plugInArray[hwDeviceEntry];
+			
+			TFourCC fourCCLeft;
+			TFourCC fourCCRight;
+			
+			ReadFourCC(hwDeviceResourceEntry, fourCCLeft, fourCCRight);
+
+			TFourCC fourCCPCM16(KPCM16FourCCString);		
+			
+			if(aCodecType == KUidAudioDecoder)
+				{
+				if(IsDataTypeMatch(fourCCPCM16, fourCCRight))
+					{
+					if(!FourCCExists(aSupportedDataTypes, fourCCLeft))
+						{
+						aSupportedDataTypes.AppendL(fourCCLeft);
+						}
+					}
+				}
+			else if (aCodecType == KUidAudioEncoder)
+				{
+				if(IsDataTypeMatch(fourCCPCM16, fourCCLeft))
+					{
+					if(!FourCCExists(aSupportedDataTypes, fourCCRight))
+						{
+						aSupportedDataTypes.AppendL(fourCCRight);
+						}
+					}	
+				}			
+			}
+		}
+
+	CleanupStack::PopAndDestroy(&plugInArray);
+	DP_OUT();
+	}
+
+// ---------------------------------------------------------------------------
+// CA3FDevSoundAdaptationInfoImpl::CBody::FourCCExists
+// ---------------------------------------------------------------------------
+TBool CA3FDevSoundAdaptationInfoImpl::CBody::FourCCExists(RArray<TFourCC>& aSupportedDataTypes, TFourCC aFourCCEntry)
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::FourCCExists *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	
+	TBool alreadyExists = EFalse;
+	
+	for (TUint fourCCEntryNumber=0; fourCCEntryNumber< aSupportedDataTypes.Count(); fourCCEntryNumber++)
+		{
+		if (aSupportedDataTypes[fourCCEntryNumber] == aFourCCEntry)
+			{
+			// we already have this 4CC in the supported data types
+			alreadyExists = ETrue;
+			break;
+			}
+		}
+		
+	DP0_RET(alreadyExists, "0x%x");
+	}
+
+// ---------------------------------------------------------------------------
+// CA3FDevSoundAdaptationInfoImpl::CBody::ReadFourCC
+// ---------------------------------------------------------------------------
+void CA3FDevSoundAdaptationInfoImpl::CBody::ReadFourCC(CImplementationInformation* aHwDeviceResourceEntry, TFourCC& aFourCCLeft, TFourCC& aFourCCRight)
+	{
+	DP_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::ReadFourCC *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	
+	TPtrC8 fourCCPtr(0,0);
+	
+	// Check for resource entry lenght since for HwDeviceAdaptor it is just "*"
+	if (aHwDeviceResourceEntry->DataType().Length()>=KHwDeviceDefaultDataLength)
+		{
+		// datatype supported 4CC is left 4 chars
+		fourCCPtr.Set(aHwDeviceResourceEntry->DataType().Left(KFOURCCLENGTH));
+	
+		aFourCCLeft.Set(fourCCPtr);
+
+		// datatype supported 4CC is right 4 chars
+		fourCCPtr.Set(aHwDeviceResourceEntry->DataType().Right(KFOURCCLENGTH));
+	
+		aFourCCRight.Set(fourCCPtr);
+		}
+
+	DP_OUT();
+	}
+	
+// -----------------------------------------------------------------------------
+// CA3FDevSoundAdaptationInfoImpl::IsDataTypeMatch
+// -----------------------------------------------------------------------------
+TBool CA3FDevSoundAdaptationInfoImpl::CBody::IsDataTypeMatch(TFourCC aFourCCPCM16,TFourCC aFourCC)
+	{
+	DP_STATIC_CONTEXT(CA3FDevSoundAdaptationInfoImpl::CBody::IsDataTypeMatch *CD1*, CtxDevSound, DPLOCAL);
+	DP_IN();
+	TBool match = EFalse;
+	
+	if(aFourCCPCM16 == aFourCC)
+		{
+		match = ETrue;
+		}
+
+	DP0_RET(match, "0x%x");
+	}
+
+// End of file