sl@0: // Copyright (c) 2002-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: sl@0: #ifndef __MMFCLIENTTONEPLAY_H__ sl@0: #define __MMFCLIENTTONEPLAY_H__ sl@0: sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: //Panic category and codes sl@0: _LIT(KMMFMdaAudioToneUtilityPanicCategory, "MMFMdaAudioToneUtility"); sl@0: enum TMMFMdaAudioToneUtilityPanicCodes sl@0: { sl@0: EMMFMdaAudioToneUtilityAlreadyPrepared, sl@0: EMMFMdaAudioToneUtilityBadToneConfig, sl@0: EMMFMdaAudioToneUtilityBadMixinCall sl@0: }; sl@0: sl@0: /** sl@0: Active object utility class to allow the callback to be called asynchronously. sl@0: This should help prevent re-entrant code in clients of the mediaframework. sl@0: */ sl@0: class CMMFMdaAudioToneObserverCallback : public CActive, public MMdaAudioToneObserver, public MMdaAudioTonePlayStartObserver sl@0: { sl@0: public: sl@0: static CMMFMdaAudioToneObserverCallback* NewL(MMdaAudioToneObserver& aCallback, MMdaAudioTonePlayStartObserver& aPlayStartCallback); sl@0: ~CMMFMdaAudioToneObserverCallback(); sl@0: // From MMdaAudioToneObserver sl@0: virtual void MatoPrepareComplete(TInt aError); sl@0: virtual void MatoPlayComplete(TInt aError); sl@0: // From MMdaAudioTonePlayStartObserver sl@0: virtual void MatoPlayStarted(TInt aError); sl@0: private: sl@0: CMMFMdaAudioToneObserverCallback(MMdaAudioToneObserver& aCallback, MMdaAudioTonePlayStartObserver& aPlayStartCallback); sl@0: void RunL(); sl@0: void DoCancel(); sl@0: private: sl@0: enum TMMFAudioToneObserverCallbackAction {EPrepareComplete, EPlayComplete, EPlayStarted}; sl@0: MMdaAudioToneObserver& iCallback; sl@0: MMdaAudioTonePlayStartObserver& iPlayStartCallback; sl@0: TMMFAudioToneObserverCallbackAction iAction; sl@0: TInt iErrorCode; sl@0: RArray iCallBackQueue; sl@0: RArray iCallBackQueueError; sl@0: }; sl@0: sl@0: class CMMFToneConfig; sl@0: sl@0: /** sl@0: Concrete implementation of the CMdaAudioToneUtility API. sl@0: @see CMdaAudioToneUtility sl@0: */ sl@0: class CMMFMdaAudioToneUtility; sl@0: NONSHARABLE_CLASS( CMMFMdaAudioToneUtility ): public CBase, sl@0: public MMdaAudioToneObserver, sl@0: public MDevSoundObserver, sl@0: public MMdaAudioTonePlayStartObserver sl@0: { sl@0: friend class CMdaAudioToneUtility; sl@0: // only for testing purposes sl@0: friend class CTestStepUnitMMFAudClient; sl@0: sl@0: public: sl@0: static CMMFMdaAudioToneUtility* NewL(MMdaAudioToneObserver& aObserver, CMdaServer* aServer = NULL, sl@0: TInt aPriority = EMdaPriorityNormal, sl@0: TInt aPref = EMdaPriorityPreferenceTimeAndQuality); sl@0: sl@0: ~CMMFMdaAudioToneUtility(); sl@0: sl@0: TMdaAudioToneUtilityState State(); sl@0: TInt MaxVolume(); sl@0: TInt Volume(); sl@0: void SetVolume(TInt aVolume); sl@0: void SetPriority(TInt aPriority, TInt aPref); sl@0: void SetDTMFLengths(TTimeIntervalMicroSeconds32 aToneLength, sl@0: TTimeIntervalMicroSeconds32 aToneOffLength, sl@0: TTimeIntervalMicroSeconds32 aPauseLength); sl@0: void SetRepeats(TInt aRepeatNumberOfTimes, const TTimeIntervalMicroSeconds& aTrailingSilence); sl@0: void SetVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration); sl@0: TInt FixedSequenceCount(); sl@0: const TDesC& FixedSequenceName(TInt aSequenceNumber); sl@0: void PrepareToPlayTone(TInt aFrequency, const TTimeIntervalMicroSeconds& aDuration); sl@0: void PrepareToPlayDualTone(TInt aFrequencyOne, TInt aFrequencyTwo, const TTimeIntervalMicroSeconds& aDuration); sl@0: void PrepareToPlayDTMFString(const TDesC& aDTMF); sl@0: void PrepareToPlayDesSequence(const TDesC8& aSequence); sl@0: void PrepareToPlayFileSequence(const TDesC& aFileName); sl@0: void PrepareToPlayFileSequence(RFile& aFile); sl@0: void PrepareToPlayFixedSequence(TInt aSequenceNumber); sl@0: void CancelPrepare(); sl@0: void Play(); sl@0: void CancelPlay(); sl@0: TInt Pause(); sl@0: TInt Resume(); sl@0: sl@0: void SetBalanceL(TInt aBalance=KMMFBalanceCenter); sl@0: TInt GetBalanceL(); sl@0: // From MMdaAudioToneObserver sl@0: void MatoPrepareComplete(TInt aError); sl@0: void MatoPlayComplete(TInt aError); sl@0: sl@0: // From DevSoundObserver sl@0: void InitializeComplete(TInt aError); sl@0: void ToneFinished(TInt aError); sl@0: void BufferToBeFilled(CMMFBuffer* /*aBuffer*/) {User::Panic(KMMFMdaAudioToneUtilityPanicCategory,EMMFMdaAudioToneUtilityBadMixinCall);} sl@0: void PlayError(TInt /*aError*/) {User::Panic(KMMFMdaAudioToneUtilityPanicCategory,EMMFMdaAudioToneUtilityBadMixinCall);} sl@0: void BufferToBeEmptied(CMMFBuffer* /*aBuffer*/) {User::Panic(KMMFMdaAudioToneUtilityPanicCategory,EMMFMdaAudioToneUtilityBadMixinCall);} sl@0: void RecordError(TInt /*aError*/) {User::Panic(KMMFMdaAudioToneUtilityPanicCategory,EMMFMdaAudioToneUtilityBadMixinCall);} sl@0: void ConvertError(TInt /*aError*/) {User::Panic(KMMFMdaAudioToneUtilityPanicCategory,EMMFMdaAudioToneUtilityBadMixinCall);} sl@0: void DeviceMessage(TUid /*aMessageId*/, const TDesC8& /*aMsg*/) {User::Panic(KMMFMdaAudioToneUtilityPanicCategory,EMMFMdaAudioToneUtilityBadMixinCall);} sl@0: void SendEventToClient(const TMMFEvent& /*aEvent*/); sl@0: sl@0: TAny* CustomInterface(TUid aInterfaceId); sl@0: sl@0: void PlayAfterInitialized(); sl@0: sl@0: void RegisterPlayStartCallback(MMdaAudioTonePlayStartObserver& aObserver); sl@0: sl@0: // From MMdaAudioTonePlayStartObserver sl@0: void MatoPlayStarted(TInt aError); sl@0: sl@0: protected: sl@0: CMMFMdaAudioToneUtility(MMdaAudioToneObserver& aCallback, TInt aPriority, TInt aPref); sl@0: void ConstructL(); sl@0: private: sl@0: // functions to convert between MediaServer Balance and SoundDev balance sl@0: void CalculateBalance( TInt& aBalance, TInt aLeft, TInt aRight ) const; sl@0: void CalculateLeftRightBalance( TInt& aLeft, TInt& aRight, TInt aBalance ) const; sl@0: sl@0: private: sl@0: CMMFDevSound* iDevSound; sl@0: MMdaAudioToneObserver& iCallback; sl@0: CMMFMdaAudioToneObserverCallback* iAsyncCallback; sl@0: sl@0: CMMFToneConfig* iToneConfig; sl@0: // Devsound doesn't take copies of descriptors we pass to it, so we sl@0: // need to cache the config info until it has finished playing. sl@0: CMMFToneConfig* iPlayingToneConfig; //unused remove when BC break allowed sl@0: sl@0: TMdaAudioToneUtilityState iState; sl@0: sl@0: TMMFPrioritySettings iPrioritySettings; sl@0: sl@0: TInt iInitializeState; sl@0: sl@0: TInt iSequenceNumber; sl@0: TBool iPlayCalled; sl@0: sl@0: TBool iInitialized; sl@0: sl@0: MMdaAudioTonePlayStartObserver* iPlayStartObserver; sl@0: sl@0: #ifdef _DEBUG sl@0: TBool iPlayCalledBeforeInitialized; sl@0: #endif sl@0: }; sl@0: sl@0: sl@0: // Tone configurations sl@0: class CMMFToneConfig : public CBase sl@0: { sl@0: public: sl@0: enum TMMFToneType sl@0: { sl@0: EMmfToneTypeSimple, sl@0: EMmfToneTypeDTMF, sl@0: EMmfToneTypeDesSeq, sl@0: EMmfToneTypeFileSeq, sl@0: EMmfToneTypeFixedSeq, sl@0: EMmfToneTypeDual, sl@0: }; sl@0: virtual ~CMMFToneConfig() {} sl@0: TMMFToneType Type() {return iType;} sl@0: protected: sl@0: CMMFToneConfig(TMMFToneType aType) : iType(aType) {} sl@0: private: sl@0: TMMFToneType iType; sl@0: }; sl@0: sl@0: class CMMFSimpleToneConfig : public CMMFToneConfig sl@0: { sl@0: public: sl@0: static CMMFToneConfig* NewL(TInt aFrequency, const TTimeIntervalMicroSeconds& aDuration); sl@0: virtual ~CMMFSimpleToneConfig(); sl@0: TInt Frequency(); sl@0: const TTimeIntervalMicroSeconds& Duration(); sl@0: protected: sl@0: CMMFSimpleToneConfig(TInt aFrequency, const TTimeIntervalMicroSeconds& aDuration); sl@0: private: sl@0: TInt iFrequency; sl@0: TTimeIntervalMicroSeconds iDuration; sl@0: }; sl@0: sl@0: class CMMFDualToneConfig : public CMMFToneConfig sl@0: { sl@0: public: sl@0: static CMMFToneConfig* NewL(TInt aFrequencyOne, TInt aFrequencyTwo, const TTimeIntervalMicroSeconds& aDuration); sl@0: virtual ~CMMFDualToneConfig(); sl@0: TInt FrequencyOne(); sl@0: TInt FrequencyTwo(); sl@0: const TTimeIntervalMicroSeconds& Duration(); sl@0: protected: sl@0: CMMFDualToneConfig(TInt aFrequencyOne, TInt aFrequencyTwo, const TTimeIntervalMicroSeconds& aDuration); sl@0: private: sl@0: TInt iFrequencyOne; sl@0: TInt iFrequencyTwo; sl@0: TTimeIntervalMicroSeconds iDuration; sl@0: }; sl@0: sl@0: class CMMFDTMFStringToneConfig : public CMMFToneConfig sl@0: { sl@0: public: sl@0: static CMMFToneConfig* NewL(const TDesC& aDTMF); sl@0: static CMMFToneConfig* NewL(RFile& aFile); sl@0: virtual ~CMMFDTMFStringToneConfig(); sl@0: const TDesC& DTMF(); sl@0: protected: sl@0: CMMFDTMFStringToneConfig(); sl@0: void ConstructL(const TDesC& aDTMF); sl@0: private: sl@0: HBufC* iDTMF; sl@0: }; sl@0: sl@0: class CMMFDesSeqToneConfig : public CMMFToneConfig sl@0: { sl@0: public: sl@0: static CMMFToneConfig* NewL(const TDesC8& aDesSeq); sl@0: virtual ~CMMFDesSeqToneConfig(); sl@0: const TDesC8& DesSeq(); sl@0: protected: sl@0: CMMFDesSeqToneConfig(); sl@0: void ConstructL(const TDesC8& aDesSeq); sl@0: private: sl@0: HBufC8* iDesSeq; sl@0: }; sl@0: sl@0: sl@0: class CMMFFileSeqToneConfig : public CMMFToneConfig sl@0: { sl@0: public: sl@0: static CMMFToneConfig* NewL(const TDesC& aFileSeq); sl@0: static CMMFToneConfig* NewL(RFile& aFile); sl@0: virtual ~CMMFFileSeqToneConfig(); sl@0: const TDesC8& FileSeq(); sl@0: sl@0: // CAF support for Tone Utility sl@0: void ExecuteIntentL(); sl@0: protected: sl@0: CMMFFileSeqToneConfig(); sl@0: void ConstructL(const TDesC& aFileSeq); sl@0: void ConstructL(RFile& aFile); sl@0: private: sl@0: ContentAccess::CContent* iCAFContent; sl@0: ContentAccess::CData* iCAFData; sl@0: HBufC8* iDesSeq; sl@0: }; sl@0: sl@0: class CMMFFixedSeqToneConfig : public CMMFToneConfig sl@0: { sl@0: public: sl@0: static CMMFToneConfig* NewL(TInt aSeqNo); sl@0: virtual ~CMMFFixedSeqToneConfig(); sl@0: TInt SequenceNumber(); sl@0: protected: sl@0: CMMFFixedSeqToneConfig(TInt aSeqNo); sl@0: private: sl@0: TInt iSequenceNumber; sl@0: }; sl@0: sl@0: #endif