mmhais/refacladapt/src/tonehwdevice/tonehwdevice.h
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmhais/refacladapt/src/tonehwdevice/tonehwdevice.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,378 @@
+/*
+* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+
+#ifndef C_TONEHWDEVICE_H
+#define C_TONEHWDEVICE_H
+
+//  INCLUDES
+#include <mmf/server/mmfhwdevice.h>
+#include <mmf/server/sounddevice.h>
+#include <mmf/server/mmfhwdevicesetup.h>
+#include <mmf/server/mmfswcodecwrappercustominterfacesuids.hrh>
+#include <a3f/a3f_trace_utils.h>
+#include "mdasoundadapter.h"
+#include "ToneGenerator.h"
+#include "tonedatapath.h"
+#include <a3f/tonedata.h>
+
+
+//note we need to keep this buffer at 8K as the tone utility expects 8K
+const TInt KPCM16ToPCM16BufferSize = 0x2000;
+
+//controlls buffer sizes
+const TInt KDevSoundDefaultFrameSize = 0x1000;
+const TInt KDevSoundMinFrameSize = 0x800; //2K
+const TInt KDevSoundMaxFrameSize = 0x4000;  //16K
+const TInt KDevSoundDeltaFrameSize = 0x800; //2K
+const TInt KDevSoundFramesPerSecond = 4;
+
+// FORWARD DECLARATIONS
+class CToneDataPath;
+
+// CLASS DECLARATION
+
+/**
+ * Implementation of custom interface class for tone play functionality created by the
+ * CToneCodec::CustomInterface() method.  It provides
+ * access to miscellaneous functionality such as volume settings
+ */
+class TToneCustomInterface : public MPlayCustomInterface
+	{
+public:
+	TToneCustomInterface() : iVolume(0),iBytesPlayed(0),iDevice(NULL),iRampDuration(0) {}
+	void SetVolume(TUint aVolume);
+	TUint Volume();
+	TUint BytesPlayed();
+	void SetVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration);
+	TTimeIntervalMicroSeconds& VolumeRamp();
+	void SetDevice(RMdaDevSound* iDevice);
+private:
+	TUint iVolume;
+	TUint iBytesPlayed;
+	RMdaDevSound* iDevice;
+	TTimeIntervalMicroSeconds iRampDuration;
+	};
+
+
+
+/*
+* Codec Implementation
+*/
+
+class CToneCodec : public CBase
+	{
+public:
+	/**
+	Indicates the result of processing data from the source buffer to a destination buffer
+	and provides functions to compare the result code.
+	The CToneCodec buffer sizes should be set to return EProcessComplete
+	The other return codes are to keep the ProcessL method compatible with
+	the 7.0s CMMFCodec API.
+	*/
+	class TCodecProcessResult
+		{
+	public:
+		/**
+		Flag to track the codec's processing status.
+		*/
+		enum TCodecProcessResultStatus
+			{
+			/** The codec has successfully completed its processing. */
+			EProcessComplete,
+			/** Could not empty the source buffer because the destination buffer became full. */
+			EProcessIncomplete,
+			/** Codec came across an end of data. */
+			EEndOfData,
+			/** Could not fill the destination buffer because the source buffer has been emptied. */
+			EDstNotFilled,
+			/** An error occured. */
+			EProcessError
+			};
+
+		/** Overloaded operator to test equality. */
+		TBool operator==(const TCodecProcessResultStatus aStatus) const {return (iCodecProcessStatus == aStatus);}
+		/** Overloaded operator to test inequality. */
+		TBool operator!=(const TCodecProcessResultStatus aStatus) const {return (iCodecProcessStatus != aStatus);}
+
+		/**
+		Default constructor.
+		*/
+		TCodecProcessResult()
+			:iCodecProcessStatus(EProcessError), iSrcBytesProcessed(0), iDstBytesAdded(0) {};
+
+		public:
+		/**
+		The codec's processing status
+
+		@see enum TCodecProcessResultStatus
+		*/
+		TCodecProcessResultStatus iCodecProcessStatus;
+
+		/** The number of source bytes processed */
+		TUint iSrcBytesProcessed;
+
+		/** The number of bytes added to the destination buffer */
+		TUint iDstBytesAdded;
+		};
+public:
+
+	CToneCodec();
+	~CToneCodec();
+
+	void ConstructL();
+
+
+	/**
+	Processes the data in the specified source buffer and writes the processed data to
+	the specified destination buffer.
+
+	This function is synchronous, when the function returns the data has been processed.
+
+	@param	aSource
+			The source buffer containing data to encode or decode.
+	@param	aDest
+	 		The destination buffer to hold the data after encoding or decoding.
+
+	@return	The result of the processing.
+
+	@see    TCodecProcessResult
+	*/
+	TCodecProcessResult ProcessL(const CMMFBuffer& aSource, CMMFBuffer& aDest);
+
+	/**
+	Gets the max size of the source buffer passed into the
+	CToneCodec::ProcessL function.
+
+	Note that this means that this is the Max size of each buffer passed to the codec.  The actual
+	size of the data could be less than the max size.
+
+	@return The max size of the source buffer in bytes.
+	*/
+	TUint SourceBufferSize();
+
+	/**
+	Gets the max size of the sink (destination) buffer passed into the
+	CToneCodec::ProcessL method.
+
+	Note that this means that this is the Max size of each buffer passed to the codec.  The actual
+	size of the data written to this buffer could be less than the max size.
+
+	@return The max size of the sink buffer in bytes.
+	*/
+	TUint SinkBufferSize();
+
+	TBool IsNullCodec() {return ETrue;};
+
+
+	private:
+
+	TUint iBufferSize;
+
+	};
+
+
+class CToneHwDevice : public CMMFHwDevice,
+					  public MMMFHwDeviceObserver
+
+	{
+	public:  // Constructors and destructor
+
+	static CToneHwDevice* NewL();
+	~CToneHwDevice();
+
+	public: // New functions
+
+	public: // Functions from base classes
+
+
+	TInt Init(THwDeviceInitParams& aDevInfo);
+	TInt Start(TDeviceFunc /*aFuncCmd*/, TDeviceFlow /*aFlowCmd*/);
+	TInt Stop();
+
+	/* This function is not used in tone playback*/
+	TInt Pause();
+
+	TAny* CustomInterface(TUid aInterfaceUid);
+
+	TInt FillThisHwBuffer(CMMFBuffer& aHwBuffer);
+
+	TInt ThisHwBufferFilled(CMMFBuffer& aMmfBuffer);
+
+	/*From MMMFHwDeviceObserver*/
+	/* This function is not used in tone playback*/
+	TInt ThisHwBufferEmptied(CMMFBuffer& aMmfBuffer);
+
+	/*From MMMFHwDeviceObserver*/
+	/* This function is not used in tone playback*/
+	TInt EmptyThisHwBuffer(CMMFBuffer& aMmfBuffer);
+
+	/*From MMMFHwDeviceObserver*/
+	TInt MsgFromHwDevice(TUid aMessageType, const TDesC8 &aMsg);
+
+	/*From MMMFHwDeviceObserver*/
+	void Stopped();
+
+	/*From MMMFHwDeviceObserver*/
+	void Error(TInt aError);
+
+	TInt SetConfig(TTaskConfig& aConfig);
+
+	/* This function is not used in tone playback*/
+	TInt StopAndDeleteCodec();
+
+	/* This function is not used in tone playback*/
+	TInt DeleteCodec();
+
+	CToneCodec& Codec();
+
+	TInt GenerateBufferData();
+
+	void SetActiveToneBuffer();
+
+	TInt SamplingFrequency();
+
+	TInt NumberOfChannels();
+
+	TInt FillFreeToneBuffer();
+
+	TInt ReadToneData();
+
+	void FreeBuffers();
+
+	TBool ValidDTMFString(const TDesC& aDTMFString);
+
+	TBool RecognizeSequence(const TDesC8& aData);
+
+	protected:  // New functions
+	protected:  // Functions from base classes
+
+	private:
+
+	CToneHwDevice();
+	void ConstructL();
+
+	public:		// Data
+	protected:	// Data
+	private:	// Data
+
+	/**
+	* Pointer to the buffer that was last sent to the observer to be filled.
+	* Own pointer.
+	*/
+	CMMFDataBuffer* iHwDataBufferFill;
+
+	/**
+	* Hwdevice observer. Information is send to upper level by using this pointer.
+	*/
+	MMMFHwDeviceObserver* iHwDeviceObserver;
+
+	/**
+	The datapath used to transfer the data
+	*/
+	CToneDataPath* iDataPath;
+
+	MPlayCustomInterface* iPlayCustomInterface;
+
+	/**
+	* Initialize status of the tone
+	*/
+	TBool iToneInitialized;
+
+	/**
+	* Playback status of the tone
+	*/
+	TBool iTonePlaying;
+
+	/**
+	* Pointer to information about hwdevice initializing parameters.
+	*/
+	//TSizeHwDeviceInitArgs* iSizeHwDeviceInitArgs;
+
+	/**
+	* Type of the tone
+	*/
+	TToneData::TToneType iToneType;
+
+	/**
+	* Tone Data
+	*/
+	TToneData myToneData;
+
+	/**
+	* Tone Codec
+	*/
+	CToneCodec *iCodec;
+
+	/**
+	The buffer size of the sound device
+	*/
+	TUint iDeviceBufferSize;
+
+	/**
+	The sample rate of the sound device
+	*/
+	TInt iSampleRate;
+	
+	/**
+	The number of channels of the sound device
+	*/
+	TInt iChannels;
+
+	TBool iLastBuffer;
+
+	TTimeIntervalMicroSeconds iRampDuration;
+
+	//WINS Sound Device Structures
+	RMdaDevSound::TCurrentSoundFormatBuf soundDeviceSettings;
+
+	// Double buffer tone playing
+	CMMFDataBuffer*				iToneBuffer1;
+	CMMFDataBuffer*				iToneBuffer2;
+	// Reference to current tone buffer playing
+	CMMFDataBuffer*				iActiveToneBuffer;
+
+	TBool						iFirstCallFromHwDevice;
+
+	//Tone Stuff:
+
+	MMdaToneSynthesis*			iCurrentGenerator;
+	TMdaSimpleToneGenerator		iToneGen;
+	TMdaDualToneGenerator		iDualToneGen;
+	TMdaDTMFGenerator			iDTMFGen;
+	TMdaSequenceGenerator		iSequenceGen; // Not Supported
+	TInt						iRepeatCount;
+	TInt						iFrequency1;
+	TInt						iFrequency2;
+	TTimeIntervalMicroSeconds	iRepeatTrailingSilence;
+	TTimeIntervalMicroSeconds	iDuration;
+
+	TTimeIntervalMicroSeconds32 myToneOnLength;
+	TTimeIntervalMicroSeconds32 myToneOffLength;
+	TTimeIntervalMicroSeconds32 myPauseLength;
+
+	TDesC *iDTMFString;
+
+	TDesC8 *iSequenceData;
+	};
+
+	#include "tonehwdevice.inl"
+
+#endif
+
+// End of File