1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_TTS_API_H_ 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define CHROME_BROWSER_EXTENSIONS_EXTENSION_TTS_API_H_ 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <queue> 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <string> 10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h" 12513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/task.h" 13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_function.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_tts_api_util.h" 15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Abstract class that defines the native platform TTS interface. 17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ExtensionTtsPlatformImpl { 18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static ExtensionTtsPlatformImpl* GetInstance(); 20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Speak the given utterance with the given parameters if possible, 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // and return true on success. Utterance will always be nonempty. 2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // If the user does not specify the other values, then locale and gender 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // will be empty strings, and rate, pitch, and volume will be -1.0. 25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // 26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The ExtensionTtsController will only try to speak one utterance at 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // a time. If it wants to interrupt speech, it will always call Stop 28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // before speaking again, otherwise it will wait until IsSpeaking 29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // returns false before calling Speak again. 30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual bool Speak( 31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& utterance, 3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& locale, 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& gender, 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick double rate, 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick double pitch, 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick double volume) = 0; 37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Stop speaking immediately and return true on success. 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual bool StopSpeaking() = 0; 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Return true if the synthesis engine is currently speaking. 42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual bool IsSpeaking() = 0; 43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual std::string error(); 4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void clear_error(); 4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void set_error(const std::string& error); 47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected: 49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExtensionTtsPlatformImpl() {} 50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual ~ExtensionTtsPlatformImpl() {} 51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string error_; 53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DISALLOW_COPY_AND_ASSIGN(ExtensionTtsPlatformImpl); 55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// One speech utterance. 5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass Utterance { 5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public: 6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Construct an utterance given a profile, the text to speak, 6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // the options passed to tts.speak, and a completion task to call 6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // when the utterance is done speaking. 6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Utterance(Profile* profile, 6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& text, 6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DictionaryValue* options, 6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Task* completion_task); 6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ~Utterance(); 6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Calls the completion task and then destroys itself. 7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void FinishAndDestroy(); 7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void set_error(const std::string& error) { error_ = error; } 7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void set_extension_id(const std::string& extension_id) { 7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen extension_id_ = extension_id; 7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Accessors 7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Profile* profile() { return profile_; } 7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& extension_id() { return extension_id_; } 8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int id() { return id_; } 8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& text() { return text_; } 8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const Value* options() { return options_.get(); } 8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& voice_name() { return voice_name_; } 8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& locale() { return locale_; } 8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& gender() { return gender_; } 8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen double rate() { return rate_; } 8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen double pitch() { return pitch_; } 8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen double volume() { return volume_; } 8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool can_enqueue() { return can_enqueue_; } 9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& error() { return error_; } 9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private: 9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The profile that initiated this utterance. 9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Profile* profile_; 9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The extension ID of the extension providing TTS for this utterance, or 9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // empty if native TTS is being used. 9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string extension_id_; 9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The unique ID of this utterance, used to associate callback functions 10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // with utterances. 10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int id_; 10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The id of the next utterance, so we can associate requests with 10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // responses. 10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen static int next_utterance_id_; 10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The text to speak. 10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string text_; 11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The full options arg passed to tts.speak, which may include fields 11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // other than the ones we explicitly parse, below. 11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_ptr<Value> options_; 11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The parsed options. 11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string voice_name_; 11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string locale_; 11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string gender_; 11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen double rate_; 12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen double pitch_; 12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen double volume_; 12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool can_enqueue_; 12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The error string to pass to the completion task. Will be empty if 12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // no error occurred. 12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string error_; 12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The method to call when this utterance has completed speaking. 12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Task* completion_task_; 13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Singleton class that manages text-to-speech. 133513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass ExtensionTtsController { 134513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Get the single instance of this class. 136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static ExtensionTtsController* GetInstance(); 137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns true if we're currently speaking an utterance. 139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool IsSpeaking() const; 140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 14121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Speak the given utterance. If the utterance's can_enqueue flag is true 14221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // and another utterance is in progress, adds it to the end of the queue. 14321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Otherwise, interrupts any current utterance and speaks this one 14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // immediately. 14521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void SpeakOrEnqueue(Utterance* utterance); 146513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Stop all utterances and flush the queue. 148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void Stop(); 149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Called when an extension finishes speaking an utterance. 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OnSpeechFinished(int request_id, const std::string& error_message); 15221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // For unit testing. 154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void SetPlatformImpl(ExtensionTtsPlatformImpl* platform_impl); 155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionTtsController(); 15821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual ~ExtensionTtsController(); 159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Get the platform TTS implementation (or injected mock). 161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionTtsPlatformImpl* GetPlatformImpl(); 162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Start speaking the given utterance. Will either take ownership of 164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // |utterance| or delete it if there's an error. 165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void SpeakNow(Utterance* utterance); 166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Called periodically when speech is ongoing. Checks to see if the 168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // underlying platform speech system has finished the current utterance, 169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // and if so finishes it and pops the next utterance off the queue. 170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void CheckSpeechStatus(); 171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Clear the utterance queue. 173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void ClearUtteranceQueue(); 174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Finalize and delete the current utterance. 176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void FinishCurrentUtterance(); 177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 17821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Start speaking the next utterance in the queue. 17921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void SpeakNextUtterance(); 18021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 18121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Return the id string of the first extension with tts_voices in its 18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // manifest that matches the speech parameters of this utterance, 18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // or the empty string if none is found. 18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string GetMatchingExtensionId(Utterance* utterance); 18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ScopedRunnableMethodFactory<ExtensionTtsController> method_factory_; 187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch friend struct DefaultSingletonTraits<ExtensionTtsController>; 188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The current utterance being spoken. 190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Utterance* current_utterance_; 191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 192513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A queue of utterances to speak after the current one finishes. 193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::queue<Utterance*> utterance_queue_; 194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A pointer to the platform implementation of text-to-speech, for 196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // dependency injection. 197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ExtensionTtsPlatformImpl* platform_impl_; 198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ExtensionTtsController); 200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}; 201513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Extension API function definitions 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 206513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass ExtensionTtsSpeakFunction : public AsyncExtensionFunction { 207513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~ExtensionTtsSpeakFunction() {} 209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual bool RunImpl(); 21021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void SpeechFinished(); 21121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Utterance* utterance_; 212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DECLARE_EXTENSION_FUNCTION_NAME("experimental.tts.speak") 213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass ExtensionTtsStopSpeakingFunction : public SyncExtensionFunction { 216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~ExtensionTtsStopSpeakingFunction() {} 218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual bool RunImpl(); 219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DECLARE_EXTENSION_FUNCTION_NAME("experimental.tts.stop") 220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass ExtensionTtsIsSpeakingFunction : public SyncExtensionFunction { 223513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~ExtensionTtsIsSpeakingFunction() {} 225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual bool RunImpl(); 226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DECLARE_EXTENSION_FUNCTION_NAME("experimental.tts.isSpeaking") 227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 22921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass ExtensionTtsSpeakCompletedFunction : public SyncExtensionFunction { 23021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private: 23121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ~ExtensionTtsSpeakCompletedFunction() {} 23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool RunImpl(); 23321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DECLARE_EXTENSION_FUNCTION_NAME("experimental.tts.speakCompleted") 23421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 23521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_TTS_API_H_ 237