// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_TTS_API_H_ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_TTS_API_H_ #include #include "base/singleton.h" #include "base/task.h" #include "chrome/browser/extensions/extension_function.h" #include "chrome/browser/extensions/extension_tts_api_util.h" // Abstract class that defines the native platform TTS interface. class ExtensionTtsPlatformImpl { public: static ExtensionTtsPlatformImpl* GetInstance(); // Speak the given utterance with the given parameters if possible, // and return true on success. Utterance will always be nonempty. // If the user does not specify the other values, language and gender // will be empty strings, and rate, pitch, and volume will be -1.0. // // The ExtensionTtsController will only try to speak one utterance at // a time. If it wants to intterupt speech, it will always call Stop // before speaking again, otherwise it will wait until IsSpeaking // returns false before calling Speak again. virtual bool Speak( const std::string& utterance, const std::string& language, const std::string& gender, double rate, double pitch, double volume) = 0; // Stop speaking immediately and return true on success. virtual bool StopSpeaking() = 0; // Return true if the synthesis engine is currently speaking. virtual bool IsSpeaking() = 0; virtual std::string error() { return error_; } virtual void clear_error() { error_ = std::string(); } virtual void set_error(const std::string& error) { error_ = error; } protected: ExtensionTtsPlatformImpl() {} virtual ~ExtensionTtsPlatformImpl() {} std::string error_; DISALLOW_COPY_AND_ASSIGN(ExtensionTtsPlatformImpl); }; // Singleton class that manages text-to-speech. class ExtensionTtsController { public: // Get the single instance of this class. static ExtensionTtsController* GetInstance(); struct Utterance { Utterance() : rate(-1.0), pitch(-1.0), volume(-1.0), success_task(NULL), failure_task(NULL) { } std::string text; std::string language; std::string gender; double rate; double pitch; double volume; Task* success_task; Task* failure_task; std::string error; }; // Returns true if we're currently speaking an utterance. bool IsSpeaking() const; // Speak the given utterance. If |can_enqueue| is true and another // utterance is in progress, adds it to the end of the queue. Otherwise, // interrupts any current utterance and speaks this one immediately. void SpeakOrEnqueue(Utterance* utterance, bool can_enqueue); // Stop all utterances and flush the queue. void Stop(); // For unit testing. void SetPlatformImpl(ExtensionTtsPlatformImpl* platform_impl); private: ExtensionTtsController(); virtual ~ExtensionTtsController() {} // Get the platform TTS implementation (or injected mock). ExtensionTtsPlatformImpl* GetPlatformImpl(); // Start speaking the given utterance. Will either take ownership of // |utterance| or delete it if there's an error. void SpeakNow(Utterance* utterance); // Called periodically when speech is ongoing. Checks to see if the // underlying platform speech system has finished the current utterance, // and if so finishes it and pops the next utterance off the queue. void CheckSpeechStatus(); // Clear the utterance queue. void ClearUtteranceQueue(); // Finalize and delete the current utterance. void FinishCurrentUtterance(); ScopedRunnableMethodFactory method_factory_; friend struct DefaultSingletonTraits; // The current utterance being spoken. Utterance* current_utterance_; // A queue of utterances to speak after the current one finishes. std::queue utterance_queue_; // A pointer to the platform implementation of text-to-speech, for // dependency injection. ExtensionTtsPlatformImpl* platform_impl_; DISALLOW_COPY_AND_ASSIGN(ExtensionTtsController); }; // // Extension API function definitions // class ExtensionTtsSpeakFunction : public AsyncExtensionFunction { private: ~ExtensionTtsSpeakFunction() {} virtual bool RunImpl(); void SpeechFinished(bool success); ExtensionTtsController::Utterance* utterance_; DECLARE_EXTENSION_FUNCTION_NAME("experimental.tts.speak") }; class ExtensionTtsStopSpeakingFunction : public SyncExtensionFunction { private: ~ExtensionTtsStopSpeakingFunction() {} virtual bool RunImpl(); DECLARE_EXTENSION_FUNCTION_NAME("experimental.tts.stop") }; class ExtensionTtsIsSpeakingFunction : public SyncExtensionFunction { private: ~ExtensionTtsIsSpeakingFunction() {} virtual bool RunImpl(); DECLARE_EXTENSION_FUNCTION_NAME("experimental.tts.isSpeaking") }; #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_TTS_API_H_