diff -r cad71a31b7fc -r e36f3802f733 srsf/devtts/src/devttsalgorithmmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srsf/devtts/src/devttsalgorithmmanager.h Wed Sep 01 12:29:17 2010 +0100 @@ -0,0 +1,601 @@ +/* +* Copyright (c) 2004-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: Implementations behind DevTTS interface +* +*/ + + +#ifndef DEVTTSALGORITHMMANAGER_H +#define DEVTTSALGORITHMMANAGER_H + +// INCLUDES +#include "srsfbldvariant.hrh" +#include "nssdevtts.h" +#include "devttsaudio.h" + +#include +#include +#include + +// CLASS DECLARATION + +/** +* CTTSAlgorithmManager contains implementations behind DevTTS interface. +* Observer callbacks from TtsHwDevice and DevTTSAudio +* +* @lib NssDevTts.lib +*/ +class CTTSAlgorithmManager : public CBase, public MDevTTSAudioObserver, + public MTtsHwDeviceObserver, + public MASRSTtpHwDeviceObserver, + public MNlpHwDeviceObserver + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * + * @param "MDevTTSObserver& aObserver" + * Reference to the callback observer. + */ + static CTTSAlgorithmManager* NewL( MDevTTSObserver& aObserver/*, CConsoleBase* console*/ ); + + /** + * Destructor. + */ + virtual ~CTTSAlgorithmManager(); + + public: // New functions + + /** + * Adds a new style to the collection. If equal style exists already, + * new style is not added. + * Will leave if an error occurs. Likely errors are: KErrNoMemory, + * not enough memory to add new style. KErrNotSupported, the style + * is not supported. KErrArgument, the style contains an imposible + * value. + * + * @param "TTtsStyle& aStyle" + * Reference to the style which will be added to the style + * collection. + * + * @return Identifier of added style. + */ + TTtsStyleID AddStyleL( const TTtsStyle& aStyle ); + + /** + * Returns the current balance setting. + * + * @return Balance value. + */ + TInt Balance(); + + /** + * Notifies that the buffer has been processed. The + * method is used if output mode of synthesizing is + * EDevTTSClientMode. + * + * @param "TDesC8& aBuffer" + * The buffer which has been processed. + */ + void BufferProcessed( const TDesC8& aBuffer ); + + /** + * Request a pointer to the custom interface. Currently not in use. + * + * @param "TUid aInterfaceID" + * Custom interface identifier. + * + * @return Pointer to custom interface. NULL if interface is not + * found or initiation failures. + */ + TAny* CustomInterface( TUid aInterfaceID ); + + /** + * Deletes style. + * + * @param "TTtsStyleID aStyleID" Identifier of style to be deleted. + */ + void DeleteStyleL( TTtsStyleID aStyleID ); + + /** + * Gives current position of synthesizing. The method will leave if an + * error occurs. Likely errors are: KErrNotReady, no synthesizing is + * ongoing. + * + * @param "TTimeIntervalMicroSeconds& aTime" + * Time of the synthesizing position + */ + void GetPositionL( TTimeIntervalMicroSeconds& aTime ) const; + + /** + * Gives current position of synthesizing. The method will leave if an + * error occurs. Likely errors are: KErrNotReady, no synthesizing is + * ongoing. + * + * @param "TTtsSegment& aSegment" + * Current segment which is synthesized, out parameter + * @param "TInt& aWordIndex" + * Index of the current word, starting from the begining of + * current segment + */ + void GetPositionL( TTtsSegment& aSegment, TInt& aWordIndex ) const; + + /** + * Tells if language is supported by the TTS engine or not. + * + * @param "TLanguage aLanguage" + * Language code + * + * @return ETrue if supported, EFalse otherwise + */ + TBool IsLanguageSupported( TLanguage aLanguage ) const; + + /** + * Returns maximum volume value. + * + * @return Maximum volume. + */ + TInt MaxVolume(); + + /** + * Gives number of styles. + * + * @return Number of styles. + */ + TUint16 NumberOfStyles() const; + + /** + * Pauses synthesizing. + */ + void Pause(); + + /** + * Prepares for synthesis. The method will leave if an + * error occurs. Likely errors are: KErrInUse, synthesizing is + * currently ongoing. KErrNoMemory, not enough memory to start + * synthesis. KErrNotSupport, requested function is not supported. + * + * @param "MTtsSegmentStream& aStream" + * Stream to be synthesized. + */ + void PrimeSynthesisL( MTtsSegmentStream& aStream ); + + /** + * Prepares for synthesis. The method will leave if an + * error occurs. Likely errors are: KErrInUse, synthesizing is + * currently ongoing. KErrNoMemory, not enough memory to start + * synthesis. KErrNotSupport, requested function is not supported. + * + * @param "CTtsParsedText& aText" + * Text containing multiple segments to be synthesized. + */ + void PrimeSynthesisL( CTtsParsedText& aText ); + + /** + * Sets the priority for audio playback if in EDevTTSSoundDeviceMode. + * + * @param "TInt iPriority" + * Priority value. + * @param "TDevTTSAudioPreference iPref"' + * 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 device balance. Affects only when DevTTS is in + * EDevTTSSoundDeviceMode. Illegal values are neglected. + * + * @param "TInt aBalance" Balance to be set. + */ + void SetBalance( TInt aBalance ); + + /** + * Sets new position for synthesizing. The method will leave if an + * error occurs. Likely errors are: KErrNotReady, no synthesizing is + * ongoing. KErrArgument, position cannot be set. + * + * @param "TTimeIntervalMicroSeconds& aTime" + * Time of the synthesizing postion. + */ + void SetPositionL( const TTimeIntervalMicroSeconds& aTime ); + + /** + * Sets new position for synthesizing. The method will leave if an + * error occurs. Likely errors are: KErrNotReady, no synthesizing is + * ongoing. KErrArgument, position cannot be set. + * + * @param "TTTtsSegment& aSegment" + * The segment being synthesized. + * @param "TInt aWordIndex" + * The index of word being synthesized. + */ + void SetPositionL( const TTtsSegment& aSegment, TInt aWordIndex ); + + /** + * Sets the playback device volume. Affects only when DevTTS is in + * EDevTTSSoundDeviceMode. Range is from 0..MaxVolume(). Illegal values + * are neglected. + * + * @param "TInt aVolume" Volume setting. + */ + void SetVolume( TInt aVolume ); + + /** + * Sets the volume ramp duration. Start and end volumes must be set with + * SetVolume() function. + * + * @param "TTimeIntervalMicroSeconds& aRampDuration" + * Ramp duration in microseconds. + */ + void SetVolumeRamp( const TTimeIntervalMicroSeconds& aRampDuration ); + + /** + * Stops synthesizing and releases resources of synthesizing. + * The method does nothing if already stopped. + */ + void Stop(); + + /** + * Receives style information. The method will leave if an error + * occurs. Likely errors are: KErrNotFound, style identifier not + * found. + * + * @param "TTtsStyleID aStyleID" + * Style identifier. + * + * @return Reference to style + */ + TTtsStyle& StyleL( TTtsStyleID aStyleID ) const; + + /** + * Receives style information. The method will leave if an error + * occurs. Likely errors are: KErrArgument, index is out of bounds. + * + * @param "TUint16 aIndex" + * Index to style: 0..NumberOfStyles(). + * + * @return Reference to style + */ + TTtsStyle& StyleL( TUint16 aIndex ) const; + + /** + * Starts synthesizing the text. The method is asynchronous, as soon + * as the request has been placed, function call will return. + * MDevTTSObserver::MdtoEvent will be called when synthesizing finishes. + * The method will leave if an error occurs. Likely errors are: + * KErrNoMemory, not enough memory. + * KErrInUse, synthesizing is currently ongoing + * + * @param "TDevTTSOutputMode aOutputMode" + * Either use a sound device (EDevTTSSoundDeviceMode) or client + * using callback (EDevTTSClientMode) + */ + void SynthesizeL( TDevTTSOutputMode aOutputMode ); + + /** + * Returns current playback volume. + * + * @return Volume setting. + */ + TInt Volume(); + + /** + * Calls language identification for a given text. + * + * @since 3.0M + * @param "CTtsParsedText& aText" Text + * @param "TInt aNumberOfGuesses" Maximum number of guesses that will be provided + * @param "RArray& aLanguages" Output parameter which will contain the languages + * @param "RArray& aScores" Scores + */ + void LanguageIdentificationL( CTtsParsedText& aText, + TInt aNumberOfGuesses, + RArray& aLanguages, + RArray& aScores ); + + /** + * Calls Natural Language Processing (NLP) to normalize text. + * + * @since 3.0M + * @param "CTtsParsedText& aText" Text which will be normalized + */ + void NormalizeTextL( CTtsParsedText& aText ); + + /** + * Calls Natural Language Processing (NLP) to normalize and segment text. + * + * @since 3.0M + * @param "CTtsParsedText& aText" Text which will be normalized + */ + void NormalizeAndSegmentTextL( CTtsParsedText& aText ); + + public: // Functions from base classes + + /** + * From MDevTTSAudioObserver::InitializeComplete + * + * @param "TInt aError" + * KErrNone if everything is ok, system wide error code otherwise + */ + void MdtaoInitializeComplete( TInt aError ); + + /** + * From MDevTTSAudioObserver::BufferToBeFilled + * + * @param "TDes8& aBuffer" + * Descriptor which should be filled + * @param "TInt aSizeRequested" + * Number of bytes requested + */ + void MdtaoBufferToBeFilled( TDes8& aBuffer, TInt aSizeRequested ); + + /** + * From MDevTTSAudioObserver::PlayFinished + * + * @param "TInt aError" + * KErrNone if everything is ok, system wide error code otherwise + */ + void MdtaoPlayFinished( TInt aError ); + + + + + /** + * From MTtsHwDeviceObserver::MthdTtsCompleted + * + * Called by the HW device when the synthesis has been completed. + * + * @param "TInt aStatus" Error code, KErrNone if success + */ + void MthdTtsCompleted( TInt aStatus ); + + /** + * From MTtsHwDeviceObserver::MthdCustomEvent + * + * Called by the HW device when custom command implementation wants + * to notify a client. + * + * @param "TInt aEvent" Event code + * @param "TInt aStatus" Error code, KErrNone if success. + * @param "TDesC8& aParameter" Optional parameter + */ + void MthdCustomEvent( TInt aEvent, TInt aStatus, + const TDesC8& aParameter = KNullDesC8 ); + + /** + * From MTtsHwDeviceObserver::MthdProcessBuffer + * + * Called by the HW device when the HW device has synthesized a new audio buffer. + * + * @param "TDesC8& aBuffer" + * Synthesized audio buffer. + */ + void MthdProcessBuffer( const TDesC8& aBuffer ); + + /** + * From MTtsHwDeviceObserver::MthdoConfigurationData + * + * Invoked by TTS HW Device when it needs a configuration data package. + * + * @param "TUint32 aPackageType" Type identifier. + * @param "TUint32 aPackageID" Identifier of package + * @param "TUint32 aStartPosition" Start index in bytes + * @param "TUint32 aEndPosition" End index in bytes. If the position is bigger + * than the size of data package, the end part will be returned. + * @return Pointer to buffer containing data. + */ + HBufC8* MthdoConfigurationData( TUint32 aPackageType, + TUint32 aPackageID, + TUint32 aStartPosition, + TUint32 aEndPosition ); + + + + + /** + * From MASRSTtpHwDeviceObserver::MathdoConfigurationData + * + * Callback function to load configuration data. + * Client provides an implementation. + * + * @param "TUint32 aPackageType" Type identifier. + * @param "TUint32 aPackageID" Package identifier. + * @param "TUint32 aStartPosition" First byte. + * @param "TUint32 aEndPosition" Last byte. If greater than the size of + * the data, rest of the data is given. + * @return Pointer to the data buffer, TTP HW Device takes ownership. + */ + HBufC8* MathdoConfigurationData( TUint32 aPackageType, TUint32 aPackageID, + TUint32 aStartPosition, + TUint32 aEndPosition ); + + /** + * From MASRSTtpHwDeviceObserver::MathdoWordListReady + * + * Callback function to notify that word list is converted. + * Client provides an implementation. + * + * @param "TInt aError" Error code, KErrNone if successful. + */ + void MathdoWordListReady( const TInt aError ); + + + /** + * From MNlpHwDeviceObserver::MnhdNlpCompleted + * + * Called by the HW device when the synthesis has been completed. + * @param aStatus Error code, KErrNone if success + * @return none + */ + void MnhdoNlpCompleted( TInt aStatus ); + + /** + * From MNlpHwDeviceObserver::MnhdoConfigurationData + * + * Invoked by TTS HW Device when it needs a configuration data package. + * @param aPackageType Type identifier. + * @param aPackageID Identifier of package + * @param aStartPosition Start index in bytes + * @param aEndPosition End index in bytes. If the position is bigger + * than the size of data package, the end part will be returned. + * @return Data package in a buffer + */ + HBufC8* MnhdoConfigurationData( TUint32 aPackageType, + TUint32 aPackageID, + TUint32 aStartPosition, + TUint32 aEndPosition ); + + /** + * From MNlpHwDeviceObserver::MnhdCustomEvent + * + * Returns style given the style id. + */ + const TTtsStyle& MnhdoStyleL( TTtsStyleID styleID ); + + + protected: // New functions + + protected: // Functions from base classes + + private: + + /** + * C++ default constructor. + */ + CTTSAlgorithmManager( MDevTTSObserver& aObserver ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL( /*CConsoleBase* console*/ ); + + /** + * Checks if state is idle and leaves in case of error. + */ + void CheckStateL(); + + // Prohibit copy constructor + CTTSAlgorithmManager( const CTTSAlgorithmManager& ); + // Prohibit assigment operator + CTTSAlgorithmManager& operator=( const CTTSAlgorithmManager& ); + + public: // Data + + protected: // Data + + private: // Data + + //State enumeration + enum TDevTTSState + { + EDevTTSNotInitialized = 0, + EDevTTSStopped, + EDevTTSPrimed, + EDevTTSSynthesizing + }; + + enum TTTSAudioPlayerState + { + ETTSAudioPlayerNotInitialized = 0, + ETTSAudioPlayerInitializing, + ETTSAudioPlayerIdle, + ETTSAudioPlayerPlaying, + ETTSAudioPlayerRecording, // Reserved for future + ETTSAudioPlayerPaused, + ETTSAudioPlayerError + }; + + + // Flag which will be set if there is an ongoing synthesis when we are + // in paused state. + TBool iPaused; + + // Reference to the registered oberserver + MDevTTSObserver& iObserver; + + // For audio playback + CDevTTSAudio* iAudio; + + // Audio device state + TTTSAudioPlayerState iAudioState; + + // Pointer to the tts hw device + CTtsHwDevice* iHw; + + // Stored error value, either from audio device or from TtsHwDevice + TInt iError; + + // Current state of the object + TDevTTSState iState; + + // Current mode of operation, buffers to audio device or to client + TDevTTSOutputMode iMode; + + // Flag which is set when last buffer from TtsHwDevice has arrived + TBool iLastBufferFromTts; + + // Reserved pointer for future extension + //TAny* iReserved; + + // TtpHwDevice + CASRSTtpHwDevice* iTtpHw; + + // Pointer to the beginning of playback data + TPtrC8 iPlaybackBuffer; + + // Start point for the next playback and length of the buffer + // These are used to index iPlaybackBuffer + TInt iStartPoint; + TInt iStopPoint; + +#ifdef DEVTTS_3DB_HACK + TBool iApplyGain; +#endif + +#ifdef DEVTTS_AUDIOBUFFER_TO_FILE + RFs iSession; + RFile iFile; + TBool iFileOpen; + TInt iFileCounter; +#endif + + // NlpHwDevice pointer + CNlpHwDevice* iNlp; + + // ETrue if NLP has been successfully initialized + TBool iNlpInitialized; + + // Wait loop for audio initialization + CActiveSchedulerWait iAudioWait; + + public: // Friend classes + + protected: // Friend classes + + private: // Friend classes + + }; + +#endif // DEVTTSALGORITHMMANAGER_H + +// End of File