--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmhais/refacladapt/src/audiocodec/audiocodec.h Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,278 @@
+/*
+* Copyright (c) 2007-2008 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 AUDIOCODEC_H
+#define AUDIOCODEC_H
+
+#include <e32base.h>
+#include <mmf/server/mmfhwdevice.h>
+#include <mmf/server/mmfhwdevicesetup.h>
+#include <mmf/server/sounddevice.h>
+#include <a3f/a3f_trace_utils.h>
+#include <a3f/a3fbase.h>
+
+#include "hwdeviceimplementationuids.hrh"
+
+#include <mmf/plugin/mmfhwdeviceimplementationuids.hrh>
+
+#include "moutputport.h"
+#include "minputport.h"
+#include "mgainhelper.h"
+#include "mstreampositioncontrol.h"
+
+#include <a3f/msynccisupport.h>
+#include <a3f/maudiocodec.h>
+
+#define KFOURCCLENGTH 4
+
+
+enum TMode
+ {
+ // Decoder mode
+ EDecode = 0x01,
+ // And vice versa
+ EEncode = 0x02
+ };
+
+class TSampleRateTableEntry
+ {
+public:
+ TInt iSampleRateValue;
+ TMMFSampleRate iSampleRate;
+ };
+
+class TAudioModeTableEntry
+ {
+public:
+ TMMFMonoStereo iAudioModeValue;
+ TUid iAudioMode;
+ };
+
+const TInt KMaxModeIndex = 1;
+
+
+
+class MAudioCodecAdaptationObserver;
+class CFourCCConvertor;
+
+ /////
+ //This is the reference implementation of Phyisical AudioCodec
+ //@lib audiocodec.lib
+ ///
+
+// TODO: Check if those interfaces MInputPort, MOutputPort should be replaced by MMMFAudioDataSupplier, MMMFAudioDataConsumer
+
+
+NONSHARABLE_CLASS(CAudioCodec) :public CActive,
+ public MMMFHwDeviceObserver,
+ public MInputPort, // Adaptation interface
+ public MOutputPort, // Adaptation interface
+ public MGainHelper, // Adaptation interface
+ public MCustomInterfaceSupport, // A3F interface
+ public MStreamPositionControl // Adaptation interface
+ {
+friend class CAudioGainControl;
+public:
+
+ /////
+ // Create a new instance.
+ //
+ // @param aTypeId.
+ // @return CAudioCodec* a pointer to the created instance.
+ ///
+
+ IMPORT_C static CAudioCodec* NewL(TUid aTypeId, const CFourCCConvertor& aFourCCConvertor);
+
+ // Check if this would be removed
+ /////
+ // Structure to hold hw device init parameters
+ ///
+ class THwDeviceInitArgs
+ {
+ public:
+ TUint8 iPolicyId;
+ TInt iEapStreamId;
+ };
+
+ /////
+ // Destructor.
+ //
+ // Deletes all objects and releases all resource owned by this instance.
+ ///
+ virtual ~CAudioCodec();
+
+
+ IMPORT_C TInt SetFormat(TUid aFormat);
+ IMPORT_C TInt RegisterAudioCodecObserver(MAudioCodecAdaptationObserver& aObserver);
+ IMPORT_C void UnregisterAudioCodecObserver(MAudioCodecAdaptationObserver& aObserver);
+ IMPORT_C TInt Initialize();
+ IMPORT_C TInt Load(TInt aSampleRate, TUid aMode);
+ IMPORT_C TInt Start();
+ IMPORT_C TInt Pause();
+ IMPORT_C TInt Stop();
+
+
+
+ // From MOutputPort
+ TInt GetOutputPort(MOutputPort*& aOutputPort);
+
+ // From MInputPort
+ TInt GetInputPort(MInputPort*& aInputPort);
+
+ // From MCustomInterfaceSupport
+ virtual TInt RequestCustomInterface(TUid aUid, TAny*& aPtr);
+ virtual TInt RegisterObserver(MCustomInterfaceSupportObserver& aObserver);
+ virtual void UnRegisterObserver(MCustomInterfaceSupportObserver& aObserver);
+
+ // from base class MInputPort
+ virtual TInt EmptyBuffer(CMMFBuffer* aBuffer, MOutputPort* aSupplier);
+ virtual TInt BufferFilled(CMMFBuffer* aBuffer);
+ virtual TInt SetOutput(MOutputPort* aOutput);
+ virtual TInt RemoveOutput(MOutputPort* aOutput);
+
+ // from base class MOutputPort
+ virtual TInt FillBuffer(CMMFBuffer* aBuffer, MInputPort* aConsumer);
+ virtual TInt BufferEmptied(CMMFBuffer* aBuffer);
+ virtual TInt SetInput(MInputPort* aInput);
+ virtual TInt RemoveInput(MInputPort* aInput);
+ virtual TInt FlushBuffer(MFlushHandlerObserver* aFlushObserver);
+
+ // from base class MMMFHwDeviceObserver
+ virtual TInt FillThisHwBuffer(CMMFBuffer& aHwBuffer);
+ virtual TInt EmptyThisHwBuffer(CMMFBuffer& aHwBuffer);
+ virtual TInt MsgFromHwDevice(TUid aMessageType, const TDesC8& aMsg);
+ virtual void Stopped();
+ virtual void Error(TInt aError);
+
+ // from base class MGainHelper
+ TInt GetGain(TInt& aGain) const;
+ TInt SetGain(RArray<TAudioChannelGain>& aChannels);
+ TInt ConfigureRamp(TUid aRampOperation, const TTimeIntervalMicroSeconds& aRampDuration);
+
+ // from base class MStreamPositionControl
+ TInt GetControlPosition(TTimeIntervalMicroSeconds& aPosition);
+ void ResetControlPosition();
+
+
+ TInt ResolveMode(TUid aMode);
+ TInt GetSupportedSampleRates(RArray<TInt>& aSupportedRates);
+ TInt GetSupportedModes(RArray<TUid>& aSupportedModes);
+
+ //Return the supported values to the client
+ IMPORT_C TInt SupportedModes(RArray<TUid>& aSupportedModes);
+ IMPORT_C TInt SupportedRates(RArray<TInt>& aSupportedRates);
+
+protected:
+ // from CActive
+ void RunL();
+ void DoCancel();
+ TInt RunError(TInt aError);
+
+ TInt LoadHwDevice();
+ TInt InitHwDevice();
+ TInt SetHwDeviceConfig();
+ void FourCCToHwDeviceUidL(TFourCC aFourCC, TMode aMode, TUid &aHWDev);
+
+ TBool IsDataTypeMatch(CImplementationInformation* aHwDeviceResourceEntry,
+ const TDesC8& aHwMatchFourCC, TMode aState);
+
+ // TODO: This will be replaced, when the new mechanism to get the supported configuration
+ // will be defined
+ /////
+ // Reads hw device parameters from resource files.
+ // @return error code.
+ ///
+ TInt ReadResourceRates(RArray<TInt>& aRates);
+ TInt ReadResourceModes(RArray<TUid>& aModes);
+
+ void UpdateBytesPlayed();
+
+private:
+ void ConstructL();
+
+ CAudioCodec(TUid aTypeId, const CFourCCConvertor& aFourCCConvertor);
+
+private:
+ TUid iType;
+ // Indicates if this is an encoder or decoder
+ TMode iMode;
+
+ // The codec format
+ TUid iFormat;
+
+ // Resolved HwDevice Uid
+ TUid iDeviceUid;
+
+ //
+
+ MPlayCustomInterface* iPlayCustomInterface;
+
+ MRecordCustomInterface* iRecordCustomInterface;
+
+ // HwDevice init parameters
+ THwDeviceInitParams iHwDeviceInitParams;
+ THwDeviceInitArgs iHwDeviceInitArgs;
+
+ // CI observers
+ RPointerArray<MCustomInterfaceSupportObserver> iCISupportObservers;
+
+ enum THwDeviceState
+ {
+ EIdle,
+ ERunning,
+ EPaused,
+ EStopped
+ };
+
+ TBool iLastBuffer;
+ THwDeviceState iHwDeviceState;
+ TBool iLastBufferAck;
+ TInt iRequest;
+ TInt iErrorRates;
+ TInt iErrorModes;
+ TInt iSampleRateConfig;
+ TUid iModeConfig;
+
+ CMMFHwDevice* iHwDevice;
+ CMMFDataBuffer* iAdaptationBuffer;
+
+ MOutputPort* iOutputPort;
+ MInputPort* iInputPort;
+ TInt64 iPosition;
+ TInt64 iPlayedBytesCount;
+
+ CFourCCConvertor* iFourCCConvertor;
+ RPointerArray<MAudioCodecAdaptationObserver> iAudioCodecObservers;
+ MIgnoreUnderflowEventsCustomInterface* iIgnoreUnderflowInterface;
+ TUid iRampOperation;
+ TTimeIntervalMicroSeconds iRampDuration;
+ };
+
+/*
+ * Updates the total bytes played.
+ *
+ */
+inline void CAudioCodec::UpdateBytesPlayed()
+ {
+ if (iPlayCustomInterface)
+ {
+ iPlayedBytesCount = iPlayCustomInterface->BytesPlayed();
+ }
+ }
+
+#endif // AUDIOCODEC_H