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 MMFCLIENTAUDIOPLAY_H sl@0: #define MMFCLIENTAUDIOPLAY_H sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include "mmfclientutility.h" sl@0: #include sl@0: sl@0: static const TUid KUidMmfAudioController = {KMmfUidControllerAudio}; sl@0: sl@0: /** sl@0: Mixin class to allow notification that the timed silence has finished. sl@0: */ sl@0: class MRepeatTrailingSilenceTimerObs sl@0: { sl@0: public: sl@0: virtual void RepeatTrailingSilenceTimerComplete() = 0; sl@0: }; sl@0: sl@0: /** sl@0: CTimer-based active object that waits the requested time before notifying its observer. sl@0: */ sl@0: class CRepeatTrailingSilenceTimer : public CTimer sl@0: { sl@0: public: sl@0: static CRepeatTrailingSilenceTimer* NewL(MRepeatTrailingSilenceTimerObs& aObs); sl@0: void RunL(); sl@0: private: sl@0: CRepeatTrailingSilenceTimer(MRepeatTrailingSilenceTimerObs& aObs); sl@0: private: sl@0: MRepeatTrailingSilenceTimerObs& iObs; 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 CMMFMdaAudioPlayerCallBack : public CActive sl@0: { sl@0: public: sl@0: enum TCallbackState { sl@0: ECallbackInitComplete, sl@0: ECallbackPlayComplete sl@0: }; sl@0: sl@0: sl@0: public: sl@0: static CMMFMdaAudioPlayerCallBack* NewL(MMdaAudioPlayerCallback& aCallback); sl@0: ~CMMFMdaAudioPlayerCallBack(); sl@0: void InitComplete(TInt aError, const TTimeIntervalMicroSeconds& aDuration); sl@0: void PlayComplete(TInt aError); sl@0: private: sl@0: CMMFMdaAudioPlayerCallBack(MMdaAudioPlayerCallback& aCallback); sl@0: void RunL(); sl@0: void DoCancel(); sl@0: private: sl@0: MMdaAudioPlayerCallback& iCallback; sl@0: TInt iError; sl@0: TTimeIntervalMicroSeconds iDuration; sl@0: TCallbackState iState; sl@0: }; sl@0: sl@0: /** sl@0: Concrete implementation of the CMdaAudioPlayerUtility API. sl@0: @see CMdaAudioPlayerUtility sl@0: */ sl@0: class CMMFMdaAudioPlayerUtility; sl@0: NONSHARABLE_CLASS( CMMFMdaAudioPlayerUtility ): public CBase, sl@0: public MMMFControllerEventMonitorObserver, sl@0: public MRepeatTrailingSilenceTimerObs, sl@0: public MMMFFindAndOpenControllerObserver sl@0: { sl@0: friend class CMdaAudioPlayerUtility; sl@0: // friends for Unit testing only sl@0: friend class CTestStepUnitMMFAudClient; sl@0: sl@0: public: sl@0: enum TMMFAudioPlayerState sl@0: { sl@0: EStopped, sl@0: EOpening, sl@0: EPaused, sl@0: EPlaying sl@0: }; sl@0: public: sl@0: static CMMFMdaAudioPlayerUtility* NewFilePlayerL(const TDesC& aFileName, sl@0: MMdaAudioPlayerCallback& aCallback, sl@0: TInt aPriority = EMdaPriorityNormal, sl@0: TInt aPref = EMdaPriorityPreferenceTimeAndQuality, sl@0: CMdaServer* aServer = NULL); sl@0: static CMMFMdaAudioPlayerUtility* NewDesPlayerL(const TDesC8& aData, sl@0: MMdaAudioPlayerCallback& aCallback, sl@0: TInt aPriority = EMdaPriorityNormal, sl@0: TInt aPref = EMdaPriorityPreferenceTimeAndQuality, sl@0: CMdaServer* aServer = NULL); sl@0: static CMMFMdaAudioPlayerUtility* NewDesPlayerReadOnlyL(const TDesC8& aData, sl@0: MMdaAudioPlayerCallback& aCallback, sl@0: TInt aPriority = EMdaPriorityNormal, sl@0: TInt aPref = EMdaPriorityPreferenceTimeAndQuality, sl@0: CMdaServer* aServer = NULL); sl@0: sl@0: static CMMFMdaAudioPlayerUtility* NewL(MMdaAudioPlayerCallback& aCallback, sl@0: TInt aPriority = EMdaPriorityNormal, sl@0: TInt aPref = EMdaPriorityPreferenceTimeAndQuality); sl@0: sl@0: /** sl@0: Destructor sl@0: */ sl@0: ~CMMFMdaAudioPlayerUtility(); sl@0: sl@0: void UseSharedHeap(); sl@0: sl@0: void OpenFileL(const TDesC& aFileName); sl@0: void OpenFileL(const RFile& aFile); sl@0: void OpenFileL(const TMMSource& aSource); sl@0: sl@0: void OpenDesL(const TDesC8& aDescriptor); sl@0: void OpenUrlL(const TDesC& aUrl, TInt aIapId=KUseDefaultIap, const TDesC8& aMimeType = KNullDesC8); sl@0: void Play(); sl@0: void Stop(); sl@0: TInt SetVolume(TInt aVolume); sl@0: void SetRepeats(TInt aRepeatNumberOfTimes, const TTimeIntervalMicroSeconds& aTrailingSilence); sl@0: void SetVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration); sl@0: const TTimeIntervalMicroSeconds& Duration(); sl@0: TInt MaxVolume(); sl@0: sl@0: // API Additions since version 7.0 sl@0: TInt Pause(); sl@0: void Close(); sl@0: TInt GetPosition(TTimeIntervalMicroSeconds& aPosition); sl@0: void SetPosition(const TTimeIntervalMicroSeconds& aPosition); sl@0: sl@0: TInt SetPriority(TInt aPriority, TInt aPref); sl@0: TInt GetVolume(TInt& aVolume); sl@0: TInt GetNumberOfMetaDataEntries(TInt& aNumEntries); sl@0: CMMFMetaDataEntry* GetMetaDataEntryL(TInt aMetaDataIndex); sl@0: TInt SetPlayWindow(const TTimeIntervalMicroSeconds& aStart, sl@0: const TTimeIntervalMicroSeconds& aEnd); sl@0: TInt ClearPlayWindow(); sl@0: TInt SetBalance(TInt aBalance = KMMFBalanceCenter); sl@0: TInt GetBalance(TInt& aBalance); sl@0: TInt GetBitRate(TUint& aBitRate); sl@0: sl@0: void RegisterForAudioLoadingNotification(MAudioLoadingObserver& aCallback); sl@0: void GetAudioLoadingProgressL(TInt& aPercentageProgress); sl@0: const CMMFControllerImplementationInformation& ControllerImplementationInformationL(); sl@0: sl@0: TInt RegisterAudioResourceNotification(MMMFAudioResourceNotificationCallback& aCallback,TUid aNotificationEventUid,const TDesC8& aNotificationRegistrationData = KNullDesC8); sl@0: TInt CancelRegisterAudioResourceNotification(TUid aNotificationEventId); sl@0: TInt WillResumePlay(); sl@0: TInt CustomCommandSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom); sl@0: TInt CustomCommandSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2); sl@0: void CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom, TRequestStatus& aStatus); sl@0: void CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TRequestStatus& aStatus); sl@0: sl@0: MMMFDRMCustomCommand* GetDRMCustomCommand(); sl@0: sl@0: TInt SetThreadPriority(const TThreadPriority& aThreadPriority) const; sl@0: sl@0: TMMFDurationInfo Duration(TTimeIntervalMicroSeconds& aDuration); sl@0: sl@0: // from MMMFControllerEventMonitorObserver sl@0: virtual void HandleEvent(const TMMFEvent& aEvent); sl@0: // from MRepeatTrailingSilenceTimerObs sl@0: virtual void RepeatTrailingSilenceTimerComplete(); sl@0: sl@0: // from MMMFFindAndOpenControllerObserver sl@0: virtual void MfaocComplete( sl@0: TInt& aError, sl@0: RMMFController* aController, sl@0: TUid aControllerUid, sl@0: TMMFMessageDestination* aSourceHandle, sl@0: TMMFMessageDestination* aSinkHandle); sl@0: sl@0: protected: sl@0: CMMFMdaAudioPlayerUtility(MMdaAudioPlayerCallback& aCallback, TInt aPriority, TInt aPref); sl@0: void ConstructL(); sl@0: void DoPlay(); sl@0: sl@0: private: sl@0: void PlaySilence(); sl@0: sl@0: private: sl@0: // last play window command sl@0: enum TPlayWindowCommand sl@0: { sl@0: ENone, sl@0: ESet, sl@0: EClear sl@0: }; sl@0: sl@0: MMdaAudioPlayerCallback& iCallback; sl@0: CMMFMdaAudioPlayerCallBack* iAsyncCallBack; sl@0: MAudioLoadingObserver* iLoadingObserver; sl@0: MMMFAudioResourceNotificationCallback* iAudioResourceNotificationCallBack; sl@0: RMMFController iController; sl@0: CMMFControllerEventMonitor* iControllerEventMonitor; sl@0: TMMFAudioPlayerState iState; sl@0: TTimeIntervalMicroSeconds iDuration; // Needed because of api "Duration()" that returns a reference sl@0: TMMFPrioritySettings iPrioritySettings; sl@0: sl@0: TInt iNumberOfTimesPlayed; sl@0: TInt iNumberOfTimesToRepeat; sl@0: TTimeIntervalMicroSeconds iTrailingSilence; sl@0: TTimeIntervalMicroSeconds iTrailingSilenceLeftToPlay; sl@0: CRepeatTrailingSilenceTimer* iRepeatTrailingSilenceTimer; sl@0: sl@0: // Source and sink handle info sl@0: TMMFMessageDestination iSourceHandle; sl@0: TMMFMessageDestination iSinkHandle; sl@0: sl@0: // Custom command handlers sl@0: RMMFAudioPlayDeviceCustomCommands iAudioPlayDeviceCommands; sl@0: RMMFAudioPlayControllerCustomCommands iAudioPlayControllerCommands; sl@0: RMMFResourceNotificationCustomCommands iNotificationRegistrationCommands; sl@0: RMMFDRMCustomCommands iDRMCustomCommands; sl@0: RMMFAudioPlayControllerSetRepeatsCustomCommands iAudioPlayControllerSetRepeatsCommands; sl@0: sl@0: // Current playback time so we can resume from where we were stopped sl@0: TTimeIntervalMicroSeconds iPosition; sl@0: sl@0: // Play window start and end times and whether it has been set sl@0: TTimeIntervalMicroSeconds iPlayStart; sl@0: TTimeIntervalMicroSeconds iPlayEnd; sl@0: TPlayWindowCommand iPlayWindowSet; sl@0: RArray iMediaIds; sl@0: sl@0: CMMFControllerImplementationInformation* iControllerImplementationInformation; sl@0: TUid iControllerUid; sl@0: sl@0: // utility class to find and open a suitable controller asynchronously sl@0: CMMFFindAndOpenController* iFindAndOpenController; sl@0: TUid iEventHolder; sl@0: TBuf8<256> iNotificationDataHolder; sl@0: TBool iRepeatCancelled; sl@0: }; sl@0: sl@0: #endif