Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4394)

Unified Diff: chrome/browser/extensions/extension_tts_api_chromeos.cc

Issue 8511026: Don't start speech synthesis until after the audio mixer is initialized. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/extensions/extension_tts_api_chromeos.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/extension_tts_api_chromeos.cc
===================================================================
--- chrome/browser/extensions/extension_tts_api_chromeos.cc (revision 109026)
+++ chrome/browser/extensions/extension_tts_api_chromeos.cc (working copy)
@@ -2,10 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "chrome/browser/extensions/extension_tts_api_chromeos.h"
+
+#include <list>
+
#include "base/bind.h"
#include "base/memory/singleton.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop.h"
+#include "base/stl_util.h"
#include "base/string_number_conversions.h"
#include "chrome/browser/chromeos/dbus/dbus_thread_manager.h"
#include "chrome/browser/chromeos/dbus/speech_synthesizer_client.h"
@@ -18,7 +23,17 @@
const int kSpeechCheckDelayIntervalMs = 100;
};
-class ExtensionTtsPlatformImplChromeOs : public ExtensionTtsPlatformImpl {
+// Very simple queue of utterances that can't be spoken because audio
+// isn't initialized yet.
+struct QueuedUtterance {
+ int utterance_id;
+ std::string utterance;
+ std::string lang;
+ UtteranceContinuousParameters params;
+};
+
+class ExtensionTtsPlatformImplChromeOs
+ : public ExtensionTtsPlatformImpl {
public:
virtual bool PlatformImplAvailable() {
return true;
@@ -37,9 +52,11 @@
// Get the single instance of this class.
static ExtensionTtsPlatformImplChromeOs* GetInstance();
+ // TTS won't begin until this is called.
+ void Enable();
+
private:
- ExtensionTtsPlatformImplChromeOs()
- : ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {}
+ ExtensionTtsPlatformImplChromeOs();
virtual ~ExtensionTtsPlatformImplChromeOs() {}
void PollUntilSpeechFinishes(int utterance_id);
@@ -51,6 +68,8 @@
int utterance_id_;
int utterance_length_;
+ std::list<QueuedUtterance*> queued_utterances_;
+ bool enabled_;
base::WeakPtrFactory<ExtensionTtsPlatformImplChromeOs> weak_ptr_factory_;
friend struct DefaultSingletonTraits<ExtensionTtsPlatformImplChromeOs>;
@@ -63,11 +82,26 @@
return ExtensionTtsPlatformImplChromeOs::GetInstance();
}
+ExtensionTtsPlatformImplChromeOs::ExtensionTtsPlatformImplChromeOs()
+ : enabled_(false),
+ ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {
+}
+
bool ExtensionTtsPlatformImplChromeOs::Speak(
int utterance_id,
const std::string& utterance,
const std::string& lang,
const UtteranceContinuousParameters& params) {
+ if (!enabled_) {
+ QueuedUtterance *queued = new QueuedUtterance();
+ queued->utterance_id = utterance_id;
+ queued->utterance = utterance;
+ queued->lang = lang;
+ queued->params = params;
+ queued_utterances_.push_back(queued);
+ return true;
+ }
+
utterance_id_ = utterance_id;
utterance_length_ = utterance.size();
@@ -111,14 +145,22 @@
speech_synthesizer_client->SetSpeakProperties(options);
speech_synthesizer_client->Speak(utterance);
- ExtensionTtsController* controller = ExtensionTtsController::GetInstance();
- controller->OnTtsEvent(utterance_id_, TTS_EVENT_START, 0, std::string());
- PollUntilSpeechFinishes(utterance_id_);
+ if (utterance_id_ >= 0) {
+ ExtensionTtsController* controller = ExtensionTtsController::GetInstance();
+ controller->OnTtsEvent(utterance_id_, TTS_EVENT_START, 0, std::string());
+ PollUntilSpeechFinishes(utterance_id_);
+ }
return true;
}
bool ExtensionTtsPlatformImplChromeOs::StopSpeaking() {
+ // If we haven't been enabled yet, clear the internal queue.
+ if (!enabled_) {
+ STLDeleteElements(&queued_utterances_);
+ return true;
+ }
+
chromeos::DBusThreadManager::Get()->GetSpeechSynthesizerClient()->
StopSpeaking();
return true;
@@ -130,6 +172,19 @@
event_type == TTS_EVENT_ERROR);
}
+void ExtensionTtsPlatformImplChromeOs::Enable() {
+ enabled_ = true;
+ while (!queued_utterances_.empty()) {
+ QueuedUtterance* queued = queued_utterances_.front();
+ Speak(queued->utterance_id,
+ queued->utterance,
+ queued->lang,
+ queued->params);
+ delete queued;
+ queued_utterances_.pop_front();
+ }
+}
+
void ExtensionTtsPlatformImplChromeOs::PollUntilSpeechFinishes(
int utterance_id) {
if (utterance_id != utterance_id_) {
@@ -180,3 +235,8 @@
ExtensionTtsPlatformImplChromeOs::GetInstance() {
return Singleton<ExtensionTtsPlatformImplChromeOs>::get();
}
+
+// global
+void EnableChromeOsTts() {
+ ExtensionTtsPlatformImplChromeOs::GetInstance()->Enable();
+}
« no previous file with comments | « chrome/browser/extensions/extension_tts_api_chromeos.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698