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