diff -r 000000000000 -r 79dd3e2336a0 mmhais/refacladapt/src/tonehwdevice/tonedatapath.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmhais/refacladapt/src/tonehwdevice/tonedatapath.h Fri Oct 08 19:40:43 2010 +0100 @@ -0,0 +1,199 @@ +// Copyright (c) 2003-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: +// + +#ifndef TONEDATAPATH_H +#define TONEDATAPATH_H + +#include +#include "mdasoundadapter.h" +#include +#include "tonehwdevice.h" + +//message from tonedatapath to hw device observer +//to tell it to update the bytes played +#define KToneHwDeviceObserverUpdateBytesPlayed 0x101FE2A4 + +class MMMFHwDeviceObserver; +class CToneDataPath; +class CToneCodec; + + +/** +@internalTechnology +Panic codes for the Tone Data Path +*/ +enum TToneDataPathPanicCode + { + /** Codec wrapper did not create an internal datapath + */ + EToneNoDataPath, + + /** Codec wrapper does not have a device handle + */ + EToneNoDevice, + + /** Codec wrapper codec returns non existant process result + */ + EToneBadCodec, + + /** Sound driver returns unexpected buffer + */ + EToneBadBuffer + }; + + +/** + * Active object used by the CToneDataPath to send data to the sound + * driver This particular active object encapsulates the asynchronous play + * function, where a buffer of data is sent to the WINS audio device, and the + * active object's RunL is called when the buffer has been consumed by the + * WINS audio device. + * @internalComponent + */ +class CToneDataPathPlayer : public CActive + { +public: + CToneDataPathPlayer(CToneDataPath& aParent, TInt aPriority); + ~CToneDataPathPlayer(); + void Start(); + void ResumePlaying(); + void PlayData(const CMMFDataBuffer& aData); + void Stop(); + virtual void RunL(); + virtual TInt RunError(TInt aError); + virtual void DoCancel(); + virtual void Error(TInt aError); +private: + CToneDataPath& iParent; + const CMMFDataBuffer* iDataFromSource; + TBool iResumePlaying; + }; + +/* +* Active object used by CToneDataPath to listening for error messages +* from the WINS audio device. If this object's RunL is called, playback has +* been terminated for some reason. The active object then +* notifies its parent the datapath, so that proper cleanup and client +* notification can occur. +* @internalComponent +*/ +class CToneSoundDevPlayErrorReceiver : public CActive + { +public: + CToneSoundDevPlayErrorReceiver(CToneDataPath& aParent, TInt aPriority); + ~CToneSoundDevPlayErrorReceiver(); + void Start(); + void Stop(); + virtual void RunL(); + virtual void DoCancel(); +private: + CToneDataPath& iParent; + }; + + +class CToneDataPath : public CBase, + public MIgnoreUnderflowEventsCustomInterface + + { +public: + enum TToneDataPathState + { + EStopped, + EPlaying, + EPaused + }; +public: + static CToneDataPath* NewL(); + ~CToneDataPath(); + TInt SetObserver(MMMFHwDeviceObserver& aHwObserver); + TInt AddCodec(CToneCodec& aCodec); + TInt Start(); + void Stop(); + void Pause(); + RMdaDevSound& Device(); + void BufferFilledL(CMMFDataBuffer& aBuffer); + void BufferEmptiedL(const CMMFDataBuffer& aBuffer); + void SoundDeviceException(TInt aError); + TToneDataPathState State() {return iState;}; + TInt EmptyBuffers(); + virtual void IgnoreUnderflowEvents(); + virtual TAny* CustomInterface(TUid aInterface); + + +protected: + CToneDataPath() {}; + inline void Panic(TInt aPanicCode); + void ConstructL(); + void FillSourceBufferL(); + void FillSoundDeviceBufferL(); + +#ifdef __CYCLE_MMF_DATABUFFERS__ + CMMFDataBuffer* CycleAudioBuffer(CMMFDataBuffer* aBuffer); +#endif + +#ifdef __USE_MMF_TRANSFERBUFFERS__ + CMMFTransferBuffer* CreateTransferBufferL(TUint aBufferSize, CMMFTransferBuffer* aOldBuffer); +#endif + +#ifdef __USE_MMF_PTRBUFFERS__ + CMMFPtrBuffer* CreatePtrBufferL(TUint aBufferSize); +#endif + +protected: + TToneDataPathState iState; + MMMFHwDeviceObserver* iHwDeviceObserver; + CToneCodec* iCodec; + CToneDataPathPlayer* iAudioPlayer; + CToneSoundDevPlayErrorReceiver* iSoundDeviceErrorReceiver; + RMdaDevSound iSoundDevice; + CMMFDataBuffer* iSourceBuffer; + CMMFDataBuffer* iSoundDeviceBuffer; + TBool iNoMoreSourceData; + TBool iSinkCanReceive; + TUint iSourceBufferSize; + TUint iSoundDevBufferSize; + TBool iRampAudioSample; + + TTimeIntervalMicroSeconds iVolumeRamp; + // DEF048512 + TInt iSampleRate; + TInt iChannels; + + TInt iBuffSize; + + TBool iIgnoreUnderflow; + +#ifdef __USE_MMF_TRANSFERBUFFERS__ + RTransferBuffer* iTransferBuffer; + RTransferWindow* iTransferWindow; +#endif + +#ifdef __USE_MMF_PTRBUFFERS__ + HBufC8* iPtrBufferMemoryBlock; +#endif + + }; + +/** + * Internal panic + * @internalComponent + */ +inline void CToneDataPath::Panic(TInt aPanicCode) + { + _LIT(KTonePanicCategory, "ToneDataPath"); + User::Panic(KTonePanicCategory, aPanicCode); + } + +#endif //TONEDATAPATH_H