williamr@2: // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: #ifndef __MMF_AUDIOOUTPUT_H__ williamr@2: #define __MMF_AUDIOOUTPUT_H__ williamr@2: williamr@2: // Standard EPOC32 includes required by this header file williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include williamr@2: williamr@2: #include williamr@2: williamr@2: //DevSound williamr@2: #include williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @deprecated williamr@2: */ williamr@2: const TUint KAudioOutputDefaultFrameSize = 0x1000; williamr@2: williamr@2: williamr@2: void Panic(TInt aPanicCode); williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Interface class to allow dynamic linkage to CMMFAudioOutput. williamr@2: */ williamr@2: class MMMFAudioOutput : public MDataSink williamr@2: { williamr@2: public: williamr@2: //factory function williamr@2: /** williamr@2: Gets a new audio output object. williamr@2: williamr@2: @param aImplementationUid williamr@2: The implementation UID. williamr@2: @param aInitData williamr@2: The initialisation data. williamr@2: williamr@2: @return The audio output object. williamr@2: */ williamr@2: inline static MMMFAudioOutput* NewAudioOutputL(TUid aImplementationUid, const TDesC8& aInitData); williamr@2: //interface williamr@2: williamr@2: /** williamr@2: Returns the sound device. williamr@2: williamr@2: Accessor function exposing public CMMFDevsound methods. williamr@2: williamr@2: @return A reference to a CMMFDevSound objector. williamr@2: */ williamr@2: virtual CMMFDevSound& SoundDevice() = 0; williamr@2: williamr@2: /** williamr@2: Returns the number of bytes played. williamr@2: williamr@2: @return The number of bytes played. If 16-bit divide this number returned by 2 to get word williamr@2: length. williamr@2: */ williamr@2: virtual TInt BytesPlayed() = 0; williamr@2: williamr@2: /** williamr@2: @deprecated williamr@2: williamr@2: Gets audio from hardware device abstracted MMFDevsound (not used). williamr@2: williamr@2: @param aBuffer williamr@2: The data to read in from a Hardware Device williamr@2: @param aSupplier williamr@2: The MDataSink consuming the data contained in aBuffer. williamr@2: */ williamr@2: virtual void HWEmptyBufferL(CMMFBuffer* aBuffer, MDataSource* aSupplier)=0;//called by a EmptyBufferL if using HW codec williamr@2: protected: williamr@2: //constructor williamr@2: /** williamr@2: Protected constructor. williamr@2: */ williamr@2: MMMFAudioOutput() : MDataSink(KUidMmfAudioOutput) {} williamr@2: }; williamr@2: williamr@2: inline MMMFAudioOutput* MMMFAudioOutput::NewAudioOutputL( TUid aImplementationUid, const TDesC8& aInitData ) williamr@2: { williamr@2: //make sure the cast will be ok by checking the uid is what we expect williamr@2: __ASSERT_ALWAYS(aImplementationUid==KUidMmfAudioOutput, Panic(EMMFAudioOutputPanicBadUID)); williamr@2: MMMFAudioOutput* retPtr = STATIC_CAST(MMMFAudioOutput*, MDataSink::NewSinkL(aImplementationUid, aInitData)); williamr@2: return retPtr; williamr@2: } williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The interface into DevSound. williamr@2: williamr@2: Abstract data sink class providing an interface into hardware sound output. williamr@2: williamr@2: Uses CMMFDevSound to access such output. williamr@2: */ williamr@2: class CMMFAudioOutput : public CBase, public MMMFAudioOutput, public MDevSoundObserver williamr@2: williamr@2: { williamr@2: public: williamr@2: static MDataSink* NewSinkL() ; williamr@2: virtual CMMFAudioOutput::~CMMFAudioOutput(); williamr@2: void ConstructL(); williamr@2: williamr@2: //MDataSink mixin implementations williamr@2: virtual TFourCC SinkDataTypeCode(TMediaId aMediaId); //used by data path MDataSource/Sink for codec matching williamr@2: virtual void EmptyBufferL(CMMFBuffer* aBuffer, MDataSource* aSupplier, TMediaId aMediaId);//called by a MDataSource to empty a buffer williamr@2: virtual void BufferFilledL(CMMFBuffer* aBuffer); //called by MDataSource to pass back full buffer to the sink williamr@2: virtual TBool CanCreateSinkBuffer(); williamr@2: virtual CMMFBuffer* CreateSinkBufferL(TMediaId aMediaId, TBool &aReference); williamr@2: virtual TInt SinkThreadLogon(MAsyncEventHandler& aEventHandler); williamr@2: virtual void SinkThreadLogoff(); williamr@2: virtual void SinkPrimeL(); williamr@2: virtual void SinkPauseL(); williamr@2: virtual void SinkPlayL(); williamr@2: virtual void SinkStopL(); williamr@2: virtual void SetSinkPrioritySettings(const TMMFPrioritySettings& aPrioritySettings); williamr@2: virtual void NegotiateL(MDataSource& aSource); williamr@2: // MMMFAudioOutput mixin implementations williamr@2: TInt BytesPlayed(); williamr@2: void HWEmptyBufferL(CMMFBuffer* aBuffer, MDataSource* aSupplier);//called by a EmptyBufferL if using HW codec williamr@2: CMMFDevSound& SoundDevice(); williamr@2: virtual TInt SetSinkDataTypeCode(TFourCC aSinkFourCC, TMediaId aMediaId); williamr@2: williamr@2: //The following DataType() methods should not be used. williamr@2: //They are provided to maintain BC/SC with 7.0s williamr@2: virtual void SetDataTypeL(TFourCC aAudioType); williamr@2: virtual TFourCC DataType() const; williamr@2: williamr@2: protected: williamr@2: virtual void ConstructSinkL( const TDesC8& aInitData ) ; williamr@2: williamr@2: private: williamr@2: inline CMMFAudioOutput() {} williamr@2: williamr@2: void ConfigDevSoundL(); williamr@2: void LoadL(); williamr@2: TInt State(); williamr@2: williamr@2: //MDevSoundObserver mixin implementations williamr@2: virtual void InitializeComplete(TInt aError); williamr@2: virtual void ToneFinished(TInt aError); williamr@2: virtual void BufferToBeFilled(CMMFBuffer* aBuffer); williamr@2: virtual void PlayError(TInt aError); williamr@2: virtual void BufferToBeEmptied(CMMFBuffer* aBuffer); williamr@2: virtual void RecordError(TInt aError); williamr@2: virtual void ConvertError(TInt aError); williamr@2: virtual void DeviceMessage(TUid aMessageType, const TDesC8& aMsg); williamr@2: virtual void SendEventToClient(const TMMFEvent& /*aEvent*/); williamr@2: williamr@2: public: williamr@2: virtual TBool IsResumeSupported(); williamr@2: williamr@2: private: williamr@2: MAsyncEventHandler* iEventHandler; williamr@2: CMMFDevSound* iMMFDevSound; //this is now private to stop stuff "grabbing it" williamr@2: CMMFBuffer* iAudioBuffer; williamr@2: TInt iInitializeState; williamr@2: enum TState williamr@2: { williamr@2: EIdle=0, williamr@2: EDevSoundReady, williamr@2: EPaused williamr@2: }; williamr@2: williamr@2: enum TError williamr@2: { williamr@2: ECantCreateBuffer, williamr@2: EEmptyBuffer, williamr@2: EDevSoundNotLoaded, williamr@2: ERecordNotSupported, williamr@2: EDevSoundError, williamr@2: EUnknown williamr@2: }; williamr@2: williamr@2: MDataSource* iSupplier; williamr@2: TState iState; williamr@2: williamr@2: TBool iCanSendBuffers; williamr@2: TBool iPlayStarted; williamr@2: TBool iDevSoundLoaded; williamr@2: williamr@2: TError iError; williamr@2: TInt iMMFDevsoundError; williamr@2: TMMFPrioritySettings iPrioritySettings; williamr@2: williamr@2: TUint iSourceSampleRate; williamr@2: TUint iSourceChannels; williamr@2: TFourCC iSourceFourCC; williamr@2: TFourCC iDataTypeCode; williamr@2: CMMFDataBuffer* iDevSoundBuffer; williamr@2: williamr@2: TMMFCapabilities iDevSoundConfig; williamr@2: williamr@2: TBool iNeedsSWConversion; williamr@2: TUint iSWConvertSampleRate; williamr@2: TUint iSWConvertChannels; williamr@2: CMMFChannelAndSampleRateConverterFactory* iChannelAndSampleRateConverterFactory; williamr@2: CMMFChannelAndSampleRateConverter* iChannelAndSampleRateConverter; williamr@2: CMMFDataBuffer* iConvertBuffer; williamr@2: CMMFBuffer* iBufferToEmpty; williamr@2: CActiveSchedulerWait* iActiveSchedulerWait; williamr@2: }; williamr@2: williamr@2: #endif