mmlibs/mmfw/src/Client/Audio/mmfclientaudiooutputstream.h
changeset 0 b8ed18f6c07b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/src/Client/Audio/mmfclientaudiooutputstream.h	Thu Oct 07 22:34:12 2010 +0100
@@ -0,0 +1,133 @@
+// 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 MMFCLIENTAUDIOOUTPUTSTREAM_H
+#define MMFCLIENTAUDIOOUTPUTSTREAM_H
+
+#include <mmf/server/sounddevice.h>
+#include <mmf/common/mmfstandardcustomcommands.h>
+
+template<class T>
+class CMMFFifo;
+class CMMFBuffer;
+class MMdaAudioOutputStreamCallback;
+class TMdaPackage;
+class MMMFAudioResourceNotificationCallback;
+
+class CMMFMdaAudioOutputStream;
+NONSHARABLE_CLASS( CMMFMdaAudioOutputStream ): public CBase,
+								 			   public MDevSoundObserver
+	{
+	enum TIsOpenState
+		{
+		EIsNotOpen,
+		EIsOpening,  // Open() called but not responded to
+		EIsOpen,     // Open callback made and successfully opened
+		};
+public:
+	static CMMFMdaAudioOutputStream* NewL(MMdaAudioOutputStreamCallback& aCallback);
+	static CMMFMdaAudioOutputStream* NewL(MMdaAudioOutputStreamCallback& aCallback, TInt aPriority, TInt aPref);
+	virtual ~CMMFMdaAudioOutputStream();
+//
+	void SetAudioPropertiesL(TInt aSampleRate, TInt aChannels);
+	void Open(TMdaPackage* aSettings);
+	void SetVolume(const TInt aVolume);
+	TInt Volume();
+	TInt MaxVolume();
+	void SetBalanceL(TInt aBalance = KMMFBalanceCenter);
+	TInt GetBalanceL() const;
+	void SetPriority(TInt aPriority, TInt aPref);
+	void WriteL(const TDesC8& aData);
+	void Stop();
+	TInt Pause();
+	TInt Resume();
+	const TTimeIntervalMicroSeconds& Position();
+	TInt GetBytes();
+	void SetDataTypeL(TFourCC aAudioType);
+	TFourCC DataType() const;
+	TInt RegisterAudioResourceNotification(MMMFAudioResourceNotificationCallback& aCallback,TUid aNotificationEventUid,const TDesC8& aNotificationRegistrationData = KNullDesC8);
+	TInt CancelRegisterAudioResourceNotification(TUid aNotificationEventId);
+	TInt WillResumePlay();
+	TAny* CustomInterface(TUid aInterfaceId);
+	TInt KeepOpenAtEnd();
+	TInt RequestStop();
+public:		
+	// from MDevSoundObserver
+	virtual void InitializeComplete(TInt aError);
+	virtual void ToneFinished(TInt aError); 
+	virtual void BufferToBeFilled(CMMFBuffer* aBuffer);
+	virtual void PlayError(TInt aError); 
+	virtual void BufferToBeEmptied(CMMFBuffer* aBuffer); 
+	virtual void RecordError(TInt aError); 
+	virtual void ConvertError(TInt aError);
+	virtual void DeviceMessage(TUid aMessageType, const TDesC8& aMsg);
+	virtual void SendEventToClient(const TMMFEvent& aEvent);
+	
+private:
+	void RealSetAudioPropertiesL(TInt aSampleRate, TInt aChannels);
+
+private:
+	// class to allow asynchronous user callbacks
+	class CActiveCallback : public CActive
+		{
+	public:
+		~CActiveCallback();
+		CActiveCallback(MMdaAudioOutputStreamCallback& aCallback);
+		void Signal(const TInt aReason);
+	protected:
+		virtual void RunL();
+		virtual void DoCancel();
+	private:
+		MMdaAudioOutputStreamCallback& iCallback;
+		};
+private:
+	CMMFMdaAudioOutputStream(MMdaAudioOutputStreamCallback& aCallback);
+	void ConstructL(TInt aPriority, TInt aPref);
+	void StartPlayL();
+	enum TState { EStopped, EPlaying, EStopping, EPaused};
+	void EmptyFifo(TInt aError);
+	void StartShutDownTimer();
+	static TInt ShutDownTimerComplete(TAny* aSamplesPlayed);
+	void DoShutDownTimerComplete();
+private:
+	MMdaAudioOutputStreamCallback&		iCallback;
+	MMMFAudioResourceNotificationCallback* iAudioResourceNotificationCallBack;
+	CMMFFifo<const TDesC8>*				iFifo;
+	TInt								iFifoItemPos;
+	CMMFDevSound*						iDevSound;
+	TState								iState;
+	TTimeIntervalMicroSeconds			iPosition;
+	CActiveCallback*					iActiveCallback;
+	TUid 								iEventHolder;
+	TBuf8<256> 						iNotificationDataHolder;
+	// only for testing
+	friend class						CTestStepUnitMMFAudClient;
+	CMMFBuffer*							iBuffer;
+	TFourCC								iDataTypeCode;
+	TIsOpenState						iIsOpenState;
+	TBool								iValuesCached;
+	TInt								iSampleRate;
+	TInt								iChannels;
+	TInt								iVolume;
+	TBool								iInitCallFrmSetDataType;//Flag to indicate that InitializeL is called from SetDataTypeL.
+	TInt								iInitializeState;
+	CActiveSchedulerWait*				iActiveSchedulerWait;
+	TBool								iKeepOpenAtEnd;
+	CPeriodic*							iShutDownTimer;
+	TInt								iCurrentSamplesPlayed;
+	TBool 								iDevSoundIgnoresUnderflow;
+	}; 
+
+#endif