| Index: chrome/browser/speech/tts_controller.cc
|
| diff --git a/chrome/browser/speech/tts_controller.cc b/chrome/browser/speech/tts_controller.cc
|
| index d7fb66e1e63bd4c78bd6ff20acc8081211aa6e57..e81de6adbf38601a7b6acae88b0d77066fd6f2c1 100644
|
| --- a/chrome/browser/speech/tts_controller.cc
|
| +++ b/chrome/browser/speech/tts_controller.cc
|
| @@ -117,6 +117,7 @@ TtsController* TtsController::GetInstance() {
|
|
|
| TtsController::TtsController()
|
| : current_utterance_(NULL),
|
| + paused_(false),
|
| platform_impl_(NULL) {
|
| }
|
|
|
| @@ -131,7 +132,15 @@ TtsController::~TtsController() {
|
| }
|
|
|
| void TtsController::SpeakOrEnqueue(Utterance* utterance) {
|
| - if (IsSpeaking() && utterance->can_enqueue()) {
|
| + // If we're paused and we get an utterance that can't be queued,
|
| + // flush the queue but stay in the paused state.
|
| + if (paused_ && !utterance->can_enqueue()) {
|
| + Stop();
|
| + paused_ = true;
|
| + return;
|
| + }
|
| +
|
| + if (paused_ || (IsSpeaking() && utterance->can_enqueue())) {
|
| utterance_queue_.push(utterance);
|
| } else {
|
| Stop();
|
| @@ -196,6 +205,7 @@ void TtsController::SpeakNow(Utterance* utterance) {
|
| }
|
|
|
| void TtsController::Stop() {
|
| + paused_ = false;
|
| if (current_utterance_ && !current_utterance_->extension_id().empty()) {
|
| ExtensionTtsEngineStop(current_utterance_);
|
| } else {
|
| @@ -210,6 +220,28 @@ void TtsController::Stop() {
|
| ClearUtteranceQueue(true); // Send events.
|
| }
|
|
|
| +void TtsController::Pause() {
|
| + paused_ = true;
|
| + if (current_utterance_ && !current_utterance_->extension_id().empty()) {
|
| + ExtensionTtsEnginePause(current_utterance_);
|
| + } else if (current_utterance_) {
|
| + GetPlatformImpl()->clear_error();
|
| + GetPlatformImpl()->Pause();
|
| + }
|
| +}
|
| +
|
| +void TtsController::Resume() {
|
| + paused_ = false;
|
| + if (current_utterance_ && !current_utterance_->extension_id().empty()) {
|
| + ExtensionTtsEngineResume(current_utterance_);
|
| + } else if (current_utterance_) {
|
| + GetPlatformImpl()->clear_error();
|
| + GetPlatformImpl()->Resume();
|
| + } else {
|
| + SpeakNextUtterance();
|
| + }
|
| +}
|
| +
|
| void TtsController::OnTtsEvent(int utterance_id,
|
| TtsEventType event_type,
|
| int char_index,
|
| @@ -253,6 +285,9 @@ void TtsController::FinishCurrentUtterance() {
|
| }
|
|
|
| void TtsController::SpeakNextUtterance() {
|
| + if (paused_)
|
| + return;
|
| +
|
| // Start speaking the next utterance in the queue. Keep trying in case
|
| // one fails but there are still more in the queue to try.
|
| while (!utterance_queue_.empty() && !current_utterance_) {
|
|
|