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