mmdevicefw/mdf/src/audio/HwDeviceAdapter/mdfhwdeviceadapter.h
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmdevicefw/mdf/src/audio/HwDeviceAdapter/mdfhwdeviceadapter.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,178 @@
+// Copyright (c) 2005-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:
+// mmfhwdeviceadapter.h
+// 
+//
+
+/**
+ @file
+ @publishedPartner
+ @prototype
+ @see CMMFHwDevice
+ @see MMdfInputPortObserver
+ @see MMdfOutputPortObserver
+ @see MMdfProcessingUnitObserver
+ @see MMdfHwDeviceSetup
+*/
+
+#ifndef HWDEVICEADAPTER_H
+#define HWDEVICEADAPTER_H
+
+#include <mdf/mdfinputport.h>
+#include <mdf/mdfoutputport.h>
+#include <mdf/mdfprocessingunit.h>
+#include <mdf/mdfpuloader.h>
+#include <mmf/server/mmfhwdevice.h>
+#include <mmf/server/mmfdatabuffer.h>
+#include <mmf/server/mmfhwdevicesetup.h>
+#include <mmf/common/mmfutilities.h>
+
+class CMMFBuffer;
+
+/*
+Hardware Device Adapter class that uses Processing Units (and their associated Ports) in
+order to decode and encode audio data.
+*/
+class CMdfHwDeviceAdapter : public CMMFHwDevice,
+				    		public MMdfInputPortObserver,
+				    		public MMdfOutputPortObserver,
+				    		public MMdfProcessingUnitObserver,
+				    		public MMdfHwDeviceSetup
+	{
+public:	
+	/*
+	The current state of the Hardware Device Adapter.
+	*/
+	enum THwDevAdapterState
+		{
+		/*
+		The PULoader has been loaded.
+		*/
+		EProcessingUnitLoaderLoaded,
+		/*
+		The Processing Units have been loaded.
+		*/
+		EProcessingUnitLoaded,
+		/*
+		The Processing Units are currently being initialised.
+		*/
+		EProcessingUnitInitializing,
+		/*
+		The Processing Units are currently in the idle state.
+		*/
+		EProcessingUnitIdle,
+		/*
+		The Processing Units are currently in the executing state.
+		*/
+		EProcessingUnitExecuting,
+		/*
+		The Processing Units are currently in the paused state.
+		*/
+		EProcessingUnitPaused		
+		};	
+	
+public:
+	static CMdfHwDeviceAdapter* NewL();
+	
+	// from CMMFHwDevice
+	TInt Start(TDeviceFunc aFuncCmd, TDeviceFlow aFlowCmd);
+	TInt Stop();
+	TInt Pause();
+	TInt Init(THwDeviceInitParams& aDevInfo);
+	TAny* CustomInterface(TUid aInterfaceId);
+	TInt ThisHwBufferFilled(CMMFBuffer& aFillBufferPtr);
+	TInt ThisHwBufferEmptied(CMMFBuffer& aEmptyBufferPtr);
+	TInt SetConfig(TTaskConfig& aConfig);
+	TInt StopAndDeleteCodec();
+	TInt DeleteCodec();	
+	~CMdfHwDeviceAdapter();
+	
+	// from MMdfInputPortObserver
+	void MipoWriteDataComplete(const MMdfInputPort* aPu, CMMFBuffer* aBuffer, TInt aErrorCode);
+	void MipoDisconnectTunnelComplete(const MMdfInputPort* aPu, TInt aErrorCode);
+	void MipoRestartTunnelComplete(const MMdfInputPort* aPu, TInt aErrorCode);
+	
+	// from MMdfOutputPortObserver
+	void MopoReadDataComplete(const MMdfOutputPort* aPu, CMMFBuffer* aBuffer, TInt aErrorCode);
+	void MopoDisconnectTunnelComplete(const MMdfOutputPort* aPu, TInt aErrorCode);
+	void MopoRestartTunnelComplete(const MMdfOutputPort* aPu, TInt aErrorCode);
+	
+	// from MMdfProcessingUnitObserver
+	void InitializeComplete(const CMdfProcessingUnit* aPu, TInt aErrorCode);
+	void ExecuteComplete(const CMdfProcessingUnit* aPu, TInt aErrorCode);
+	
+	// from MMdfHwDeviceSetup	
+	void SetDataTypesL(TFourCC aSrcType, TFourCC aDestType);
+	
+	// CMdfHwDeviceAdapter
+	void GetState(THwDevAdapterState& aState) const;
+	
+protected:
+	/*
+	Hardware Device Adapter panics raised as a result of a programming error.
+	*/	
+	enum THwDeviceAdapterPanics
+		{
+		/*
+		Raised when the Codec Processing Unit has not been initialised.
+		@see CMdfHwDeviceAdapter::CustomInterface
+		@see CMdfHwDeviceAdapter::SetDataTypesL
+		*/
+		EPanicCodecNotSet
+		};	
+	
+private:
+	CMdfHwDeviceAdapter();
+	void ConstructL();
+	TInt CreateBuffers();
+	TInt StartEncode();
+	TInt StartDecode();
+	TInt InitializeEncode();
+	TInt InitializeDecode();
+	TInt StartExecuting();
+	void StopHwDevice(TInt error);
+private:
+	enum TPUType
+		{
+		EPcmPu,
+		ESourceSinkPu
+		};
+	CMdfPuLoader* iPuLoader;
+	TUid iPuLoaderDtorKey;
+	MMdfInputPort* iCodecInputPort;
+	MMdfOutputPort* iCodecOutputPort;
+	MMdfInputPort* iSinkInputPort;
+	MMdfOutputPort* iSourceOutputPort;
+	CMdfProcessingUnit* iCodecPU;
+	CMdfProcessingUnit* iAudioDevicePU;
+	THwDevAdapterState iState;
+	TBool iPCMPUCallbackComplete;
+	TBool iSourceSinkPUCallbackComplete;
+	TBool iSourceSinkPuMopoStopCompleted;
+	TBool iPCMPuMopoStopCompleted;
+	TBool iPCMPuMipoStopCompleted;
+	TBool iStopping;
+	TInt iInitError;
+	TInt iExecuteError;
+	CMMFBuffer* iInputBuffer;
+	CMMFBuffer* iOutputBuffer;
+	TInt iInputPortBufferData;	
+	TInt iOutputPortBufferData;
+	CActiveSchedulerWait* iActiveWait;
+	TDeviceFunc iFuncCmd;
+	TFourCC iFirstFourCC;
+	TFourCC iSecondFourCC;
+	};
+	
+#endif // HWDEVICEADAPTER_H