diff -r 000000000000 -r 79dd3e2336a0 mmhais/refacladapt/src/audiocodec/audiocodec.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmhais/refacladapt/src/audiocodec/audiocodec.h Fri Oct 08 19:40:43 2010 +0100 @@ -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 +#include +#include +#include +#include +#include + +#include "hwdeviceimplementationuids.hrh" + +#include + +#include "moutputport.h" +#include "minputport.h" +#include "mgainhelper.h" +#include "mstreampositioncontrol.h" + +#include +#include + +#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& 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& aSupportedRates); + TInt GetSupportedModes(RArray& aSupportedModes); + + //Return the supported values to the client + IMPORT_C TInt SupportedModes(RArray& aSupportedModes); + IMPORT_C TInt SupportedRates(RArray& 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& aRates); + TInt ReadResourceModes(RArray& 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 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 iAudioCodecObservers; + MIgnoreUnderflowEventsCustomInterface* iIgnoreUnderflowInterface; + TUid iRampOperation; + TTimeIntervalMicroSeconds iRampDuration; + }; + +/* + * Updates the total bytes played. + * + */ +inline void CAudioCodec::UpdateBytesPlayed() + { + if (iPlayCustomInterface) + { + iPlayedBytesCount = iPlayCustomInterface->BytesPlayed(); + } + } + +#endif // AUDIOCODEC_H