haitest/bspsvs/suite/bsp/sound/src/t_mdadevsounddata.cpp
changeset 0 cec860690d41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/haitest/bspsvs/suite/bsp/sound/src/t_mdadevsounddata.cpp	Tue Feb 02 01:39:10 2010 +0200
@@ -0,0 +1,1355 @@
+/*
+* Copyright (c) 2005-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:
+*
+*/
+
+/**
+@test
+@internalComponent
+
+This contains CT_MdaDevSoundData
+*/
+
+//	User includes
+#include "t_mdadevsounddata.h"
+#include "t_sounddriverserver.h"
+
+/*@{*/
+///	Parameters
+
+_LIT(KSoundFormatsSupportedObject,	"SoundFormatsSupportedObject");
+_LIT(KCurrentSoundFormatObject,		"CurrentSoundFormatObject");
+
+_LIT(KUUnit,						"unit");
+_LIT(KUUnitEnum,					"UnitEnum");
+_LIT(KUToFile,						"to_file");
+_LIT(KUBlockSize,					"block_size");
+_LIT(KUVersion,						"version");
+
+_LIT(KUFromFile,					"from_file");
+_LIT(KUDataSize,					"data_size");
+_LIT(KUVolumeExpected,				"volume_expected");
+_LIT(KUVolume,						"volume");
+_LIT(KUBytesPlayed,					"bytes_played");
+_LIT(KUCancel,						"cancel");
+_LIT(KUFlush,						"flush");
+
+_LIT(KUSoundLevel,					"sound_level");
+_LIT(KUSoundLevelExpected,			"sound_level_expected");
+
+_LIT(KUFileToDelete,				"file_to_delete");
+
+_LIT(KLDDName,						"ldd");
+_LIT(KPDDName,						"pdd");
+
+
+
+/*@{*/
+///	Commands
+_LIT(KCmdUtilityDeleteFile,			"utilityDeleteFile");
+
+_LIT(KCmdRecordData,				"RecordData");
+_LIT(KCmdCancelRecordData,			"CancelRecordData");
+_LIT(KCmdFlushRecordBuffer,			"FlushRecordBuffer");
+_LIT(KCmdRecordLevel,				"RecordLevel");
+_LIT(KCmdSetRecordLevel,			"SetRecordLevel");
+_LIT(KCmdNotifyRecordError,			"NotifyRecordError");
+_LIT(KCmdCancelNotifyRecordError,	"CancelNotifyRecordError");
+
+_LIT(KCmdPlayVolume,				"PlayVolume");
+_LIT(KCmdSetPlayVolume,				"SetPlayVolume");
+_LIT(KCmdPlayData,					"PlayData");
+_LIT(KCmdCancelPlayData,			"CancelPlayData");
+_LIT(KCmdFlushPlayBuffer,			"FlushPlayBuffer");
+_LIT(KCmdNotifyPlayError,			"NotifyPlayError");
+_LIT(KCmdCancelNotifyPlayError,		"CancelNotifyPlayError");
+
+_LIT(KCmdBytesPlayed,				"BytesPlayed");
+_LIT(KCmdResetBytesPlayed,			"ResetBytesPlayed");
+_LIT(KCmdPausePlayBuffer,			"PausePlayBuffer");
+_LIT(KCmdResumePlaying,				"ResumePlaying");
+
+_LIT(KCmdPlayFormatsSupported,		"PlayFormatsSupported");
+_LIT(KCmdGetPlayFormat,				"GetPlayFormat");
+_LIT(KCmdSetPlayFormat,				"SetPlayFormat");
+_LIT(KCmdRecordFormatsSupported,	"RecordFormatsSupported");
+_LIT(KCmdGetRecordFormat,			"GetRecordFormat");
+_LIT(KCmdSetRecordFormat,			"SetRecordFormat");
+
+_LIT(KCmdNew,						"new");
+_LIT(KCmdOpen,						"Open");
+_LIT(KCmdClose,						"Close");
+_LIT(KCmdDestructor,				"~");
+_LIT(KCmdIsMdaSound,				"IsMdaSound");
+_LIT(KCmdVersionRequired,			"VersionRequired");
+/*@}*/
+
+/**
+ * Two phase constructor
+ */
+CT_MdaDevSoundData* CT_MdaDevSoundData::NewL(RMdaDevSound* aServerStore)
+	{
+	CT_MdaDevSoundData*	ret = new (ELeave) CT_MdaDevSoundData(aServerStore);
+	CleanupStack::PushL(ret);
+	ret->ConstructL();
+	CleanupStack::Pop(ret);
+	return ret;	
+	}
+
+/**
+ * Protected constructor. First phase construction
+ */
+CT_MdaDevSoundData::CT_MdaDevSoundData(RMdaDevSound* aServerStore)
+	:iServerStore(aServerStore)
+	{
+	}
+
+/**
+* Protected constructor. Second phase construction
+*/
+void CT_MdaDevSoundData::ConstructL()
+	{
+	}
+
+/**
+ * Destructor.
+ */
+CT_MdaDevSoundData::~CT_MdaDevSoundData()
+	{	
+	DoCleanup();
+
+	iNotifyPlayError.ResetAndDestroy();
+	iNotifyRecordError.ResetAndDestroy();
+	iPlay.ResetAndDestroy();
+	iRecord.ResetAndDestroy();
+	}
+
+/**
+ * Contains cleanup implementation
+ */
+void CT_MdaDevSoundData::DoCleanup()
+	{
+	if(iMdaDevSound)
+		{
+		INFO_PRINTF1(_L("Deleting current RMdaDevSound"));
+		delete iMdaDevSound;
+		iMdaDevSound = NULL;
+		}
+	}
+
+/**
+ * Return a pointer to the object that the data wraps
+ *
+ * @return pointer to the object that the data wraps
+ */
+TAny* CT_MdaDevSoundData::GetObject()
+	{
+	return iMdaDevSound;
+	}
+
+/**
+ * Set the wrapped data object with new value
+ */
+void CT_MdaDevSoundData::SetObjectL( TAny* aAny )
+	{
+	DoCleanup();
+	iMdaDevSound = static_cast<RMdaDevSound*> ( aAny );
+	*iServerStore = *iMdaDevSound; 
+	}
+
+/**
+ * Clear the wrapped data object pointer w/o de-initialization
+ */
+void CT_MdaDevSoundData::DisownObjectL()
+	{
+	iMdaDevSound = NULL;
+	iServerStore->SetHandle(KNullHandle);
+	}
+
+/**
+ * Return static cleanup function
+ */
+inline TCleanupOperation CT_MdaDevSoundData::CleanupOperation()
+	{
+	return CleanupOperation;
+	}
+
+/**
+ * Static cleanup function
+ */
+void CT_MdaDevSoundData::CleanupOperation( TAny* aAny )
+	{
+	RMdaDevSound* sound = static_cast<RMdaDevSound*> ( aAny );
+	delete sound;
+	}
+
+/**
+ * Process a command read from the ini file
+ *
+ * @param aCommand	the command to process
+ * @param aSection		the entry in the ini file requiring the command to be processed
+ *
+ * @return ETrue if the command is processed
+ */
+TBool CT_MdaDevSoundData::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+	{
+	TBool	ret=ETrue;
+	if (aCommand == KCmdNew)
+		{
+		DoCmdNewL();
+		}
+	else if (aCommand == KCmdClose)
+		{
+		DoCmdClose();
+		}
+	else if (aCommand == KCmdDestructor)
+		{
+		DoCmdDestructor();
+		}
+	else if (aCommand == KCmdOpen)
+		{
+		DoCmdOpen(aSection);
+		}
+	else if (aCommand == KCmdIsMdaSound)
+		{
+		DoCmdIsMdaSound();
+		}
+	else if (aCommand == KCmdVersionRequired)
+		{
+		DoCmdVersionRequired(aSection);
+		}
+	else if (aCommand == KCmdPlayFormatsSupported)
+		{
+		DoCmdPlayFormatsSupportedL(aSection);
+		}
+	else if (aCommand == KCmdGetPlayFormat)
+		{
+		DoCmdGetPlayFormatL(aSection);
+		}
+	else if (aCommand == KCmdSetPlayFormat)
+		{
+		DoCmdSetPlayFormatL(aSection);
+		}
+	else if (aCommand == KCmdRecordFormatsSupported)
+		{
+		DoCmdRecordFormatsSupportedL(aSection);
+		}
+	else if (aCommand == KCmdGetRecordFormat)
+		{
+		DoCmdGetRecordFormatL(aSection);
+		}
+	else if (aCommand == KCmdSetRecordFormat)
+		{
+		DoCmdSetRecordFormatL(aSection);
+		}
+	else if (aCommand == KCmdPlayVolume)
+		{
+		DoCmdPlayVolume(aSection);
+		}
+	else if (aCommand == KCmdSetPlayVolume)
+		{
+		DoCmdSetPlayVolume(aSection);
+		}
+	else if (aCommand == KCmdPlayData)
+		{
+		DoCmdPlayDataL(aSection, aAsyncErrorIndex);
+		}
+	else if (aCommand == KCmdCancelPlayData)
+		{
+		DoCmdCancelPlayData();
+		}
+	else if (aCommand == KCmdFlushPlayBuffer)
+		{
+		DoCmdFlushPlayBuffer();
+		}
+	else if (aCommand == KCmdFlushPlayBuffer)
+		{
+		DoCmdNotifyPlayErrorL(aAsyncErrorIndex);
+		}
+	else if (aCommand == KCmdFlushPlayBuffer)
+		{
+		DoCmdCancelNotifyPlayError();
+		}
+	else if (aCommand == KCmdNotifyPlayError)
+		{
+		DoCmdNotifyPlayErrorL(aAsyncErrorIndex);
+		}
+	else if (aCommand == KCmdCancelNotifyPlayError)
+		{
+		DoCmdCancelNotifyPlayError();
+		}
+	else if (aCommand == KCmdBytesPlayed)
+		{
+		DoCmdBytesPlayed(aSection);
+		}
+	else if (aCommand == KCmdResetBytesPlayed)
+		{
+		DoCmdResetBytesPlayed();
+		}
+	else if (aCommand == KCmdPausePlayBuffer)
+		{
+		DoCmdPausePlayBuffer();
+		}
+	else if (aCommand == KCmdResumePlaying)
+		{
+		DoCmdResumePlaying();
+		}
+	else if (aCommand == KCmdRecordData)
+		{
+		DoCmdRecordDataL(aSection, aAsyncErrorIndex);
+		}
+	else if (aCommand == KCmdCancelRecordData)
+		{
+		DoCmdCancelRecordData();
+		}
+	else if (aCommand == KCmdFlushRecordBuffer)
+		{
+		DoCmdFlushRecordBuffer();
+		}
+	else if (aCommand == KCmdRecordLevel)
+		{
+		DoCmdRecordLevel(aSection);
+		}
+	else if (aCommand == KCmdSetRecordLevel)
+		{
+		DoCmdSetRecordLevel(aSection);
+		}
+	else if (aCommand == KCmdNotifyRecordError)
+		{
+		DoCmdNotifyRecordErrorL(aAsyncErrorIndex);
+		}
+	else if (aCommand == KCmdCancelNotifyRecordError)
+		{
+		DoCmdCancelNotifyRecordError();
+		}
+	else if (aCommand == KCmdUtilityDeleteFile)
+		{
+		DoCmdUtilityDeleteFileL(aSection);
+		}
+	else
+		{
+		ret=CDataWrapperBase::DoCommandL(aCommand, aSection, aAsyncErrorIndex);
+		}
+
+	return ret;
+	}
+
+/** 
+ * Creates new RMdaDevSound class instance 
+ */
+void CT_MdaDevSoundData::DoCmdNewL()
+	{
+	INFO_PRINTF1(_L("Create new RMdaDevSound class instance"));
+	
+	//Deletes previous RMdaDevsound class instance if it was already created.
+	DoCleanup();
+
+	// do create
+	TRAPD(err, iMdaDevSound = new (ELeave) RMdaDevSound());
+	if ( err!=KErrNone )
+		{
+		ERR_PRINTF2(_L("new error %d"), err);
+		SetError( err );
+		}
+	}
+
+/** 
+ * Close RMdaDevSound handle 
+ */
+void CT_MdaDevSoundData::DoCmdClose()
+	{
+	INFO_PRINTF1(_L("Closing RMdaDevSound"));
+	iServerStore->SetHandle(KNullHandle);
+	iMdaDevSound->Close();
+	}
+
+/** 
+ * Destroy RMdaDevSound the object 
+ */
+void CT_MdaDevSoundData::DoCmdDestructor()
+	{
+	INFO_PRINTF1(_L("Destroying the RMdaDevSound object"));
+	//close RMdaDevSound first
+	iServerStore->SetHandle(KNullHandle);
+	iMdaDevSound->Close();
+	DoCleanup();
+	}
+
+/** 
+ * Connects a client to the sound driver server 
+ * 
+ * @param aSection 			section name which contains unit
+ * 							KUUnit - unit to open
+ *
+ * @return					void
+ *
+ * @leave					no
+ */
+void CT_MdaDevSoundData::DoCmdOpen(const TDesC& aSection)
+	{
+	//Loading device drivers
+	TPtrC lddName;
+	TPtrC pddName;
+	if(GET_OPTIONAL_STRING_PARAMETER(KLDDName(), aSection, lddName) &&
+		GET_OPTIONAL_STRING_PARAMETER(KPDDName(), aSection, pddName))
+		{
+		TInt err = TSoundUtil::LoadSoundDrivers(lddName, pddName);	
+		if( (err != KErrNone) && (err != KErrAlreadyExists ))
+			{
+			ERR_PRINTF4(_L("Open() -> LoadSoundDrivers(%S, %S) error %d"), &lddName, &pddName, err);
+			SetError( err );		
+			}
+		}
+	//Finish Loading device drivers
+			
+	TInt	unit = KNullUnit;
+	TPtrC	unitName;
+	if (GET_OPTIONAL_STRING_PARAMETER(KUUnit(), aSection, unitName))
+		{
+		GetHexFromConfig(KUUnitEnum(), unitName, unit );
+		}
+	TInt err = iMdaDevSound->Open(unit);
+	*iServerStore = *iMdaDevSound;
+	INFO_PRINTF2(_L("Call Open(unit = %d)"), unit);
+	
+	if ( err!=KErrNone )
+		{
+		ERR_PRINTF2(_L("Open() error %d"), err);
+		SetError( err );
+		}		
+	}	
+	
+	
+	
+
+/** 
+ * Checks if driver is MdaSound
+ */
+void CT_MdaDevSoundData::DoCmdIsMdaSound()
+	{
+	INFO_PRINTF1(_L("CT_MdaDevSoundData::DoCmdIsMdaSound Called"));
+	
+	TInt err = iMdaDevSound->IsMdaSound();	
+	if(err!=KErrNone)
+		{
+		ERR_PRINTF2(_L("IsMdaSound() error %d"), err);
+		SetError(err);
+		}
+	
+	}
+
+/** 
+ * Checks driver version required
+ * 
+ * @param aSection 			section name with expected version
+ *							KUVersion - version expected
+ * 
+ * @return					void
+ *
+ * @leave					no
+ */
+void CT_MdaDevSoundData::DoCmdVersionRequired(const TDesC& aSection)
+	{
+	INFO_PRINTF1(_L("CT_MdaDevSoundData::VersionRequired Called"));
+	
+	TVersion version = iMdaDevSound->VersionRequired();
+	TPtrC versionNameFromSystem = version.Name();
+	TPtrC versionName;
+	if(GET_MANDATORY_STRING_PARAMETER(KUVersion(), aSection, versionName))
+		{
+		if(versionNameFromSystem != versionName)
+			{
+			ERR_PRINTF1(_L("iMdaDevSound->VersionRequired() != expected"));
+			ERR_PRINTF3(_L("version.Name()=%S, expected=%S"), &versionNameFromSystem, &versionName);
+			SetBlockResult(EFail);
+			}
+		else
+			{
+			INFO_PRINTF1(_L("iMdaDevSound->VersionRequired() == expected"));
+			}
+		}
+	
+	}
+
+/** 
+ * Gets PlayFormatsSupported
+ * 
+ * @param aSection 			Section name which contains SoundFormatsSupported 
+ * 							object name
+ *  						KSoundFormatsSupportedObject - SoundFormatsSupported 
+ * 							object name
+ *
+ * @return					void
+ *
+ * @leave					System wide error
+ */
+void CT_MdaDevSoundData::DoCmdPlayFormatsSupportedL(const TDesC& aSection)
+	{	
+	INFO_PRINTF1(_L("Getting PlayFormatsSupported!"));
+	
+	TPtrC		objectName;	
+	if (GET_MANDATORY_STRING_PARAMETER(KSoundFormatsSupportedObject, aSection, objectName))
+		{		
+		RMdaDevSound::TSoundFormatsSupported* soundFormat = static_cast<RMdaDevSound::TSoundFormatsSupported*>(GetDataObjectL(objectName));		
+		RMdaDevSound::TSoundFormatsSupportedBuf soundFormatsSupportedBuf(*soundFormat);		
+		iMdaDevSound->PlayFormatsSupported(soundFormatsSupportedBuf);		
+		*soundFormat = soundFormatsSupportedBuf();		
+		}		
+	}
+
+/** 
+ * Gets current PlayFormat
+ * 
+ * @param aSection 			Section name which contains CurrentSoundFormat 
+ * 							object name
+ *  						KCurrentSoundFormatObject - CurrentSoundFormat 
+ * 							object name
+ *
+ * @return					void
+ *
+ * @leave					System wide error
+ */
+void CT_MdaDevSoundData::DoCmdGetPlayFormatL(const TDesC& aSection)
+	{
+	INFO_PRINTF1(_L("Getting PlayFormat!"));
+	
+	TPtrC		objectName;	
+	if (GET_MANDATORY_STRING_PARAMETER(KCurrentSoundFormatObject, aSection, objectName))
+		{		
+		RMdaDevSound::TCurrentSoundFormat* soundFormat = static_cast<RMdaDevSound::TCurrentSoundFormat*>(GetDataObjectL(objectName));		
+		RMdaDevSound::TCurrentSoundFormatBuf currentSoundFormatBuf(*soundFormat);		
+		iMdaDevSound->GetPlayFormat(currentSoundFormatBuf);		
+		*soundFormat = currentSoundFormatBuf();
+		}		
+	}
+
+/** 
+ * Sets current PlayFormat
+ * 
+ * @param aSection 			Section name which contains CurrentSoundFormat 
+ * 							object name
+ * 							KCurrentSoundFormatObject - CurrentSoundFormat 
+ * 							object name
+ *
+ * @return					void
+ *
+ * @leave					System wide error
+ */
+void CT_MdaDevSoundData::DoCmdSetPlayFormatL(const TDesC& aSection)
+	{
+	INFO_PRINTF1(_L("Setting PlayFormat!"));
+	
+	TPtrC		objectName;	
+	if (GET_MANDATORY_STRING_PARAMETER(KCurrentSoundFormatObject, aSection, objectName))
+		{		
+		RMdaDevSound::TCurrentSoundFormat* soundFormat = static_cast<RMdaDevSound::TCurrentSoundFormat*>(GetDataObjectL(objectName));		
+		RMdaDevSound::TCurrentSoundFormatBuf currentSoundFormatBuf(*soundFormat);		
+		TInt err = iMdaDevSound->SetPlayFormat(currentSoundFormatBuf);
+		if(err != KErrNone)
+			{
+			ERR_PRINTF2(_L("error in SetPlayFormatL %d"), err);
+			SetError( err );
+			}
+		else
+			{
+			*soundFormat = currentSoundFormatBuf();
+			}
+		}
+	}
+
+/** 
+ * Gets RecordFormatsSupported
+ * 
+ * @param aSection 			Section name which contains SoundFormatsSupported 
+ * 							object name
+ * 							KSoundFormatsSupportedObject - SoundFormatsSupported 
+ * 							object name
+ *
+ * @return					void
+ *
+ * @leave					System wide error
+ */
+void CT_MdaDevSoundData::DoCmdRecordFormatsSupportedL(const TDesC& aSection)
+	{
+	INFO_PRINTF1(_L("Getting RecordFormatsSupported!"));
+
+	TPtrC		objectName;
+	if (GET_MANDATORY_STRING_PARAMETER(KSoundFormatsSupportedObject, aSection, objectName))
+		{		
+		RMdaDevSound::TSoundFormatsSupported* soundFormat = static_cast<RMdaDevSound::TSoundFormatsSupported*>(GetDataObjectL(objectName));		
+		RMdaDevSound::TSoundFormatsSupportedBuf soundFormatsSupportedBuf(*soundFormat);		
+		iMdaDevSound->RecordFormatsSupported(soundFormatsSupportedBuf);		
+		*soundFormat = soundFormatsSupportedBuf();		
+		}
+	}
+
+/** 
+ * Gets current RecordFormat
+ * 
+ * @param aSection 			Section name which contains CurrentSoundFormat 
+ * 							object name
+ *  						KCurrentSoundFormatObject - CurrentSoundFormat 
+ * 							object name
+ *
+ * @return					void
+ *
+ * @leave					System wide error
+ */
+void CT_MdaDevSoundData::DoCmdGetRecordFormatL(const TDesC& aSection)
+	{
+	INFO_PRINTF1(_L("Getting RecordFormat!"));
+	
+	TPtrC		objectName;	
+	if (GET_MANDATORY_STRING_PARAMETER(KCurrentSoundFormatObject, aSection, objectName))
+		{		
+		RMdaDevSound::TCurrentSoundFormat* soundFormat = static_cast<RMdaDevSound::TCurrentSoundFormat*>(GetDataObjectL(objectName));		
+		RMdaDevSound::TCurrentSoundFormatBuf currentSoundFormatBuf(*soundFormat);		
+		iMdaDevSound->GetRecordFormat(currentSoundFormatBuf);		
+		*soundFormat = currentSoundFormatBuf();
+		}
+	}
+
+/** 
+ * Sets current RecordFormat
+ * 
+ * @param aSection 			Section name which contains CurrentSoundFormat 
+ * 							object name
+ * 							KCurrentSoundFormatObject - CurrentSoundFormat 
+ * 							object name
+ *
+ * @return					void
+ *
+ * @leave					System wide error
+ */
+void CT_MdaDevSoundData::DoCmdSetRecordFormatL(const TDesC& aSection)
+	{
+	INFO_PRINTF1(_L("Setting RecordFormat!"));
+	
+	TPtrC		objectName;	
+	if (GET_MANDATORY_STRING_PARAMETER(KCurrentSoundFormatObject, aSection, objectName))
+		{		
+		RMdaDevSound::TCurrentSoundFormat* soundFormat = static_cast<RMdaDevSound::TCurrentSoundFormat*>(GetDataObjectL(objectName));		
+		RMdaDevSound::TCurrentSoundFormatBuf currentSoundFormatBuf(*soundFormat);		
+		TInt err = iMdaDevSound->SetRecordFormat(currentSoundFormatBuf);
+		if(err != KErrNone)
+			{
+			ERR_PRINTF2(_L("error in SetRecordFormatL %d"), err);
+			SetError( err );
+			}
+		else
+			{
+			*soundFormat = currentSoundFormatBuf();
+			}
+		}
+	}
+
+/** 
+ * Gets current PlayVolume
+ * 
+ * @param aSection 			Section name which contains expected value
+ * 							KUVolumeExpected - expected volume level
+ *
+ * @return					void
+ *
+ * @leave					no
+ */
+void	CT_MdaDevSoundData::DoCmdPlayVolume(const TDesC& aSection)
+	{
+	TInt volume = 0;
+	INFO_PRINTF2(_L("calling PlayVolume(), value before execution = %d"), volume);
+	volume = iMdaDevSound->PlayVolume();
+	
+	TInt	expected;
+	if (GET_OPTIONAL_INT_PARAMETER(KUVolumeExpected(), aSection, expected))
+		{
+		if(volume != expected)
+			{
+			ERR_PRINTF3(_L("Expected result != volume, expected = %d, volume = %d"),
+							expected, volume);
+			SetBlockResult(EFail);
+			}
+		else
+			{
+			INFO_PRINTF2(_L("volume = %d"), volume);
+			}
+		}
+	else
+		{
+		INFO_PRINTF2(_L("volume = %d"), volume);
+		}
+	}
+
+/** 
+ * Sets current PlayVolume
+ * 
+ * @param aSection 			Section name which contains value to set
+ * 							KUVolume - volume to set
+ *
+ * @return					void
+ *
+ * @leave					no
+ */
+void	CT_MdaDevSoundData::DoCmdSetPlayVolume(const TDesC& aSection)
+	{
+	TInt volume = 0;
+	INFO_PRINTF2(_L("calling SetPlayVolume(), value before execution = %d"), volume);
+	if (GET_OPTIONAL_INT_PARAMETER(KUVolume(), aSection, volume))
+		{
+		iMdaDevSound->SetPlayVolume(volume);
+		INFO_PRINTF2(_L("after execution value = %d"), volume);
+		}
+	else
+		{
+		INFO_PRINTF2(_L("volume after execution = %d"), volume);
+		}
+	}
+
+/** 
+ * Play audio from file. DoCmdPlayDataL is asynchronous function
+ * 
+ * @param aSection 			Section name which can contain values to set
+ * 							KUDataSize - data size, 
+ * 							KUFromFile - file name to play, 
+ * 							KUBlockSize - block size
+ * 							
+ *
+ * @return					void
+ *
+ * @leave					System wide error
+ */
+void	CT_MdaDevSoundData::DoCmdPlayDataL(const TDesC& aSection, 
+											const TInt aAsyncErrorIndex)
+	{
+	INFO_PRINTF1(_L("calling PlayData()"));
+	
+	CT_SoundActiveCallback* active = CT_SoundActiveCallback::NewL(*this);
+	iPlay.Append(active);
+		
+	active->iSoundData = new(ELeave) TSoundUtil::RAudioBuffer();
+	TSoundUtil::RAudioBuffer* soundData = active->iSoundData;
+
+	TInt dataSize = TSoundUtil::KAudioBufferMaxSize;
+	GET_OPTIONAL_INT_PARAMETER(KUDataSize, aSection, dataSize);
+	soundData->Close();
+	soundData->CreateL(dataSize);
+
+	TPtrC	fileName;
+	TInt err = KErrNone;
+	if (GET_OPTIONAL_STRING_PARAMETER(KUFromFile, aSection, fileName))
+		{
+		err = soundData->LoadAudioDataL(fileName);
+		if (err)
+			{
+			SetBlockResult(EFail);
+			ERR_PRINTF2(_L("Audio file loading failed with error code %d"), err);
+			}
+		}
+
+	if (!err)
+		{
+		active->SetSection(aSection);
+		IncOutstanding();
+
+		TInt blockSize = TSoundUtil::KDefaultBlockSize;
+		GET_OPTIONAL_INT_PARAMETER(KUBlockSize, aSection, blockSize);
+		blockSize = Min(blockSize, soundData->Length());
+		active->iBufferBlock.Set(&soundData->operator[](0), blockSize, blockSize);
+		iMdaDevSound->PlayData(active->iStatus, active->iBufferBlock);
+		active->Activate(aAsyncErrorIndex);
+		TBool stopPlay = EFalse;
+		if (GET_OPTIONAL_BOOL_PARAMETER(KUCancel, aSection, stopPlay))
+			{
+			if ( stopPlay )
+				{
+				iMdaDevSound->CancelPlayData();
+				INFO_PRINTF1(_L("CancelPlayData() executed"));
+				}
+			}
+		if (GET_OPTIONAL_BOOL_PARAMETER(KUFlush, aSection, stopPlay))
+			{
+			if ( stopPlay )
+				{
+				iMdaDevSound->FlushPlayBuffer();
+				INFO_PRINTF1(_L("FlushPlayBuffer() executed"));
+				}
+			}
+		}
+	}
+
+/** 
+ * Cancel playing
+ */
+void	CT_MdaDevSoundData::DoCmdCancelPlayData()
+	{
+	INFO_PRINTF1(_L("calling CancelPlayData()"));
+	
+	if (iPlay.Count() > 0)
+		{
+		INFO_PRINTF2(_L("CancelPlayData called on active object with iStatus == %d"),
+				iPlay[iPlay.Count() - 1]->iStatus.Int());
+		}
+	else
+		{
+		INFO_PRINTF1(_L("No active objects found"));
+		}
+	
+	iMdaDevSound->CancelPlayData();
+	}
+
+/** 
+ * Flush play buffer
+ */
+void	CT_MdaDevSoundData::DoCmdFlushPlayBuffer()
+	{
+	INFO_PRINTF1(_L("calling FlushPlayBuffer()"));
+
+	if (iPlay.Count() > 0)
+		{
+		INFO_PRINTF2(_L("FLushPlayBuffer called on active object with iStatus == %d"),
+				iPlay[iPlay.Count() - 1]->iStatus.Int());
+		}
+	else
+		{
+		INFO_PRINTF1(_L("No active objects found"));
+		}
+	
+	iMdaDevSound->FlushPlayBuffer();
+	}
+
+/** 
+ * Asynchronous function that starts notifying play error
+ */
+void	CT_MdaDevSoundData::DoCmdNotifyPlayErrorL(const TInt aAsyncErrorIndex)
+	{
+	INFO_PRINTF1(_L("calling NotifyPlayError()"));
+	
+	CActiveCallback* active = CActiveCallback::NewL(*this);
+	iNotifyPlayError.Append(active);
+	iMdaDevSound->NotifyPlayError(active->iStatus);
+		
+	//acitvate callback object
+	active->Activate(aAsyncErrorIndex);
+	IncOutstanding();
+	}
+
+/** 
+ * Cancel notifying play error
+ */
+void	CT_MdaDevSoundData::DoCmdCancelNotifyPlayError()
+	{
+	INFO_PRINTF1(_L("calling CancelNotifyPlayError()"));
+	
+	iMdaDevSound->CancelNotifyPlayError();
+	}
+
+/** 
+ * Gets bytes played
+ * 
+ * @param aSection 			Section name which can contain expected value
+ * 							KUBytesPlayed - bytes played
+ *
+ * @return					void
+ *
+ * @leave					no
+ */
+void	CT_MdaDevSoundData::DoCmdBytesPlayed(const TDesC& aSection)
+	{
+	INFO_PRINTF1(_L("calling BytesPlayed()"));
+	
+	TInt bytesPlayed = iMdaDevSound->BytesPlayed();
+	INFO_PRINTF2(_L("Bytes played: %d"), bytesPlayed);
+
+	TInt expected = 0;
+	if (GET_OPTIONAL_INT_PARAMETER(KUBytesPlayed, aSection, expected))
+		{
+		if (expected != bytesPlayed)
+			{
+			ERR_PRINTF3(_L("Bytes played %d != %d expected"), bytesPlayed, expected);
+			SetBlockResult(EFail);
+			}
+		}
+	}
+
+/** 
+ * Resets bytes played
+ */
+void	CT_MdaDevSoundData::DoCmdResetBytesPlayed()
+	{
+	INFO_PRINTF1(_L("calling ResetBytesPlayed()"));
+	
+	iMdaDevSound->ResetBytesPlayed();
+	}
+
+/** 
+ * Pause playing
+ */
+void	CT_MdaDevSoundData::DoCmdPausePlayBuffer()
+	{
+	INFO_PRINTF1(_L("calling PausePlayBuffer()"));
+	
+	iMdaDevSound->PausePlayBuffer();
+	}
+
+/** 
+ * Resume playing
+ */
+void	CT_MdaDevSoundData::DoCmdResumePlaying()
+	{
+	INFO_PRINTF1(_L("calling ResumePlaying()"));
+	
+	iMdaDevSound->ResumePlaying();		
+	}
+
+/** 
+ * DoCmdRecordDataL is asynchronous function to record audio.
+ * 
+ * @param aSection 			Section name which can contain value to set
+ * 							KUDataSize - data size to record, 
+ * 							KUToFile - file to record audio,
+ * 							KUBlockSize - block size
+ *
+ * @return					void
+ *
+ * @leave					System wide error
+ */
+void CT_MdaDevSoundData::DoCmdRecordDataL(const TDesC& aSection, const TInt aAsyncErrorIndex)
+	{
+	INFO_PRINTF1(_L("calling RecordData()"));	
+	
+	CT_SoundActiveCallback* active = CT_SoundActiveCallback::NewL(*this);
+	iRecord.Append(active);
+	
+	active->iSoundData = new(ELeave) TSoundUtil::RAudioBuffer();
+	TSoundUtil::RAudioBuffer* soundData = active->iSoundData;
+
+	TInt dataSize = TSoundUtil::KAudioBufferMaxSize;
+	GET_OPTIONAL_INT_PARAMETER(KUDataSize, aSection, dataSize);
+	soundData->Close();
+	soundData->CreateL(dataSize);
+	soundData->SetLength(dataSize);
+
+	TInt blockSize = TSoundUtil::KDefaultBlockSize;
+	GET_OPTIONAL_INT_PARAMETER(KUBlockSize, aSection, blockSize);
+	active->iBufferBlock.Set(&soundData->operator[](0), 0, Min(blockSize, soundData->Length()));
+	iMdaDevSound->RecordData(active->iStatus, active->iBufferBlock);
+
+	active->SetSection(aSection);
+	IncOutstanding();
+	active->Activate(aAsyncErrorIndex);
+	TBool stopRecord = EFalse;
+	if (GET_OPTIONAL_BOOL_PARAMETER(KUCancel, aSection, stopRecord))
+		{
+		if ( stopRecord )
+			{
+			iMdaDevSound->CancelPlayData();
+			INFO_PRINTF1(_L("CancelRecordData() executed"));
+			}
+		}
+	if (GET_OPTIONAL_BOOL_PARAMETER(KUFlush, aSection, stopRecord))
+		{
+		if ( stopRecord )
+			{
+			iMdaDevSound->FlushRecordBuffer();
+			INFO_PRINTF1(_L("FlushRecordBuffer() executed"));
+			}
+		}
+	}
+
+/** 
+ * Cancels recording in progress
+ */
+void CT_MdaDevSoundData::DoCmdCancelRecordData()
+	{
+	INFO_PRINTF1(_L("calling CancelRecordData()"));
+	
+	if (iRecord.Count() > 0)
+		{
+		INFO_PRINTF2(_L("CancelRecordData called on active object with iStatus == %d"),
+				iRecord[iRecord.Count() - 1]->iStatus.Int());
+		}
+	else
+		{
+		INFO_PRINTF1(_L("No active objects found"));
+		}
+	
+	iMdaDevSound->CancelRecordData();
+	}
+
+/** 
+ * Flushes record buffer
+ */
+void CT_MdaDevSoundData::DoCmdFlushRecordBuffer()
+	{
+	INFO_PRINTF1(_L("calling FlushRecordBuffer()"));
+	
+	if (iRecord.Count() > 0)
+		{
+		INFO_PRINTF2(_L("FlushRecordBuffer called on active object with iStatus == %d"),
+				iRecord[iRecord.Count() - 1]->iStatus.Int());
+		}
+	else
+		{
+		INFO_PRINTF1(_L("No active objects found"));
+		}
+	
+	iMdaDevSound->FlushRecordBuffer();
+	}
+
+/** 
+ * Gets record volume level
+ * 
+ * @param aSection 			Section name which can contain expected value
+ * 							KUSoundLevelExpected - expected sound level
+ *
+ * @return					void
+ *
+ * @leave					no
+ */
+void CT_MdaDevSoundData::DoCmdRecordLevel(const TDesC& aSection)
+	{	
+	TInt level = 0;
+	INFO_PRINTF1(_L("calling RecordLevel()"));
+	level = iMdaDevSound->RecordLevel();
+	
+	TInt	expected;
+	if (GET_OPTIONAL_INT_PARAMETER(KUSoundLevelExpected(), aSection, expected))
+		{
+		if(level != expected)
+			{
+			ERR_PRINTF3(_L("Expected result != level, expected = %d, level = %d"),
+							expected, level);
+			SetBlockResult(EFail);
+			}
+		else
+			{
+			INFO_PRINTF2(_L("level = %d"), level);
+			}
+		}
+	else
+		{
+		INFO_PRINTF2(_L("level = %d"), level);
+		}
+	}
+
+/** 
+ * Sets record volume level
+ * 
+ * @param aSection 			Section name which can contain value to set
+ * 							KUSoundLevel - sound level to set
+ *
+ * @return					void
+ *
+ * @leave					no
+ */
+void CT_MdaDevSoundData::DoCmdSetRecordLevel(const TDesC& aSection)
+	{
+	TInt level = 0;
+	INFO_PRINTF2(_L("calling SetRecordLevel(), level before execution = %d"), level);
+	
+	if(GET_OPTIONAL_INT_PARAMETER(KUSoundLevel, aSection, level))
+		{
+		iMdaDevSound->SetRecordLevel(level);
+		INFO_PRINTF2(_L("after execution level = %d"), level);
+		}	
+	else
+		{
+		INFO_PRINTF2(_L("level after execution = %d"), level);
+		}
+	}
+
+/** 
+ * DoCmdNotifyRecordErrorL is asynchronous function that starts notifying recording
+ * error
+ */
+void CT_MdaDevSoundData::DoCmdNotifyRecordErrorL(const TInt aAsyncErrorIndex)
+	{
+	INFO_PRINTF1(_L("calling NotifyRecordError()"));
+	
+	CActiveCallback* active = CActiveCallback::NewL(*this);
+	iNotifyRecordError.Append(active);
+	
+	iMdaDevSound->NotifyRecordError(active->iStatus);
+	
+	//acitvate callback object
+	active->Activate(aAsyncErrorIndex);
+	IncOutstanding();	
+	}
+
+/** 
+ * Cancels notifying recording error
+ */
+void CT_MdaDevSoundData::DoCmdCancelNotifyRecordError()
+	{
+	INFO_PRINTF1(_L("calling CancelNotifyRecordError()"));
+	
+	iMdaDevSound->CancelNotifyRecordError();
+	}
+
+/** 
+ * Deletes file specified
+ * 
+ * @param aSection 			Section name which contains file name to delete
+ * 							KUFileToDelete - File to delete 
+ *
+ * @return					void
+ *
+ * @leave					System wide error
+ */
+void CT_MdaDevSoundData::DoCmdUtilityDeleteFileL(const TDesC& aSection)
+	{
+	INFO_PRINTF1(_L("DoCmdUtilityDeleteFileL called!"));
+	
+	TPtrC	file;	
+	if (GET_MANDATORY_STRING_PARAMETER(KUFileToDelete, aSection, file))
+		{
+		TInt err;
+		err = TSoundUtil::DeleteFileL(file);
+		if(err != KErrNone)
+			{
+			ERR_PRINTF2(_L("Deleting file failed with error code %d"), err);
+			SetBlockResult(EFail);
+			}
+		else
+			{
+			INFO_PRINTF1(_L("File deleted successfully"));
+			}
+		}
+	}
+
+/** 
+ * Handle asynchronous events here
+ */
+void CT_MdaDevSoundData::RunL(CActive* aActive, TInt aIndex)
+	{
+	INFO_PRINTF1(_L("CT_MdaDevSoundData::RunL Called"));
+	TBool	foundActiveObject = EFalse;
+	TInt	index=0;
+	TInt	count=0;
+	TBool	completed=ETrue;
+
+	// See if it is in iNotifyPlayError
+	count=iNotifyPlayError.Count();
+	for( index=0; (index<count) && (!foundActiveObject); ++index )
+ 		{
+ 		if( aActive == iNotifyPlayError[index] )
+			{
+			INFO_PRINTF1(_L("RunL iNotifyPlayError called"));
+			foundActiveObject = ETrue;
+			iNotifyPlayError.Remove(index);
+	 		}
+		}
+
+	// See if it is in iNotifyRecordError
+	count=iNotifyRecordError.Count();
+	for( index=0; (index<count) && (!foundActiveObject); ++index )
+ 		{
+ 		if( aActive == iNotifyRecordError[index] )
+			{
+			INFO_PRINTF1(_L("RunL iNotifyRecordError called"));
+			foundActiveObject = ETrue;
+			iNotifyRecordError.Remove(index);
+	 		}
+		}
+
+	// See if it is in iPlay
+	count=iPlay.Count();
+	for( index=0; (index<count) && (!foundActiveObject); ++index )
+ 		{
+ 		if( aActive == iPlay[index] )
+			{
+			foundActiveObject = ETrue;
+			INFO_PRINTF1(_L("RunL iPlay called"));
+			
+			TSoundUtil::RAudioBuffer* soundData = iPlay[index]->iSoundData;
+
+			iPlay[index]->iDataPosition += iPlay[index]->iBufferBlock.Length();
+			INFO_PRINTF3(_L("Played %d bytes, %d bytes played total"), iPlay[index]->iBufferBlock.Length(),
+					iPlay[index]->iDataPosition);
+
+			if ( ( iPlay[index]->iDataPosition >= soundData->Length() ) || aActive->iStatus.Int() )
+				{
+				iPlay.Remove(index);
+				}
+			else
+				{
+				TInt blockSize = TSoundUtil::KDefaultBlockSize;
+				GET_OPTIONAL_INT_PARAMETER(KUBlockSize, *(iPlay[index]->iSection), blockSize);
+				blockSize = Min(blockSize, soundData->Length() - iPlay[index]->iDataPosition);
+				iPlay[index]->iBufferBlock.Set(&soundData->operator[](iPlay[index]->iDataPosition), blockSize, blockSize);
+				iMdaDevSound->PlayData(iPlay[index]->iStatus, iPlay[index]->iBufferBlock);
+				iPlay[index]->Activate(aIndex);
+				completed = EFalse;
+				}
+	 		}
+		}
+
+	// See if it is in iRecord
+	count=iRecord.Count();
+	for( index=0; (index<count) && (!foundActiveObject); ++index )
+ 		{
+ 		if( aActive == iRecord[index] )
+			{
+			foundActiveObject = ETrue;	
+			INFO_PRINTF1(_L("RunL iRecord called"));
+			iRecord[index]->iDataPosition += iRecord[index]->iBufferBlock.Length();
+			INFO_PRINTF3(_L("Stored %d bytes, %d bytes total"),
+					iRecord[index]->iBufferBlock.Length(),
+					iRecord[index]->iDataPosition);
+
+			TSoundUtil::RAudioBuffer* buffer = iRecord[index]->iSoundData;
+				
+			TInt	err = aActive->iStatus.Int();
+			if( err == KErrNone )
+				{				
+				if(iRecord[index]->iDataPosition >= buffer->Length() ||
+						iRecord[index]->iBufferBlock.Length() == 0)
+					{
+					TPtrC fileName;
+					if(GET_OPTIONAL_STRING_PARAMETER(KUToFile, *(iRecord[index]->iSection), fileName))
+						{
+						TInt err;
+						err = buffer->SaveAudioDataL(fileName);
+						if (err)
+							{
+							SetBlockResult(EFail);
+							ERR_PRINTF2(_L("Saving to file failed with error code %d"), err);
+							}
+						}		
+					iRecord.Remove(index);
+					}				
+				else
+					{
+					TInt blockSize = TSoundUtil::KDefaultBlockSize;
+					//if specified in INI file get block size
+					GET_OPTIONAL_INT_PARAMETER(KUBlockSize, *(iRecord[index]->iSection), blockSize);
+					iRecord[index]->iBufferBlock.Set(&buffer->operator[](iRecord[index]->iDataPosition), 0, Min(blockSize, buffer->Length() - iRecord[index]->iDataPosition));
+					iMdaDevSound->RecordData(iRecord[index]->iStatus, iRecord[index]->iBufferBlock);
+					iRecord[index]->Activate(aIndex);
+					completed = EFalse;
+					}
+				}//err == KErrNone
+			else
+				{
+				iRecord.Remove(index);
+				}					
+			}//aActive == iRecord[index]
+		}//for
+	
+ 	if( foundActiveObject )
+ 		{
+		if ( completed )
+			{						
+			if (aActive)
+				{
+				TInt	err = aActive->iStatus.Int();
+				if( err != KErrNone )
+					{
+					ERR_PRINTF2(_L("RunL Error %d"), err);
+					SetAsyncError( aIndex, err );
+					}
+				}
+
+			// Reset the outstanding request state
+			delete aActive;
+			DecOutstanding();
+			}
+		}
+ 	else
+ 		{
+ 		ERR_PRINTF1(_L("An unchecked active object completed"));
+ 		SetBlockResult(EFail);
+ 		}
+	}
+
+/** 
+ * Cancels asynchronous events
+ */
+void CT_MdaDevSoundData::DoCancel(CActive* aActive, TInt aIndex)
+	{
+	TBool	foundActiveObject = EFalse;
+
+	TInt	index=0;
+	TInt	count=0;
+
+	// See if it is in iNotifyPlayError
+	count=iNotifyPlayError.Count();
+	for( index=0; (index<count) && (!foundActiveObject); ++index )
+ 		{
+ 		if( aActive == iNotifyPlayError[index] )
+			{
+			INFO_PRINTF1(_L("DoCancel iNotifyPlayError called"));
+			foundActiveObject = ETrue;
+			iNotifyPlayError.Remove(index);
+	 		}
+		}
+
+	// See if it is in iNotifyRecordError
+	count=iNotifyRecordError.Count();
+	for( index=0; (index<count) && (!foundActiveObject); ++index )
+ 		{
+ 		if( aActive == iNotifyRecordError[index] )
+			{
+			INFO_PRINTF1(_L("DoCancel iNotifyRecordError called"));
+			foundActiveObject = ETrue;
+			iNotifyRecordError.Remove(index);
+	 		}
+		}
+
+	// See if it is in iPlay
+	count=iPlay.Count();
+	for( index=0; (index<count) && (!foundActiveObject); ++index )
+ 		{
+ 		if( aActive == iPlay[index] )
+			{
+			INFO_PRINTF1(_L("DoCancel iPlay called"));
+			foundActiveObject = ETrue;
+			iPlay.Remove(index);
+	 		}
+		}
+
+	// See if it is in iRecord
+	count=iRecord.Count();
+	for( index=0; (index<count) && (!foundActiveObject); ++index )
+ 		{
+ 		if( aActive == iRecord[index] )
+			{
+			INFO_PRINTF1(_L("DoCancel iRecord called"));
+			foundActiveObject = ETrue;
+			iRecord.Remove(index);
+	 		}
+		}
+	
+	if( foundActiveObject )
+ 		{
+		if (aActive)
+			{
+			TInt	err = aActive->iStatus.Int();
+			if( err != KErrNone ) 
+				{
+				ERR_PRINTF2(_L("DoCancel Error %d"), err);
+				SetAsyncError( aIndex, err );
+				}
+			}
+
+		// Reset the outstanding request state
+		delete aActive;
+		DecOutstanding();
+		}
+	else
+		{
+ 		ERR_PRINTF1(_L("An unchecked active object canceled"));
+ 		SetBlockResult(EFail);
+		}
+	}