diff -r 000000000000 -r 58be5850fb6c omxilcomp/omxilaudioemulator/pcmrenderer/src/omxilpcmrendererprocessingfunction.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxilcomp/omxilaudioemulator/pcmrenderer/src/omxilpcmrendererprocessingfunction.h Thu Sep 02 20:13:57 2010 +0300 @@ -0,0 +1,238 @@ +/* +* Copyright (c) 2008-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: +* +*/ + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILPCMRENDERERPROCESSINGFUNCTION_H +#define OMXILPCMRENDERERPROCESSINGFUNCTION_H + +#include +#include "omxilpcmrendererconst.h" +#include +#include + +// Forward declarations +class MOmxILClockComponentCmdsIf; + +NONSHARABLE_CLASS(COmxILPcmRendererProcessingFunction) : + public COmxILProcessingFunction + { + +public: + static COmxILPcmRendererProcessingFunction* NewL( + MOmxILCallbackNotificationIf& aCallbacks, + MOmxILClockComponentCmdsIf& aClientClockPort); + + ~COmxILPcmRendererProcessingFunction(); + + OMX_ERRORTYPE StateTransitionIndication(TStateIndex aNewState); + + OMX_ERRORTYPE BufferFlushingIndication(TUint32 aPortIndex, + OMX_DIRTYPE aDirection); + + OMX_ERRORTYPE ParamIndication(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure); + + OMX_ERRORTYPE ConfigIndication(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure); + + OMX_ERRORTYPE BufferIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection); + + OMX_ERRORTYPE MediaTimeIndication(const OMX_TIME_MEDIATIMETYPE& aMediaTimeType); + + OMX_BOOL BufferRemovalIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection); + + TInt GetBytesPlayed() const; + +private: + + COmxILPcmRendererProcessingFunction(MOmxILCallbackNotificationIf& aCallbacks, + MOmxILClockComponentCmdsIf& aClientClockPort); + + void ConstructL(); + + void FlushBufferList(RPointerArray& aBufferList); + +private: + RPointerArray iBuffersToEmpty; + RPointerArray iBuffersEmptied; + OMX_STATETYPE iState; + MOmxILClockComponentCmdsIf* iClientClockPortPtr; + OMX_TICKS iStartMediaTime; + + class CAudioDevice : public CActive + { + public: + static CAudioDevice* NewL(COmxILPcmRendererProcessingFunction& aParent); + ~CAudioDevice(); + + // from CActive + void RunL(); + void DoCancel(); + + OMX_ERRORTYPE OpenDevice(); + OMX_ERRORTYPE CloseDevice(); + OMX_ERRORTYPE Execute(); + OMX_ERRORTYPE MoveToPausedState(); + OMX_ERRORTYPE Stop(); + + OMX_ERRORTYPE SetChannels(TUint aChannels); + OMX_ERRORTYPE SetSampleRate(TUint aSampleRate); + OMX_ERRORTYPE SetVolume(TInt aVolume); + OMX_ERRORTYPE SetVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration); + OMX_ERRORTYPE SetMuted(TBool aMuted); + OMX_BUFFERHEADERTYPE* GetCurrentBuffer(); + TInt GetBytesPlayed(); + void ConfigAudioRamper(TInt64 aRampTime); + TBool RampAudio(CMMFDataBuffer* aBuffer); + TBool ConstructAndStartUpdateTimer(); + void ProcessNextBuffer(); + void PlayData(); + void ProcessMediaTimeIndication(OMX_TIME_MEDIATIMETYPE& aMediaTimeType); + void ProcessParamIndication(const OMX_AUDIO_PARAM_PCMMODETYPE& aPcmModeType); + + private: + CAudioDevice(COmxILPcmRendererProcessingFunction& aParent); + void ConstructL(); + OMX_ERRORTYPE SetPlayFormat(); + void SignalBufferCompletion(OMX_BUFFERHEADERTYPE* apCurrentBuffer); + TBool IsBufferLengthSufficient(TInt aBufferLength) const; + TInt GetMinBufferLength() const; + void SendBufferToSoundDevice(TDes8& aBuffer); + void StartUpdateTimer(); + void HandleClockStateChanged(const OMX_TIME_MEDIATIMETYPE& aMediaTimeType); + TBool CanPlayNow(); + void HandleClockScaleChanged(const OMX_TIME_MEDIATIMETYPE& aMediaTimeType); + void PauseAudio(); + + // From MGenericTimerClient + static TInt UpdateClockMediaTime(TAny* aPtr ); + + private: + RMdaDevSound iSoundDevice; + OMX_BUFFERHEADERTYPE* iCurrentBuffer; + COmxILPcmRendererProcessingFunction& iParent; + TInt iSampleRate; + TInt iChannels; + RMdaDevSound::TMdaSoundEncoding iEncoding; + TUint iVolume; + TBool iMuted; + TUint iBufferSize; + TTimeIntervalMicroSeconds iVolumeRamp; + TBool iRampAudioSample; + TInt iRampSamples; + TInt iRampSamplesLeft; + TInt iRampIncr; + TBool iSkip; + TBool iClockStateRunning; + TBool iPausedClockViaScale; + TBool iIsStartTimeFlagSet; + OMX_TICKS iClockMediaTime; + TBool iPlayData; // To indicate whether it can start rendering audio or not + + /// If the component is in a state other than OMX_StateExecuting, this + /// internal variable is used to store the last value of bytes played by + /// the Sound Device. + TInt iLastBytesPlayedValue; + + /// This is used to send a media time update to the clock component + CPeriodic* iPeriodic; + + // This variable is used to optionally allocate a memory segment to cache OMX buffers if the tunnelled component does not utilise them well + // If the tunnelled components don't fill in sufficient data in the buffers, this can create underflows in the renderer, as the driver won't have enough data to play + RBuf8 iCachedPlayBuffer; + TBool iResumeAfterNextPlay; + + } *iAudioDevice; + + class CPFHelper : public CActive + { + public: + static CPFHelper* NewL(CAudioDevice& aAudioDevice); + ~CPFHelper(); + + // from CActive + void RunL(); + void DoCancel(); + + TInt OpenDevice(); + TInt CloseDevice(); + TInt CloseDeviceOnError(); + TInt Execute(); + TInt Stop(); + TInt CancelDevice(); + TInt BufferIndication(); + TInt MediaTimeIndication(const OMX_TIME_MEDIATIMETYPE& aMediaTimeType); + TInt ParamIndication(const OMX_AUDIO_PARAM_PCMMODETYPE* aPcmModeType); + TInt SetVolumeRamp(const OMX_U64 aRampDuration); + TInt SetVolume(const OMX_S32 aVolumeValue); + TInt SetMuted(const OMX_BOOL aVolumeValue); + + enum TMessageType + { + EOpenDevice, + ECloseDevice, + ECloseDeviceOnError, + EExecuteCommand, + EStopCommand, + ECancelCommand, + EBufferIndication, + EMediaTimeIndication, + EParamIndication, + ESetVolumeRamp, + ESetVolume, + ESetMuted + }; + + class TProcMessage + { + public: + TMessageType iType; + OMX_TIME_MEDIATIMETYPE iMediaTimeType; + OMX_AUDIO_PARAM_PCMMODETYPE iPcmModeType; + OMX_U64 iRampDuration; + OMX_S32 iVolumeValue; + OMX_BOOL iMuted; + }; + + RMsgQueue iMsgQueue; + + private: + CPFHelper(CAudioDevice& aAudioDevice); + void ConstructL(); + + private: + + static const TInt KMaxMsgQueueEntries = 150; + + CAudioDevice& iAudioDevice; + TThreadId iHelperThreadId; + RSemaphore iCallerSemaphore; + + } *iPFHelper; + + }; + +#endif // OMXILPCMRENDERERPROCESSINGFUNCTION_H