diff -r 000000000000 -r 71ca22bcf22a mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/DevSoundAudioOutput/Inc/DevSoundAudioOutput.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/DevSoundAudioOutput/Inc/DevSoundAudioOutput.h Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,555 @@ +/* +* Copyright (c) 2006 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: This file defines the DevSound audio output class responsible for +* sending output to the speaker. +* +*/ + + +#ifndef CDEVSOUNDAUDIOOUTPUT_H +#define CDEVSOUNDAUDIOOUTPUT_H + +// INCLUDES +#include "AdvancedAudioOutput.h" +#include + +// CLASS DECLARATIONS +class CConfigurationComponentsFactory; +class CAudioOutputControlUtility; +/** +* This class defines audio output functions specific to DevSound used for playback. +* +* @lib DevSoundAudioOutput.lib +* @since 3.0 +*/ +class CDevSoundAudioOutput : public CAdvancedAudioOutput, + public MDevSoundObserver + { + public: // Constructors and destructor + + /** + * Class instantiation function. + * @param aPrioritySettings priority settings for devSound and policy + * @param aObserver observer class that will handle all DevSoundAudioOutput + * callbacks + * @return pointer to the instance created + */ + IMPORT_C static CDevSoundAudioOutput* NewL(const TMMFPrioritySettings& aPrioritySettings, + MAdvancedAudioOutputObserver& aObserver, + CMMFDevSound& aMMFDevSound); + + /** + * Destructor function + * @param none + * @return none + */ + IMPORT_C virtual ~CDevSoundAudioOutput(); + + public: // Functions from base classes (CAdvancedAudioOutput) + + /** + * From CAdvancedAudioOutput + * Prepares DevSound Audio Output for playback. + * @since 3.0 + * @param none + * @return none + */ + IMPORT_C virtual void PrimeL(); + + /** + * From CAdvancedAudioOutput + * Handles request to pause playback. Sends pause command to DevSound. + * @since 3.0 + * @param none + * @return none + */ + IMPORT_C virtual void PauseL(); + + /** + * From CAdvancedAudioOutput + * Handles request to start playback. Configures and initializes DevSound. + * @since 3.1 + * @param aBuffer buffer to be played + * aIndex index of the buffer to be played. + * @return none + */ + IMPORT_C virtual void PlayL(TAny* aBuffer, TInt aIndex); + + /** + * From CAdvancedAudioOutput + * Handles request to stop playback. Sends stop command to DevSound. + * @since 3.0 + * @param none + * @return none + */ + IMPORT_C virtual void StopL(TBool aStopDevsound=ETrue); + + /** + * From CAdvancedAudioOutput + * Handles request to get the maximum volume. The max volume is obtained from DevSound. + * @since 3.0 + * @param none + * @return the maximum gain value + */ + IMPORT_C virtual TInt MaxVolumeL(); + + /** + * From CAdvancedAudioOutput + * Handles request to set the volume. The new value is sent to DevSound. + * @since 3.0 + * @param aVolume new volume value + * @return void + */ + IMPORT_C virtual void SetVolumeL(TInt aVolume); + + /** + * From CAdvancedAudioOutput + * Handles request to get the current volume. The current volume is obtained from DevSound. + * @since 3.0 + * @param void + * @return the current volume value + */ + IMPORT_C virtual TInt VolumeL(); + + /** + * From CAdvancedAudioOutput + * Handles request to set priority. The given priority settings are sent to DevSound. + * @since 3.0 + * @param aPrioritySettings new priority settings + * @return none + */ + IMPORT_C virtual void SetPrioritySettingsL(const TMMFPrioritySettings& aPrioritySettings); + + /** + * From CAdvancedAudioOutput + * Handles request to calculate current playback position in terms to micro seconds + * @since 3.0 + * @param none + * @return Current position in microseconds + */ + IMPORT_C virtual TInt64 CalculateAudioOutputPositionL() const; + + /** + * From CAdvancedAudioOutput + * Handles request to get all configured sampling rates from DevSound. + * This is a request for all sampling rates that DevSound is currently + * configured with. + * @since 3.0 + * @param aRates array to hold the retrieved sampling rates + * @return void + */ + IMPORT_C virtual void ConfigRatesL(RArray& aRates); + + /** + * From CAdvancedAudioOutput + * Handles request to get all configured channels from DevSound. + * This is a request for all channels that DevSound is currently + * configured with. + * @since 3.0 + * @param aChannels array to hold the retrieved channels + * @return void + */ + IMPORT_C virtual void ConfigChannelsL(RArray& aChannels); + + /** + * From CAdvancedAudioOutput + * Handles request to get all configured data types (FourCC) from DevSound. + * This is a request for all data types that DevSound is currently + * configured with. + * @since 3.0 + * @param aDataTypes array to hold the retrieved data types + * @return void + */ + IMPORT_C virtual void ConfigDataTypesL(RArray& aDataTypes); + + /** + * From CAdvancedAudioOutput + * Handles request to get all capablities sampling rates from DevSound. + * This contains all sampling rates DevSound is capable of supporting + * @since 3.0 + * @param aRates array to hold the retrieved sampling rates + * @return void + */ + IMPORT_C virtual void CapabilitiesRatesL(RArray& aRates); + + /** + * Handles request to get all capabilities channels from DevSound. + * This is a request for all channels that DevSound is capable of + * supporting. + * @since 3.0 + * @param aChannels array to hold the retrieved channels + * @return void + */ + IMPORT_C virtual void CapabilitiesChannelsL(RArray& aChannels); + + /** + * From CAdvancedAudioOutput + * Handles request to get all capabilities data types (FourCC) from DevSound. + * This is a request for all data types that DevSound is capable of + * supporting. + * @since 3.0 + * @param aDataTypes array to hold the retrieved channels + * @return void + */ + IMPORT_C virtual void CapabilitiesDataTypesL(RArray& aDataTypes); + + /** + * From CAdvancedAudioOutput + * Handles request to set volume ramp to given duration. + * @since 3.0 + * @param aRampDuration ramp duration in microseconds + * @return void + */ + IMPORT_C virtual void SetVolumeRampL(const TTimeIntervalMicroSeconds& aRampDuration); + + /** + * From CAdvancedAudioOutput + * Handles request to set play balance in DevSound. + * @since 3.0 + * @param aLeftPercentage percentage for left channel + * @param aRightPercentage percentage for right channel + * @return void + */ + IMPORT_C virtual void SetPlayBalanceL(TInt aLeftPercentage, TInt aRightPercentage); + + /** + * From CAdvancedAudioOutput + * Handles request to get play balance from DevSound. + * @since 3.0 + * @param aLeftPercentage percentage retrieved for left channel + * @param aRightPercentage percentage retrieved for right channel + * @return void + */ + IMPORT_C virtual void GetPlayBalanceL(TInt& aLeftPercentage, TInt& aRightPercentage); + + /** + * Handles request to configure DevSound with the given parameters. + * @since 3.0 + * @param aSampleRate sampling rate + * @param aNumChannel required number of channels (mono/stereo indication) + * @param aFourCC FourCC of required recording format + * @param aCodecConfigData specific codec configuration data + * @return void + */ + IMPORT_C virtual void ConfigureL(TUint aSampleRate, TUint aNumChannel, TFourCC aFourCC, + const RArray& aCodecConfigData); + + /** + * Sets the Decoder instance to be used by the audio output. + * @since 3.0 + * @param aDecoder Decoder instance + * @return void + */ + IMPORT_C virtual void SetDecoder(CAdvancedAudioDecoder* aDecoder); + + IMPORT_C virtual void Resume(TInt aBufferIndex = -1); + + IMPORT_C virtual void IsLoopPlayEnabled(const TBool aLoopPlayEnabled); + + IMPORT_C virtual void UnSetLastBuffer(const TBool aUnSetLastBuffer); + + IMPORT_C TBool IsDSStopped(); + + IMPORT_C virtual void SetDataSourceAdapter(CDataSourceAdapter* aDataSourceAdapter); + + public: // Functions from base classes (MDevSoundObserver) + + /** + * From MDevSoundObserver + * Callback function from DevSound to indicate initialization has completed. + * @since 2.0 + * @param aError error code returned by DevSound (KErrNone if no error) + * @return void + */ + virtual void InitializeComplete(TInt aError); + + /** + * From MDevSoundObserver + * Callback function from DevSound to indicate tone playback has completed + * since 2.0 + * @param aError error code returned by DevSound (KErrNone if no error) + * @return void + */ + virtual void ToneFinished(TInt aError); + + /** + * From MDevSoundObserver + * Callback function from DevSound to indicate the spcecified buffer needs to be filled. + * (Applicable to playback only) + * @since 2.0 + * @param aBuffer buffer to place playback data + * @return void + */ + virtual void BufferToBeFilled(CMMFBuffer* aBuffer); + + /** + * From MDevSoundObserver + * Callback function from DevSound to indicate playback has completed successfully + * or otherwise. + * @since 2.0 + * @param aError error code returned by DevSound (KErrNone if no error) + * @return void + */ + virtual void PlayError(TInt aError); + + /** + * From MDevSoundObserver + * Callback function from DevSound to indicate the specified buffer has been filled and + * needs to be emptied. (Applicable for Recording only) + * @since 2.0 + * @param aBuffer buffer with recorded data that needs to be emptied + * @return void + */ + virtual void BufferToBeEmptied(CMMFBuffer* aBuffer); + + /** + * From MDevSoundObserver + * Callback function from DevSound to indicate error has occurred during recording + * (for record only) + * @since 3.0 + * @param aError error code returned by DevSound (KErrNone if no error) + * @return void + */ + virtual void RecordError(TInt aError); + + /** + * From MDevSoundObserver + * Callback function from DevSound to indicate conversion from one format to another + * has completed successfully or otherwise. + * (during conversion only) + * @since 3.0 + * @param aError error code returned by DevSound (KErrNone if no error) + * @return void + */ + virtual void ConvertError(TInt aError); + + /** + * From MDevSoundObserver + * Callback function from hardware device passed through via DevSound + * @since 3.0 + * @param aMessageType type of message + * @param aMsg message contents + * @return void + */ + virtual void DeviceMessage(TUid aMessageType, const TDesC8& aMsg); + + /** + * From MDevSoundObserver + * Callback function from DevSound to request given event be sent to client + * @since 3.0 + * @param aEvent event to send + * @return void + */ + virtual void SendEventToClient(const TMMFEvent& aEvent); + + /** + * From MAdvancedAudioDecoderObserver + * Called by a CAdvancedAudioDecoder object when the specifed buffer is filled. + * @since 3.0 + * @param @param aFilledBuffer data buffer filled with decoded data + * @return void + */ + virtual void BufferFilled(CMMFBuffer* aFilledBuffer); + + /** + * From MAdvancedAudioDecoderObserver + * Callback function from CAdvancedAudioDecoder when the specified source buffer + * needs to be refilled. + * @since 3.0 + * @param aEmptyBuffer an empty buffer to be refilled + * @param aDoSynchronousRead whether read should be Sync + * @return - + */ + virtual void RefillBuffer(CMMFBuffer* aEmptyBuffer); + + /** + * From MAdvancedAudioDecoderObserver + * Callback function from CAdvancedAudioDecoder when the specified buffer + * needs to be refilled. This indicates a shared buffer is to be refilled. + * @since 3.2 + * @param aEmptyBuffer an empty buffer to be refilled + * @param aDoSynchronousRead if the operation should be perform Synchronuously + * @return - + */ +// virtual void RefillBuffer(CMMFBuffer* aEmptyBuffer, TBool aDoSynchronousRead); + + /** + * From MAdvancedAudioDecoderObserver + * Callback function from CAdvancedAudioDecoder to handle specified event + * @since 3.0 + * @param aEvent The event to be handled + * @return - + */ + virtual void SendEvent(const TMMFEvent& aEvent); + + private: + + /** + * C++ default constructor. + */ + CDevSoundAudioOutput(CMMFDevSound& aMMFDevSound); + + /** + * + * Phase 2 of two-phase constructor + * + * @param aPrioritySettings priority settings for devSound and policy + * @param aObserver observer class that will handle all DevSoundAudioOutput + * callbacks + * + * @return void + * + */ + void ConstructL(const TMMFPrioritySettings& aPrioritySettings, + MAdvancedAudioOutputObserver& aObserver); + + /** + * Builds configuration data for DevSound and codec. + * @since 3.0 + * @return void + */ + void BuildConfigurationParametersL(); + + /** + * + * Converts DevSound bit representation of sampling rates to integer values. + * + * @param aDevSoundCaps DevSound capabilities structure + * @param aSampleRates array to hold the retrieved sampling rates + * + * @return void + * + */ + void ConvertFromDevSoundCapsToSampleRatesL(const TMMFCapabilities& aDevSoundCaps, + RArray& aSampleRates); + + /** + * + * Converts DevSound representation of data types to FourCC values. + * + * @param aDevSoundCaps DevSound capabilities structure + * @param aDataTypes array to hold the retrieved data types + * + * @return void + * + */ + void ConvertFromDevSoundCapsToDataTypesL(const TMMFCapabilities& aDevSoundCaps, + RArray& aDataTypes); + + /** + * + * Converts DevSound representation of channels to integer values. + * + * @param aDevSoundCaps DevSound capabilities structure + * @param aNumChannels array to hold the retrieved number of channels + * + * @return void + * + */ + void ConvertFromDevSoundCapsToNumChannelsL(const TMMFCapabilities& aDevSoundCaps, + RArray& aNumChannels); + + /** + * + * Issues a user panic with the given panic code. + * @param aPanicCode panic code + * @return void + * + */ + void Panic(TInt aPanicCode) const; + + /** + * Handles actual start of playback. Configures and initializes DevSound. + * @since 3.0 + * @param none + * @return none + */ + void DoPlayL(TAny* aBuffer, TInt aIndex); + private: + + // DevSoundAudioOutput states + enum TState + { + EIdle=0, + EDevSoundReady, + EMMFDevSoundFirstBufferSent, + EPlaying, + EPaused, + EBufferEmpty, + EPreIdle, + EPlayPending + }; + + // DevSoundAudioOutput error code + enum TError + { + ECantCreateBuffer, + EEmptyBuffer, + EDevSoundNotLoaded, + ERecordNotSupported, + EDevSoundError, + EUnknown + }; + + private: + + // DevSoundAudioOutput internal state + TState iState; + + // True if sampling rate conversion is required + TBool iNeedsSWConversion; + + // Sample rate to convert to + TUint iSWConvertSampleRate; + + // Number of channels to convert to + TUint iSWConvertChannels; + + // priority settings for DevSound + TMMFPrioritySettings iPrioritySettings; + + // Structure for DevSound configuration parameters + TMMFCapabilities iDevSoundConfig; + + // sampling rate from the source audio data + TUint iSourceSampleRate; + + // number of channel from the source audio data + TUint iSourceChannels; + + // FourCC from the source audio data + TFourCC iSourceFourCC; + + // Codec configuration data + RArray iCodecConfigData; + + // DevSound pointer + CMMFDevSound& iMMFDevSound; + TAny* iPlayPendingBuffer; + TBool iDevSoundInitialized; + + TInt iBufferIndex; + TUint32 iPlayDevSound; + + TBool iLoopPlayEnabled; // Indicates if LoopPlay is enabled or not + TBool iIgnoreBTBFDuringLoopPlay; // Ignores any BTBF callbacks from DevSound during the TrailingSilence in LoopPlay + TBool iUnSetLastBuffer; // Indicates if LastBuffer needs to be unset during LoopPlay + TBool iDSStopped; // Indicates if DevSound is Stopped or not + TBool iLastBufferSentToDevSound; // Indicates the end of the playback when last buffer is sent to DevSound at (in normal playback or in loopplay) + + CConfigurationComponentsFactory* iFactory; + CAudioOutputControlUtility* iAudioOutputControlUtility; + }; + +#endif // CDEVSOUNDAUDIOOUTPUT_H