sl@0: // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #ifndef __TONEGENERATOR_H__ sl@0: #define __TONEGENERATOR_H__ sl@0: sl@0: #include sl@0: sl@0: // sl@0: // Sine tone generator sl@0: // sl@0: sl@0: const TInt KMaxSineTable = 256; sl@0: const TUint KToneBufferSize = 8192; sl@0: sl@0: // one second in microseconds sl@0: const TInt KOneMillionMicroSeconds = 1000000; sl@0: sl@0: sl@0: class TSineGen sl@0: /** sl@0: *@internalTechnology sl@0: */ sl@0: { sl@0: public: sl@0: void SetFrequency(TInt aFrequency,TInt aAmplitude); sl@0: TInt NextSample(); sl@0: private: sl@0: TUint iPosition; sl@0: TUint iStep; sl@0: TInt iAmplitude; sl@0: static const TInt16 SineTable[KMaxSineTable]; sl@0: static const TInt16 IncTable[KMaxSineTable]; sl@0: }; sl@0: sl@0: class TSineWave sl@0: /** sl@0: *@internalTechnology sl@0: */ sl@0: { sl@0: public: sl@0: void Generate(TInt16* aDest,TInt aCount); sl@0: void SetFrequency(TInt aFrequency,TInt aAmplitude); sl@0: void SetFrequency(TInt aFrequency1,TInt aAmplitude1,TInt aFrequency2,TInt aAmplitude2); sl@0: private: sl@0: TSineGen iGen1; sl@0: TSineGen iGen2; sl@0: }; sl@0: sl@0: // sl@0: // Tone synthesis interface sl@0: // Defines the abstract interface for tone synthesis sl@0: // Capable of filling buffers with audio data sl@0: // sl@0: sl@0: class MMdaToneSynthesis sl@0: /** sl@0: *@internalTechnology sl@0: */ sl@0: { sl@0: public: sl@0: // Allocate necessary resources for this kind of synthesis sl@0: virtual void Configure(TInt aRate, TInt aChannels, TInt aRepeats, TInt aSilence, TInt aRampUp)=0; sl@0: // Begin generating data from start again sl@0: virtual void Reset()=0; sl@0: // Fill supplied buffer with next block of 16bit PCM audio data sl@0: virtual TInt FillBuffer(TDes8& aBuffer)=0; sl@0: }; sl@0: sl@0: // sl@0: // Tone generator base class sl@0: // sl@0: sl@0: class TMdaToneGenerator : public MMdaToneSynthesis sl@0: { sl@0: public: sl@0: virtual void Configure(TInt aRate, TInt aChannels, TInt aRepeats, TInt aSilence, TInt aRampUp); sl@0: virtual TInt FillBuffer(TDes8& aBuffer); sl@0: protected: sl@0: virtual TInt GetNextTone()=0; sl@0: // sl@0: TInt DurationToSamples(const TTimeIntervalMicroSeconds& aDuration); sl@0: protected: sl@0: TSineWave iSineWave; sl@0: TInt iRate; sl@0: TInt iChannels; sl@0: TInt iSamplesLeft; sl@0: TInt iTrailingSilence; sl@0: TBool iRampUp; sl@0: TBool iRampDown; sl@0: TBool iIncompleteRampDown; sl@0: TBool iIncompleteRampUp; sl@0: TInt iIncompleteVolume; sl@0: TInt iRampUpRemainder; sl@0: TInt iRepeats; sl@0: TInt iSilenceBetweenRepeats; sl@0: TBool iAfterRepeatSilence; sl@0: TInt iRampUpCount; sl@0: TInt iRampUpLeft; sl@0: }; sl@0: sl@0: // sl@0: // Simple tone synthesis sl@0: // sl@0: sl@0: class TMdaSimpleToneGenerator : public TMdaToneGenerator sl@0: /** sl@0: *@internalTechnology sl@0: */ sl@0: { sl@0: public: sl@0: void SetFrequencyAndDuration(TInt aFrequency, const TTimeIntervalMicroSeconds& aDuration); sl@0: virtual void Reset(); sl@0: virtual TInt GetNextTone(); sl@0: private: sl@0: TTimeIntervalMicroSeconds iDuration; sl@0: TInt iFrequency; sl@0: TBool iPlayed; sl@0: }; sl@0: sl@0: sl@0: /** sl@0: * Dual tone synthesis sl@0: * Generates a tone consisting of two sine waves of different sl@0: * frequencies summed together. sl@0: * sl@0: * @internalTechnology sl@0: */ sl@0: class TMdaDualToneGenerator : public TMdaToneGenerator sl@0: { sl@0: public: sl@0: void SetFrequencyAndDuration(TInt aFrequencyOne, TInt aFrequencyTwo, const TTimeIntervalMicroSeconds& aDuration); sl@0: virtual void Reset(); sl@0: virtual TInt GetNextTone(); sl@0: private: sl@0: TTimeIntervalMicroSeconds iDuration; sl@0: TInt iFrequencyOne; sl@0: TInt iFrequencyTwo; sl@0: TBool iPlayed; sl@0: }; sl@0: sl@0: // sl@0: // DTMF tone synthesis sl@0: // sl@0: sl@0: class TMdaDTMFGenerator : public TMdaToneGenerator sl@0: /** sl@0: *@internalTechnology sl@0: */ sl@0: { sl@0: public: sl@0: virtual void Reset(); sl@0: void SetToneDurations( const TTimeIntervalMicroSeconds32 aOn, sl@0: const TTimeIntervalMicroSeconds32 aOff, sl@0: const TTimeIntervalMicroSeconds32 aPause); sl@0: void SetString(const TDesC& aDTMFString); sl@0: private: sl@0: virtual TInt GetNextTone(); sl@0: private: sl@0: const TDesC* iDTMFString; sl@0: TTimeIntervalMicroSeconds32 iOn; sl@0: TTimeIntervalMicroSeconds32 iOff; sl@0: TTimeIntervalMicroSeconds32 iPause; sl@0: TInt iOnSamples; sl@0: TInt iOffSamples; sl@0: TInt iPauseSamples; sl@0: TInt iChar; sl@0: TBool iPlayToneOff; sl@0: }; sl@0: sl@0: // sl@0: // Tone sequence synthesis sl@0: // sl@0: sl@0: const TInt KMaxSequenceStack = 6; sl@0: class TMdaSequenceGenerator : public TMdaToneGenerator sl@0: /** sl@0: *@internalTechnology sl@0: */ sl@0: { sl@0: public: sl@0: virtual void Reset(); sl@0: void SetSequenceData(const TDesC8& aSequenceData); sl@0: private: sl@0: virtual TInt GetNextTone(); sl@0: private: sl@0: const TDesC8* iSequenceData; sl@0: const TInt16* iInstructionPtr; sl@0: const TInt16* iLastInstruction; sl@0: TInt iStack[KMaxSequenceStack]; sl@0: TInt iStackIndex; sl@0: }; sl@0: sl@0: const TInt KBufferLength = 0x1000; sl@0: sl@0: // Public Media Server includes sl@0: sl@0: class TMdaPtr8 : public TPtr8 //needed for this WINS Impl of Tone Gen sl@0: { sl@0: public: sl@0: TMdaPtr8() sl@0: : TPtr8(0,0,0) {}; sl@0: inline void Set(const TDes8& aDes) sl@0: { TPtr8::Set((TUint8*)(aDes.Ptr()),aDes.Length(),aDes.MaxLength()); }; sl@0: inline void SetLengthOnly(const TDes8& aDes) sl@0: { TPtr8::Set((TUint8*)(aDes.Ptr()),aDes.Length(),aDes.Length()); }; sl@0: inline void Set(const TPtrC8& aDes) sl@0: { TPtr8::Set((TUint8*)(aDes.Ptr()),aDes.Length(),aDes.Length()); }; sl@0: inline void Shift(TInt aOffset) sl@0: { SetLength(Length()-aOffset); iMaxLength-=aOffset; iPtr+=aOffset; }; sl@0: }; sl@0: sl@0: sl@0: #endif