mmhais/refacladapt/src/tonehwdevice/ToneGenerator.h
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmhais/refacladapt/src/tonehwdevice/ToneGenerator.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,226 @@
+// Copyright (c) 1997-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 __TONEGENERATOR_H__
+#define __TONEGENERATOR_H__
+
+#include <e32base.h>
+
+//
+// Sine tone generator
+// 
+
+const TInt KMaxSineTable = 256;
+const TUint KToneBufferSize = 8192;
+
+// one second in microseconds
+const TInt KOneMillionMicroSeconds = 1000000;
+
+
+class TSineGen
+/**
+*@internalTechnology
+*/
+	{
+public:
+	void SetFrequency(TInt aFrequency,TInt aAmplitude);
+	TInt NextSample();
+private:
+	TUint iPosition;
+	TUint iStep;
+	TInt iAmplitude;
+	static const TInt16 SineTable[KMaxSineTable];
+	static const TInt16 IncTable[KMaxSineTable];
+	};
+
+class TSineWave
+/**
+*@internalTechnology
+*/
+	{
+public:
+	void Generate(TInt16* aDest,TInt aCount);
+	void SetFrequency(TInt aFrequency,TInt aAmplitude);
+	void SetFrequency(TInt aFrequency1,TInt aAmplitude1,TInt aFrequency2,TInt aAmplitude2);
+private:
+	TSineGen iGen1;
+	TSineGen iGen2;
+	};
+
+//
+// Tone synthesis interface
+// Defines the abstract interface for tone synthesis
+// Capable of filling buffers with audio data
+//
+
+class MMdaToneSynthesis
+/**
+*@internalTechnology
+*/
+	{
+public:
+	// Allocate necessary resources for this kind of synthesis
+	virtual void Configure(TInt aRate, TInt aChannels, TInt aRepeats, TInt aSilence, TInt aRampUp)=0;
+	// Begin generating data from start again
+	virtual void Reset()=0;
+	// Fill supplied buffer with next block of 16bit PCM audio data
+	virtual TInt FillBuffer(TDes8& aBuffer)=0;
+	};
+
+//
+// Tone generator base class
+//
+
+class TMdaToneGenerator : public MMdaToneSynthesis
+	{
+public:
+	virtual void Configure(TInt aRate, TInt aChannels, TInt aRepeats, TInt aSilence, TInt aRampUp);
+	virtual TInt FillBuffer(TDes8& aBuffer);
+protected:
+	virtual TInt GetNextTone()=0;
+	//
+	TInt DurationToSamples(const TTimeIntervalMicroSeconds& aDuration);
+protected:
+	TSineWave iSineWave;
+	TInt iRate;
+	TInt iChannels;
+	TInt iSamplesLeft;
+	TInt iTrailingSilence;
+	TBool iRampUp;
+	TBool iRampDown;
+	TBool iIncompleteRampDown;
+	TBool iIncompleteRampUp;
+	TInt iIncompleteVolume;
+	TInt iRampUpRemainder;
+	TInt iRepeats;
+	TInt iSilenceBetweenRepeats;
+	TBool iAfterRepeatSilence;
+	TInt iRampUpCount;
+	TInt iRampUpLeft;
+	};
+
+//
+// Simple tone synthesis
+//
+
+class TMdaSimpleToneGenerator : public TMdaToneGenerator
+/**
+*@internalTechnology
+*/
+	{
+public:
+	void SetFrequencyAndDuration(TInt aFrequency, const TTimeIntervalMicroSeconds& aDuration);
+	virtual void Reset();
+	virtual TInt GetNextTone();
+private:
+	TTimeIntervalMicroSeconds iDuration;
+	TInt iFrequency;
+	TBool iPlayed;
+	};
+
+
+/**
+ * Dual tone synthesis
+ * Generates a tone consisting of two sine waves of different 
+ * frequencies summed together.
+ * 
+ * @internalTechnology
+ */
+class TMdaDualToneGenerator : public TMdaToneGenerator
+	{
+public:
+	void SetFrequencyAndDuration(TInt aFrequencyOne, TInt aFrequencyTwo, const TTimeIntervalMicroSeconds& aDuration);
+	virtual void Reset();
+	virtual TInt GetNextTone();
+private:
+	TTimeIntervalMicroSeconds iDuration;
+	TInt iFrequencyOne;
+	TInt iFrequencyTwo;
+	TBool iPlayed;
+	};
+
+//
+// DTMF tone synthesis
+//
+
+class TMdaDTMFGenerator : public TMdaToneGenerator
+/**
+*@internalTechnology
+*/
+	{
+public:
+	virtual void Reset();
+	void SetToneDurations(	const TTimeIntervalMicroSeconds32 aOn,
+							const TTimeIntervalMicroSeconds32 aOff,
+							const TTimeIntervalMicroSeconds32 aPause);
+	void SetString(const TDesC& aDTMFString); 
+private:
+	virtual TInt GetNextTone();
+private:
+	const TDesC* iDTMFString;
+	TTimeIntervalMicroSeconds32 iOn;
+	TTimeIntervalMicroSeconds32 iOff;
+	TTimeIntervalMicroSeconds32 iPause;
+	TInt iOnSamples;
+	TInt iOffSamples;
+	TInt iPauseSamples;
+	TInt iChar;
+	TBool iPlayToneOff;
+	};
+
+//
+// Tone sequence synthesis
+//
+
+const TInt KMaxSequenceStack = 6;
+class TMdaSequenceGenerator : public TMdaToneGenerator
+/**
+*@internalTechnology
+*/
+	{
+public:
+	virtual void Reset();
+	void SetSequenceData(const TDesC8& aSequenceData); 
+private:
+	virtual TInt GetNextTone();
+private:
+	const TDesC8* iSequenceData;
+	const TInt16* iInstructionPtr;
+	const TInt16* iLastInstruction;
+	TInt iStack[KMaxSequenceStack];
+	TInt iStackIndex;
+	};
+
+const TInt KBufferLength = 0x1000;
+
+// Public Media Server includes
+
+class TMdaPtr8 : public TPtr8 //needed for this WINS Impl of Tone Gen
+	{
+public:
+	TMdaPtr8()
+		: TPtr8(0,0,0) {};
+	inline void Set(const TDes8& aDes)
+		{ TPtr8::Set((TUint8*)(aDes.Ptr()),aDes.Length(),aDes.MaxLength()); };
+	inline void SetLengthOnly(const TDes8& aDes)
+		{ TPtr8::Set((TUint8*)(aDes.Ptr()),aDes.Length(),aDes.Length()); };
+	inline void Set(const TPtrC8& aDes)
+		{ TPtr8::Set((TUint8*)(aDes.Ptr()),aDes.Length(),aDes.Length()); };
+	inline void Shift(TInt aOffset)
+		{ SetLength(Length()-aOffset); iMaxLength-=aOffset; iPtr+=aOffset; };
+	};
+
+
+#endif