sl@0: // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #ifndef __TESTUSEOLDCODECAUDIOCONTROLLER_H__ sl@0: #define __TESTUSEOLDCODECAUDIOCONTROLLER_H__ sl@0: sl@0: // Standard EPOC32 includes required by this header file sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: // Public Media Server includes sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: sl@0: const TInt KOneSecondInMicroSeconds(1000000); sl@0: sl@0: sl@0: class CMMFMessageHolder : public CBase sl@0: { sl@0: public: sl@0: static CMMFMessageHolder* NewL(TMMFMessage& aMessage) sl@0: {return new(ELeave) CMMFMessageHolder(aMessage);} sl@0: void Complete(TInt a) {iMessage.Complete(a);} sl@0: private: sl@0: CMMFMessageHolder(TMMFMessage& aMessage): CBase(), iMessage(aMessage) {} sl@0: TMMFMessage iMessage; sl@0: }; sl@0: sl@0: /** sl@0: * sl@0: * The public API for clients of the MMFAudioController sl@0: * sl@0: */ sl@0: sl@0: class CMMFTestUseOldCodecAudioController : public CMMFController, sl@0: public MAsyncEventHandler, sl@0: public MMMFAudioPlayDeviceCustomCommandImplementor, sl@0: public MMMFAudioRecordDeviceCustomCommandImplementor, sl@0: public MMMFAudioPlayControllerCustomCommandImplementor, sl@0: public MMMFAudioRecordControllerCustomCommandImplementor, sl@0: public MMMFAudioControllerCustomCommandImplementor sl@0: { sl@0: public: sl@0: static CMMFController* NewL(); sl@0: virtual ~CMMFTestUseOldCodecAudioController(); sl@0: sl@0: void DevSoundInitialised(TInt aError); sl@0: sl@0: //implement CMMFController ecom plugin interface sl@0: virtual void AddDataSourceL(MDataSource& aDataSource); sl@0: virtual void AddDataSinkL(MDataSink& aDataSink); sl@0: virtual void RemoveDataSourceL(MDataSource& aDataSource); sl@0: virtual void RemoveDataSinkL(MDataSink& aDataSink); sl@0: sl@0: virtual void ResetL(); sl@0: virtual void PrimeL(); sl@0: virtual void PlayL(); sl@0: virtual void PauseL(); sl@0: virtual void StopL() {} //not required sl@0: virtual void StopL(TMMFMessage& aMessage); sl@0: sl@0: virtual TTimeIntervalMicroSeconds PositionL() const; sl@0: virtual void SetPositionL(const TTimeIntervalMicroSeconds& aPosition); sl@0: virtual TTimeIntervalMicroSeconds DurationL() const; sl@0: virtual void CustomCommand(TMMFMessage& aMessage); sl@0: virtual void SetPrioritySettings(const TMMFPrioritySettings& aPrioritySettings); sl@0: virtual void GetNumberOfMetaDataEntriesL(TInt& aNumberOfEntries); sl@0: virtual CMMFMetaDataEntry* GetMetaDataEntryL(TInt aIndex); sl@0: sl@0: //from MAsyncEventHandler sl@0: virtual TInt SendEventToClient(const TMMFEvent& aEvent); sl@0: sl@0: //from MMMFAudioPlayDeviceCustomCommandImplementor sl@0: virtual void MapdSetVolumeL(TInt aVolume); sl@0: virtual void MapdGetMaxVolumeL(TInt& aMaxVolume); sl@0: virtual void MapdGetVolumeL(TInt& aVolume); sl@0: virtual void MapdSetVolumeRampL(const TTimeIntervalMicroSeconds& aRampDuration); sl@0: virtual void MapdSetBalanceL(TInt aBalance); sl@0: virtual void MapdGetBalanceL(TInt& aBalance); sl@0: sl@0: //from MMMFAudioRecordDeviceCustomCommandImplementor sl@0: virtual void MardSetGainL(TInt aGain); sl@0: virtual void MardGetMaxGainL(TInt& aMaxGain); sl@0: virtual void MardGetGainL(TInt& aGain); sl@0: virtual void MardSetBalanceL(TInt aBalance); sl@0: virtual void MardGetBalanceL(TInt& aBalance); sl@0: sl@0: //from MMMFAudioPlayControllerCustomCommandImplementor sl@0: virtual void MapcSetPlaybackWindowL(const TTimeIntervalMicroSeconds& aStart, const TTimeIntervalMicroSeconds& aEnd); sl@0: virtual void MapcDeletePlaybackWindowL(); sl@0: virtual void MapcGetLoadingProgressL(TInt& aPercentageComplete); sl@0: sl@0: //from MMMFAudioRecordControllerCustomCommandImplementor sl@0: virtual void MarcGetRecordTimeAvailableL(TTimeIntervalMicroSeconds& aTime); sl@0: virtual void MarcSetMaxDurationL(const TTimeIntervalMicroSeconds& aMaxDuration); sl@0: virtual void MarcSetMaxFileSizeL(TInt aFileSize); sl@0: virtual void MarcCropL(TBool aToEnd); sl@0: virtual void MarcAddMetaDataEntryL(const CMMFMetaDataEntry& aNewEntry); sl@0: virtual void MarcRemoveMetaDataEntryL(TInt aIndex); sl@0: virtual void MarcReplaceMetaDataEntryL(TInt aIndex, const CMMFMetaDataEntry& aNewEntry); sl@0: sl@0: //from MMMFAudioControllerCustomCommandImplementor sl@0: virtual void MacSetSourceSampleRateL(TUint aSampleRate); sl@0: virtual void MacSetSourceNumChannelsL(TUint aNumChannels); sl@0: virtual void MacSetSourceFormatL(TUid aFormatUid); sl@0: virtual void MacSetSinkSampleRateL(TUint aSampleRate); sl@0: virtual void MacSetSinkNumChannelsL(TUint aNumChannels); sl@0: virtual void MacSetSinkFormatL(TUid aFormatUid); sl@0: virtual void MacSetCodecL(TFourCC aSourceDataType, TFourCC aSinkDataType); sl@0: virtual void MacSetSourceBitRateL(TUint aBitRate); sl@0: virtual void MacSetSourceDataTypeL(TFourCC aDataType); sl@0: virtual void MacSetSinkBitRateL(TUint aRate); sl@0: virtual void MacSetSinkDataTypeL(TFourCC aDataType); sl@0: virtual void MacGetSourceSampleRateL(TUint& aRate); sl@0: virtual void MacGetSourceBitRateL(TUint& aRate); sl@0: virtual void MacGetSourceNumChannelsL(TUint& aNumChannels); sl@0: virtual void MacGetSourceFormatL(TUid& aFormat); sl@0: virtual void MacGetSourceDataTypeL(TFourCC& aDataType); sl@0: virtual void MacGetSinkSampleRateL(TUint& aRate); sl@0: virtual void MacGetSinkBitRateL(TUint& aRate); sl@0: virtual void MacGetSinkNumChannelsL(TUint& aNumChannels); sl@0: virtual void MacGetSinkFormatL(TUid& aFormat); sl@0: virtual void MacGetSinkDataTypeL(TFourCC& aDataType); sl@0: virtual void MacGetSupportedSourceSampleRatesL(RArray& aSupportedRates); sl@0: virtual void MacGetSupportedSourceBitRatesL(RArray& aSupportedRates); sl@0: virtual void MacGetSupportedSourceNumChannelsL(RArray& aSupportedChannels); sl@0: virtual void MacGetSupportedSourceDataTypesL(RArray& aSupportedDataTypes); sl@0: virtual void MacGetSupportedSinkSampleRatesL(RArray& aSupportedRates); sl@0: virtual void MacGetSupportedSinkBitRatesL(RArray& aSupportedRates); sl@0: virtual void MacGetSupportedSinkNumChannelsL(RArray& aSupportedChannels); sl@0: virtual void MacGetSupportedSinkDataTypesL(RArray& aSupportedDataTypes); sl@0: sl@0: public: sl@0: sl@0: /** sl@0: TControllerState is an enumeration within the namespace CMMFAudioController sl@0: The enumeration provides a set of control states: sl@0: EStopped is the initial state the controller resides in after it has been loaded sl@0: EPrimed is the state the controller is in when it has been associated with datapaths but is not streaming data sl@0: EPlaying is the state the controller is in when it is streaming data sl@0: */ sl@0: enum TControllerState sl@0: { sl@0: EStopped, sl@0: EPrimed, sl@0: EPlaying sl@0: }; sl@0: sl@0: protected: sl@0: CMMFTestUseOldCodecAudioController(); sl@0: protected: sl@0: void ConstructL(); sl@0: void NegotiateL(); sl@0: sl@0: void ConvertFromDevSoundCapsToSampleRatesL(const TMMFCapabilities& aDevSoundCaps, sl@0: RArray& aSampleRates); sl@0: void ConvertFromDevSoundCapsToNumChannelsL(const TMMFCapabilities& aDevSoundCaps, sl@0: RArray& aNumChannels); sl@0: void ConvertFromDevSoundCapsToDataTypesL(const TMMFCapabilities& aDevSoundCaps, sl@0: RArray& aDataTypes); sl@0: void ConvertFromSampleRateToDevSoundCapsL(TUint aSampleRate, TMMFCapabilities& aDevSoundCaps); sl@0: void ConvertFromNumChannelsToDevSoundCapsL(TUint aNumChannels, TMMFCapabilities& aDevSoundCaps); sl@0: void ConvertFromDataTypeToDevSoundCapsL(TFourCC aDataType, TMMFCapabilities& aDevSoundCaps); sl@0: sl@0: // state accessor functions sl@0: TBool SetState( TControllerState aState ); sl@0: TControllerState State() const ; sl@0: TBool IsValidStateTransition( TControllerState aState ) const; sl@0: TBool Invariant() const; sl@0: TBool IsValidState( TControllerState aState ) const ; sl@0: TBool ResetPostCondition() const; sl@0: TBool SinkFormatRequired( MDataSink& aDataSink) const; sl@0: TBool SourceFormatRequired(MDataSource& aDataSource) const; sl@0: void CalculateLeftRightBalance( TInt& aLeft, TInt& aRight, TInt aBalance ) const; sl@0: void CalculateBalance( TInt& aBalance, TInt aLeft, TInt aRight ) const; sl@0: sl@0: sl@0: //This method is used to assist testing of the audio controller sl@0: virtual TBool IsUnderTest(){return EFalse;} sl@0: sl@0: private: sl@0: /** sl@0: * sl@0: * This class is required to ensure that CMMFTestUseOldCodecAudioController::PrimeL() runs synchronously sl@0: * as in some configurations it needs to wait on DevSound initialisation. This class sits between the sl@0: * DevSound interface and the actual real DevSound client, propagating all the function calls to it. sl@0: * The only additional functionality it performs is to inform the CMMFTestUseOldCodecAudioController object sl@0: * when DevSound initialisation is complete. sl@0: * sl@0: */ sl@0: class TDevSoundEventHandler : public MDevSoundObserver sl@0: { sl@0: public: sl@0: TDevSoundEventHandler(); sl@0: sl@0: void SetInterceptedDevSoundObserver(MDevSoundObserver* aObserver); sl@0: void SetEventObserver(CMMFTestUseOldCodecAudioController* aObserver); sl@0: sl@0: //from MDevSoundObserver sl@0: virtual void InitializeComplete(TInt aError); sl@0: virtual void ToneFinished(TInt aError); sl@0: virtual void BufferToBeFilled(CMMFBuffer* aBuffer); sl@0: virtual void PlayError(TInt aError); sl@0: virtual void BufferToBeEmptied(CMMFBuffer* aBuffer); sl@0: virtual void RecordError(TInt aError); sl@0: virtual void ConvertError(TInt aError); sl@0: virtual void DeviceMessage(TUid aMessageType, const TDesC8& aMsg); sl@0: sl@0: private: sl@0: MDevSoundObserver* iInterceptedDevSoundObserver; //Not owned sl@0: CMMFTestUseOldCodecAudioController* iEventObserver; //Not owned sl@0: }; sl@0: sl@0: private: sl@0: MDataSource* iDataSource; sl@0: MDataSink* iDataSink; sl@0: CMMFDataPath* iDataPath; sl@0: CMMFFormatDecode* iSourceFormat; sl@0: CMMFFormatEncode* iSinkFormat; sl@0: TMediaId iMediaId; sl@0: TControllerState iState; sl@0: TMMFPrioritySettings iPrioritySettings; sl@0: TBool iSourceAndSinkAdded; sl@0: sl@0: TBool iStoppingRecording; sl@0: sl@0: CMMFMessageHolder* iStoppingMessage; sl@0: TDevSoundEventHandler iDevSoundEventHandler; sl@0: CActiveSchedulerWait* iWaitForAsyncService; sl@0: }; sl@0: sl@0: sl@0: #endif