os/mm/mmlibs/mmfw/src/Client/Audio/mmfclientaudioplayer.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 
    17 #ifndef MMFCLIENTAUDIOPLAY_H
    18 #define MMFCLIENTAUDIOPLAY_H
    19 
    20 #include <e32std.h>
    21 #include <e32base.h>
    22 #include <mdaaudiosampleplayer.h>
    23 #include <mmf/common/mmfcontroller.h>
    24 #include <mmf/server/mmffile.h>
    25 #include <mmf/server/mmfdes.h>
    26 #include <mmfcontrollerimplementationuids.hrh>
    27 #include <mmf/common/mmfstandardcustomcommands.h>
    28 #include <mmf/common/mmfdrmcustomcommands.h>
    29 #include "mmfclientutility.h"
    30 #include <mmf/common/mmfdurationinfocustomcommands.h>
    31 
    32 static const TUid KUidMmfAudioController = {KMmfUidControllerAudio}; 
    33 
    34 /**
    35 Mixin class to allow notification that the timed silence has finished.
    36 */
    37 class MRepeatTrailingSilenceTimerObs
    38 	{
    39 public:
    40 	virtual void RepeatTrailingSilenceTimerComplete() = 0;
    41 	};
    42 
    43 /**
    44 CTimer-based active object that waits the requested time before notifying its observer.
    45 */
    46 class CRepeatTrailingSilenceTimer : public CTimer
    47 	{
    48 public:
    49 	static CRepeatTrailingSilenceTimer* NewL(MRepeatTrailingSilenceTimerObs& aObs);
    50 	void RunL();
    51 private:
    52 	CRepeatTrailingSilenceTimer(MRepeatTrailingSilenceTimerObs& aObs);
    53 private:
    54 	MRepeatTrailingSilenceTimerObs& iObs;
    55 	};
    56 
    57 /**
    58 Active object utility class to allow the callback to be called asynchronously.
    59 This should help prevent re-entrant code in clients of the mediaframework.
    60 */
    61 class CMMFMdaAudioPlayerCallBack : public CActive
    62 	{
    63 public:
    64 	enum TCallbackState {
    65 		ECallbackInitComplete,
    66 		ECallbackPlayComplete
    67 		};
    68 
    69 		
    70 public:
    71 	static CMMFMdaAudioPlayerCallBack* NewL(MMdaAudioPlayerCallback& aCallback);
    72 	~CMMFMdaAudioPlayerCallBack();
    73 	void InitComplete(TInt aError, const TTimeIntervalMicroSeconds& aDuration);
    74 	void PlayComplete(TInt aError);
    75 private:
    76 	CMMFMdaAudioPlayerCallBack(MMdaAudioPlayerCallback& aCallback);
    77 	void RunL();
    78 	void DoCancel();
    79 private:
    80 	MMdaAudioPlayerCallback& iCallback;
    81 	TInt iError;
    82 	TTimeIntervalMicroSeconds iDuration;
    83 	TCallbackState iState;
    84 	};
    85 
    86 /**
    87 Concrete implementation of the CMdaAudioPlayerUtility API.
    88 @see CMdaAudioPlayerUtility
    89 */
    90 class CMMFMdaAudioPlayerUtility;
    91 NONSHARABLE_CLASS( CMMFMdaAudioPlayerUtility ): public CBase, 
    92 								  				public MMMFControllerEventMonitorObserver,
    93 								  				public MRepeatTrailingSilenceTimerObs,
    94 								  				public MMMFFindAndOpenControllerObserver
    95 	{
    96 friend class CMdaAudioPlayerUtility;
    97 // friends for Unit testing only
    98 friend class CTestStepUnitMMFAudClient;
    99 
   100 public:
   101 	enum TMMFAudioPlayerState
   102 		{
   103 		EStopped,
   104 		EOpening,
   105 		EPaused,
   106 		EPlaying		
   107 		};
   108 public:
   109 	static CMMFMdaAudioPlayerUtility* NewFilePlayerL(const TDesC& aFileName, 
   110 								MMdaAudioPlayerCallback& aCallback, 
   111 								TInt aPriority = EMdaPriorityNormal, 
   112 								TInt aPref = EMdaPriorityPreferenceTimeAndQuality,
   113 								CMdaServer* aServer = NULL);
   114 	static CMMFMdaAudioPlayerUtility* NewDesPlayerL(const TDesC8& aData, 
   115 								MMdaAudioPlayerCallback& aCallback, 
   116 								TInt aPriority = EMdaPriorityNormal, 
   117 								TInt aPref = EMdaPriorityPreferenceTimeAndQuality,
   118 								CMdaServer* aServer = NULL);
   119 	static CMMFMdaAudioPlayerUtility* NewDesPlayerReadOnlyL(const TDesC8& aData, 
   120 								MMdaAudioPlayerCallback& aCallback, 
   121 								TInt aPriority = EMdaPriorityNormal, 
   122 								TInt aPref = EMdaPriorityPreferenceTimeAndQuality,
   123 								CMdaServer* aServer = NULL);
   124 
   125 	static CMMFMdaAudioPlayerUtility* NewL(MMdaAudioPlayerCallback& aCallback,
   126 								TInt aPriority = EMdaPriorityNormal,
   127 								TInt aPref = EMdaPriorityPreferenceTimeAndQuality);
   128 
   129 /**
   130 	Destructor
   131 */
   132 	~CMMFMdaAudioPlayerUtility();
   133 	
   134 	void UseSharedHeap();
   135 
   136 	void OpenFileL(const TDesC& aFileName);
   137 	void OpenFileL(const RFile& aFile);
   138 	void OpenFileL(const TMMSource& aSource);
   139 
   140 	void OpenDesL(const TDesC8& aDescriptor);
   141 	void OpenUrlL(const TDesC& aUrl, TInt aIapId=KUseDefaultIap, const TDesC8& aMimeType = KNullDesC8);
   142 	void Play();
   143 	void Stop();
   144 	TInt SetVolume(TInt aVolume);
   145 	void SetRepeats(TInt aRepeatNumberOfTimes, const TTimeIntervalMicroSeconds& aTrailingSilence);
   146 	void SetVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration);
   147 	const TTimeIntervalMicroSeconds& Duration();
   148 	TInt MaxVolume();
   149 
   150 	// API Additions since version 7.0	
   151 	TInt Pause();
   152 	void Close();
   153 	TInt GetPosition(TTimeIntervalMicroSeconds& aPosition);
   154 	void SetPosition(const TTimeIntervalMicroSeconds& aPosition);
   155 
   156 	TInt SetPriority(TInt aPriority, TInt aPref);
   157 	TInt GetVolume(TInt& aVolume);
   158 	TInt GetNumberOfMetaDataEntries(TInt& aNumEntries);
   159 	CMMFMetaDataEntry* GetMetaDataEntryL(TInt aMetaDataIndex);
   160 	TInt SetPlayWindow(const TTimeIntervalMicroSeconds& aStart,
   161 								const TTimeIntervalMicroSeconds& aEnd);
   162 	TInt ClearPlayWindow();
   163 	TInt SetBalance(TInt aBalance = KMMFBalanceCenter);
   164 	TInt GetBalance(TInt& aBalance);
   165 	TInt GetBitRate(TUint& aBitRate);
   166 	
   167 	void RegisterForAudioLoadingNotification(MAudioLoadingObserver& aCallback);
   168 	void GetAudioLoadingProgressL(TInt& aPercentageProgress);
   169 	const CMMFControllerImplementationInformation& ControllerImplementationInformationL();
   170 	
   171 	TInt RegisterAudioResourceNotification(MMMFAudioResourceNotificationCallback& aCallback,TUid aNotificationEventUid,const TDesC8& aNotificationRegistrationData = KNullDesC8);
   172 	TInt CancelRegisterAudioResourceNotification(TUid aNotificationEventId);
   173 	TInt WillResumePlay();
   174 	TInt CustomCommandSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom);
   175 	TInt CustomCommandSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2);
   176 	void CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom, TRequestStatus& aStatus);
   177 	void CustomCommandAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TRequestStatus& aStatus);
   178 	
   179 	MMMFDRMCustomCommand* GetDRMCustomCommand();
   180 
   181 	TInt SetThreadPriority(const TThreadPriority& aThreadPriority) const;
   182 	
   183 	TMMFDurationInfo Duration(TTimeIntervalMicroSeconds& aDuration);
   184 	
   185 	// from MMMFControllerEventMonitorObserver
   186 	virtual void HandleEvent(const TMMFEvent& aEvent);
   187 	// from MRepeatTrailingSilenceTimerObs
   188 	virtual void RepeatTrailingSilenceTimerComplete();
   189 
   190 	// from MMMFFindAndOpenControllerObserver 
   191 	virtual void MfaocComplete(
   192 		TInt& aError, 
   193 		RMMFController* aController, 
   194 		TUid aControllerUid, 
   195 		TMMFMessageDestination* aSourceHandle, 
   196 		TMMFMessageDestination* aSinkHandle);
   197 
   198 protected:
   199 	CMMFMdaAudioPlayerUtility(MMdaAudioPlayerCallback& aCallback, TInt aPriority, TInt aPref);
   200 	void ConstructL();
   201 	void DoPlay();
   202 
   203 private:
   204 	void PlaySilence();
   205 
   206 private:
   207 	// last play window command
   208 	enum TPlayWindowCommand
   209 		{
   210 		ENone,
   211 		ESet,
   212 		EClear
   213 		};
   214 
   215 	MMdaAudioPlayerCallback& iCallback;
   216 	CMMFMdaAudioPlayerCallBack* iAsyncCallBack;
   217 	MAudioLoadingObserver* iLoadingObserver;
   218 	MMMFAudioResourceNotificationCallback* iAudioResourceNotificationCallBack;
   219 	RMMFController iController;
   220 	CMMFControllerEventMonitor* iControllerEventMonitor;
   221 	TMMFAudioPlayerState iState;
   222 	TTimeIntervalMicroSeconds iDuration; // Needed because of api "Duration()" that returns a reference
   223 	TMMFPrioritySettings iPrioritySettings;
   224 
   225 	TInt iNumberOfTimesPlayed;
   226 	TInt iNumberOfTimesToRepeat;
   227 	TTimeIntervalMicroSeconds iTrailingSilence;
   228 	TTimeIntervalMicroSeconds iTrailingSilenceLeftToPlay;	
   229 	CRepeatTrailingSilenceTimer* iRepeatTrailingSilenceTimer;
   230 
   231 	// Source and sink handle info
   232 	TMMFMessageDestination iSourceHandle;
   233 	TMMFMessageDestination iSinkHandle;
   234 
   235 	// Custom command handlers
   236 	RMMFAudioPlayDeviceCustomCommands iAudioPlayDeviceCommands;
   237 	RMMFAudioPlayControllerCustomCommands iAudioPlayControllerCommands;
   238 	RMMFResourceNotificationCustomCommands iNotificationRegistrationCommands;
   239 	RMMFDRMCustomCommands iDRMCustomCommands;
   240 	RMMFAudioPlayControllerSetRepeatsCustomCommands iAudioPlayControllerSetRepeatsCommands;
   241 	
   242 	// Current playback time so we can resume from where we were stopped
   243 	TTimeIntervalMicroSeconds iPosition;
   244 
   245 	// Play window start and end times and whether it has been set
   246 	TTimeIntervalMicroSeconds iPlayStart;
   247 	TTimeIntervalMicroSeconds iPlayEnd;
   248 	TPlayWindowCommand iPlayWindowSet;
   249 	RArray<TUid> iMediaIds;
   250 	
   251 	CMMFControllerImplementationInformation* iControllerImplementationInformation;
   252 	TUid iControllerUid;
   253 
   254 	// utility class to find and open a suitable controller asynchronously
   255 	CMMFFindAndOpenController* iFindAndOpenController;
   256 	TUid iEventHolder;
   257 	TBuf8<256> iNotificationDataHolder;
   258 	TBool iRepeatCancelled;
   259 	}; 
   260 
   261 #endif