srsf/devtts/src/devttsaudio.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:29:17 +0100
branchRCL_3
changeset 19 e36f3802f733
parent 0 bf1d17376201
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2004-2007 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:  Audio interface for DevTts
*
*/


#ifndef DEVTTSAUDIO_H
#define DEVTTSAUDIO_H

//  INCLUDES

#include <e32base.h>
#include <sounddevice.h>    // DevSound
#include <nssdevtts.h>      // DevTTS public header


// FORWARD DECLARATION

class CAudioOutput;


// CLASS DECLARATIONS

class MDevTTSAudioObserver
    {
    public:
        
        /**
        * Notifies the observer that initialization has been completed.
        *
        * @param "TInt aError"
        *        KErrNone if successful, otherwise one of the system level 
        *        error codes.
        */
        virtual void MdtaoInitializeComplete( TInt aError ) = 0;
        
        /**
        * Audio device wants the buffer to be filled. Client should provide
        * data to the descriptor given as parameter and call PlayData when
        * data is ready to be played.
        *
        * @param "TDes8& aBuffer"
        *        Descriptor which should be filled
        * @param "TInt aSizeRequested"
        *        Number of bytes requested
        */
        virtual void MdtaoBufferToBeFilled( TDes8& aBuffer,
                                            TInt aSizeRequested ) = 0;
        
        /**
        * Called when playback process is finished, successfully or otherwise.
        *
        * @param "TInt aError"
        *        KErrNone if everything succeeded, one of the system level error
        *        codes otherwise.
        */
        virtual void MdtaoPlayFinished( TInt aError ) = 0;
        
    };

/**
* Audio playback functionality for DevTTS.
*/
class CDevTTSAudio : public CBase, 
                     public MDevSoundObserver
    {
    public:  // Constructors and destructor
        
        /**
        * Two-phased constructor.
        */
        static CDevTTSAudio* NewL( MDevTTSAudioObserver& aObserver, 
                                   TInt aPriority );
        
        /**
        * Destructor.
        */
        virtual ~CDevTTSAudio();
        
    public: // New functions
        
        /**
        * Initializes the audio device. Method is asynchronous.
        * MDevTTSAudioObserver::InitializeComplete() called when initialization
        * is ready.
        */
        void InitializeL();
        
         /**
        * Configures the audio device. Method is synchronous.
        */
        void ConfigL( TUint aSamplingRate, TUint aBitsPerSample, 
                      TBool aStereo, TUint aBufferSize );
        
        /**
        * Clears the audio device resources. Counter part of InitializeL.
        */
        void Clear();
        
        /**
        * Returns the current balance setting.
        *
        * @return Balance.
        */
        TInt Balance();

        /**
        * Returns maximum volume.
        *
        * @return Max volume.
        */
        TInt MaxVolume();

        /**
        * Initialises the audio playback process.
        */
        void PlayInitL();
        
        /**
        * Plays the filled buffer, Should be called when BufferToBeFilled 
        * callback has filled the requested buffer.
        *
        * @param "TBool aLastBuffer"
        *        Flag to tell if this is the last buffer
        */
        void PlayData( TBool aLastBuffer );
        
        /**
        * Sets the priority for audio playback.
        * 
        * @param "TInt aPriority"
        *        Priority value.
        * @param "TDevTTSAudioPreference aPref"'
        *        Preference setting. Quality, time or both.
        */
        void SetAudioPriority( TInt aPriority, TDevTTSAudioPreference aPref );

        /**
        * Sets the audio output routing
        * 
        * @param TInt aAudioOutput
        *        New output.
        */
        void SetAudioOutputL( TInt aAudioOutput );

        /**
        * Sets the playback balance.
        *
        * @param "TInt aBalance"
        *        Balance value to be set.
        */
        void SetBalance( TInt aVolume );
        
        /**
        * Sets the playback volume. Range is from 0 (minumum) to MaxVolume().
        * Out of range values will be discarded.
        *
        * @param "TInt aVolume"
        *        Volume value to be set, from 0 to MaxVolume.
        */
        void SetVolume( TInt aVolume );

        /**
        * Sets the volume ramp duration
        *
        * @param "TTimeIntervalMicroSeconds& aRampDuration"
        *        Ramp duration.
        */
        void SetVolumeRamp( const TTimeIntervalMicroSeconds& aRampDuration );
        
        /**
        * Stops the ongoing playback operation.
        */
        void Stop();
        
        /**
        * Pauses the ongoing playback operation
        */
        void Pause();
        
        /**
        * Returns the current volume setting.
        *
        * @return Volume
        */
        TInt Volume();

    public: // Functions from base classes
        
        /**
        * From MDevSoundObserver::InitializeComplete
        * Handles initialization completion event from DevSound.
        * Called InitializeL() function completes.
        *
        * @param "TInt aError"
        *        Error code. KErrNone if successful. Other values are possible
        *        indicating a problem initializing CMMFDevSound object.
        */
        void InitializeComplete( TInt aError );
        
        /**
        * From MDevSoundObserver::ToneFinished
        * Handles tone play completion event.
        * Called when an attempt to play tone has
        * completed, successfully or otherwise.
        *
        * @param "TInt aError"
        *        Error code. The status of tone playback. KErrUnderflow playing of
        *        the tone is complete. KErrAccessDenied the sound device is in use by
        *        another higher priority client. KErrCancel playing of the audio
        *        sample is stopped by DevSound client another higher priority client.
        */
        void ToneFinished( TInt aError ); 
        
        /**
        * From MDevSoundObserver::BufferToBeFilled
        * Handles CMMFDevSound object's data request event.
        * CMMFDevSound object calls this method when and where it needs data for
        * playing or converting. The observer should notify CMMFDevSound object as
        * quickly as possible after the data is read into buffer, aBuffer by calling
        * PlayData(), otherwise the implementation might callback method PlayError()
        * on derived class object with error code KErrUnderflow.
        *
        * @param "CMMFBuffer* aBuffer"
        *         Buffer into which data should be read. The amount of data that is
        *         needed is specified in CMMFBuffer::RequestSize().
        */
        void BufferToBeFilled( CMMFBuffer* aBuffer );
        
        /**
        * From MDevSoundObserver::PlayError
        * Handles play completion or cancel event.
        * Called when an attempt to play audio sample
        * has completed, successfully or otherwise.
        *
        * @param "TInt aError"
        *        Error code. The status of playback. KErrUnderflow playing of the
        *        audio sample is complete. KErrAccessDenied the sound device is in
        *        use by another higher priority client.
        */
        void PlayError( TInt aError ); 
        
        /**
        * From MDevSoundObserver::BufferToBeEmptied
        * Handles CMMFDevSound object's data request event.
        * Called when the buffer, aBuffer gets filled
        * while recording or converting. The observer should notify CMMFDevSound
        * object as quickly as possible after data in the buffer is processed by
        * calling RecordData(), otherwise the implementation might callback
        * method RecordError() on derived class object with error code KErrOverflow.
        *
        * @param "CMMFBuffer* aBuffer"
        *        Buffer containing processed (recorded or converted) data. The amount
        *        of data that is available is specified in CMMFBuffer::RequestSize().
        */
        void BufferToBeEmptied( CMMFBuffer* aBuffer ); 
        
        /**
        * From MDevSoundObserver::RecordError
        * Handles record completion or cancel event.
        * Called when an attempt to record audio sample
        * has completed, successfully or otherwise.
        *
        * @param "TInt aError"
        *        Error code. The status of recording. KErrOverflow audio devices
        *        runs out of internal buffer. KErrAccessDenied the sound device is
        *        in use by another higher priority client.
        */
        void RecordError( TInt aError ); 
        
        /**
        * From MDevSoundObserver::ConvertError
        * Handles conversion completion or cancel event.
        * Called when an attempt to convert data from
        * source format to destination format has completed, 
        * successfully or otherwise.
        *
        * @param	"TInt aError"
        *           Error code. KErrCancel conversion operation is cancelled. KErrNone
        *           conversion is complete. Other values are possible indicating a
        *           problem converting data.
        */
        void ConvertError( TInt aError );
        
        /**
        * From MDevSoundObserver::DeviceMessage
        * Handles device event.
        * Called when a message is received from the
        * audio hardware device.
        *
        * @param "aMessageType" 
        *         Defines the type of message. Used to determine how to 
        *         interpret the contents of aMsg.
        * @param "aMsg"
        *         Message that is packed in the Descriptor format.
        */
        void DeviceMessage( TUid aMessageType, const TDesC8& aMsg );
        
        /**
        * From MDevSoundObserver::SendEventToClient
        * Handles policy request completion event.
        * Called when an attempt to acquire sound
        * device is rejected by audio policy server.
        *
        * @param "const TMMFEvent& aEvent"
        */
        void SendEventToClient( const TMMFEvent& aEvent );  
        
    private:
        
        /**
        * C++ default constructor.
        */
        CDevTTSAudio( MDevTTSAudioObserver& aObserver, TInt aPriority );
        
        /**
        * By default Symbian 2nd phase constructor is private.
        */
        void ConstructL();
        
    private:    // Data
    
        // Observer
        MDevTTSAudioObserver& iObserver;
        
        // DevSound
        CMMFDevSound* iDevsound;
        
        // Used for setting audio routing
        CAudioOutput* iAudioOutput;
        
        // DevSound capabilities
        TMMFCapabilities iDevCap;
        
        // Buffer which is being filled
        CMMFBuffer* iBuffer;

        // Numerical value of the priority setting
        TInt iPriority;
        
        // DevSound priority settings
        TMMFPrioritySettings iAudioPriority;

        // Current balance
        TInt iBalance;

        // Current volume
        TInt iVolume;
    };
    
#endif // DEVTTSAUDIO_H
    
// End of File