mmhais/refacladapt/src/audiocodec/audiocodec.h
changeset 0 79dd3e2336a0
equal deleted inserted replaced
-1:000000000000 0:79dd3e2336a0
       
     1 /*
       
     2 * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #ifndef AUDIOCODEC_H
       
    20 #define AUDIOCODEC_H
       
    21 
       
    22 #include <e32base.h>
       
    23 #include <mmf/server/mmfhwdevice.h>
       
    24 #include <mmf/server/mmfhwdevicesetup.h>
       
    25 #include <mmf/server/sounddevice.h>
       
    26 #include <a3f/a3f_trace_utils.h>
       
    27 #include <a3f/a3fbase.h>
       
    28 
       
    29 #include "hwdeviceimplementationuids.hrh"
       
    30 
       
    31 #include <mmf/plugin/mmfhwdeviceimplementationuids.hrh>
       
    32 
       
    33 #include "moutputport.h"
       
    34 #include "minputport.h"
       
    35 #include "mgainhelper.h"
       
    36 #include "mstreampositioncontrol.h"
       
    37 
       
    38 #include <a3f/msynccisupport.h>
       
    39 #include <a3f/maudiocodec.h>
       
    40 
       
    41 #define KFOURCCLENGTH 4
       
    42 
       
    43 
       
    44 enum TMode
       
    45 	{
       
    46 	// Decoder mode
       
    47 	EDecode = 0x01,
       
    48 	// And vice versa
       
    49 	EEncode = 0x02
       
    50 	};
       
    51 
       
    52 class TSampleRateTableEntry
       
    53 	{
       
    54 public:
       
    55 	TInt		iSampleRateValue;
       
    56 	TMMFSampleRate iSampleRate;
       
    57 	};
       
    58 
       
    59 class TAudioModeTableEntry
       
    60 	{
       
    61 public:
       
    62 	TMMFMonoStereo	iAudioModeValue;
       
    63 	TUid 			iAudioMode;
       
    64 	};
       
    65 
       
    66 const TInt KMaxModeIndex = 1;
       
    67 
       
    68 
       
    69 
       
    70 class MAudioCodecAdaptationObserver;
       
    71 class CFourCCConvertor;
       
    72 
       
    73 	/////
       
    74 	//This is the reference implementation of Phyisical AudioCodec
       
    75 	//@lib audiocodec.lib
       
    76 	///
       
    77 
       
    78 // TODO: Check if those interfaces MInputPort, MOutputPort should be replaced by MMMFAudioDataSupplier, MMMFAudioDataConsumer
       
    79 
       
    80 
       
    81 NONSHARABLE_CLASS(CAudioCodec) :public CActive,
       
    82 								public MMMFHwDeviceObserver,
       
    83 								public MInputPort,				// Adaptation interface
       
    84 								public MOutputPort,				// Adaptation interface
       
    85 								public MGainHelper,				// Adaptation interface
       
    86 								public MCustomInterfaceSupport,	// A3F interface
       
    87 								public MStreamPositionControl	// Adaptation interface
       
    88 	{
       
    89 friend class CAudioGainControl;
       
    90 public:
       
    91 
       
    92 	/////
       
    93 	// Create a new instance.
       
    94 	//
       
    95 	// @param aTypeId.
       
    96 	// @return CAudioCodec* a pointer to the created instance.
       
    97 	///
       
    98 
       
    99 	IMPORT_C static CAudioCodec* NewL(TUid aTypeId, const CFourCCConvertor& aFourCCConvertor);
       
   100 
       
   101 	// Check if this would be removed
       
   102 	/////
       
   103 	//  Structure to hold hw device init parameters
       
   104 	///
       
   105 	class THwDeviceInitArgs
       
   106 		{
       
   107 	public:
       
   108 		TUint8 iPolicyId;
       
   109 		TInt iEapStreamId;
       
   110 		};
       
   111 
       
   112 	/////
       
   113 	 // Destructor.
       
   114 	 //
       
   115 	 // Deletes all objects and releases all resource owned by this instance.
       
   116 	///
       
   117 	virtual ~CAudioCodec();
       
   118 
       
   119 
       
   120 	IMPORT_C TInt SetFormat(TUid aFormat);
       
   121 	IMPORT_C TInt RegisterAudioCodecObserver(MAudioCodecAdaptationObserver& aObserver);
       
   122 	IMPORT_C void UnregisterAudioCodecObserver(MAudioCodecAdaptationObserver& aObserver);
       
   123 	IMPORT_C TInt Initialize();
       
   124 	IMPORT_C TInt Load(TInt aSampleRate, TUid aMode);
       
   125 	IMPORT_C TInt Start();
       
   126 	IMPORT_C TInt Pause();
       
   127 	IMPORT_C TInt Stop();
       
   128 
       
   129 
       
   130 
       
   131 	// From MOutputPort
       
   132 	TInt GetOutputPort(MOutputPort*& aOutputPort);
       
   133 
       
   134 	// From MInputPort
       
   135 	TInt GetInputPort(MInputPort*& aInputPort);
       
   136 
       
   137 	// From MCustomInterfaceSupport
       
   138 	virtual TInt RequestCustomInterface(TUid aUid, TAny*& aPtr);
       
   139 	virtual TInt RegisterObserver(MCustomInterfaceSupportObserver& aObserver);
       
   140 	virtual void UnRegisterObserver(MCustomInterfaceSupportObserver& aObserver);
       
   141 
       
   142 	// from base class MInputPort
       
   143 	virtual TInt EmptyBuffer(CMMFBuffer* aBuffer, MOutputPort* aSupplier);
       
   144 	virtual TInt BufferFilled(CMMFBuffer* aBuffer);
       
   145 	virtual TInt SetOutput(MOutputPort* aOutput);
       
   146 	virtual TInt RemoveOutput(MOutputPort* aOutput);
       
   147 
       
   148 	// from base class MOutputPort
       
   149 	virtual TInt FillBuffer(CMMFBuffer* aBuffer, MInputPort* aConsumer);
       
   150 	virtual TInt BufferEmptied(CMMFBuffer* aBuffer);
       
   151 	virtual TInt SetInput(MInputPort* aInput);
       
   152 	virtual TInt RemoveInput(MInputPort* aInput);
       
   153 	virtual TInt FlushBuffer(MFlushHandlerObserver* aFlushObserver);
       
   154 
       
   155 	// from base class MMMFHwDeviceObserver
       
   156 	virtual TInt FillThisHwBuffer(CMMFBuffer& aHwBuffer);
       
   157 	virtual TInt EmptyThisHwBuffer(CMMFBuffer& aHwBuffer);
       
   158 	virtual TInt MsgFromHwDevice(TUid aMessageType, const TDesC8& aMsg);
       
   159 	virtual void Stopped();
       
   160 	virtual void Error(TInt aError);
       
   161 
       
   162 	// from base class MGainHelper
       
   163 	TInt GetGain(TInt& aGain) const;
       
   164 	TInt SetGain(RArray<TAudioChannelGain>& aChannels);
       
   165 	TInt ConfigureRamp(TUid aRampOperation, const TTimeIntervalMicroSeconds& aRampDuration);
       
   166 
       
   167 	// from base class MStreamPositionControl
       
   168 	TInt GetControlPosition(TTimeIntervalMicroSeconds& aPosition);
       
   169 	void ResetControlPosition();
       
   170 
       
   171 
       
   172 	TInt ResolveMode(TUid aMode);
       
   173 	TInt GetSupportedSampleRates(RArray<TInt>& aSupportedRates);
       
   174 	TInt GetSupportedModes(RArray<TUid>& aSupportedModes);
       
   175 
       
   176 	//Return the supported values to the client
       
   177 	IMPORT_C TInt SupportedModes(RArray<TUid>& aSupportedModes);
       
   178 	IMPORT_C TInt SupportedRates(RArray<TInt>& aSupportedRates);
       
   179 	
       
   180 protected:
       
   181 	// from CActive
       
   182 	void RunL();
       
   183 	void DoCancel();
       
   184 	TInt RunError(TInt aError);
       
   185 
       
   186 	TInt LoadHwDevice();
       
   187 	TInt InitHwDevice();
       
   188 	TInt SetHwDeviceConfig();
       
   189 	void FourCCToHwDeviceUidL(TFourCC aFourCC, TMode aMode, TUid &aHWDev);
       
   190 
       
   191 	TBool IsDataTypeMatch(CImplementationInformation* aHwDeviceResourceEntry,
       
   192 		const TDesC8& aHwMatchFourCC, TMode aState);
       
   193 
       
   194 	// TODO: This will be replaced, when the new mechanism to get the supported configuration
       
   195 	// will be defined
       
   196 	/////
       
   197 	 // Reads hw device parameters from resource files.
       
   198 	 // @return error code.
       
   199 	 ///
       
   200 	TInt ReadResourceRates(RArray<TInt>& aRates);
       
   201 	TInt ReadResourceModes(RArray<TUid>& aModes);
       
   202 
       
   203 	void UpdateBytesPlayed();
       
   204 
       
   205 private:
       
   206 	void ConstructL();
       
   207 
       
   208 	CAudioCodec(TUid aTypeId, const CFourCCConvertor& aFourCCConvertor);
       
   209 
       
   210 private:
       
   211 	TUid						iType;
       
   212 	// Indicates if this is an encoder or decoder
       
   213 	TMode						iMode;
       
   214 
       
   215 	// The codec format
       
   216 	TUid						iFormat;
       
   217 
       
   218 	// Resolved HwDevice Uid
       
   219 	TUid						iDeviceUid;
       
   220 
       
   221 	//
       
   222 
       
   223 	MPlayCustomInterface*		iPlayCustomInterface;
       
   224 
       
   225 	MRecordCustomInterface*		iRecordCustomInterface;
       
   226 
       
   227 	// HwDevice init parameters
       
   228 	THwDeviceInitParams			iHwDeviceInitParams;
       
   229 	THwDeviceInitArgs			iHwDeviceInitArgs;
       
   230 
       
   231 	// CI observers
       
   232 	RPointerArray<MCustomInterfaceSupportObserver>	iCISupportObservers;
       
   233 
       
   234 	enum THwDeviceState
       
   235 		{
       
   236 		EIdle,
       
   237 		ERunning,
       
   238 		EPaused,
       
   239 		EStopped
       
   240 		};
       
   241 
       
   242 	TBool						iLastBuffer;
       
   243 	THwDeviceState				iHwDeviceState;
       
   244 	TBool						iLastBufferAck;
       
   245 	TInt						iRequest;
       
   246 	TInt						iErrorRates;
       
   247 	TInt						iErrorModes;
       
   248 	TInt						iSampleRateConfig;
       
   249 	TUid						iModeConfig;
       
   250 
       
   251 	CMMFHwDevice*				iHwDevice;
       
   252 	CMMFDataBuffer*				iAdaptationBuffer;
       
   253 
       
   254 	MOutputPort*				iOutputPort;
       
   255 	MInputPort*					iInputPort;
       
   256 	TInt64						iPosition;
       
   257 	TInt64 						iPlayedBytesCount;
       
   258 
       
   259 	CFourCCConvertor* 			iFourCCConvertor;
       
   260 	RPointerArray<MAudioCodecAdaptationObserver> iAudioCodecObservers;
       
   261 	MIgnoreUnderflowEventsCustomInterface* iIgnoreUnderflowInterface;
       
   262 	TUid						iRampOperation;
       
   263 	TTimeIntervalMicroSeconds	iRampDuration;
       
   264 	};
       
   265 
       
   266 /*
       
   267  *	Updates the total bytes played.
       
   268  *
       
   269  */
       
   270 inline void CAudioCodec::UpdateBytesPlayed()
       
   271 	{
       
   272 	if (iPlayCustomInterface)
       
   273 		{
       
   274 		iPlayedBytesCount = iPlayCustomInterface->BytesPlayed();
       
   275 		}
       
   276 	}
       
   277 
       
   278 #endif // AUDIOCODEC_H