cellularsrvapitest/telephonydevsoundhaitest/devsound/src/T_CMMFDevSoundData.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/cellularsrvapitest/telephonydevsoundhaitest/devsound/src/T_CMMFDevSoundData.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/cellularsrvapitest/telephonydevsoundhaitest/devsound/src/T_CMMFDevSoundData.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,2159 +1,2159 @@
-/*
-* 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:
-*
-*/
-
-
-#include "T_CMMFDevSoundData.h"
-
-/*@{*/
-//Constants for HwDevice
-const TInt KHwDeviceDefaultDataLength = 9;
-const TInt KFourCCLength = 4;
-//Supported Input Data Types
-const TInt KFourCCMaxBitDisplacement = 24;
-const TInt K8Bits = 8;
-const TInt KTFourCC = 4;
-/*@}*/
-
-/*@{*/
-//Command literals
-_LIT(KCmdNewL,                         "NewL");
-_LIT(KCmdNewLLoopL,                    "NewLLoopL");
-_LIT(KCmdDestructor,                   "~");
-_LIT(KCmdCapabilities,                 "Capabilities");
-_LIT(KCmdConfig,                       "Config");
-_LIT(KCmdMaxGain,                      "MaxGain");
-_LIT(KCmdMaxVolume,                    "MaxVolume");
-_LIT(KCmdGetPlayBalanceL,              "GetPlayBalanceL");
-_LIT(KCmdGetRecordBalanceL,            "GetRecordBalanceL");
-_LIT(KCmdGetSupportedInputDataTypesL,  "GetSupportedInputDataTypesL");
-_LIT(KCmdGetSupportedOutputDataTypesL, "GetSupportedOutputDataTypesL");
-_LIT(KCmdSamplesPlayed,                "SamplesPlayed");
-_LIT(KCmdSamplesRecorded,              "SamplesRecorded");
-_LIT(KCmdVolume,                       "Volume");
-_LIT(KCmdGain,                         "Gain");
-_LIT(KCmdFixedSequenceCount,           "FixedSequenceCount");
-_LIT(KCmdFixedSequenceName,            "FixedSequenceName");
-_LIT(KCmdSetConfigL,                   "SetConfigL");
-_LIT(KCmdSetDTMFLengths,               "SetDTMFLengths");
-_LIT(KCmdSetGain,                      "SetGain");
-_LIT(KCmdSetPlayBalanceL,              "SetPlayBalanceL");
-_LIT(KCmdSetPrioritySettings,          "SetPrioritySettings");
-_LIT(KCmdSetRecordBalanceL,            "SetRecordBalanceL");
-_LIT(KCmdSetToneRepeats,               "SetToneRepeats");
-_LIT(KCmdSetVolume,                    "SetVolume");
-_LIT(KCmdSetVolumeRamp,                "SetVolumeRamp");
-_LIT(KCmdInitializeL,                  "InitializeL");
-_LIT(KCmdPlayDTMFStringL,              "PlayDTMFStringL");
-_LIT(KCmdPlayData,                     "PlayData");
-_LIT(KCmdPlayDualToneL,                "PlayDualToneL");
-_LIT(KCmdPlayInitL,                    "PlayInitL");
-_LIT(KCmdPlayToneL,                    "PlayToneL");
-_LIT(KCmdPlayToneSequenceL,            "PlayToneSequenceL");
-_LIT(KCmdRecordData,                   "RecordData");
-_LIT(KCmdRecordInitL,                  "RecordInitL");
-_LIT(KCmdStop,                         "Stop");
-_LIT(KCmdErrorConceal,                 "ErrorConceal");
-_LIT(KCmdSetVolumeLoop,                "SetVolumeLoop");
-/*@}*/
-
-/*@{*/
-//Utility literals
-_LIT(KCmdUtilityReplaceFile,                  "ReplaceFile");
-_LIT(KCmdUtilityOpenFile,                     "OpenFile");
-_LIT(KCmdUtilityCloseFile,                    "CloseFile");
-_LIT(KCmdUtilityFileStartPosition,            "FileStartPosition");
-/*@}*/
-
-/*@{*/
-//INI Section name literals
-_LIT(KGainValue,                       "Gain");
-_LIT(KVolumeValue,                     "Volume");
-_LIT(KLeftPercentage,                  "LeftPercentage");
-_LIT(KRightPercentage,                 "RightPercentage");
-_LIT(KSequenceNumber,                  "SequenceNumber");
-_LIT(KRate,                            "Rate");
-_LIT(KEncoding,                        "Encoding");
-_LIT(KChannels,                        "Channels");
-_LIT(KBufferSize,                      "BufferSize");
-_LIT(KToneOnLength,                    "ToneOnLength");
-_LIT(KToneOffLength,                   "ToneOffLength");
-_LIT(KPause,                           "Pause");
-_LIT(KPauseLength,                     "PauseLength");
-_LIT(KPriority,                        "Priority");
-_LIT(KPreference,                      "Preference");
-_LIT(KPriorityState,                   "PriorityState");
-_LIT(KRepeatCount,                     "RepeatCount");
-_LIT(KRepeatTrailingSilence,           "RepeatTrailingSilence");
-_LIT(KRampDuration,                    "RampDuration");
-_LIT(KMode,                            "Mode");
-_LIT(KHwDevice,                        "HwDevice");
-_LIT(KFourCC,                          "FourCC");
-_LIT(KFilename,                        "Filename");
-_LIT(KDTMFString,                      "DTMFString");
-_LIT(KFrequency,                       "Frequency");
-_LIT(KFrequencyOne,                    "FrequencyOne");
-_LIT(KFrequencyTwo,                    "FrequencyTwo");
-_LIT(KDuration,                        "Duration");
-_LIT(KLoop,                            "Loop");
-_LIT(KAllowedError,                    "AllowedError");
-_LIT(KVolumeList,                      "VolumeList");
-_LIT(KVolumeLoop,                      "VolumeLoop");
-/*@}*/
-
-/*@{*/
-//Literals for iEnumChannels
-_LIT(KEMMFStereo, "EMMFStereo");
-_LIT(KEMMFMono,   "EMMFMono");
-/*@}*/
-
-const CDataWrapperBase::TEnumEntryTable CT_CMMFDevSoundData::iEnumChannels[] =
-	{
-	{KEMMFMono,   EMMFMono},
-	{KEMMFStereo, EMMFStereo}
-	};
-
-/*@{*/
-//Literals for iEnumSampleRate
-_LIT(KEMMFSampleRate8000Hz,  "EMMFSampleRate8000Hz");
-_LIT(KEMMFSampleRate11025Hz, "EMMFSampleRate11025Hz");
-_LIT(KEMMFSampleRate16000Hz, "EMMFSampleRate16000Hz");
-_LIT(KEMMFSampleRate22050Hz, "EMMFSampleRate22050Hz");
-_LIT(KEMMFSampleRate32000Hz, "EMMFSampleRate32000Hz");
-_LIT(KEMMFSampleRate44100Hz, "EMMFSampleRate44100Hz");
-_LIT(KEMMFSampleRate48000Hz, "EMMFSampleRate48000Hz");
-_LIT(KEMMFSampleRate88200Hz, "EMMFSampleRate88200Hz");
-_LIT(KEMMFSampleRate96000Hz, "EMMFSampleRate96000Hz");
-_LIT(KEMMFSampleRate12000Hz, "EMMFSampleRate12000Hz");
-_LIT(KEMMFSampleRate24000Hz, "EMMFSampleRate24000Hz");
-_LIT(KEMMFSampleRate64000Hz, "EMMFSampleRate64000Hz");
-/*@}*/
-
-const CDataWrapperBase::TEnumEntryTable CT_CMMFDevSoundData::iEnumSampleRate[] =
-	{
-	{KEMMFSampleRate8000Hz,  EMMFSampleRate8000Hz},
-	{KEMMFSampleRate11025Hz, EMMFSampleRate11025Hz},
-	{KEMMFSampleRate16000Hz, EMMFSampleRate16000Hz},
-	{KEMMFSampleRate22050Hz, EMMFSampleRate22050Hz},
-	{KEMMFSampleRate32000Hz, EMMFSampleRate32000Hz},
-	{KEMMFSampleRate44100Hz, EMMFSampleRate44100Hz},
-	{KEMMFSampleRate48000Hz, EMMFSampleRate48000Hz},
-	{KEMMFSampleRate88200Hz, EMMFSampleRate88200Hz},
-	{KEMMFSampleRate96000Hz, EMMFSampleRate96000Hz},
-	{KEMMFSampleRate12000Hz, EMMFSampleRate12000Hz},
-	{KEMMFSampleRate24000Hz, EMMFSampleRate24000Hz},
-	{KEMMFSampleRate64000Hz, EMMFSampleRate64000Hz}
-	};
-
-/*@{*/
-//Literal for iEnumMode
-_LIT(KEMMFStateIdle,             "EMMFStateIdle");
-_LIT(KEMMFStatePlaying,          "EMMFStatePlaying");
-_LIT(KEMMFStateTonePlaying,      "EMMFStateTonePlaying");
-_LIT(KEMMFStateRecording,        "EMMFStateRecording");
-_LIT(KEMMFStatePlayingRecording, "EMMFStatePlayingRecording");
-_LIT(KEMMFStateConverting,       "EMMFStateConverting");
-/*@}*/
-
-const CDataWrapperBase::TEnumEntryTable CT_CMMFDevSoundData::iEnumMode[] =
-	{
-	{KEMMFStateIdle,             EMMFStateIdle},
-	{KEMMFStatePlaying,          EMMFStatePlaying},
-	{KEMMFStateRecording,        EMMFStateRecording},
-	{KEMMFStateTonePlaying,      EMMFStateTonePlaying},
-	{KEMMFStatePlayingRecording, EMMFStatePlayingRecording},
-	{KEMMFStateConverting,       EMMFStateConverting}
-	};
-
-/*@{*/
-//Literals for iEnumInitializeLType
-_LIT(KEInitializeState,          "EInitializeState");
-_LIT(KEInitializeHwDeviceMode,   "EInitializeHwDeviceMode");
-_LIT(KEInitializeFourCCMode,     "EInitializeFourCCMode");
-/*@}*/
-
-enum TMMFInitializeMode
-	{
-	EInitializeState,
-	EInitializeHwDeviceMode,
-	EInitializeFourCCMode
-	};
-
-const CDataWrapperBase::TEnumEntryTable CT_CMMFDevSoundData::iEnumInitializeLType[] =
-	{
-	{KEInitializeState,        EInitializeState},
-	{KEInitializeHwDeviceMode, EInitializeHwDeviceMode},
-	{KEInitializeFourCCMode,   EInitializeFourCCMode}
-	};
-
-/**
- * Two phase constructor
- *
- * @leave   system wide error
- */
-CT_CMMFDevSoundData* CT_CMMFDevSoundData::NewL()
-	{
-	CT_CMMFDevSoundData* ret = new (ELeave) CT_CMMFDevSoundData();
-	CleanupStack::PushL(ret);
-	ret->ConstructL();
-	CleanupStack::Pop(ret);
-	return ret;
-	}
-
-/**
- * Private constructor. First phase construction
- */
-CT_CMMFDevSoundData::CT_CMMFDevSoundData()
-	:
-	iDevSound(NULL),
-	iPrioritySettings(),
-	iCapabilities(),
-	iVolumeValue(0),
-	iGainValue(0),
-	iLeftPercentage(0),
-	iRightPercentage(0),
-	iFs(),
-	iToneFile(),
-	iAudiofile(),
-	iBuffer(NULL),
-	iLastSample(0),
-	iPaused(EFalse),
-	iErrorConceal(EFalse),
-	iEndFile(EFalse),
-	iToneSequence(),
-	iRecordErrorIndex(0),
-	iPlayErrorIndex(0),
-	iToneErrorIndex(0),
-    iInitializeErrorIndex(0)
-	{
-	}
-
-/**
- * Second phase construction
- * @internalComponent
- * @return  N/A
- * @pre     None
- * @post    None
- * @leave   system wide error
- */
-void CT_CMMFDevSoundData::ConstructL()
-	{
-	iFs.Connect();
-	}
-
-/**
- * Public destructor
- */
-CT_CMMFDevSoundData::~CT_CMMFDevSoundData()
-	{
-	iFs.Close();
-	DestroyData();
-	}
-
-/**
- * Helper Destructor
- */
-void CT_CMMFDevSoundData::DestroyData()
-	{
-	if(iDevSound)
-		{
-		delete iDevSound;
-		iDevSound = NULL;
-		}
-	}
-
-/**
- * Return a pointer to the object that the data wraps
- *
- * @return  pointer to the object that the data wraps
- */
-TAny* CT_CMMFDevSoundData::GetObject()
-	{
-	return iDevSound;
-	}
-
-/**
- * Process a command read from the Ini file
- * @param aCommand          - The command to process
- * @param aSection          - The section get from the *.ini file of the project T_Wlan
- * @param aAsyncErrorIndex  - Command index dor async calls to returns errors to
- * @return TBool            - ETrue if the command is process
- * @leave                   - system wide error
- */
-TBool CT_CMMFDevSoundData::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
-	{
-	TBool ret = ETrue;
-
-	if (aCommand == KCmdNewL)
-		{
-		DoCmdNewL();
-		}
-	else if(aCommand == KCmdNewLLoopL)
-		{
-		DoCmdNewLLoopL(aSection);
-		}
-	else if (aCommand == KCmdDestructor)
-		{
-		DoCmdDestructor();
-		}
-	else if (aCommand == KCmdUtilityReplaceFile)
-		{
-		DoCmdUtilityReplaceFile(aSection);
-		}
-	else if (aCommand == KCmdUtilityOpenFile)
-		{
-		DoCmdUtilityOpenFile(aSection);
-		}
-	else if (aCommand == KCmdUtilityCloseFile)
-		{
-		DoCmdUtilityCloseFile();
-		}
-	else if (aCommand == KCmdUtilityFileStartPosition)
-		{
-		DoCmdUtilityFileStartPosition();
-		}
-	else if (aCommand == KCmdCapabilities)
-		{
-		DoCmdCapabilities();
-		}
-	else if (aCommand == KCmdConfig)
-		{
-		DoCmdConfig();
-		}
-	else if (aCommand == KCmdMaxGain)
-		{
-		DoCmdMaxGain(aSection);
-		}
-	else if (aCommand == KCmdMaxVolume)
-		{
-		DoCmdMaxVolume(aSection);
-		}
-	else if (aCommand == KCmdGetPlayBalanceL)
-		{
-		DoCmdGetPlayBalanceL(aSection);
-		}
-	else if (aCommand == KCmdGetRecordBalanceL)
-		{
-		DoCmdGetRecordBalanceL(aSection);
-		}
-	else if (aCommand == KCmdGetSupportedInputDataTypesL)
-		{
-		DoCmdGetSupportedInputDataTypesL();
-		}
-	else if (aCommand == KCmdGetSupportedOutputDataTypesL)
-		{
-		DoCmdGetSupportedOutputDataTypesL();
-		}
-	else if (aCommand == KCmdSamplesPlayed)
-		{
-		DoCmdSamplesPlayed();
-		}
-	else if (aCommand == KCmdSamplesRecorded)
-		{
-		DoCmdSamplesRecorded();
-		}
-	else if (aCommand == KCmdVolume)
-		{
-		DoCmdVolume(aSection);
-		}
-	else if (aCommand == KCmdGain)
-		{
-		DoCmdGain(aSection);
-		}
-	else if (aCommand == KCmdFixedSequenceCount)
-		{
-		DoCmdFixedSequenceCount();
-		}
-	else if (aCommand == KCmdFixedSequenceName)
-		{
-		DoCmdFixedSequenceName(aSection);
-		}
-	else if (aCommand == KCmdSetConfigL)
-		{
-		DoCmdSetConfigL(aSection);
-		}
-	else if (aCommand == KCmdSetDTMFLengths)
-		{
-		DoCmdSetDTMFLengths(aSection);
-		}
-	else if (aCommand == KCmdSetGain)
-		{
-		DoCmdSetGain(aSection);
-		}
-	else if (aCommand == KCmdSetPlayBalanceL)
-		{
-		DoCmdSetPlayBalanceL(aSection);
-		}
-	else if (aCommand == KCmdSetPrioritySettings)
-		{
-		DoCmdSetPrioritySettings(aSection);
-		}
-	else if (aCommand == KCmdSetRecordBalanceL)
-		{
-		DoCmdSetRecordBalanceL(aSection);
-		}
-	else if (aCommand == KCmdSetToneRepeats)
-		{
-		DoCmdSetToneRepeats(aSection);
-		}
-	else if (aCommand == KCmdSetVolume)
-		{
-		DoCmdSetVolume(aSection);
-		}
-	else if (aCommand == KCmdSetVolumeLoop)
-		{
-		DoCmdSetVolumeLoop(aSection);
-		}
-	else if (aCommand == KCmdSetVolumeRamp)
-		{
-		DoCmdSetVolumeRamp(aSection);
-		}
-	else if (aCommand == KCmdInitializeL)
-		{
-		DoCmdInitializeL(aSection,aAsyncErrorIndex);
-		}
-	else if (aCommand == KCmdPlayDTMFStringL)
-		{
-		DoCmdPlayDTMFStringL(aSection, aAsyncErrorIndex);
-		}
-	else if (aCommand == KCmdPlayData)
-		{
-		DoCmdPlayData();
-		}
-	else if (aCommand == KCmdPlayDualToneL)
-		{
-		DoCmdPlayDualToneL(aSection, aAsyncErrorIndex);
-		}
-	else if (aCommand == KCmdPlayInitL)
-		{
-		DoCmdPlayInitL(aAsyncErrorIndex);
-		}
-	else if (aCommand == KCmdPlayToneL)
-		{
-		DoCmdPlayToneL(aSection, aAsyncErrorIndex);
-		}
-	else if (aCommand == KCmdPlayToneSequenceL)
-		{
-		DoCmdPlayToneSequenceL(aSection,aAsyncErrorIndex);
-		}
-	else if (aCommand == KCmdRecordData)
-		{
-		DoCmdRecordData();
-		}
-	else if (aCommand == KCmdRecordInitL)
-		{
-		DoCmdRecordInitL(aAsyncErrorIndex);
-		}
-	else if (aCommand == KCmdStop)
-		{
-		DoCmdStop(aSection);
-		}
-	else if(aCommand == KCmdErrorConceal)
-		{
-		DoCmdUtilityErrorConceal();
-		}
-	else
-		{
-		ERR_PRINTF1(_L("Unknown command."));
-		ret=EFalse;
-		}
-	return ret;
-	}
-
-/**
- * Handles initialization completion event.
- * CMMFDevSound object calls this function when its InitializeL() function
- * completes.
- * @param  aError - Error code. KErrNone if successful. Other values are possible
- *                  indicating a problem initializing CMMFDevSound object.
- * @return void
- */
-
-void CT_CMMFDevSoundData::InitializeComplete(TInt aError)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::InitializeComplete"));
-	if(KErrNone != aError)
-		{
-		ERR_PRINTF2(_L("InitializeComplete callback failed with error %d"), aError);
-		SetAsyncError(iInitializeErrorIndex, aError);
-        iInitializeErrorIndex = 0;
-		}
-	if(Outstanding())
-	{
-    DecOutstanding();
-	}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::InitializeComplete"));
-	}
-
-/**
- * It's needed for playing o converting
- * @param aBuffer - Buffer into which data should be read. The amount of data that is
- *                  needed is specified in CMMFBuffer::RequestSize().
- */
-void CT_CMMFDevSoundData::BufferToBeFilled(CMMFBuffer* aBuffer)
-	{
-	if (!aBuffer)
-		{
-		ERR_PRINTF1(_L("BufferToBeFilled callback received a NULL CMMFBuffer!"));
-		SetBlockResult(EFail);
-		}
-	else
-		{
-		TBool dataOk = ETrue;
-		iBuffer = aBuffer;
-		iBuffer->SetLastBuffer(EFalse);
-		CMMFDataBuffer* buffer = static_cast <CMMFDataBuffer*> (iBuffer);
-		if (iPaused)
-			{
-			iPaused=EFalse;
-			TInt error = iAudiofile.Read(iLastSample,buffer->Data());
-			if (error != KErrNone)
-				{
-				ERR_PRINTF2(_L("ERROR : iFile.Read() failed with %d"), error);
-				SetBlockResult(EFail);
-				dataOk = EFalse;
-				}
-			}
-		else
-			{
-			TInt error = iAudiofile.Read(buffer->Data());
-			if (error != KErrNone)
-				{
-				ERR_PRINTF2(_L("ERROR : iFile.Read() failed with %d"), error);
-				SetBlockResult(EFail);
-				dataOk =EFalse;
-				}
-			}
-		if(dataOk)
-			{
-			if (buffer->Data().Length() != buffer->RequestSize())
-				{
-				iBuffer->SetLastBuffer(ETrue);
-				}
-			if (iErrorConceal)
-				{
-				iErrorConceal=EFalse;
-				buffer->Data().Zero();
-				INFO_PRINTF1(_L("buffer->Data().Zero()"));
-				}
-			PlayData();
-			TInt pos=0;
-			iLastSample=iAudiofile.Seek(ESeekCurrent ,pos);
-			INFO_PRINTF2(_L("Number of samples played so far: %d"), pos);
-			iLastSample=pos;
-			}
-		}
-	}
-
-/**
-* Handles play completion or cancel event.
-*
-* CMMFDevSound object calls this function when an attempt to play audio sample
-* has completed, successfully or otherwise.
-*
-*   @param  aError - Error code. The status of playback. KErrUnderflow playing of the
-*                    audio sample is complete. KErrAccessDenied the sound device is in
-*                    use by another higher priority client.
-*/
-void CT_CMMFDevSoundData::PlayError(TInt aError)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::PlayError"));
-	if(Outstanding())
-	{
-    DecOutstanding();
-	}
-	if(aError != KErrNone && aError != KErrUnderflow)
-	{
-   	ERR_PRINTF2(_L("Playback completed with error %d"), aError);
-		SetAsyncError(iPlayErrorIndex, aError);	
-		iPlayErrorIndex = 0; 
-	}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::PlayError"));
-	}
-
-
-/**
- *  Handles tone play completion event.
- *
- *
- *  CMMFDevSound object calls this function when an attempt to play tone has
- *  completed, successfully or otherwise.
- *
- *  The following are the play tone functions; PlayToneL(), PlayDMTFStringL(),
- *  PlayToneSequenceL(), and PlayFixedSequenceL().
- *
- *  @param  aError -  Error code. The status of tone playback. KErrUnderflow playing of
- *                    the tone is complete. KErrAccessDenied the sound device is in use by
- *                    another higher priority client. KErrCancel playing of the audio
- *                    sample is stopped by DevSound client another higher priority client.
- *
- */
-
-void CT_CMMFDevSoundData::ToneFinished(TInt aError)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::ToneFinished"));
-	if(Outstanding())
-	{
-    DecOutstanding();
-	}
-	if(aError != KErrNone)
-	{
-   	ERR_PRINTF2(_L("Tone finished with error %d"), aError);
-		SetAsyncError(iToneErrorIndex, aError);
-	  iToneErrorIndex = 0;	
-	}
-	iToneFile.Close();
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::ToneFinished"));
-	}
-
-/**
- * Handles CMMFDevSound object's data request event.
- *
- * CMMFDevSound object calls this function when the buffer, aBuffer gets filled
- * while recording or converting. The observer should notify CMMFDevSound
- * object as quickly as possible after data in the buffer is processed by
- * calling RecordData(), otherwise the implementation might callback
- * the function RecordError() on derived class object with error code KErrOverflow.
- *
- * @param  aBuffer - Buffer containing processed (recorded or converted) data. The amount
- *                   of data that is available is specified in CMMFBuffer::RequestSize().
- */
-
-void CT_CMMFDevSoundData::BufferToBeEmptied(CMMFBuffer* aBuffer)
-	{
-	if (!aBuffer)
-		{
-		INFO_PRINTF1(_L("BufferToBeEmptied callback received a NULL CMMFBuffer"));
-		SetBlockResult(EFail);
-		}
-	else
-		{
-		iBuffer = aBuffer;
-		CMMFDataBuffer* buffer = static_cast <CMMFDataBuffer*> (iBuffer);
-		TInt error = iAudiofile.Write(buffer->Data());
-		if(error == KErrNone)
-			{
-			if (!aBuffer->LastBuffer())
-				{
-				RecordData();
-				}
-			else{
-				Stop();
-				}
-			}
-		else
-			{
-			ERR_PRINTF2(_L("iFile.Write() returned the error %d"), error);
-			SetBlockResult(EFail);
-			}
-		}
-	}
-
-/**
- * Stops the ongoing operation (Play, Record, TonePlay, Convert).
- * This function should be synchronous and invoke no callbacks through MDevSoundObserver.
- */
-void CT_CMMFDevSoundData::Stop()
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::Stop()"));
-	iDevSound->Stop();
-	if(Outstanding())
-		{
-		DecOutstanding();
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::Stop()"));
-	}
-
-/**
- * Handles record completion or cancel event.
- *
- * CMMFDevSound object calls this function when an attempt to record audio sample
- * has completed, successfully or otherwise.
- *
- * @param  aError - Error code. The status of recording. KErrOverflow audio devices
- *                  runs out of internal buffer. KErrAccessDenied the sound device is
- *                  in use by another higher priority client.
- *
- */
-
-void CT_CMMFDevSoundData::RecordError(TInt aError)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::RecordError"));
-	if(aError != KErrNone)
-	{
-   ERR_PRINTF2(_L("Record failed with error %d"), aError); 
-   SetAsyncError(iRecordErrorIndex , aError);	
-	 iRecordErrorIndex = 0;	
-	}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::RecordError"));
-	}
-
-
-/**
- * Handles conversion completion or cancel event.
- *
- * CMMFDevSound object calls this function when an attempt to convert data from
- * source format to destination format has completed, successfully or otherwise.
- *
- * @param  aError - Error code. KErrCancel conversion operation is cancelled. KErrNone
- *                  conversion is complete. Other values are possible indicating a
- *                  problem converting data.
- */
-
-void CT_CMMFDevSoundData::ConvertError(TInt aError)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::ConvertError"));
-	ERR_PRINTF1(_L("Invalid Callback call"));
-	if (aError == KErrNone)
-		{
-		INFO_PRINTF1(_L("Data conversion completed successfully."));
-		}
-	if (aError == KErrCancel)
-		{
-		INFO_PRINTF1(_L("Data conversion operation was cancelled."));
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::ConvertError"));
-	}
-
-/**
- * Handles device event.
- *
- * CMMFDevSound object calls this function when a message is received from the
- * audio hardware device.
- *
- * @param   aMessageType - Defines the type of message. Used to determine how to
- *                         interpret the contents of aMsg.
- * @param   aMsg         - Message that is packed in the Descriptor format.
- */
-
-
-void CT_CMMFDevSoundData::DeviceMessage(TUid aMessageType, const TDesC8& aMsg)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DeviceMessage"));
-	INFO_PRINTF2(_L("Message type: %d"), aMessageType.iUid);
-	INFO_PRINTF2(_L("Message type: %S"), &aMsg);
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DeviceMessage"));
-	}
-
-
-/**
- * Create a new or Replace the existing file
- *
- */
-void CT_CMMFDevSoundData::DoCmdUtilityReplaceFile(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START* CT_CMMFDevSoundData::DoCmdUtilityReplaceFile()"));
-	TPtrC fileName;
-	TBool dataOk = ETrue;
-	if (!GetStringFromConfig(aSection, KFilename, fileName))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFilename);
-		SetBlockResult(EFail);
-		dataOk =EFalse;
-		}
-	if(dataOk)
-		{
-		TInt error = iAudiofile.Replace(iFs, fileName, EFileRead);
-		if (error != KErrNone)
-			{
-			ERR_PRINTF2(_L("Could not open input file. Error = %d"), error);
-			SetError(error);
-			}
-		}
-
-	INFO_PRINTF1(_L("*END* CT_CMMFDevSoundData::DoCmdUtilityReplaceFile()"));
-	}
-
-/**
- * Open a file
- */
-void CT_CMMFDevSoundData::DoCmdUtilityOpenFile(const TTEFSectionName& aSection)
-	{
-
-	INFO_PRINTF1(_L("*START* CT_CMMFDevSoundData::DoCmdUtilityOpenFile()"));
-	TPtrC fileName;
-	TBool dataOk = ETrue;
-	if (!GetStringFromConfig(aSection, KFilename, fileName))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFilename);
-		SetBlockResult(EFail);
-		dataOk =EFalse;
-		}
-	if(dataOk)
-		{
-		TInt error = iAudiofile.Open(iFs, fileName, EFileRead);
-		if (error != KErrNone)
-			{
-			ERR_PRINTF2(_L("Could not open input file. Error = %d"), error);
-			iFs.Close();
-			SetError(error);
-			}
-		}
-	INFO_PRINTF1(_L("*END* CT_CMMFDevSoundData::DoCmdUtilityOpenFile()"));
-	}
-
-/**
- * Close the opened file
- */
-void CT_CMMFDevSoundData::DoCmdUtilityCloseFile()
-	{
-	INFO_PRINTF1(_L("*START* CT_CMMFDevSoundData::DoCmdUtilityCloseFile()"));
-	iAudiofile.Close();
-	INFO_PRINTF1(_L("*END* CT_CMMFDevSoundData::DoCmdUtilityCloseFile()"));
-	}
-
-/**
- * Place the the pointer file at the begining
- *
- */
-void CT_CMMFDevSoundData::DoCmdUtilityFileStartPosition()
-	{
-	INFO_PRINTF1(_L("*START* CT_CMMFDevSoundData::DoCmdUtilityFileStartPosition()"));
-	TInt filePosition = 0;
-	TBool dataOk = ETrue;
-	TInt error = iAudiofile.Seek(ESeekStart, filePosition);
-	if (error != KErrNone)
-		{
-		ERR_PRINTF2(_L("Could not set file to the start position. Error = %d"), error);
-		SetError(error);
-		dataOk =EFalse;
-		}
-	if(dataOk)
-		{
-		INFO_PRINTF2(_L("File Position: %d"), filePosition);
-		}
-	INFO_PRINTF1(_L("*END* CT_CMMFDevSoundData::DoCmdUtilityFileStartPosition()"));
-	}
-
-
-/**
- * Creates "n" instance of CMMFDevSound
- * @param aSection - Section to read from the ini file
- * @return void
- */
-void CT_CMMFDevSoundData::DoCmdNewLLoopL(const TTEFSectionName&aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdNewLLoopL"));
-	CMMFDevSound* devSound = NULL;
-	TBool dataOk = ETrue;
-	TInt loop= 0;
-	if (!GetIntFromConfig(aSection, KLoop, loop))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KLoop);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	TInt allowedError=0;
-	if ( !GetIntFromConfig(aSection, KAllowedError, allowedError) )
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KAllowedError);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	if(dataOk)
-		{
-		for(TInt i=0; i<loop; i++)
-			{
-			TRAPD(error,devSound = CMMFDevSound::NewL());
-			if(error == KErrNone)
-				{
-				INFO_PRINTF2(_L("Instance %d of DevSound was created"),i);
-				CleanupStack::PushL(devSound);
-				iObjectsDevSound.AppendL(devSound);
-				CleanupStack::Pop(devSound);
-				}
-			else if(error == allowedError)
-				{
-				INFO_PRINTF2(_L(" Allowing Error: %d"), error);
-				ERR_PRINTF2(_L(" Could not create CMMFDevSound due to error: %d"), error);
-				i = loop;
-				}
-			else if((error != KErrNone) && (error!=allowedError))
-				{
-				ERR_PRINTF2(_L("> Could not create CMMFDevSound: %d"), error);
-				SetError(error);
-				}
-			}
-		iObjectsDevSound.ResetAndDestroy();
-		INFO_PRINTF2(_L("%d DevSound instances were deleted"),loop);
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdNewLLoopL"));
-	}
-
-
-/**
- * Create an instance of CMMFDevSound
- */
-void CT_CMMFDevSoundData::DoCmdNewL()
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdNewL"));
-	DestroyData();
-	TRAPD(error,iDevSound = CMMFDevSound::NewL());
-	if(error!= KErrNone)
-		{
-		ERR_PRINTF2(_L("> Could not create CMMFDevSound: %d"), error);
-		SetError(error);
-		}
-	else
-		{
-		iPaused= EFalse;
-		iErrorConceal = EFalse;
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdNewL"));
-	}
-/**
- * Destroy an instance of CMMFDevSound
- */
-
-void CT_CMMFDevSoundData::DoCmdDestructor()
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdDestroyData"));
-	DestroyData();
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdDestroyData"));
-	}
-
-/**
- * Show the supported Audio settings ie. encoding, sample rates, mono/stereo operation, buffer
- * size, etc.
- * @param none
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdCapabilities()
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdCapabilities"));
-	iCapabilities = iDevSound->Capabilities();
-	INFO_PRINTF5(_L("Supported Audio settings: buffsize=%d, channels=0x%x, encoding=0x%x and rate=0x%x"),
-							iCapabilities.iBufferSize,
-							iCapabilities.iChannels,
-							iCapabilities.iEncoding,
-							iCapabilities.iRate);
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdCapabilities"));
-	}
-
-
-/**
- * Shows the current device configuration.
- * @params none
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdConfig()
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdConfig"));
-	TMMFCapabilities currentConfiguration = iDevSound->Config();
-	INFO_PRINTF5(_L("Current device configuration: buffsize=%d, channels=0x%x, encoding=0x%x and rate=0x%x"),
-			currentConfiguration.iBufferSize,
-			currentConfiguration.iChannels,
-			currentConfiguration.iEncoding,
-			currentConfiguration.iRate);
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdConfig"));
-	}
-
-
-/**
- * Shows an integer representing the maximum gain the device supports.
- * This is the maximum value which can be passed to CMMFDevSound::SetGain.
- * @param aSection - The section to read the params from the ini file
- * @return none
- */
-
-void CT_CMMFDevSoundData::DoCmdMaxGain(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdMaxGain"));
-	TBool dataOk = ETrue;
-	TInt expectedGainValue=0;
-	if (!GetIntFromConfig(aSection, KGainValue, expectedGainValue))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KGainValue);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	if(dataOk)
-		{
-		iGainValue = iDevSound->MaxGain();
-		INFO_PRINTF2(_L("Retrieved maximum gain value: %d"), iGainValue);
-		if (expectedGainValue != iGainValue)
-			{
-			ERR_PRINTF3(_L("Expected gain value %d is different from retrieved gain value %d"), expectedGainValue, iGainValue);
-			SetBlockResult(EFail);
-			}
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdMaxGain"));
-	}
-
-/**
- * Shows an integer representing the maximum volume device supports.
- * This is the maximum value which can be passed to CMMFDevSound::SetVolume.
- * @param aSection - Section to read params from the ini file
- * @return none
- */
-
-void CT_CMMFDevSoundData::DoCmdMaxVolume(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdMaxVolume"));
-	TBool dataOk = ETrue;
-	TInt expectedVolumeValue=0;
-	if(!GetIntFromConfig(aSection, KVolumeValue, expectedVolumeValue))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KVolumeValue);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	if(dataOk)
-		{
-		iVolumeValue = iDevSound->MaxVolume();
-		INFO_PRINTF2(_L("Retrieved maximum volume value: %d"), iVolumeValue);
-		if(expectedVolumeValue != iVolumeValue)
-			{
-			ERR_PRINTF3(_L("Expected volume value %d is different from retrieved volume value %d"), expectedVolumeValue, iVolumeValue);
-			SetBlockResult(EFail);
-			}
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdMaxVolume"));
-	}
-
-/**
- * Shows the speaker balance set for playing.
- * @param aSection - Section to read params from the ini file
- * @return none
- */
-
-void CT_CMMFDevSoundData::DoCmdGetPlayBalanceL(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdGetPlayBalanceL"));
-	TBool dataOk = ETrue;
-	TInt expectedLeftPercentage=0;
-	if (!GetIntFromConfig(aSection, KLeftPercentage, expectedLeftPercentage))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KLeftPercentage);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	TInt expectedRightPercentage=0;
-	if (!GetIntFromConfig(aSection, KRightPercentage, expectedRightPercentage))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRightPercentage);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	if(dataOk)
-		{
-		TRAPD(error, iDevSound->GetPlayBalanceL(iLeftPercentage, iRightPercentage));
-		if (error != KErrNone)
-			{
-			ERR_PRINTF2(_L("GetPlayBalanceL left with error %d"), error);
-			SetError(error);
-			}
-		else
-			{
-			INFO_PRINTF3(_L("> Retrieved play balance values are left: %d, right:%d"), iLeftPercentage, iRightPercentage);
-			if (expectedLeftPercentage !=iLeftPercentage)
-				{
-				ERR_PRINTF3(_L("Expected left percentage value %d is different from retrieved value %d"), expectedLeftPercentage, iLeftPercentage);
-				SetBlockResult(EFail);
-				}
-			if (expectedRightPercentage !=iRightPercentage)
-				{
-				ERR_PRINTF3(_L("Expected right percentage value %d is different from retrieved value %d"), expectedRightPercentage, iRightPercentage);
-				SetBlockResult(EFail);
-				}
-			}
-		}
-
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdGetPlayBalanceL"));
-	}
-
-
-/**
- * Shows the microphone gain balance set for recording.
- * @param aSection - Section to read params from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdGetRecordBalanceL(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdGetRecordBalanceL"));
-	TBool dataOk = ETrue;
-	TInt expectedLeftPercentage=0;
-	if(!GetIntFromConfig(aSection, KLeftPercentage, expectedLeftPercentage))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KLeftPercentage);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	TInt expectedRightPercentage=0;
-	if(!GetIntFromConfig(aSection, KRightPercentage, expectedRightPercentage))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRightPercentage);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	if(dataOk)
-		{
-		TRAPD(error, iDevSound->GetRecordBalanceL(iLeftPercentage, iRightPercentage));
-		if (error != KErrNone)
-			{
-			ERR_PRINTF2(_L("GetRecordBalanceL left with error %d"), error);
-			SetError(error);
-			}
-		else
-			{
-			INFO_PRINTF3(_L("> Retrieved record balance values are left: %d, right:%d"), iLeftPercentage, iRightPercentage);
-			if(expectedLeftPercentage !=iLeftPercentage)
-				{
-				ERR_PRINTF3(_L("Expected left percentage value %d is different from retrieved value %d"), expectedLeftPercentage, iLeftPercentage);
-				SetBlockResult(EFail);
-				}
-			if(expectedRightPercentage !=iRightPercentage)
-				{
-				ERR_PRINTF3(_L("Expected right ercentage value %d is different from retrieved value %d"), expectedRightPercentage, iRightPercentage);
-				SetBlockResult(EFail);
-				}
-			}
-
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdGetRecordBalanceL"));
-	}
-
-/**
- * Shows a list of the supported input datatypes that can be sent to DevSound for playing audio.
- * The datatypes returned are those that the DevSound supports given the priority settings passed
- * in aPrioritySettings.
- * @params none
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdGetSupportedInputDataTypesL()
-	{
-	TUid outputUid= {0x0};
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdGetSupportedInputDataTypesL"));
-	RArray< TFourCC > supportedDataTypes;
-	TRAPD(error, iDevSound->GetSupportedInputDataTypesL(supportedDataTypes, iPrioritySettings));
-	if (error != KErrNone)
-		{
-		ERR_PRINTF2(_L("GetSupportedInputDataTypesL left with error %d"), error);
-		SetError(error);
-		}
-	else
-		{
-		INFO_PRINTF1(_L("List of the supported input datatypes that can be sent to DevSound for playing audio."));
-		for (TInt i=0; i<supportedDataTypes.Count(); i++)
-			{
-			TFourCC fourCC = supportedDataTypes[i];
-			TBuf<4> name;
-			for(TInt j=0; j<= KFourCCMaxBitDisplacement; j+=K8Bits)
-				{
-				name.Append((TUint8)(fourCC.FourCC() >> j));
-				}
-			INFO_PRINTF3(_L("Supported Input Data types: 0x%x  %S "), fourCC.FourCC(), &name);
-			UtilityFourCCToHwDeviceUidL(name,EDecoder, outputUid);
-			if(outputUid.iUid != 0)
-				{
-				INFO_PRINTF3(_L("\nHwDevice Uid=0x%08x for %S"),outputUid.iUid,&name);
-				}
-			else
-				{
-				INFO_PRINTF1(_L("Not Found"));
-				}
-			}
-		supportedDataTypes.Reset();
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdGetSupportedInputDataTypesL"));
-	}
-
-/**
- * Shows a list of the supported output dataypes that can be received from DevSound for
- * recording audio.  The datatypes returned are those that the DevSound supports given the priority
- * settings passed in aPrioritySettings.
- * @param none
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdGetSupportedOutputDataTypesL()
-	{
-	TUid outputUid= {0x0};
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdGetSupportedOutputDataTypesL"));
-	RArray< TFourCC > supportedDataTypes;
-	TRAPD(error, iDevSound->GetSupportedOutputDataTypesL(supportedDataTypes, iPrioritySettings));
-	if (error != KErrNone)
-		{
-		ERR_PRINTF2(_L("GetSupportedOutputDataTypesL left with error %d"), error);
-		SetError(error);
-		}
-	else
-		{
-		INFO_PRINTF1(_L("List of the supported output dataypes that can be received from DevSound for recording audio."));
-		for (TInt i=0; i<supportedDataTypes.Count(); i++)
-			{
-			TFourCC fourCC = supportedDataTypes[i];
-			TBuf<4> name;
-			for(TInt j=0; j<=KFourCCMaxBitDisplacement; j+=K8Bits)
-				{
-				name.Append((TUint8)(fourCC.FourCC() >> j));
-				}
-			INFO_PRINTF3(_L("Supported Output Data types: 0x%x  %S "), fourCC.FourCC(), &name);
-			UtilityFourCCToHwDeviceUidL(name, EEncoder, outputUid);
-			if(outputUid.iUid != 0)
-				{
-				INFO_PRINTF3(_L("\nHwDevice Uid=0x%08x for %S"),outputUid.iUid,&name);
-				}
-			else
-				{
-				INFO_PRINTF1(_L("Not Found"));
-				}
-			}
-		supportedDataTypes.Reset();
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdGetSupportedOutputDataTypesL"));
-	}
-
-/**
- * Shows the number of samples played
- * @param none
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdSamplesPlayed()
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSamplesPlayed"));
-	INFO_PRINTF2(_L("Number of samples played so far: %d"),iDevSound->SamplesPlayed());
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSamplesPlayed"));
-	}
-
-/**
- * Shows the number of samples recorded
- * @param none
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdSamplesRecorded()
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSamplesRecorded"));
-	INFO_PRINTF2(_L("Number of samples recorded so far: %d"), iDevSound->SamplesRecorded());
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSamplesRecorded"));
-	}
-
-/**
- * Shows an integer representing the current volume.
- * @param aSection - Section to read param from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdVolume(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdVolume"));
-	TBool dataOk = ETrue;
-	TInt expectedVolumeValue=0;
-	if(!GetIntFromConfig(aSection, KVolumeValue, expectedVolumeValue))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KVolumeValue);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	if(dataOk)
-		{
-		iVolumeValue = iDevSound->Volume();
-		INFO_PRINTF2(_L("Retrieved volume value: %d"), iVolumeValue);
-		if(expectedVolumeValue != iVolumeValue)
-			{
-			ERR_PRINTF3(_L("Expected volume value %d is different from retrieved volume value %d"), expectedVolumeValue, iVolumeValue);
-			SetBlockResult(EFail);
-			}
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdVolume"));
-	}
-
-/**
- * Shows an integer representing the current gain.
- * @param aSection - Section to read param from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdGain(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdGain"));
-	TBool dataOk = ETrue;
-	TInt expectedGainValue=0;
-	if(!GetIntFromConfig(aSection, KGainValue, expectedGainValue))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KGainValue);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	if(dataOk)
-		{
-		iGainValue = iDevSound->Gain();
-		INFO_PRINTF2(_L("Retrieved gain value: %d"), iGainValue);
-		if(expectedGainValue != iGainValue)
-			{
-			ERR_PRINTF3(_L("Expected gain value %d is different from retrieved gain value %d"), expectedGainValue, iGainValue);
-			SetBlockResult(EFail);
-			}
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdGain"));
-	}
-
-/**
- * Shows the number of available pre-defined tone sequences
- * @param none
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdFixedSequenceCount()
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdFixedSequenceCount"));
-	INFO_PRINTF2(_L("Number of available pre-defined tone sequences: %d"), iDevSound->FixedSequenceCount());
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdFixedSequenceCount"));
-	}
-
-/**
- * Shows the name assigned to a specific pre-defined tone sequence.
- * This is the number of the fixed sequence supported by DevSound by default.
- * @param aSection -  Section to read params from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdFixedSequenceName(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdFixedSequenceName"));
-	TBool dataOk =ETrue;
-	TInt sequenceNumber=0;
-	if(!GetIntFromConfig(aSection, KSequenceNumber, sequenceNumber))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KSequenceNumber);
-		SetBlockResult(EFail);
-		dataOk =EFalse;
-		}
-	if(dataOk)
-		{
-		INFO_PRINTF2(_L("Name assigned to a specific pre-defined tone sequence returned: %S"),
-					&iDevSound->FixedSequenceName(sequenceNumber));
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdFixedSequenceName"));
-	}
-
-
-/**
- * Configure CMMFDevSound object with the settings in aConfig.
- * Use this to set sampling rate, encoding and mono/stereo.
- * @param aSection - Section to read params from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdSetConfigL(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetConfigL"));
-
-	TInt rate=0;
-	INFO_PRINTF1(_L("To use default values run Capabilities before SetConfigL"));
-	if (!GetEnumFromConfig(aSection, KRate, iEnumSampleRate, rate))
-		{
-		INFO_PRINTF2(_L("Rate value was not overwritten, using default value %d."), iCapabilities.iRate);
-		}
-	else
-		{
-		iCapabilities.iRate = rate;
-		}
-
-	TInt encoding=0;
-	if (!GetIntFromConfig(aSection, KEncoding, encoding))
-		{
-		INFO_PRINTF2(_L("Encoding value was not overwritten, using default value %d."), iCapabilities.iEncoding);
-		}
-	else
-		{
-		iCapabilities.iEncoding = encoding;
-		}
-
-	TInt channels=0;
-	if (!GetEnumFromConfig(aSection, KChannels, iEnumChannels, channels))
-		{
-		INFO_PRINTF2(_L("Channels value was not overwritten, using default value %d ."), iCapabilities.iChannels);
-		}
-	else
-		{
-		iCapabilities.iChannels = channels;
-		}
-
-	TInt bufferSize=0;
-	if (!GetIntFromConfig(aSection, KBufferSize, bufferSize))
-		{
-		INFO_PRINTF2(_L("BufferSize value was not overwritten, using default value %d"), iCapabilities.iBufferSize);
-		}
-	else
-		{
-		iCapabilities.iBufferSize = bufferSize;
-		}
-	TRAPD(error,iDevSound->SetConfigL(iCapabilities))
-	if(error != KErrNone)
-		{
-		ERR_PRINTF2(_L("SetConfigL left with error %d"), error);
-		SetError(error);
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetConfigL"));
-	}
-
-
-/**
- * Defines the duration of tone on, tone off and tone pause to be used during the
- * DTMF tone playback operation.
- * Supported only during tone playing.
- * @param aSection - Section to read param from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdSetDTMFLengths(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetDTMFLengths"));
-	TInt time=0;
-	TBool dataOk = ETrue;
-	if (!GetIntFromConfig(aSection, KToneOnLength, time))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KToneOnLength);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	TTimeIntervalMicroSeconds32 toneOnLength(time);
-
-	if (!GetIntFromConfig(aSection, KToneOffLength, time))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KToneOffLength);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	TTimeIntervalMicroSeconds32 toneOffLength(time);
-
-	if (!GetIntFromConfig(aSection, KPauseLength, time))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPauseLength);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	TTimeIntervalMicroSeconds32 pauseLength(time);
-	if(dataOk)
-		{
-		iDevSound->SetDTMFLengths(toneOnLength, toneOffLength, pauseLength);
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetDTMFLengths"));
-	}
-
-
-/**
- * Changes the current recording gain to a specified value.
- * The gain can be changed before or during recording and is effective
- * immediately.
- * @params aSection - Section to read param from the ini file
- */
-void CT_CMMFDevSoundData::DoCmdSetGain(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetGain"));
-	TInt gainValue = iGainValue;
-	if(!GetIntFromConfig(aSection, KGainValue, gainValue))
-		{
-		INFO_PRINTF1(_L("The Gain value was not found in the ini file, using default value"));
-		}
-	INFO_PRINTF2(_L("Setting gain value to %d"), gainValue);
-	iDevSound->SetGain(gainValue);
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetGain"));
-	}
-
-/**
- * Sets the speaker balance for playing.
- * The speaker balance can be changed before or during playback and is
- * effective immediately.
- * @param aSection - The section to read params from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdSetPlayBalanceL(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetPlayBalanceL"));
-	TInt leftPercentage = iLeftPercentage;
-	if(!GetIntFromConfig(aSection, KLeftPercentage, leftPercentage))
-		{
-		INFO_PRINTF1(_L("The Left percentage was not found in the ini file, using default value"));
-		}
-	TInt rightPercentage = iRightPercentage;
-	if(!GetIntFromConfig(aSection, KRightPercentage, rightPercentage))
-		{
-		INFO_PRINTF1(_L("The Right percentage was not found in the ini file, using default value"));
-		}
-	INFO_PRINTF3(_L("Setting play balance to left: %d, right: %d values"), leftPercentage, rightPercentage);
-	TRAPD(error, iDevSound->SetPlayBalanceL(leftPercentage, rightPercentage));
-	if(error != KErrNone)
-		{
-		ERR_PRINTF2(_L("SetPlayBalanceL left with error %d"), error);
-		SetError(error);
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetPlayBalanceL"));
-	}
-
-/**
- * Defines the priority settings that should be used for this instance.
- * @param aSection - Section to read params from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdSetPrioritySettings(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetPrioritySettings"));
-	TBool dataOk = ETrue;
-	if(!GetIntFromConfig(aSection, KPriority, iPrioritySettings.iPriority))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPriority);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	TInt preference=0;
-	if (!GetHexFromConfig(aSection, KPreference, preference))
-		{
-		ERR_PRINTF2(_L("%S parameter was not found in INI file"), &KPreference);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	iPrioritySettings.iPref = (TMdaPriorityPreference)preference;
-	TInt state=0;
-	if (!GetEnumFromConfig(aSection, KPriorityState, iEnumMode, state))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPriorityState);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	iPrioritySettings.iState = (TMMFState)state;
-	if(dataOk)
-		{
-		iDevSound->SetPrioritySettings(iPrioritySettings);
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetPrioritySettings"));
-	}
-
-/**
- * Sets the microphone gain balance for recording.
- * The microphone gain balance can be changed before or during recording and
- * is effective immediately.
- * @param aSection - Section to read params from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdSetRecordBalanceL(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetRecordBalanceL"));
-	TInt leftPercentage = iLeftPercentage;
-	if (!GetIntFromConfig(aSection, KLeftPercentage, leftPercentage))
-		{
-		INFO_PRINTF1(_L("The Left value was not found in the ini file, using default value"));
-		}
-	TInt rightPercentage = iRightPercentage;
-	if (!GetIntFromConfig(aSection, KRightPercentage, rightPercentage))
-		{
-		INFO_PRINTF1(_L("The Right value was not found in the ini file, using default value"));
-		}
-	INFO_PRINTF3(_L("Setting record balance to left: %d, right: %d values"), leftPercentage, rightPercentage);
-	TRAPD(error, iDevSound->SetRecordBalanceL(leftPercentage, rightPercentage));
-	if (KErrNone != error)
-		{
-		ERR_PRINTF2(_L("SetRecordBalanceL left with error %d"), error);
-		SetError(error);
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetRecordBalanceL"));
-	}
-
-/**
- * Defines the number of times the audio is to be repeated during the tone
- * playback operation.
- * A period of silence can follow each playing of a tone. The tone playing can
- * be repeated indefinitely.
- * @param aSection - Section to read params from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdSetToneRepeats(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetToneRepeats"));
-	TInt repeatCount=0;
-	TBool dataOk = ETrue;
-	if (!GetIntFromConfig(aSection, KRepeatCount, repeatCount))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRepeatCount);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-
-	TInt tempValue=0;
-	if (!GetIntFromConfig(aSection, KRepeatTrailingSilence, tempValue))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRepeatTrailingSilence);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	TTimeIntervalMicroSeconds repeatTrailingSilence(tempValue);
-
-	if(dataOk)
-		{
-		iDevSound->SetToneRepeats(repeatCount, repeatTrailingSilence);
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetToneRepeats"));
-	}
-
-/**
- * Defines the period over which the volume level is to rise smoothly from
- * nothing to the normal volume level.
- * The function is only available while the tone is playing.
- * @param aSection - Section to read params from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdSetVolume(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetVolume"));
-	TInt volume = iVolumeValue;
-	if(!GetIntFromConfig(aSection, KVolumeValue, volume))
-		{
-		INFO_PRINTF1(_L("The Volume value was not found in the ini file, using default value"));
-		}
-	INFO_PRINTF2(_L("Setting volume value to %d"), volume);
-	iDevSound->SetVolume(volume);
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetVolume"));
-	}
-
-/**
- * Defines the loop over which the volume level is to rise smoothly from
- * nothing to the normal volume level.
- * @param aSection - Section to read params from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdSetVolumeLoop(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetVolumeLoop"));
-	TInt volLoop=0;
-	TBool dataOk = ETrue;
-	if (!GetIntFromConfig(aSection, KVolumeLoop, volLoop))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KVolumeLoop);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	if(dataOk)
-		{
-		TPtrC parVolume;
-		TInt volumeValue=0;
-		RPointerArray<HBufC> volumeList;
-		for (TInt i=0; i<volLoop; i++)
-			{
-			if (!GetArrayRectFromConfig(aSection, KVolumeList, volumeList))
-				{
-				ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KVolumeList);
-				volumeList.ResetAndDestroy();
-				SetBlockResult(EFail);
-				dataOk = EFalse;
-				}
-			if(dataOk)
-				{
-				for (TInt j=0; j<volumeList.Count(); j++)
-					{
-					parVolume.Set(*volumeList[j]);
-					TLex lex(parVolume);
-					TInt error = lex.Val(volumeValue);
-					if (error != KErrNone)
-						{
-						ERR_PRINTF2(_L("Obtaining volume value failed with error %d"), error);
-						SetError(error);
-						volumeList.ResetAndDestroy();
-						}
-					else
-						{
-						INFO_PRINTF3(_L("Setting volume number %d in the iteration number %d"), j, i);
-						iDevSound->SetVolume(volumeValue);
-						}
-					}
-				}
-			}
-		volumeList.ResetAndDestroy();
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetVolumeLoop"));
-	}
-
-/**
- * Defines the period over which the volume level is to rise smoothly from
- * nothing to the normal volume level.
- * The function is only available while the tone is playing.
- * @param aSection - Section to read param from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdSetVolumeRamp(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetVolumeRamp"));
-	TInt tempValue=0;
-	TBool dataOk = ETrue;
-	if (!GetIntFromConfig(aSection, KRampDuration, tempValue))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRampDuration);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	TTimeIntervalMicroSeconds rampDuration(tempValue);
-
-	if(dataOk)
-		{
-		iDevSound->SetVolumeRamp(rampDuration);
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetVolumeRamp"));
-	}
-
-/**
- * Initializes DevSound object for the mode aMode for processing audio data
- * with hardware device aHWDev and supporting FourCC.
- * Too Initializes CMMFDevSound object to play and record PCM16 raw audio data
- * with sampling rate of 8 KHz.
- * @param aSection - Section to read params from the ini file
- */
-void CT_CMMFDevSoundData::DoCmdInitializeL(const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdInitializeL"));
-	TBool dataOk = ETrue;
-	TInt mode=0;
-	if (!GetEnumFromConfig(aSection, KMode, iEnumMode, mode))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KMode);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	else
-		{
-		TInt hwDeviceInt=0;
-		if (!GetHexFromConfig(aSection, KHwDevice, hwDeviceInt))
-			{
-			INFO_PRINTF2(_L("%S parameter was not found in INI file"), &KHwDevice);
-			TPtrC fourCCIniString;
-			if (!GetStringFromConfig(aSection, KFourCC, fourCCIniString))
-				{
-				INFO_PRINTF2(_L("%S parameter was not found in INI file"), &KFourCC);
-				if (dataOk)
-					{
-					INFO_PRINTF1(_L("Initializing DevSound with overload: void InitializeL(MDevSoundObserver &aDevSoundObserver, TMMFState aMode)"));
-					TRAPD(error, iDevSound->InitializeL(*this, (TMMFState)mode));
-					if(KErrNone != error)
-						{
-						ERR_PRINTF2(_L("InitializeL(aMDevSoundObserver, mode) left with error %d"), error);
-						SetError(error);
-						}
-					}
-				}
-			else
-				{
-				if (fourCCIniString.Length() > KTFourCC)
-					{
-					ERR_PRINTF2(_L("FourCC obtained from INI file exceeded the valid length in %d"), fourCCIniString.Length());
-					SetBlockResult(EFail);
-					dataOk = EFalse;
-					}
-				if (dataOk)
-					{
-					TBuf<256> fourCCString;
-					fourCCString.Copy(fourCCIniString);
-					while (fourCCString.Length() < KTFourCC)
-						{
-						fourCCString.Insert(0, _L(" "));
-						}
-					TFourCC fourCC;
-					fourCC = TFourCC(fourCCString[3] << 24 | fourCCString[2] << 16 | fourCCString[1] << 8 | fourCCString[0]);
-					INFO_PRINTF1(_L("Initializing DevSound with overload: void InitializeL(MDevSoundObserver &aDevSoundObserver, TFourCC aDesiredFourCC, TMMFState aMode)"));
-					TRAPD(error, iDevSound->InitializeL(*this, fourCC, (TMMFState)mode));
-					if(KErrNone!=error)
-						{
-						ERR_PRINTF2(_L("InitializeL(aMDevSoundObserver, fourCC, mode) left with error %d"), error);
-						ERR_PRINTF2(_L(" %S Not supported in this device"), &fourCCString);
-						SetError(error);
-						SetBlockResult(EFail);
-						}
-					}
-				}
-			}
-		else
-			{
-			if (dataOk)
-				{
-				TUid hwDevice;
-				hwDevice.iUid = hwDeviceInt;
-				INFO_PRINTF1(_L("Initializing DevSound with overload: void InitializeL(MDevSoundObserver &aDevSoundObserver, TUid aHWDev, TMMFState aMode)"));
-				TRAPD(error, iDevSound->InitializeL(*this, hwDevice, (TMMFState)mode));
-				if(KErrNone != error)
-					{
-					ERR_PRINTF2(_L("InitializeL(aMDevSoundObserver, hwDevice, mode) left with error %d"), error);
-					SetError(error);
-					}
-				}
-			}
-		}
-
-	if (dataOk)
-		{
-		IncOutstanding();
-        iInitializeErrorIndex = aAsyncErrorIndex;
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdInitializeL"));
-	}
-
-
-/**
- * Initializes the audio device and starts playing the DTMF string aDTMFString.
- * @param aSection - Section to read param from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdPlayDTMFStringL(const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdPlayDTMFStringL"));
-	TBool dataOk = ETrue;
-	TPtrC dtmfString;
-	if (!GetStringFromConfig(aSection, KDTMFString, dtmfString) )
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDTMFString);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	if(dataOk)
-		{
-		TRAPD( error, iDevSound->PlayDTMFStringL(dtmfString) );
-		if(error != KErrNone)
-			{
-			ERR_PRINTF2(_L("Play DTMF string failed with error: %d "), error);
-			SetError(error);
-			}
-		else
-			{
-			iToneErrorIndex = aAsyncErrorIndex;
-			IncOutstanding();
-			}
-		}
-
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdPlayDTMFStringL"));
-	}
-
-/**
- * Plays data in the buffer at the current volume.
- * @param
- * @return
- */
-void CT_CMMFDevSoundData::DoCmdPlayData()
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdPlayData"));
-	PlayData();
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdPlayData"));
-	}
-
-/**
- * Helper for the DoCmdPlayData command
- */
-void CT_CMMFDevSoundData::PlayData()
-	{
-	INFO_PRINTF1(_L("CT_CMMFDevSoundData::PlayData()"));
-	iDevSound->PlayData();
-	}
-
-/**
- * Initializes audio device and starts playing a dual tone.
- * The generated tone consists of two sine waves of different frequencies summed together.
- * Dual Tone is played with the specified frequencies and for the specified duration.
- * @param aSection - Section to read params from the ini file.
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdPlayDualToneL(const TTEFSectionName& aSection , const TInt aAsyncErrorIndex)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdPlayDualToneL"));
-	TBool dataOk = ETrue;
-	TInt frequencyOne=0;
-	if (!GetIntFromConfig(aSection, KFrequencyOne, frequencyOne) )
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFrequencyOne);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-
-	TInt frequencyTwo=0;
-	if (!GetIntFromConfig(aSection, KFrequencyTwo, frequencyTwo) )
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFrequencyTwo);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-
-	TInt duration=0;
-	if (!GetIntFromConfig(aSection, KDuration, duration) )
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDuration);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	if(dataOk)
-		{
-		TRAPD( error, iDevSound->PlayDualToneL(frequencyOne, frequencyTwo, duration) );
-		if(error != KErrNone)
-			{
-			ERR_PRINTF2(_L("Play dual tone failed with error %d"), error);
-			SetError(error);
-			}
-		else
-			{
-			iToneErrorIndex =  aAsyncErrorIndex;
-			IncOutstanding();
-			}
-		}
-
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdPlayDualToneL"));
-	}
-
-
-/**
- * Initializes the audio device and starts the play process.
- *
- * This function queries and acquires the audio policy before initializing audio device. If there was
- * an error during policy initialization, PlayError() function will be called on    the observer with
- * error code KErrAccessDenied, otherwise BufferToBeFilled() function will be called with a buffer
- * reference. After reading data into the buffer reference passed, the client should call PlayData() to play data.
- *
- * The amount of data that can be played is specified in CMMFBuffer::RequestSize(). Any data that is read into
- * buffer beyond this size will be ignored.
- * @param none
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdPlayInitL(const TInt aAsyncErrorIndex)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdPlayInitL"));
-	TRAPD(error, iDevSound->PlayInitL());
-	if (error != KErrNone)
-		{
-		ERR_PRINTF2(_L("PlayInitL left with error %d"), error);
-		SetError(error);
-		}
-	else
-		{
-		iPlayErrorIndex =  aAsyncErrorIndex;
-		IncOutstanding();
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdPlayInitL"));
-	}
-
-/**
- * Initializes the audio device and starts playing a tone. The tone is played with the
- * frequency and duration specified.
- * @param aSection - Section to read params from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdPlayToneL(const TTEFSectionName& aSection , const TInt aAsyncErrorIndex)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdPlayToneL"));
-	TBool dataOk = ETrue;
-	TInt frequency=0;
-	if (!GetIntFromConfig(aSection, KFrequency, frequency))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFrequency);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-
-	TInt duration=0;
-	if (!GetIntFromConfig(aSection, KDuration, duration))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDuration);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	if(dataOk)
-		{
-		TRAPD(error, iDevSound->PlayToneL(frequency, duration));
-		if (error != KErrNone)
-			{
-			ERR_PRINTF2(_L("Play tone failed with error %d"), error);
-			SetError(error);
-			}
-		else
-			{
-			iToneErrorIndex =  aAsyncErrorIndex;
-			IncOutstanding();
-			}
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdPlayToneL"));
-	}
-
-/**
- * Initializes the audio device and starts playing a tone sequence.
- * @param aSection - Section to read param from the ini file
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdPlayToneSequenceL(const TTEFSectionName& aSection , const TInt aAsyncErrorIndex)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdPlayToneSequenceL"));
-	TBool dataOk = ETrue;
-	TPtrC toneFileParameter;
-	if (!GetStringFromConfig(aSection, KFilename, toneFileParameter))
-		{
-		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFilename);
-		SetBlockResult(EFail);
-		dataOk = EFalse;
-		}
-	if(dataOk)
-		{
-		TInt error = iToneFile.Open(iFs, toneFileParameter, EFileRead);
-		if (error != KErrNone)
-			{
-			ERR_PRINTF2(_L("Open file failed with error %d"), error);
-			SetError(EFail);
-			}
-		else
-			{
-			error = iToneFile.Read(iToneSequence);
-			if (error != KErrNone)
-				{
-				ERR_PRINTF2(_L("Read file failed with error %d"), error);
-				SetError(EFail);
-				}
-			else
-				{
-				TRAP(error, iDevSound->PlayToneSequenceL(iToneSequence));
-				if (error != KErrNone)
-					{
-					ERR_PRINTF2(_L("Play tone sequence failed with error %d"), error);
-					SetError(error);
-					}
-				else
-					{
-				  iToneErrorIndex =  aAsyncErrorIndex;
-					IncOutstanding();
-					}
-				}
-			}
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdPlayToneSequenceL"));
-	}
-
-/**
- * Contine the process of recording.
- *
- * Once the buffer is filled with recorded  data, the Observer gets a reference to the buffer along
- * with the callback function BufferToBeEmptied(). After processing the buffer (copying over to a
- * different buffer or writing to file) the client should call this function to continue the
- * recording process.
- * @param none
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdRecordData()
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdRecordData"));
-	RecordData();
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdRecordData"));
-	}
-
-/**
- * Helper method to DoCmdRecordData command
- */
-void CT_CMMFDevSoundData::RecordData()
-	{
-	iDevSound->RecordData();
-	}
-
-/**
- * Initializes audio device and starts the recording process.
- *
- * This command queries and acquires the audio policy before initializing audio device. If there
- * was an error during policy initialization, RecordError() function will be called on the observer
- * with error code KErrAccessDenied, otherwise BufferToBeEmptied()  function will be called with a
- * buffer reference. This buffer contains recorded  or encoded data. After processing data in the
- * buffer reference passed, the client should call RecordData() to continue recording process.
- *
- * The amount of data that is available is specified in CMMFBuffer::RequestSize().
- * @param none
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdRecordInitL(const TInt aAsyncErrorIndex)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdRecordInitL"));
-	iRecordErrorIndex = aAsyncErrorIndex;	
-	TRAPD(error, iDevSound->RecordInitL());
-	if (error != KErrNone)
-		{
-		ERR_PRINTF2(_L("RecordInitL left with error %d"), error);
-		SetError(error);
-		}
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdRecordInitL"));
-	}
-
-
-/**
- * Conceal an error
- * @param none
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdUtilityErrorConceal()
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdErrorConceal"));
-	iErrorConceal=ETrue;
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdErrorConceal"));
-	}
-
-/**
- * Stop an audio file
- * @param none
- * @return none
- */
-void CT_CMMFDevSoundData::DoCmdStop(const TTEFSectionName& aSection)
-	{
-	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdStop"));
-	TBool pause;
-	if(!GetBoolFromConfig(aSection,KPause,pause))
-		{
-		INFO_PRINTF1(_L("The DoCmdStop command will be execute"));
-		pause = EFalse;
-		}
-	iPaused=pause;
-	if(iPaused)
-		{
-		INFO_PRINTF1(_L("a Pause was required"));
-		}
-	Stop();
-	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdStop"));
-	}
-
-
-
-
-/**
- * Utility for get the HwDevice for play and recording
- */
-
-void CT_CMMFDevSoundData::UtilityFourCCToHwDeviceUidL(const TDesC& aFourCC, THwDeviceType aType, TUid& aHwDeviceUid)
-	{
-	TPtrC8 fourCCPtr(0,0);
-	TPtrC8 fourCCP16Ptr(0,0);
-	RImplInfoPtrArray impArray;
-	CleanupResetAndDestroyPushL(impArray);
-	REComSession::ListImplementationsL(TUid::Uid(KMmfUidPluginInterfaceHwDevice), impArray);
-	TBuf<KHwDeviceDefaultDataLength> datatype;
-	for(TInt i = 0; i < impArray.Count(); ++i)
-		{
-		CImplementationInformation& entry = *(impArray[i]);
-		// Validate lenght
-		if (entry.DataType().Length() == KHwDeviceDefaultDataLength)
-			{
-			INFO_PRINTF2(_L("Implementation UID=0x%08x"),entry.ImplementationUid());
-			datatype.Copy(entry.DataType());
-			INFO_PRINTF2(_L("Default data (fourCCs)=%S"), &datatype);
-			// Extract FourCC
-			if(aType == EDecoder)
-				{
-				fourCCPtr.Set(entry.DataType().Left(KFourCCLength));
-				fourCCP16Ptr.Set(entry.DataType().Right(KFourCCLength));
-				}
-			else if (aType == EEncoder)
-				{
-				fourCCPtr.Set(entry.DataType().Right(KFourCCLength));
-				fourCCP16Ptr.Set(entry.DataType().Left(KFourCCLength));
-				}
-			// Compare FourCC
-			TBuf16<4> foundFourCC;
-			foundFourCC.Copy(fourCCPtr);
-			if(aFourCC.CompareF(foundFourCC) == 0)
-				{
-				aHwDeviceUid = entry.ImplementationUid();
-				break;
-				}
-			}
-		}
-	CleanupStack::PopAndDestroy(&impArray);
-	REComSession::FinalClose();
-	}
+/*
+* 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:
+*
+*/
+
+
+#include "T_CMMFDevSoundData.h"
+
+/*@{*/
+//Constants for HwDevice
+const TInt KHwDeviceDefaultDataLength = 9;
+const TInt KFourCCLength = 4;
+//Supported Input Data Types
+const TInt KFourCCMaxBitDisplacement = 24;
+const TInt K8Bits = 8;
+const TInt KTFourCC = 4;
+/*@}*/
+
+/*@{*/
+//Command literals
+_LIT(KCmdNewL,                         "NewL");
+_LIT(KCmdNewLLoopL,                    "NewLLoopL");
+_LIT(KCmdDestructor,                   "~");
+_LIT(KCmdCapabilities,                 "Capabilities");
+_LIT(KCmdConfig,                       "Config");
+_LIT(KCmdMaxGain,                      "MaxGain");
+_LIT(KCmdMaxVolume,                    "MaxVolume");
+_LIT(KCmdGetPlayBalanceL,              "GetPlayBalanceL");
+_LIT(KCmdGetRecordBalanceL,            "GetRecordBalanceL");
+_LIT(KCmdGetSupportedInputDataTypesL,  "GetSupportedInputDataTypesL");
+_LIT(KCmdGetSupportedOutputDataTypesL, "GetSupportedOutputDataTypesL");
+_LIT(KCmdSamplesPlayed,                "SamplesPlayed");
+_LIT(KCmdSamplesRecorded,              "SamplesRecorded");
+_LIT(KCmdVolume,                       "Volume");
+_LIT(KCmdGain,                         "Gain");
+_LIT(KCmdFixedSequenceCount,           "FixedSequenceCount");
+_LIT(KCmdFixedSequenceName,            "FixedSequenceName");
+_LIT(KCmdSetConfigL,                   "SetConfigL");
+_LIT(KCmdSetDTMFLengths,               "SetDTMFLengths");
+_LIT(KCmdSetGain,                      "SetGain");
+_LIT(KCmdSetPlayBalanceL,              "SetPlayBalanceL");
+_LIT(KCmdSetPrioritySettings,          "SetPrioritySettings");
+_LIT(KCmdSetRecordBalanceL,            "SetRecordBalanceL");
+_LIT(KCmdSetToneRepeats,               "SetToneRepeats");
+_LIT(KCmdSetVolume,                    "SetVolume");
+_LIT(KCmdSetVolumeRamp,                "SetVolumeRamp");
+_LIT(KCmdInitializeL,                  "InitializeL");
+_LIT(KCmdPlayDTMFStringL,              "PlayDTMFStringL");
+_LIT(KCmdPlayData,                     "PlayData");
+_LIT(KCmdPlayDualToneL,                "PlayDualToneL");
+_LIT(KCmdPlayInitL,                    "PlayInitL");
+_LIT(KCmdPlayToneL,                    "PlayToneL");
+_LIT(KCmdPlayToneSequenceL,            "PlayToneSequenceL");
+_LIT(KCmdRecordData,                   "RecordData");
+_LIT(KCmdRecordInitL,                  "RecordInitL");
+_LIT(KCmdStop,                         "Stop");
+_LIT(KCmdErrorConceal,                 "ErrorConceal");
+_LIT(KCmdSetVolumeLoop,                "SetVolumeLoop");
+/*@}*/
+
+/*@{*/
+//Utility literals
+_LIT(KCmdUtilityReplaceFile,                  "ReplaceFile");
+_LIT(KCmdUtilityOpenFile,                     "OpenFile");
+_LIT(KCmdUtilityCloseFile,                    "CloseFile");
+_LIT(KCmdUtilityFileStartPosition,            "FileStartPosition");
+/*@}*/
+
+/*@{*/
+//INI Section name literals
+_LIT(KGainValue,                       "Gain");
+_LIT(KVolumeValue,                     "Volume");
+_LIT(KLeftPercentage,                  "LeftPercentage");
+_LIT(KRightPercentage,                 "RightPercentage");
+_LIT(KSequenceNumber,                  "SequenceNumber");
+_LIT(KRate,                            "Rate");
+_LIT(KEncoding,                        "Encoding");
+_LIT(KChannels,                        "Channels");
+_LIT(KBufferSize,                      "BufferSize");
+_LIT(KToneOnLength,                    "ToneOnLength");
+_LIT(KToneOffLength,                   "ToneOffLength");
+_LIT(KPause,                           "Pause");
+_LIT(KPauseLength,                     "PauseLength");
+_LIT(KPriority,                        "Priority");
+_LIT(KPreference,                      "Preference");
+_LIT(KPriorityState,                   "PriorityState");
+_LIT(KRepeatCount,                     "RepeatCount");
+_LIT(KRepeatTrailingSilence,           "RepeatTrailingSilence");
+_LIT(KRampDuration,                    "RampDuration");
+_LIT(KMode,                            "Mode");
+_LIT(KHwDevice,                        "HwDevice");
+_LIT(KFourCC,                          "FourCC");
+_LIT(KFilename,                        "Filename");
+_LIT(KDTMFString,                      "DTMFString");
+_LIT(KFrequency,                       "Frequency");
+_LIT(KFrequencyOne,                    "FrequencyOne");
+_LIT(KFrequencyTwo,                    "FrequencyTwo");
+_LIT(KDuration,                        "Duration");
+_LIT(KLoop,                            "Loop");
+_LIT(KAllowedError,                    "AllowedError");
+_LIT(KVolumeList,                      "VolumeList");
+_LIT(KVolumeLoop,                      "VolumeLoop");
+/*@}*/
+
+/*@{*/
+//Literals for iEnumChannels
+_LIT(KEMMFStereo, "EMMFStereo");
+_LIT(KEMMFMono,   "EMMFMono");
+/*@}*/
+
+const CDataWrapperBase::TEnumEntryTable CT_CMMFDevSoundData::iEnumChannels[] =
+	{
+	{KEMMFMono,   EMMFMono},
+	{KEMMFStereo, EMMFStereo}
+	};
+
+/*@{*/
+//Literals for iEnumSampleRate
+_LIT(KEMMFSampleRate8000Hz,  "EMMFSampleRate8000Hz");
+_LIT(KEMMFSampleRate11025Hz, "EMMFSampleRate11025Hz");
+_LIT(KEMMFSampleRate16000Hz, "EMMFSampleRate16000Hz");
+_LIT(KEMMFSampleRate22050Hz, "EMMFSampleRate22050Hz");
+_LIT(KEMMFSampleRate32000Hz, "EMMFSampleRate32000Hz");
+_LIT(KEMMFSampleRate44100Hz, "EMMFSampleRate44100Hz");
+_LIT(KEMMFSampleRate48000Hz, "EMMFSampleRate48000Hz");
+_LIT(KEMMFSampleRate88200Hz, "EMMFSampleRate88200Hz");
+_LIT(KEMMFSampleRate96000Hz, "EMMFSampleRate96000Hz");
+_LIT(KEMMFSampleRate12000Hz, "EMMFSampleRate12000Hz");
+_LIT(KEMMFSampleRate24000Hz, "EMMFSampleRate24000Hz");
+_LIT(KEMMFSampleRate64000Hz, "EMMFSampleRate64000Hz");
+/*@}*/
+
+const CDataWrapperBase::TEnumEntryTable CT_CMMFDevSoundData::iEnumSampleRate[] =
+	{
+	{KEMMFSampleRate8000Hz,  EMMFSampleRate8000Hz},
+	{KEMMFSampleRate11025Hz, EMMFSampleRate11025Hz},
+	{KEMMFSampleRate16000Hz, EMMFSampleRate16000Hz},
+	{KEMMFSampleRate22050Hz, EMMFSampleRate22050Hz},
+	{KEMMFSampleRate32000Hz, EMMFSampleRate32000Hz},
+	{KEMMFSampleRate44100Hz, EMMFSampleRate44100Hz},
+	{KEMMFSampleRate48000Hz, EMMFSampleRate48000Hz},
+	{KEMMFSampleRate88200Hz, EMMFSampleRate88200Hz},
+	{KEMMFSampleRate96000Hz, EMMFSampleRate96000Hz},
+	{KEMMFSampleRate12000Hz, EMMFSampleRate12000Hz},
+	{KEMMFSampleRate24000Hz, EMMFSampleRate24000Hz},
+	{KEMMFSampleRate64000Hz, EMMFSampleRate64000Hz}
+	};
+
+/*@{*/
+//Literal for iEnumMode
+_LIT(KEMMFStateIdle,             "EMMFStateIdle");
+_LIT(KEMMFStatePlaying,          "EMMFStatePlaying");
+_LIT(KEMMFStateTonePlaying,      "EMMFStateTonePlaying");
+_LIT(KEMMFStateRecording,        "EMMFStateRecording");
+_LIT(KEMMFStatePlayingRecording, "EMMFStatePlayingRecording");
+_LIT(KEMMFStateConverting,       "EMMFStateConverting");
+/*@}*/
+
+const CDataWrapperBase::TEnumEntryTable CT_CMMFDevSoundData::iEnumMode[] =
+	{
+	{KEMMFStateIdle,             EMMFStateIdle},
+	{KEMMFStatePlaying,          EMMFStatePlaying},
+	{KEMMFStateRecording,        EMMFStateRecording},
+	{KEMMFStateTonePlaying,      EMMFStateTonePlaying},
+	{KEMMFStatePlayingRecording, EMMFStatePlayingRecording},
+	{KEMMFStateConverting,       EMMFStateConverting}
+	};
+
+/*@{*/
+//Literals for iEnumInitializeLType
+_LIT(KEInitializeState,          "EInitializeState");
+_LIT(KEInitializeHwDeviceMode,   "EInitializeHwDeviceMode");
+_LIT(KEInitializeFourCCMode,     "EInitializeFourCCMode");
+/*@}*/
+
+enum TMMFInitializeMode
+	{
+	EInitializeState,
+	EInitializeHwDeviceMode,
+	EInitializeFourCCMode
+	};
+
+const CDataWrapperBase::TEnumEntryTable CT_CMMFDevSoundData::iEnumInitializeLType[] =
+	{
+	{KEInitializeState,        EInitializeState},
+	{KEInitializeHwDeviceMode, EInitializeHwDeviceMode},
+	{KEInitializeFourCCMode,   EInitializeFourCCMode}
+	};
+
+/**
+ * Two phase constructor
+ *
+ * @leave   system wide error
+ */
+CT_CMMFDevSoundData* CT_CMMFDevSoundData::NewL()
+	{
+	CT_CMMFDevSoundData* ret = new (ELeave) CT_CMMFDevSoundData();
+	CleanupStack::PushL(ret);
+	ret->ConstructL();
+	CleanupStack::Pop(ret);
+	return ret;
+	}
+
+/**
+ * Private constructor. First phase construction
+ */
+CT_CMMFDevSoundData::CT_CMMFDevSoundData()
+	:
+	iDevSound(NULL),
+	iPrioritySettings(),
+	iCapabilities(),
+	iVolumeValue(0),
+	iGainValue(0),
+	iLeftPercentage(0),
+	iRightPercentage(0),
+	iFs(),
+	iToneFile(),
+	iAudiofile(),
+	iBuffer(NULL),
+	iLastSample(0),
+	iPaused(EFalse),
+	iErrorConceal(EFalse),
+	iEndFile(EFalse),
+	iToneSequence(),
+	iRecordErrorIndex(0),
+	iPlayErrorIndex(0),
+	iToneErrorIndex(0),
+    iInitializeErrorIndex(0)
+	{
+	}
+
+/**
+ * Second phase construction
+ * @internalComponent
+ * @return  N/A
+ * @pre     None
+ * @post    None
+ * @leave   system wide error
+ */
+void CT_CMMFDevSoundData::ConstructL()
+	{
+	iFs.Connect();
+	}
+
+/**
+ * Public destructor
+ */
+CT_CMMFDevSoundData::~CT_CMMFDevSoundData()
+	{
+	iFs.Close();
+	DestroyData();
+	}
+
+/**
+ * Helper Destructor
+ */
+void CT_CMMFDevSoundData::DestroyData()
+	{
+	if(iDevSound)
+		{
+		delete iDevSound;
+		iDevSound = NULL;
+		}
+	}
+
+/**
+ * Return a pointer to the object that the data wraps
+ *
+ * @return  pointer to the object that the data wraps
+ */
+TAny* CT_CMMFDevSoundData::GetObject()
+	{
+	return iDevSound;
+	}
+
+/**
+ * Process a command read from the Ini file
+ * @param aCommand          - The command to process
+ * @param aSection          - The section get from the *.ini file of the project T_Wlan
+ * @param aAsyncErrorIndex  - Command index dor async calls to returns errors to
+ * @return TBool            - ETrue if the command is process
+ * @leave                   - system wide error
+ */
+TBool CT_CMMFDevSoundData::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+	{
+	TBool ret = ETrue;
+
+	if (aCommand == KCmdNewL)
+		{
+		DoCmdNewL();
+		}
+	else if(aCommand == KCmdNewLLoopL)
+		{
+		DoCmdNewLLoopL(aSection);
+		}
+	else if (aCommand == KCmdDestructor)
+		{
+		DoCmdDestructor();
+		}
+	else if (aCommand == KCmdUtilityReplaceFile)
+		{
+		DoCmdUtilityReplaceFile(aSection);
+		}
+	else if (aCommand == KCmdUtilityOpenFile)
+		{
+		DoCmdUtilityOpenFile(aSection);
+		}
+	else if (aCommand == KCmdUtilityCloseFile)
+		{
+		DoCmdUtilityCloseFile();
+		}
+	else if (aCommand == KCmdUtilityFileStartPosition)
+		{
+		DoCmdUtilityFileStartPosition();
+		}
+	else if (aCommand == KCmdCapabilities)
+		{
+		DoCmdCapabilities();
+		}
+	else if (aCommand == KCmdConfig)
+		{
+		DoCmdConfig();
+		}
+	else if (aCommand == KCmdMaxGain)
+		{
+		DoCmdMaxGain(aSection);
+		}
+	else if (aCommand == KCmdMaxVolume)
+		{
+		DoCmdMaxVolume(aSection);
+		}
+	else if (aCommand == KCmdGetPlayBalanceL)
+		{
+		DoCmdGetPlayBalanceL(aSection);
+		}
+	else if (aCommand == KCmdGetRecordBalanceL)
+		{
+		DoCmdGetRecordBalanceL(aSection);
+		}
+	else if (aCommand == KCmdGetSupportedInputDataTypesL)
+		{
+		DoCmdGetSupportedInputDataTypesL();
+		}
+	else if (aCommand == KCmdGetSupportedOutputDataTypesL)
+		{
+		DoCmdGetSupportedOutputDataTypesL();
+		}
+	else if (aCommand == KCmdSamplesPlayed)
+		{
+		DoCmdSamplesPlayed();
+		}
+	else if (aCommand == KCmdSamplesRecorded)
+		{
+		DoCmdSamplesRecorded();
+		}
+	else if (aCommand == KCmdVolume)
+		{
+		DoCmdVolume(aSection);
+		}
+	else if (aCommand == KCmdGain)
+		{
+		DoCmdGain(aSection);
+		}
+	else if (aCommand == KCmdFixedSequenceCount)
+		{
+		DoCmdFixedSequenceCount();
+		}
+	else if (aCommand == KCmdFixedSequenceName)
+		{
+		DoCmdFixedSequenceName(aSection);
+		}
+	else if (aCommand == KCmdSetConfigL)
+		{
+		DoCmdSetConfigL(aSection);
+		}
+	else if (aCommand == KCmdSetDTMFLengths)
+		{
+		DoCmdSetDTMFLengths(aSection);
+		}
+	else if (aCommand == KCmdSetGain)
+		{
+		DoCmdSetGain(aSection);
+		}
+	else if (aCommand == KCmdSetPlayBalanceL)
+		{
+		DoCmdSetPlayBalanceL(aSection);
+		}
+	else if (aCommand == KCmdSetPrioritySettings)
+		{
+		DoCmdSetPrioritySettings(aSection);
+		}
+	else if (aCommand == KCmdSetRecordBalanceL)
+		{
+		DoCmdSetRecordBalanceL(aSection);
+		}
+	else if (aCommand == KCmdSetToneRepeats)
+		{
+		DoCmdSetToneRepeats(aSection);
+		}
+	else if (aCommand == KCmdSetVolume)
+		{
+		DoCmdSetVolume(aSection);
+		}
+	else if (aCommand == KCmdSetVolumeLoop)
+		{
+		DoCmdSetVolumeLoop(aSection);
+		}
+	else if (aCommand == KCmdSetVolumeRamp)
+		{
+		DoCmdSetVolumeRamp(aSection);
+		}
+	else if (aCommand == KCmdInitializeL)
+		{
+		DoCmdInitializeL(aSection,aAsyncErrorIndex);
+		}
+	else if (aCommand == KCmdPlayDTMFStringL)
+		{
+		DoCmdPlayDTMFStringL(aSection, aAsyncErrorIndex);
+		}
+	else if (aCommand == KCmdPlayData)
+		{
+		DoCmdPlayData();
+		}
+	else if (aCommand == KCmdPlayDualToneL)
+		{
+		DoCmdPlayDualToneL(aSection, aAsyncErrorIndex);
+		}
+	else if (aCommand == KCmdPlayInitL)
+		{
+		DoCmdPlayInitL(aAsyncErrorIndex);
+		}
+	else if (aCommand == KCmdPlayToneL)
+		{
+		DoCmdPlayToneL(aSection, aAsyncErrorIndex);
+		}
+	else if (aCommand == KCmdPlayToneSequenceL)
+		{
+		DoCmdPlayToneSequenceL(aSection,aAsyncErrorIndex);
+		}
+	else if (aCommand == KCmdRecordData)
+		{
+		DoCmdRecordData();
+		}
+	else if (aCommand == KCmdRecordInitL)
+		{
+		DoCmdRecordInitL(aAsyncErrorIndex);
+		}
+	else if (aCommand == KCmdStop)
+		{
+		DoCmdStop(aSection);
+		}
+	else if(aCommand == KCmdErrorConceal)
+		{
+		DoCmdUtilityErrorConceal();
+		}
+	else
+		{
+		ERR_PRINTF1(_L("Unknown command."));
+		ret=EFalse;
+		}
+	return ret;
+	}
+
+/**
+ * Handles initialization completion event.
+ * CMMFDevSound object calls this function when its InitializeL() function
+ * completes.
+ * @param  aError - Error code. KErrNone if successful. Other values are possible
+ *                  indicating a problem initializing CMMFDevSound object.
+ * @return void
+ */
+
+void CT_CMMFDevSoundData::InitializeComplete(TInt aError)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::InitializeComplete"));
+	if(KErrNone != aError)
+		{
+		ERR_PRINTF2(_L("InitializeComplete callback failed with error %d"), aError);
+		SetAsyncError(iInitializeErrorIndex, aError);
+        iInitializeErrorIndex = 0;
+		}
+	if(Outstanding())
+	{
+    DecOutstanding();
+	}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::InitializeComplete"));
+	}
+
+/**
+ * It's needed for playing o converting
+ * @param aBuffer - Buffer into which data should be read. The amount of data that is
+ *                  needed is specified in CMMFBuffer::RequestSize().
+ */
+void CT_CMMFDevSoundData::BufferToBeFilled(CMMFBuffer* aBuffer)
+	{
+	if (!aBuffer)
+		{
+		ERR_PRINTF1(_L("BufferToBeFilled callback received a NULL CMMFBuffer!"));
+		SetBlockResult(EFail);
+		}
+	else
+		{
+		TBool dataOk = ETrue;
+		iBuffer = aBuffer;
+		iBuffer->SetLastBuffer(EFalse);
+		CMMFDataBuffer* buffer = static_cast <CMMFDataBuffer*> (iBuffer);
+		if (iPaused)
+			{
+			iPaused=EFalse;
+			TInt error = iAudiofile.Read(iLastSample,buffer->Data());
+			if (error != KErrNone)
+				{
+				ERR_PRINTF2(_L("ERROR : iFile.Read() failed with %d"), error);
+				SetBlockResult(EFail);
+				dataOk = EFalse;
+				}
+			}
+		else
+			{
+			TInt error = iAudiofile.Read(buffer->Data());
+			if (error != KErrNone)
+				{
+				ERR_PRINTF2(_L("ERROR : iFile.Read() failed with %d"), error);
+				SetBlockResult(EFail);
+				dataOk =EFalse;
+				}
+			}
+		if(dataOk)
+			{
+			if (buffer->Data().Length() != buffer->RequestSize())
+				{
+				iBuffer->SetLastBuffer(ETrue);
+				}
+			if (iErrorConceal)
+				{
+				iErrorConceal=EFalse;
+				buffer->Data().Zero();
+				INFO_PRINTF1(_L("buffer->Data().Zero()"));
+				}
+			PlayData();
+			TInt pos=0;
+			iLastSample=iAudiofile.Seek(ESeekCurrent ,pos);
+			INFO_PRINTF2(_L("Number of samples played so far: %d"), pos);
+			iLastSample=pos;
+			}
+		}
+	}
+
+/**
+* Handles play completion or cancel event.
+*
+* CMMFDevSound object calls this function when an attempt to play audio sample
+* has completed, successfully or otherwise.
+*
+*   @param  aError - Error code. The status of playback. KErrUnderflow playing of the
+*                    audio sample is complete. KErrAccessDenied the sound device is in
+*                    use by another higher priority client.
+*/
+void CT_CMMFDevSoundData::PlayError(TInt aError)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::PlayError"));
+	if(Outstanding())
+	{
+    DecOutstanding();
+	}
+	if(aError != KErrNone && aError != KErrUnderflow)
+	{
+   	ERR_PRINTF2(_L("Playback completed with error %d"), aError);
+		SetAsyncError(iPlayErrorIndex, aError);	
+		iPlayErrorIndex = 0; 
+	}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::PlayError"));
+	}
+
+
+/**
+ *  Handles tone play completion event.
+ *
+ *
+ *  CMMFDevSound object calls this function when an attempt to play tone has
+ *  completed, successfully or otherwise.
+ *
+ *  The following are the play tone functions; PlayToneL(), PlayDMTFStringL(),
+ *  PlayToneSequenceL(), and PlayFixedSequenceL().
+ *
+ *  @param  aError -  Error code. The status of tone playback. KErrUnderflow playing of
+ *                    the tone is complete. KErrAccessDenied the sound device is in use by
+ *                    another higher priority client. KErrCancel playing of the audio
+ *                    sample is stopped by DevSound client another higher priority client.
+ *
+ */
+
+void CT_CMMFDevSoundData::ToneFinished(TInt aError)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::ToneFinished"));
+	if(Outstanding())
+	{
+    DecOutstanding();
+	}
+	if(aError != KErrNone)
+	{
+   	ERR_PRINTF2(_L("Tone finished with error %d"), aError);
+		SetAsyncError(iToneErrorIndex, aError);
+	  iToneErrorIndex = 0;	
+	}
+	iToneFile.Close();
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::ToneFinished"));
+	}
+
+/**
+ * Handles CMMFDevSound object's data request event.
+ *
+ * CMMFDevSound object calls this function when the buffer, aBuffer gets filled
+ * while recording or converting. The observer should notify CMMFDevSound
+ * object as quickly as possible after data in the buffer is processed by
+ * calling RecordData(), otherwise the implementation might callback
+ * the function RecordError() on derived class object with error code KErrOverflow.
+ *
+ * @param  aBuffer - Buffer containing processed (recorded or converted) data. The amount
+ *                   of data that is available is specified in CMMFBuffer::RequestSize().
+ */
+
+void CT_CMMFDevSoundData::BufferToBeEmptied(CMMFBuffer* aBuffer)
+	{
+	if (!aBuffer)
+		{
+		INFO_PRINTF1(_L("BufferToBeEmptied callback received a NULL CMMFBuffer"));
+		SetBlockResult(EFail);
+		}
+	else
+		{
+		iBuffer = aBuffer;
+		CMMFDataBuffer* buffer = static_cast <CMMFDataBuffer*> (iBuffer);
+		TInt error = iAudiofile.Write(buffer->Data());
+		if(error == KErrNone)
+			{
+			if (!aBuffer->LastBuffer())
+				{
+				RecordData();
+				}
+			else{
+				Stop();
+				}
+			}
+		else
+			{
+			ERR_PRINTF2(_L("iFile.Write() returned the error %d"), error);
+			SetBlockResult(EFail);
+			}
+		}
+	}
+
+/**
+ * Stops the ongoing operation (Play, Record, TonePlay, Convert).
+ * This function should be synchronous and invoke no callbacks through MDevSoundObserver.
+ */
+void CT_CMMFDevSoundData::Stop()
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::Stop()"));
+	iDevSound->Stop();
+	if(Outstanding())
+		{
+		DecOutstanding();
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::Stop()"));
+	}
+
+/**
+ * Handles record completion or cancel event.
+ *
+ * CMMFDevSound object calls this function when an attempt to record audio sample
+ * has completed, successfully or otherwise.
+ *
+ * @param  aError - Error code. The status of recording. KErrOverflow audio devices
+ *                  runs out of internal buffer. KErrAccessDenied the sound device is
+ *                  in use by another higher priority client.
+ *
+ */
+
+void CT_CMMFDevSoundData::RecordError(TInt aError)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::RecordError"));
+	if(aError != KErrNone)
+	{
+   ERR_PRINTF2(_L("Record failed with error %d"), aError); 
+   SetAsyncError(iRecordErrorIndex , aError);	
+	 iRecordErrorIndex = 0;	
+	}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::RecordError"));
+	}
+
+
+/**
+ * Handles conversion completion or cancel event.
+ *
+ * CMMFDevSound object calls this function when an attempt to convert data from
+ * source format to destination format has completed, successfully or otherwise.
+ *
+ * @param  aError - Error code. KErrCancel conversion operation is cancelled. KErrNone
+ *                  conversion is complete. Other values are possible indicating a
+ *                  problem converting data.
+ */
+
+void CT_CMMFDevSoundData::ConvertError(TInt aError)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::ConvertError"));
+	ERR_PRINTF1(_L("Invalid Callback call"));
+	if (aError == KErrNone)
+		{
+		INFO_PRINTF1(_L("Data conversion completed successfully."));
+		}
+	if (aError == KErrCancel)
+		{
+		INFO_PRINTF1(_L("Data conversion operation was cancelled."));
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::ConvertError"));
+	}
+
+/**
+ * Handles device event.
+ *
+ * CMMFDevSound object calls this function when a message is received from the
+ * audio hardware device.
+ *
+ * @param   aMessageType - Defines the type of message. Used to determine how to
+ *                         interpret the contents of aMsg.
+ * @param   aMsg         - Message that is packed in the Descriptor format.
+ */
+
+
+void CT_CMMFDevSoundData::DeviceMessage(TUid aMessageType, const TDesC8& aMsg)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DeviceMessage"));
+	INFO_PRINTF2(_L("Message type: %d"), aMessageType.iUid);
+	INFO_PRINTF2(_L("Message type: %S"), &aMsg);
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DeviceMessage"));
+	}
+
+
+/**
+ * Create a new or Replace the existing file
+ *
+ */
+void CT_CMMFDevSoundData::DoCmdUtilityReplaceFile(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START* CT_CMMFDevSoundData::DoCmdUtilityReplaceFile()"));
+	TPtrC fileName;
+	TBool dataOk = ETrue;
+	if (!GetStringFromConfig(aSection, KFilename, fileName))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFilename);
+		SetBlockResult(EFail);
+		dataOk =EFalse;
+		}
+	if(dataOk)
+		{
+		TInt error = iAudiofile.Replace(iFs, fileName, EFileRead);
+		if (error != KErrNone)
+			{
+			ERR_PRINTF2(_L("Could not open input file. Error = %d"), error);
+			SetError(error);
+			}
+		}
+
+	INFO_PRINTF1(_L("*END* CT_CMMFDevSoundData::DoCmdUtilityReplaceFile()"));
+	}
+
+/**
+ * Open a file
+ */
+void CT_CMMFDevSoundData::DoCmdUtilityOpenFile(const TTEFSectionName& aSection)
+	{
+
+	INFO_PRINTF1(_L("*START* CT_CMMFDevSoundData::DoCmdUtilityOpenFile()"));
+	TPtrC fileName;
+	TBool dataOk = ETrue;
+	if (!GetStringFromConfig(aSection, KFilename, fileName))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFilename);
+		SetBlockResult(EFail);
+		dataOk =EFalse;
+		}
+	if(dataOk)
+		{
+		TInt error = iAudiofile.Open(iFs, fileName, EFileRead);
+		if (error != KErrNone)
+			{
+			ERR_PRINTF2(_L("Could not open input file. Error = %d"), error);
+			iFs.Close();
+			SetError(error);
+			}
+		}
+	INFO_PRINTF1(_L("*END* CT_CMMFDevSoundData::DoCmdUtilityOpenFile()"));
+	}
+
+/**
+ * Close the opened file
+ */
+void CT_CMMFDevSoundData::DoCmdUtilityCloseFile()
+	{
+	INFO_PRINTF1(_L("*START* CT_CMMFDevSoundData::DoCmdUtilityCloseFile()"));
+	iAudiofile.Close();
+	INFO_PRINTF1(_L("*END* CT_CMMFDevSoundData::DoCmdUtilityCloseFile()"));
+	}
+
+/**
+ * Place the the pointer file at the begining
+ *
+ */
+void CT_CMMFDevSoundData::DoCmdUtilityFileStartPosition()
+	{
+	INFO_PRINTF1(_L("*START* CT_CMMFDevSoundData::DoCmdUtilityFileStartPosition()"));
+	TInt filePosition = 0;
+	TBool dataOk = ETrue;
+	TInt error = iAudiofile.Seek(ESeekStart, filePosition);
+	if (error != KErrNone)
+		{
+		ERR_PRINTF2(_L("Could not set file to the start position. Error = %d"), error);
+		SetError(error);
+		dataOk =EFalse;
+		}
+	if(dataOk)
+		{
+		INFO_PRINTF2(_L("File Position: %d"), filePosition);
+		}
+	INFO_PRINTF1(_L("*END* CT_CMMFDevSoundData::DoCmdUtilityFileStartPosition()"));
+	}
+
+
+/**
+ * Creates "n" instance of CMMFDevSound
+ * @param aSection - Section to read from the ini file
+ * @return void
+ */
+void CT_CMMFDevSoundData::DoCmdNewLLoopL(const TTEFSectionName&aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdNewLLoopL"));
+	CMMFDevSound* devSound = NULL;
+	TBool dataOk = ETrue;
+	TInt loop= 0;
+	if (!GetIntFromConfig(aSection, KLoop, loop))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KLoop);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	TInt allowedError=0;
+	if ( !GetIntFromConfig(aSection, KAllowedError, allowedError) )
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KAllowedError);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	if(dataOk)
+		{
+		for(TInt i=0; i<loop; i++)
+			{
+			TRAPD(error,devSound = CMMFDevSound::NewL());
+			if(error == KErrNone)
+				{
+				INFO_PRINTF2(_L("Instance %d of DevSound was created"),i);
+				CleanupStack::PushL(devSound);
+				iObjectsDevSound.AppendL(devSound);
+				CleanupStack::Pop(devSound);
+				}
+			else if(error == allowedError)
+				{
+				INFO_PRINTF2(_L(" Allowing Error: %d"), error);
+				ERR_PRINTF2(_L(" Could not create CMMFDevSound due to error: %d"), error);
+				i = loop;
+				}
+			else if((error != KErrNone) && (error!=allowedError))
+				{
+				ERR_PRINTF2(_L("> Could not create CMMFDevSound: %d"), error);
+				SetError(error);
+				}
+			}
+		iObjectsDevSound.ResetAndDestroy();
+		INFO_PRINTF2(_L("%d DevSound instances were deleted"),loop);
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdNewLLoopL"));
+	}
+
+
+/**
+ * Create an instance of CMMFDevSound
+ */
+void CT_CMMFDevSoundData::DoCmdNewL()
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdNewL"));
+	DestroyData();
+	TRAPD(error,iDevSound = CMMFDevSound::NewL());
+	if(error!= KErrNone)
+		{
+		ERR_PRINTF2(_L("> Could not create CMMFDevSound: %d"), error);
+		SetError(error);
+		}
+	else
+		{
+		iPaused= EFalse;
+		iErrorConceal = EFalse;
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdNewL"));
+	}
+/**
+ * Destroy an instance of CMMFDevSound
+ */
+
+void CT_CMMFDevSoundData::DoCmdDestructor()
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdDestroyData"));
+	DestroyData();
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdDestroyData"));
+	}
+
+/**
+ * Show the supported Audio settings ie. encoding, sample rates, mono/stereo operation, buffer
+ * size, etc.
+ * @param none
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdCapabilities()
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdCapabilities"));
+	iCapabilities = iDevSound->Capabilities();
+	INFO_PRINTF5(_L("Supported Audio settings: buffsize=%d, channels=0x%x, encoding=0x%x and rate=0x%x"),
+							iCapabilities.iBufferSize,
+							iCapabilities.iChannels,
+							iCapabilities.iEncoding,
+							iCapabilities.iRate);
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdCapabilities"));
+	}
+
+
+/**
+ * Shows the current device configuration.
+ * @params none
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdConfig()
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdConfig"));
+	TMMFCapabilities currentConfiguration = iDevSound->Config();
+	INFO_PRINTF5(_L("Current device configuration: buffsize=%d, channels=0x%x, encoding=0x%x and rate=0x%x"),
+			currentConfiguration.iBufferSize,
+			currentConfiguration.iChannels,
+			currentConfiguration.iEncoding,
+			currentConfiguration.iRate);
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdConfig"));
+	}
+
+
+/**
+ * Shows an integer representing the maximum gain the device supports.
+ * This is the maximum value which can be passed to CMMFDevSound::SetGain.
+ * @param aSection - The section to read the params from the ini file
+ * @return none
+ */
+
+void CT_CMMFDevSoundData::DoCmdMaxGain(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdMaxGain"));
+	TBool dataOk = ETrue;
+	TInt expectedGainValue=0;
+	if (!GetIntFromConfig(aSection, KGainValue, expectedGainValue))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KGainValue);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	if(dataOk)
+		{
+		iGainValue = iDevSound->MaxGain();
+		INFO_PRINTF2(_L("Retrieved maximum gain value: %d"), iGainValue);
+		if (expectedGainValue != iGainValue)
+			{
+			ERR_PRINTF3(_L("Expected gain value %d is different from retrieved gain value %d"), expectedGainValue, iGainValue);
+			SetBlockResult(EFail);
+			}
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdMaxGain"));
+	}
+
+/**
+ * Shows an integer representing the maximum volume device supports.
+ * This is the maximum value which can be passed to CMMFDevSound::SetVolume.
+ * @param aSection - Section to read params from the ini file
+ * @return none
+ */
+
+void CT_CMMFDevSoundData::DoCmdMaxVolume(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdMaxVolume"));
+	TBool dataOk = ETrue;
+	TInt expectedVolumeValue=0;
+	if(!GetIntFromConfig(aSection, KVolumeValue, expectedVolumeValue))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KVolumeValue);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	if(dataOk)
+		{
+		iVolumeValue = iDevSound->MaxVolume();
+		INFO_PRINTF2(_L("Retrieved maximum volume value: %d"), iVolumeValue);
+		if(expectedVolumeValue != iVolumeValue)
+			{
+			ERR_PRINTF3(_L("Expected volume value %d is different from retrieved volume value %d"), expectedVolumeValue, iVolumeValue);
+			SetBlockResult(EFail);
+			}
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdMaxVolume"));
+	}
+
+/**
+ * Shows the speaker balance set for playing.
+ * @param aSection - Section to read params from the ini file
+ * @return none
+ */
+
+void CT_CMMFDevSoundData::DoCmdGetPlayBalanceL(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdGetPlayBalanceL"));
+	TBool dataOk = ETrue;
+	TInt expectedLeftPercentage=0;
+	if (!GetIntFromConfig(aSection, KLeftPercentage, expectedLeftPercentage))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KLeftPercentage);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	TInt expectedRightPercentage=0;
+	if (!GetIntFromConfig(aSection, KRightPercentage, expectedRightPercentage))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRightPercentage);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	if(dataOk)
+		{
+		TRAPD(error, iDevSound->GetPlayBalanceL(iLeftPercentage, iRightPercentage));
+		if (error != KErrNone)
+			{
+			ERR_PRINTF2(_L("GetPlayBalanceL left with error %d"), error);
+			SetError(error);
+			}
+		else
+			{
+			INFO_PRINTF3(_L("> Retrieved play balance values are left: %d, right:%d"), iLeftPercentage, iRightPercentage);
+			if (expectedLeftPercentage !=iLeftPercentage)
+				{
+				ERR_PRINTF3(_L("Expected left percentage value %d is different from retrieved value %d"), expectedLeftPercentage, iLeftPercentage);
+				SetBlockResult(EFail);
+				}
+			if (expectedRightPercentage !=iRightPercentage)
+				{
+				ERR_PRINTF3(_L("Expected right percentage value %d is different from retrieved value %d"), expectedRightPercentage, iRightPercentage);
+				SetBlockResult(EFail);
+				}
+			}
+		}
+
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdGetPlayBalanceL"));
+	}
+
+
+/**
+ * Shows the microphone gain balance set for recording.
+ * @param aSection - Section to read params from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdGetRecordBalanceL(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdGetRecordBalanceL"));
+	TBool dataOk = ETrue;
+	TInt expectedLeftPercentage=0;
+	if(!GetIntFromConfig(aSection, KLeftPercentage, expectedLeftPercentage))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KLeftPercentage);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	TInt expectedRightPercentage=0;
+	if(!GetIntFromConfig(aSection, KRightPercentage, expectedRightPercentage))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRightPercentage);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	if(dataOk)
+		{
+		TRAPD(error, iDevSound->GetRecordBalanceL(iLeftPercentage, iRightPercentage));
+		if (error != KErrNone)
+			{
+			ERR_PRINTF2(_L("GetRecordBalanceL left with error %d"), error);
+			SetError(error);
+			}
+		else
+			{
+			INFO_PRINTF3(_L("> Retrieved record balance values are left: %d, right:%d"), iLeftPercentage, iRightPercentage);
+			if(expectedLeftPercentage !=iLeftPercentage)
+				{
+				ERR_PRINTF3(_L("Expected left percentage value %d is different from retrieved value %d"), expectedLeftPercentage, iLeftPercentage);
+				SetBlockResult(EFail);
+				}
+			if(expectedRightPercentage !=iRightPercentage)
+				{
+				ERR_PRINTF3(_L("Expected right ercentage value %d is different from retrieved value %d"), expectedRightPercentage, iRightPercentage);
+				SetBlockResult(EFail);
+				}
+			}
+
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdGetRecordBalanceL"));
+	}
+
+/**
+ * Shows a list of the supported input datatypes that can be sent to DevSound for playing audio.
+ * The datatypes returned are those that the DevSound supports given the priority settings passed
+ * in aPrioritySettings.
+ * @params none
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdGetSupportedInputDataTypesL()
+	{
+	TUid outputUid= {0x0};
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdGetSupportedInputDataTypesL"));
+	RArray< TFourCC > supportedDataTypes;
+	TRAPD(error, iDevSound->GetSupportedInputDataTypesL(supportedDataTypes, iPrioritySettings));
+	if (error != KErrNone)
+		{
+		ERR_PRINTF2(_L("GetSupportedInputDataTypesL left with error %d"), error);
+		SetError(error);
+		}
+	else
+		{
+		INFO_PRINTF1(_L("List of the supported input datatypes that can be sent to DevSound for playing audio."));
+		for (TInt i=0; i<supportedDataTypes.Count(); i++)
+			{
+			TFourCC fourCC = supportedDataTypes[i];
+			TBuf<4> name;
+			for(TInt j=0; j<= KFourCCMaxBitDisplacement; j+=K8Bits)
+				{
+				name.Append((TUint8)(fourCC.FourCC() >> j));
+				}
+			INFO_PRINTF3(_L("Supported Input Data types: 0x%x  %S "), fourCC.FourCC(), &name);
+			UtilityFourCCToHwDeviceUidL(name,EDecoder, outputUid);
+			if(outputUid.iUid != 0)
+				{
+				INFO_PRINTF3(_L("\nHwDevice Uid=0x%08x for %S"),outputUid.iUid,&name);
+				}
+			else
+				{
+				INFO_PRINTF1(_L("Not Found"));
+				}
+			}
+		supportedDataTypes.Reset();
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdGetSupportedInputDataTypesL"));
+	}
+
+/**
+ * Shows a list of the supported output dataypes that can be received from DevSound for
+ * recording audio.  The datatypes returned are those that the DevSound supports given the priority
+ * settings passed in aPrioritySettings.
+ * @param none
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdGetSupportedOutputDataTypesL()
+	{
+	TUid outputUid= {0x0};
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdGetSupportedOutputDataTypesL"));
+	RArray< TFourCC > supportedDataTypes;
+	TRAPD(error, iDevSound->GetSupportedOutputDataTypesL(supportedDataTypes, iPrioritySettings));
+	if (error != KErrNone)
+		{
+		ERR_PRINTF2(_L("GetSupportedOutputDataTypesL left with error %d"), error);
+		SetError(error);
+		}
+	else
+		{
+		INFO_PRINTF1(_L("List of the supported output dataypes that can be received from DevSound for recording audio."));
+		for (TInt i=0; i<supportedDataTypes.Count(); i++)
+			{
+			TFourCC fourCC = supportedDataTypes[i];
+			TBuf<4> name;
+			for(TInt j=0; j<=KFourCCMaxBitDisplacement; j+=K8Bits)
+				{
+				name.Append((TUint8)(fourCC.FourCC() >> j));
+				}
+			INFO_PRINTF3(_L("Supported Output Data types: 0x%x  %S "), fourCC.FourCC(), &name);
+			UtilityFourCCToHwDeviceUidL(name, EEncoder, outputUid);
+			if(outputUid.iUid != 0)
+				{
+				INFO_PRINTF3(_L("\nHwDevice Uid=0x%08x for %S"),outputUid.iUid,&name);
+				}
+			else
+				{
+				INFO_PRINTF1(_L("Not Found"));
+				}
+			}
+		supportedDataTypes.Reset();
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdGetSupportedOutputDataTypesL"));
+	}
+
+/**
+ * Shows the number of samples played
+ * @param none
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdSamplesPlayed()
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSamplesPlayed"));
+	INFO_PRINTF2(_L("Number of samples played so far: %d"),iDevSound->SamplesPlayed());
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSamplesPlayed"));
+	}
+
+/**
+ * Shows the number of samples recorded
+ * @param none
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdSamplesRecorded()
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSamplesRecorded"));
+	INFO_PRINTF2(_L("Number of samples recorded so far: %d"), iDevSound->SamplesRecorded());
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSamplesRecorded"));
+	}
+
+/**
+ * Shows an integer representing the current volume.
+ * @param aSection - Section to read param from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdVolume(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdVolume"));
+	TBool dataOk = ETrue;
+	TInt expectedVolumeValue=0;
+	if(!GetIntFromConfig(aSection, KVolumeValue, expectedVolumeValue))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KVolumeValue);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	if(dataOk)
+		{
+		iVolumeValue = iDevSound->Volume();
+		INFO_PRINTF2(_L("Retrieved volume value: %d"), iVolumeValue);
+		if(expectedVolumeValue != iVolumeValue)
+			{
+			ERR_PRINTF3(_L("Expected volume value %d is different from retrieved volume value %d"), expectedVolumeValue, iVolumeValue);
+			SetBlockResult(EFail);
+			}
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdVolume"));
+	}
+
+/**
+ * Shows an integer representing the current gain.
+ * @param aSection - Section to read param from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdGain(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdGain"));
+	TBool dataOk = ETrue;
+	TInt expectedGainValue=0;
+	if(!GetIntFromConfig(aSection, KGainValue, expectedGainValue))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KGainValue);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	if(dataOk)
+		{
+		iGainValue = iDevSound->Gain();
+		INFO_PRINTF2(_L("Retrieved gain value: %d"), iGainValue);
+		if(expectedGainValue != iGainValue)
+			{
+			ERR_PRINTF3(_L("Expected gain value %d is different from retrieved gain value %d"), expectedGainValue, iGainValue);
+			SetBlockResult(EFail);
+			}
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdGain"));
+	}
+
+/**
+ * Shows the number of available pre-defined tone sequences
+ * @param none
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdFixedSequenceCount()
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdFixedSequenceCount"));
+	INFO_PRINTF2(_L("Number of available pre-defined tone sequences: %d"), iDevSound->FixedSequenceCount());
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdFixedSequenceCount"));
+	}
+
+/**
+ * Shows the name assigned to a specific pre-defined tone sequence.
+ * This is the number of the fixed sequence supported by DevSound by default.
+ * @param aSection -  Section to read params from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdFixedSequenceName(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdFixedSequenceName"));
+	TBool dataOk =ETrue;
+	TInt sequenceNumber=0;
+	if(!GetIntFromConfig(aSection, KSequenceNumber, sequenceNumber))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KSequenceNumber);
+		SetBlockResult(EFail);
+		dataOk =EFalse;
+		}
+	if(dataOk)
+		{
+		INFO_PRINTF2(_L("Name assigned to a specific pre-defined tone sequence returned: %S"),
+					&iDevSound->FixedSequenceName(sequenceNumber));
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdFixedSequenceName"));
+	}
+
+
+/**
+ * Configure CMMFDevSound object with the settings in aConfig.
+ * Use this to set sampling rate, encoding and mono/stereo.
+ * @param aSection - Section to read params from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdSetConfigL(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetConfigL"));
+
+	TInt rate=0;
+	INFO_PRINTF1(_L("To use default values run Capabilities before SetConfigL"));
+	if (!GetEnumFromConfig(aSection, KRate, iEnumSampleRate, rate))
+		{
+		INFO_PRINTF2(_L("Rate value was not overwritten, using default value %d."), iCapabilities.iRate);
+		}
+	else
+		{
+		iCapabilities.iRate = rate;
+		}
+
+	TInt encoding=0;
+	if (!GetIntFromConfig(aSection, KEncoding, encoding))
+		{
+		INFO_PRINTF2(_L("Encoding value was not overwritten, using default value %d."), iCapabilities.iEncoding);
+		}
+	else
+		{
+		iCapabilities.iEncoding = encoding;
+		}
+
+	TInt channels=0;
+	if (!GetEnumFromConfig(aSection, KChannels, iEnumChannels, channels))
+		{
+		INFO_PRINTF2(_L("Channels value was not overwritten, using default value %d ."), iCapabilities.iChannels);
+		}
+	else
+		{
+		iCapabilities.iChannels = channels;
+		}
+
+	TInt bufferSize=0;
+	if (!GetIntFromConfig(aSection, KBufferSize, bufferSize))
+		{
+		INFO_PRINTF2(_L("BufferSize value was not overwritten, using default value %d"), iCapabilities.iBufferSize);
+		}
+	else
+		{
+		iCapabilities.iBufferSize = bufferSize;
+		}
+	TRAPD(error,iDevSound->SetConfigL(iCapabilities))
+	if(error != KErrNone)
+		{
+		ERR_PRINTF2(_L("SetConfigL left with error %d"), error);
+		SetError(error);
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetConfigL"));
+	}
+
+
+/**
+ * Defines the duration of tone on, tone off and tone pause to be used during the
+ * DTMF tone playback operation.
+ * Supported only during tone playing.
+ * @param aSection - Section to read param from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdSetDTMFLengths(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetDTMFLengths"));
+	TInt time=0;
+	TBool dataOk = ETrue;
+	if (!GetIntFromConfig(aSection, KToneOnLength, time))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KToneOnLength);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	TTimeIntervalMicroSeconds32 toneOnLength(time);
+
+	if (!GetIntFromConfig(aSection, KToneOffLength, time))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KToneOffLength);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	TTimeIntervalMicroSeconds32 toneOffLength(time);
+
+	if (!GetIntFromConfig(aSection, KPauseLength, time))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPauseLength);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	TTimeIntervalMicroSeconds32 pauseLength(time);
+	if(dataOk)
+		{
+		iDevSound->SetDTMFLengths(toneOnLength, toneOffLength, pauseLength);
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetDTMFLengths"));
+	}
+
+
+/**
+ * Changes the current recording gain to a specified value.
+ * The gain can be changed before or during recording and is effective
+ * immediately.
+ * @params aSection - Section to read param from the ini file
+ */
+void CT_CMMFDevSoundData::DoCmdSetGain(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetGain"));
+	TInt gainValue = iGainValue;
+	if(!GetIntFromConfig(aSection, KGainValue, gainValue))
+		{
+		INFO_PRINTF1(_L("The Gain value was not found in the ini file, using default value"));
+		}
+	INFO_PRINTF2(_L("Setting gain value to %d"), gainValue);
+	iDevSound->SetGain(gainValue);
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetGain"));
+	}
+
+/**
+ * Sets the speaker balance for playing.
+ * The speaker balance can be changed before or during playback and is
+ * effective immediately.
+ * @param aSection - The section to read params from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdSetPlayBalanceL(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetPlayBalanceL"));
+	TInt leftPercentage = iLeftPercentage;
+	if(!GetIntFromConfig(aSection, KLeftPercentage, leftPercentage))
+		{
+		INFO_PRINTF1(_L("The Left percentage was not found in the ini file, using default value"));
+		}
+	TInt rightPercentage = iRightPercentage;
+	if(!GetIntFromConfig(aSection, KRightPercentage, rightPercentage))
+		{
+		INFO_PRINTF1(_L("The Right percentage was not found in the ini file, using default value"));
+		}
+	INFO_PRINTF3(_L("Setting play balance to left: %d, right: %d values"), leftPercentage, rightPercentage);
+	TRAPD(error, iDevSound->SetPlayBalanceL(leftPercentage, rightPercentage));
+	if(error != KErrNone)
+		{
+		ERR_PRINTF2(_L("SetPlayBalanceL left with error %d"), error);
+		SetError(error);
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetPlayBalanceL"));
+	}
+
+/**
+ * Defines the priority settings that should be used for this instance.
+ * @param aSection - Section to read params from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdSetPrioritySettings(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetPrioritySettings"));
+	TBool dataOk = ETrue;
+	if(!GetIntFromConfig(aSection, KPriority, iPrioritySettings.iPriority))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPriority);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	TInt preference=0;
+	if (!GetHexFromConfig(aSection, KPreference, preference))
+		{
+		ERR_PRINTF2(_L("%S parameter was not found in INI file"), &KPreference);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	iPrioritySettings.iPref = (TMdaPriorityPreference)preference;
+	TInt state=0;
+	if (!GetEnumFromConfig(aSection, KPriorityState, iEnumMode, state))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPriorityState);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	iPrioritySettings.iState = (TMMFState)state;
+	if(dataOk)
+		{
+		iDevSound->SetPrioritySettings(iPrioritySettings);
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetPrioritySettings"));
+	}
+
+/**
+ * Sets the microphone gain balance for recording.
+ * The microphone gain balance can be changed before or during recording and
+ * is effective immediately.
+ * @param aSection - Section to read params from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdSetRecordBalanceL(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetRecordBalanceL"));
+	TInt leftPercentage = iLeftPercentage;
+	if (!GetIntFromConfig(aSection, KLeftPercentage, leftPercentage))
+		{
+		INFO_PRINTF1(_L("The Left value was not found in the ini file, using default value"));
+		}
+	TInt rightPercentage = iRightPercentage;
+	if (!GetIntFromConfig(aSection, KRightPercentage, rightPercentage))
+		{
+		INFO_PRINTF1(_L("The Right value was not found in the ini file, using default value"));
+		}
+	INFO_PRINTF3(_L("Setting record balance to left: %d, right: %d values"), leftPercentage, rightPercentage);
+	TRAPD(error, iDevSound->SetRecordBalanceL(leftPercentage, rightPercentage));
+	if (KErrNone != error)
+		{
+		ERR_PRINTF2(_L("SetRecordBalanceL left with error %d"), error);
+		SetError(error);
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetRecordBalanceL"));
+	}
+
+/**
+ * Defines the number of times the audio is to be repeated during the tone
+ * playback operation.
+ * A period of silence can follow each playing of a tone. The tone playing can
+ * be repeated indefinitely.
+ * @param aSection - Section to read params from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdSetToneRepeats(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetToneRepeats"));
+	TInt repeatCount=0;
+	TBool dataOk = ETrue;
+	if (!GetIntFromConfig(aSection, KRepeatCount, repeatCount))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRepeatCount);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+
+	TInt tempValue=0;
+	if (!GetIntFromConfig(aSection, KRepeatTrailingSilence, tempValue))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRepeatTrailingSilence);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	TTimeIntervalMicroSeconds repeatTrailingSilence(tempValue);
+
+	if(dataOk)
+		{
+		iDevSound->SetToneRepeats(repeatCount, repeatTrailingSilence);
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetToneRepeats"));
+	}
+
+/**
+ * Defines the period over which the volume level is to rise smoothly from
+ * nothing to the normal volume level.
+ * The function is only available while the tone is playing.
+ * @param aSection - Section to read params from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdSetVolume(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetVolume"));
+	TInt volume = iVolumeValue;
+	if(!GetIntFromConfig(aSection, KVolumeValue, volume))
+		{
+		INFO_PRINTF1(_L("The Volume value was not found in the ini file, using default value"));
+		}
+	INFO_PRINTF2(_L("Setting volume value to %d"), volume);
+	iDevSound->SetVolume(volume);
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetVolume"));
+	}
+
+/**
+ * Defines the loop over which the volume level is to rise smoothly from
+ * nothing to the normal volume level.
+ * @param aSection - Section to read params from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdSetVolumeLoop(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetVolumeLoop"));
+	TInt volLoop=0;
+	TBool dataOk = ETrue;
+	if (!GetIntFromConfig(aSection, KVolumeLoop, volLoop))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KVolumeLoop);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	if(dataOk)
+		{
+		TPtrC parVolume;
+		TInt volumeValue=0;
+		RPointerArray<HBufC> volumeList;
+		for (TInt i=0; i<volLoop; i++)
+			{
+			if (!GetArrayRectFromConfig(aSection, KVolumeList, volumeList))
+				{
+				ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KVolumeList);
+				volumeList.ResetAndDestroy();
+				SetBlockResult(EFail);
+				dataOk = EFalse;
+				}
+			if(dataOk)
+				{
+				for (TInt j=0; j<volumeList.Count(); j++)
+					{
+					parVolume.Set(*volumeList[j]);
+					TLex lex(parVolume);
+					TInt error = lex.Val(volumeValue);
+					if (error != KErrNone)
+						{
+						ERR_PRINTF2(_L("Obtaining volume value failed with error %d"), error);
+						SetError(error);
+						volumeList.ResetAndDestroy();
+						}
+					else
+						{
+						INFO_PRINTF3(_L("Setting volume number %d in the iteration number %d"), j, i);
+						iDevSound->SetVolume(volumeValue);
+						}
+					}
+				}
+			}
+		volumeList.ResetAndDestroy();
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetVolumeLoop"));
+	}
+
+/**
+ * Defines the period over which the volume level is to rise smoothly from
+ * nothing to the normal volume level.
+ * The function is only available while the tone is playing.
+ * @param aSection - Section to read param from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdSetVolumeRamp(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdSetVolumeRamp"));
+	TInt tempValue=0;
+	TBool dataOk = ETrue;
+	if (!GetIntFromConfig(aSection, KRampDuration, tempValue))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRampDuration);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	TTimeIntervalMicroSeconds rampDuration(tempValue);
+
+	if(dataOk)
+		{
+		iDevSound->SetVolumeRamp(rampDuration);
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdSetVolumeRamp"));
+	}
+
+/**
+ * Initializes DevSound object for the mode aMode for processing audio data
+ * with hardware device aHWDev and supporting FourCC.
+ * Too Initializes CMMFDevSound object to play and record PCM16 raw audio data
+ * with sampling rate of 8 KHz.
+ * @param aSection - Section to read params from the ini file
+ */
+void CT_CMMFDevSoundData::DoCmdInitializeL(const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdInitializeL"));
+	TBool dataOk = ETrue;
+	TInt mode=0;
+	if (!GetEnumFromConfig(aSection, KMode, iEnumMode, mode))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KMode);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	else
+		{
+		TInt hwDeviceInt=0;
+		if (!GetHexFromConfig(aSection, KHwDevice, hwDeviceInt))
+			{
+			INFO_PRINTF2(_L("%S parameter was not found in INI file"), &KHwDevice);
+			TPtrC fourCCIniString;
+			if (!GetStringFromConfig(aSection, KFourCC, fourCCIniString))
+				{
+				INFO_PRINTF2(_L("%S parameter was not found in INI file"), &KFourCC);
+				if (dataOk)
+					{
+					INFO_PRINTF1(_L("Initializing DevSound with overload: void InitializeL(MDevSoundObserver &aDevSoundObserver, TMMFState aMode)"));
+					TRAPD(error, iDevSound->InitializeL(*this, (TMMFState)mode));
+					if(KErrNone != error)
+						{
+						ERR_PRINTF2(_L("InitializeL(aMDevSoundObserver, mode) left with error %d"), error);
+						SetError(error);
+						}
+					}
+				}
+			else
+				{
+				if (fourCCIniString.Length() > KTFourCC)
+					{
+					ERR_PRINTF2(_L("FourCC obtained from INI file exceeded the valid length in %d"), fourCCIniString.Length());
+					SetBlockResult(EFail);
+					dataOk = EFalse;
+					}
+				if (dataOk)
+					{
+					TBuf<256> fourCCString;
+					fourCCString.Copy(fourCCIniString);
+					while (fourCCString.Length() < KTFourCC)
+						{
+						fourCCString.Insert(0, _L(" "));
+						}
+					TFourCC fourCC;
+					fourCC = TFourCC(fourCCString[3] << 24 | fourCCString[2] << 16 | fourCCString[1] << 8 | fourCCString[0]);
+					INFO_PRINTF1(_L("Initializing DevSound with overload: void InitializeL(MDevSoundObserver &aDevSoundObserver, TFourCC aDesiredFourCC, TMMFState aMode)"));
+					TRAPD(error, iDevSound->InitializeL(*this, fourCC, (TMMFState)mode));
+					if(KErrNone!=error)
+						{
+						ERR_PRINTF2(_L("InitializeL(aMDevSoundObserver, fourCC, mode) left with error %d"), error);
+						ERR_PRINTF2(_L(" %S Not supported in this device"), &fourCCString);
+						SetError(error);
+						SetBlockResult(EFail);
+						}
+					}
+				}
+			}
+		else
+			{
+			if (dataOk)
+				{
+				TUid hwDevice;
+				hwDevice.iUid = hwDeviceInt;
+				INFO_PRINTF1(_L("Initializing DevSound with overload: void InitializeL(MDevSoundObserver &aDevSoundObserver, TUid aHWDev, TMMFState aMode)"));
+				TRAPD(error, iDevSound->InitializeL(*this, hwDevice, (TMMFState)mode));
+				if(KErrNone != error)
+					{
+					ERR_PRINTF2(_L("InitializeL(aMDevSoundObserver, hwDevice, mode) left with error %d"), error);
+					SetError(error);
+					}
+				}
+			}
+		}
+
+	if (dataOk)
+		{
+		IncOutstanding();
+        iInitializeErrorIndex = aAsyncErrorIndex;
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdInitializeL"));
+	}
+
+
+/**
+ * Initializes the audio device and starts playing the DTMF string aDTMFString.
+ * @param aSection - Section to read param from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdPlayDTMFStringL(const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdPlayDTMFStringL"));
+	TBool dataOk = ETrue;
+	TPtrC dtmfString;
+	if (!GetStringFromConfig(aSection, KDTMFString, dtmfString) )
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDTMFString);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	if(dataOk)
+		{
+		TRAPD( error, iDevSound->PlayDTMFStringL(dtmfString) );
+		if(error != KErrNone)
+			{
+			ERR_PRINTF2(_L("Play DTMF string failed with error: %d "), error);
+			SetError(error);
+			}
+		else
+			{
+			iToneErrorIndex = aAsyncErrorIndex;
+			IncOutstanding();
+			}
+		}
+
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdPlayDTMFStringL"));
+	}
+
+/**
+ * Plays data in the buffer at the current volume.
+ * @param
+ * @return
+ */
+void CT_CMMFDevSoundData::DoCmdPlayData()
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdPlayData"));
+	PlayData();
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdPlayData"));
+	}
+
+/**
+ * Helper for the DoCmdPlayData command
+ */
+void CT_CMMFDevSoundData::PlayData()
+	{
+	INFO_PRINTF1(_L("CT_CMMFDevSoundData::PlayData()"));
+	iDevSound->PlayData();
+	}
+
+/**
+ * Initializes audio device and starts playing a dual tone.
+ * The generated tone consists of two sine waves of different frequencies summed together.
+ * Dual Tone is played with the specified frequencies and for the specified duration.
+ * @param aSection - Section to read params from the ini file.
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdPlayDualToneL(const TTEFSectionName& aSection , const TInt aAsyncErrorIndex)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdPlayDualToneL"));
+	TBool dataOk = ETrue;
+	TInt frequencyOne=0;
+	if (!GetIntFromConfig(aSection, KFrequencyOne, frequencyOne) )
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFrequencyOne);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+
+	TInt frequencyTwo=0;
+	if (!GetIntFromConfig(aSection, KFrequencyTwo, frequencyTwo) )
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFrequencyTwo);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+
+	TInt duration=0;
+	if (!GetIntFromConfig(aSection, KDuration, duration) )
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDuration);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	if(dataOk)
+		{
+		TRAPD( error, iDevSound->PlayDualToneL(frequencyOne, frequencyTwo, duration) );
+		if(error != KErrNone)
+			{
+			ERR_PRINTF2(_L("Play dual tone failed with error %d"), error);
+			SetError(error);
+			}
+		else
+			{
+			iToneErrorIndex =  aAsyncErrorIndex;
+			IncOutstanding();
+			}
+		}
+
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdPlayDualToneL"));
+	}
+
+
+/**
+ * Initializes the audio device and starts the play process.
+ *
+ * This function queries and acquires the audio policy before initializing audio device. If there was
+ * an error during policy initialization, PlayError() function will be called on    the observer with
+ * error code KErrAccessDenied, otherwise BufferToBeFilled() function will be called with a buffer
+ * reference. After reading data into the buffer reference passed, the client should call PlayData() to play data.
+ *
+ * The amount of data that can be played is specified in CMMFBuffer::RequestSize(). Any data that is read into
+ * buffer beyond this size will be ignored.
+ * @param none
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdPlayInitL(const TInt aAsyncErrorIndex)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdPlayInitL"));
+	TRAPD(error, iDevSound->PlayInitL());
+	if (error != KErrNone)
+		{
+		ERR_PRINTF2(_L("PlayInitL left with error %d"), error);
+		SetError(error);
+		}
+	else
+		{
+		iPlayErrorIndex =  aAsyncErrorIndex;
+		IncOutstanding();
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdPlayInitL"));
+	}
+
+/**
+ * Initializes the audio device and starts playing a tone. The tone is played with the
+ * frequency and duration specified.
+ * @param aSection - Section to read params from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdPlayToneL(const TTEFSectionName& aSection , const TInt aAsyncErrorIndex)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdPlayToneL"));
+	TBool dataOk = ETrue;
+	TInt frequency=0;
+	if (!GetIntFromConfig(aSection, KFrequency, frequency))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFrequency);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+
+	TInt duration=0;
+	if (!GetIntFromConfig(aSection, KDuration, duration))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDuration);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	if(dataOk)
+		{
+		TRAPD(error, iDevSound->PlayToneL(frequency, duration));
+		if (error != KErrNone)
+			{
+			ERR_PRINTF2(_L("Play tone failed with error %d"), error);
+			SetError(error);
+			}
+		else
+			{
+			iToneErrorIndex =  aAsyncErrorIndex;
+			IncOutstanding();
+			}
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdPlayToneL"));
+	}
+
+/**
+ * Initializes the audio device and starts playing a tone sequence.
+ * @param aSection - Section to read param from the ini file
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdPlayToneSequenceL(const TTEFSectionName& aSection , const TInt aAsyncErrorIndex)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdPlayToneSequenceL"));
+	TBool dataOk = ETrue;
+	TPtrC toneFileParameter;
+	if (!GetStringFromConfig(aSection, KFilename, toneFileParameter))
+		{
+		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFilename);
+		SetBlockResult(EFail);
+		dataOk = EFalse;
+		}
+	if(dataOk)
+		{
+		TInt error = iToneFile.Open(iFs, toneFileParameter, EFileRead);
+		if (error != KErrNone)
+			{
+			ERR_PRINTF2(_L("Open file failed with error %d"), error);
+			SetError(EFail);
+			}
+		else
+			{
+			error = iToneFile.Read(iToneSequence);
+			if (error != KErrNone)
+				{
+				ERR_PRINTF2(_L("Read file failed with error %d"), error);
+				SetError(EFail);
+				}
+			else
+				{
+				TRAP(error, iDevSound->PlayToneSequenceL(iToneSequence));
+				if (error != KErrNone)
+					{
+					ERR_PRINTF2(_L("Play tone sequence failed with error %d"), error);
+					SetError(error);
+					}
+				else
+					{
+				  iToneErrorIndex =  aAsyncErrorIndex;
+					IncOutstanding();
+					}
+				}
+			}
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdPlayToneSequenceL"));
+	}
+
+/**
+ * Contine the process of recording.
+ *
+ * Once the buffer is filled with recorded  data, the Observer gets a reference to the buffer along
+ * with the callback function BufferToBeEmptied(). After processing the buffer (copying over to a
+ * different buffer or writing to file) the client should call this function to continue the
+ * recording process.
+ * @param none
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdRecordData()
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdRecordData"));
+	RecordData();
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdRecordData"));
+	}
+
+/**
+ * Helper method to DoCmdRecordData command
+ */
+void CT_CMMFDevSoundData::RecordData()
+	{
+	iDevSound->RecordData();
+	}
+
+/**
+ * Initializes audio device and starts the recording process.
+ *
+ * This command queries and acquires the audio policy before initializing audio device. If there
+ * was an error during policy initialization, RecordError() function will be called on the observer
+ * with error code KErrAccessDenied, otherwise BufferToBeEmptied()  function will be called with a
+ * buffer reference. This buffer contains recorded  or encoded data. After processing data in the
+ * buffer reference passed, the client should call RecordData() to continue recording process.
+ *
+ * The amount of data that is available is specified in CMMFBuffer::RequestSize().
+ * @param none
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdRecordInitL(const TInt aAsyncErrorIndex)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdRecordInitL"));
+	iRecordErrorIndex = aAsyncErrorIndex;	
+	TRAPD(error, iDevSound->RecordInitL());
+	if (error != KErrNone)
+		{
+		ERR_PRINTF2(_L("RecordInitL left with error %d"), error);
+		SetError(error);
+		}
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdRecordInitL"));
+	}
+
+
+/**
+ * Conceal an error
+ * @param none
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdUtilityErrorConceal()
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdErrorConceal"));
+	iErrorConceal=ETrue;
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdErrorConceal"));
+	}
+
+/**
+ * Stop an audio file
+ * @param none
+ * @return none
+ */
+void CT_CMMFDevSoundData::DoCmdStop(const TTEFSectionName& aSection)
+	{
+	INFO_PRINTF1(_L("*START*CT_CMMFDevSoundData::DoCmdStop"));
+	TBool pause;
+	if(!GetBoolFromConfig(aSection,KPause,pause))
+		{
+		INFO_PRINTF1(_L("The DoCmdStop command will be execute"));
+		pause = EFalse;
+		}
+	iPaused=pause;
+	if(iPaused)
+		{
+		INFO_PRINTF1(_L("a Pause was required"));
+		}
+	Stop();
+	INFO_PRINTF1(_L("*END*CT_CMMFDevSoundData::DoCmdStop"));
+	}
+
+
+
+
+/**
+ * Utility for get the HwDevice for play and recording
+ */
+
+void CT_CMMFDevSoundData::UtilityFourCCToHwDeviceUidL(const TDesC& aFourCC, THwDeviceType aType, TUid& aHwDeviceUid)
+	{
+	TPtrC8 fourCCPtr(0,0);
+	TPtrC8 fourCCP16Ptr(0,0);
+	RImplInfoPtrArray impArray;
+	CleanupResetAndDestroyPushL(impArray);
+	REComSession::ListImplementationsL(TUid::Uid(KMmfUidPluginInterfaceHwDevice), impArray);
+	TBuf<KHwDeviceDefaultDataLength> datatype;
+	for(TInt i = 0; i < impArray.Count(); ++i)
+		{
+		CImplementationInformation& entry = *(impArray[i]);
+		// Validate lenght
+		if (entry.DataType().Length() == KHwDeviceDefaultDataLength)
+			{
+			INFO_PRINTF2(_L("Implementation UID=0x%08x"),entry.ImplementationUid());
+			datatype.Copy(entry.DataType());
+			INFO_PRINTF2(_L("Default data (fourCCs)=%S"), &datatype);
+			// Extract FourCC
+			if(aType == EDecoder)
+				{
+				fourCCPtr.Set(entry.DataType().Left(KFourCCLength));
+				fourCCP16Ptr.Set(entry.DataType().Right(KFourCCLength));
+				}
+			else if (aType == EEncoder)
+				{
+				fourCCPtr.Set(entry.DataType().Right(KFourCCLength));
+				fourCCP16Ptr.Set(entry.DataType().Left(KFourCCLength));
+				}
+			// Compare FourCC
+			TBuf16<4> foundFourCC;
+			foundFourCC.Copy(fourCCPtr);
+			if(aFourCC.CompareF(foundFourCC) == 0)
+				{
+				aHwDeviceUid = entry.ImplementationUid();
+				break;
+				}
+			}
+		}
+	CleanupStack::PopAndDestroy(&impArray);
+	REComSession::FinalClose();
+	}