cellularsrvapitest/telephonydevsoundhaitest/devsound/src/T_CMMFDevSoundData.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 27 Apr 2010 17:51:07 +0300
branchRCL_3
changeset 21 2492a6e4aed7
parent 0 3553901f7fa8
child 24 6638e7f4bd8f
permissions -rw-r--r--
Revision: 201017 Kit: 201017

/*
* 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();
	}