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@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.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_AUDIOINPUT_H__ williamr@2: #define __MMF_AUDIOINPUT_H__ williamr@2: williamr@2: // Standard EPOC32 includes required by this header file williamr@2: #include williamr@2: #include williamr@2: williamr@2: // Public Media Server includes 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 KAudioInputDefaultFrameSize = 0x1000; //4K williamr@2: //#define KAudioInputCanResample //uncomment this to allow Audio Input to sample rate convert williamr@2: williamr@2: williamr@2: void Panic(TInt aPanicCode); williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Interface class to allow dynamic linkage to CMMFAudioInput. williamr@2: */ williamr@2: class MMMFAudioInput : public MDataSource williamr@2: { williamr@2: public: williamr@2: williamr@2: //factory function williamr@2: inline static MMMFAudioInput* NewAudioInputL(TUid aImplementationUid, const TDesC8& aInitData); williamr@2: williamr@2: //interface williamr@2: /** williamr@2: Returns the sound device. williamr@2: williamr@2: @return A reference to a CMMFDevSound objector. Accessor function exposing public CMMFDevsound methods. 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 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 aConsumer williamr@2: The MDataSink consuming the data contained in aBuffer. williamr@2: */ williamr@2: virtual void HWFillBufferL(CMMFBuffer* aBuffer, MDataSink* aConsumer) = 0; williamr@2: protected: williamr@2: //constructor williamr@2: /** williamr@2: Protected constructor. williamr@2: */ williamr@2: inline MMMFAudioInput() : MDataSource(KUidMmfAudioInput) {}; williamr@2: }; williamr@2: williamr@2: /** williamr@2: Allocates and constructs an audio input object. williamr@2: williamr@2: Calls MDataSource::NewSourceL(). 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 A new audio input object. williamr@2: */ williamr@2: inline MMMFAudioInput* MMMFAudioInput::NewAudioInputL( 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==KUidMmfAudioInput, Panic(EMMFAudioInputPanicBadUID)); williamr@2: MMMFAudioInput* retPtr = STATIC_CAST(MMMFAudioInput*, MDataSource::NewSourceL(aImplementationUid, aInitData)); williamr@2: return retPtr; williamr@2: } williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Concrete data source to provide microphone support. williamr@2: williamr@2: Intended to be used by controller plugin developers for source plugins. Uses CMMFDevSound to access williamr@2: hardware. williamr@2: */ williamr@2: class CMMFAudioInput : public CBase, public MMMFAudioInput, public MDevSoundObserver williamr@2: williamr@2: { williamr@2: public: williamr@2: williamr@2: static MDataSource* NewSourceL(); williamr@2: virtual ~CMMFAudioInput(); williamr@2: void ConstructL(); williamr@2: williamr@2: //MDataSource mixin implementations williamr@2: virtual TFourCC SourceDataTypeCode(TMediaId aMediaId); williamr@2: virtual void FillBufferL(CMMFBuffer* aBuffer, MDataSink* aConsumer,TMediaId aMediaId);//called by a MDataSink to request buffer fill williamr@2: virtual void BufferEmptiedL(CMMFBuffer* aBuffer); //called by MDataSink to pass back emptied buffer to the source williamr@2: virtual TBool CanCreateSourceBuffer(); williamr@2: virtual CMMFBuffer* CreateSourceBufferL(TMediaId aMediaId); williamr@2: williamr@2: inline virtual CMMFBuffer* CreateSourceBufferL(TMediaId aMediaId, CMMFBuffer& aSinkBuffer); williamr@2: williamr@2: virtual CMMFBuffer* CreateSourceBufferL(TMediaId aMediaId, TBool &aReference); williamr@2: williamr@2: inline virtual CMMFBuffer* CreateSourceBufferL(TMediaId aMediaId, CMMFBuffer& aSinkBuffer, TBool &aReference); williamr@2: virtual TInt SourceThreadLogon(MAsyncEventHandler& aEventHandler); williamr@2: virtual void SourceThreadLogoff(); williamr@2: virtual void SourcePrimeL(); williamr@2: virtual void SourceStopL(); williamr@2: virtual void SourcePlayL(); williamr@2: virtual void SourcePauseL(); williamr@2: virtual void SetSourcePrioritySettings(const TMMFPrioritySettings& aPrioritySettings); williamr@2: williamr@2: virtual void NegotiateSourceL(MDataSink& aSink); williamr@2: williamr@2: // MMMFAudioInput mixin implementations williamr@2: TInt BytesPlayed(); williamr@2: void HWFillBufferL(CMMFBuffer* aBuffer, MDataSink* aConsumer); //called by a FillBufferL if using HW codec williamr@2: CMMFDevSound& SoundDevice(); williamr@2: virtual TInt SetSourceDataTypeCode(TFourCC aSourceFourCC, TMediaId aMediaId); williamr@2: williamr@2: void LoadL(); williamr@2: williamr@2: //The following DataType() methods and iBufferStatus 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: Buffer completion status. williamr@2: */ williamr@2: TRequestStatus iBufferStatus; williamr@2: williamr@2: protected: williamr@2: virtual void ConstructSourceL( const TDesC8& aInitData ) ; williamr@2: williamr@2: private: williamr@2: inline CMMFAudioInput() {} williamr@2: williamr@2: MAsyncEventHandler* iEventHandler; williamr@2: CMMFDevSound* iMMFDevSound; //this is now private to stop stuff "grabbing it" 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: void ConfigDevSoundL(); williamr@2: williamr@2: private: williamr@2: williamr@2: enum TCodec williamr@2: { williamr@2: EUseARMCodec=0, williamr@2: EUseHWCodec williamr@2: }; williamr@2: williamr@2: enum TState williamr@2: { williamr@2: EIdle=0, williamr@2: EPaused, williamr@2: EDevSoundReady, williamr@2: EBufferEmpty williamr@2: }; williamr@2: williamr@2: enum TError williamr@2: { williamr@2: ECantCreateBuffer, williamr@2: EEmptyBuffer, williamr@2: EDevSoundNotLoaded, williamr@2: EUnknown williamr@2: }; williamr@2: williamr@2: williamr@2: MDataSink* iConsumer; williamr@2: TState iState; williamr@2: williamr@2: TBool iFirstBufferRequested; williamr@2: TBool iFirstBufferRead; williamr@2: williamr@2: TBool iDevSoundLoaded; williamr@2: TBool iStopped; williamr@2: williamr@2: TError iError; williamr@2: TInt iMMFDevsoundError; williamr@2: TMMFPrioritySettings iPrioritySettings; williamr@2: williamr@2: TUint iSinkSampleRate; williamr@2: TUint iSinkChannels; williamr@2: TFourCC iSinkFourCC; williamr@2: TFourCC iDataTypeCode; williamr@2: CMMFBuffer* iDevSoundBuf; williamr@2: williamr@2: TBool iPausePending; williamr@2: TInt iInitializeState; williamr@2: CActiveSchedulerWait* iActiveSchedulerWait; williamr@2: }; williamr@2: williamr@2: /** williamr@2: Intended for synchronous usage (returns buffer specific to a Media Type). williamr@2: williamr@2: @param aMediaId williamr@2: The Media ID. williamr@2: @param aSinkBuffer williamr@2: Not Used. williamr@2: williamr@2: @return A pointer to the CMMFBuffer source buffer. williamr@2: */ williamr@2: inline CMMFBuffer* CMMFAudioInput::CreateSourceBufferL(TMediaId aMediaId, CMMFBuffer& /*aSinkBuffer*/) williamr@2: { williamr@2: return CreateSourceBufferL(aMediaId); williamr@2: } williamr@2: williamr@2: /** williamr@2: Creates a source buffer. williamr@2: williamr@2: Intended for asynchronous usage (returns buffer specific to a Media Type). williamr@2: williamr@2: @param aMediaId williamr@2: The Media ID. williamr@2: @param aSinkBuffer williamr@2: Not used. williamr@2: @param aReference williamr@2: A boolean indicating if MDataSource owns the buffer. If EFalse the the caller owns the williamr@2: buffer. williamr@2: williamr@2: @return The source buffer. williamr@2: */ williamr@2: inline CMMFBuffer* CMMFAudioInput::CreateSourceBufferL(TMediaId aMediaId, CMMFBuffer& /*aSinkBuffer*/, TBool &aReference) williamr@2: { williamr@2: return CreateSourceBufferL(aMediaId, aReference); williamr@2: } williamr@2: williamr@2: #endif