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

Side by Side Diff: chrome/browser/speech/tts_controller_impl.cc

Issue 692203002: Stop utterances from a tab when that tab is closed. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Don't hold lock during destruction Created 6 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 unified diff | Download patch
« no previous file with comments | « chrome/browser/speech/tts_controller_impl.h ('k') | chrome/browser/speech/tts_message_filter.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/speech/tts_controller_impl.h" 5 #include "chrome/browser/speech/tts_controller_impl.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/float_util.h" 10 #include "base/float_util.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 int char_index, 84 int char_index,
85 const std::string& error_message) { 85 const std::string& error_message) {
86 if (char_index >= 0) 86 if (char_index >= 0)
87 char_index_ = char_index; 87 char_index_ = char_index;
88 if (IsFinalTtsEventType(event_type)) 88 if (IsFinalTtsEventType(event_type))
89 finished_ = true; 89 finished_ = true;
90 90
91 if (event_delegate_) 91 if (event_delegate_)
92 event_delegate_->OnTtsEvent(this, event_type, char_index, error_message); 92 event_delegate_->OnTtsEvent(this, event_type, char_index, error_message);
93 if (finished_) 93 if (finished_)
94 event_delegate_.reset(); 94 event_delegate_ = NULL;
95 } 95 }
96 96
97 void Utterance::Finish() { 97 void Utterance::Finish() {
98 finished_ = true; 98 finished_ = true;
99 } 99 }
100 100
101 void Utterance::set_options(const base::Value* options) { 101 void Utterance::set_options(const base::Value* options) {
102 options_.reset(options->DeepCopy()); 102 options_.reset(options->DeepCopy());
103 } 103 }
104 104
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 GetPlatformImpl()->error()); 237 GetPlatformImpl()->error());
238 delete utterance; 238 delete utterance;
239 return; 239 return;
240 } 240 }
241 } 241 }
242 } 242 }
243 243
244 void TtsControllerImpl::Stop() { 244 void TtsControllerImpl::Stop() {
245 paused_ = false; 245 paused_ = false;
246 if (current_utterance_ && !current_utterance_->extension_id().empty()) { 246 if (current_utterance_ && !current_utterance_->extension_id().empty()) {
247 #if !defined(OS_ANDROID)
248 if (tts_engine_delegate_) 247 if (tts_engine_delegate_)
249 tts_engine_delegate_->Stop(current_utterance_); 248 tts_engine_delegate_->Stop(current_utterance_);
250 #endif
251 } else { 249 } else {
252 GetPlatformImpl()->clear_error(); 250 GetPlatformImpl()->clear_error();
253 GetPlatformImpl()->StopSpeaking(); 251 GetPlatformImpl()->StopSpeaking();
254 } 252 }
255 253
256 if (current_utterance_) 254 if (current_utterance_)
257 current_utterance_->OnTtsEvent(TTS_EVENT_INTERRUPTED, kInvalidCharIndex, 255 current_utterance_->OnTtsEvent(TTS_EVENT_INTERRUPTED, kInvalidCharIndex,
258 std::string()); 256 std::string());
259 FinishCurrentUtterance(); 257 FinishCurrentUtterance();
260 ClearUtteranceQueue(true); // Send events. 258 ClearUtteranceQueue(true); // Send events.
261 } 259 }
262 260
263 void TtsControllerImpl::Pause() { 261 void TtsControllerImpl::Pause() {
264 paused_ = true; 262 paused_ = true;
265 if (current_utterance_ && !current_utterance_->extension_id().empty()) { 263 if (current_utterance_ && !current_utterance_->extension_id().empty()) {
266 #if !defined(OS_ANDROID)
267 if (tts_engine_delegate_) 264 if (tts_engine_delegate_)
268 tts_engine_delegate_->Pause(current_utterance_); 265 tts_engine_delegate_->Pause(current_utterance_);
269 #endif
270 } else if (current_utterance_) { 266 } else if (current_utterance_) {
271 GetPlatformImpl()->clear_error(); 267 GetPlatformImpl()->clear_error();
272 GetPlatformImpl()->Pause(); 268 GetPlatformImpl()->Pause();
273 } 269 }
274 } 270 }
275 271
276 void TtsControllerImpl::Resume() { 272 void TtsControllerImpl::Resume() {
277 paused_ = false; 273 paused_ = false;
278 if (current_utterance_ && !current_utterance_->extension_id().empty()) { 274 if (current_utterance_ && !current_utterance_->extension_id().empty()) {
279 #if !defined(OS_ANDROID)
280 if (tts_engine_delegate_) 275 if (tts_engine_delegate_)
281 tts_engine_delegate_->Resume(current_utterance_); 276 tts_engine_delegate_->Resume(current_utterance_);
282 #endif
283 } else if (current_utterance_) { 277 } else if (current_utterance_) {
284 GetPlatformImpl()->clear_error(); 278 GetPlatformImpl()->clear_error();
285 GetPlatformImpl()->Resume(); 279 GetPlatformImpl()->Resume();
286 } else { 280 } else {
287 SpeakNextUtterance(); 281 SpeakNextUtterance();
288 } 282 }
289 } 283 }
290 284
291 void TtsControllerImpl::OnTtsEvent(int utterance_id, 285 void TtsControllerImpl::OnTtsEvent(int utterance_id,
292 TtsEventType event_type, 286 TtsEventType event_type,
293 int char_index, 287 int char_index,
294 const std::string& error_message) { 288 const std::string& error_message) {
295 // We may sometimes receive completion callbacks "late", after we've 289 // We may sometimes receive completion callbacks "late", after we've
296 // already finished the utterance (for example because another utterance 290 // already finished the utterance (for example because another utterance
297 // interrupted or we got a call to Stop). This is normal and we can 291 // interrupted or we got a call to Stop). This is normal and we can
298 // safely just ignore these events. 292 // safely just ignore these events.
299 if (!current_utterance_ || utterance_id != current_utterance_->id()) { 293 if (!current_utterance_ || utterance_id != current_utterance_->id()) {
300 return; 294 return;
301 } 295 }
302 current_utterance_->OnTtsEvent(event_type, char_index, error_message); 296 current_utterance_->OnTtsEvent(event_type, char_index, error_message);
303 if (current_utterance_->finished()) { 297 if (current_utterance_->finished()) {
304 FinishCurrentUtterance(); 298 FinishCurrentUtterance();
305 SpeakNextUtterance(); 299 SpeakNextUtterance();
306 } 300 }
307 } 301 }
308 302
309 void TtsControllerImpl::GetVoices(content::BrowserContext* browser_context, 303 void TtsControllerImpl::GetVoices(content::BrowserContext* browser_context,
310 std::vector<VoiceData>* out_voices) { 304 std::vector<VoiceData>* out_voices) {
311 #if !defined(OS_ANDROID)
312 if (browser_context && tts_engine_delegate_) 305 if (browser_context && tts_engine_delegate_)
313 tts_engine_delegate_->GetVoices(browser_context, out_voices); 306 tts_engine_delegate_->GetVoices(browser_context, out_voices);
314 #endif
315 307
316 TtsPlatformImpl* platform_impl = GetPlatformImpl(); 308 TtsPlatformImpl* platform_impl = GetPlatformImpl();
317 if (platform_impl) { 309 if (platform_impl) {
318 // Ensure we have all built-in voices loaded. This is a no-op if already 310 // Ensure we have all built-in voices loaded. This is a no-op if already
319 // loaded. 311 // loaded.
320 platform_impl->LoadBuiltInTtsExtension(browser_context); 312 platform_impl->LoadBuiltInTtsExtension(browser_context);
321 if (platform_impl->PlatformImplAvailable()) 313 if (platform_impl->PlatformImplAvailable())
322 platform_impl->GetVoices(out_voices); 314 platform_impl->GetVoices(out_voices);
323 } 315 }
324 } 316 }
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 void TtsControllerImpl::AddVoicesChangedDelegate( 444 void TtsControllerImpl::AddVoicesChangedDelegate(
453 VoicesChangedDelegate* delegate) { 445 VoicesChangedDelegate* delegate) {
454 voices_changed_delegates_.insert(delegate); 446 voices_changed_delegates_.insert(delegate);
455 } 447 }
456 448
457 void TtsControllerImpl::RemoveVoicesChangedDelegate( 449 void TtsControllerImpl::RemoveVoicesChangedDelegate(
458 VoicesChangedDelegate* delegate) { 450 VoicesChangedDelegate* delegate) {
459 voices_changed_delegates_.erase(delegate); 451 voices_changed_delegates_.erase(delegate);
460 } 452 }
461 453
454 void TtsControllerImpl::RemoveUtteranceEventDelegate(
455 UtteranceEventDelegate* delegate) {
456 // First clear any pending utterances with this delegate.
457 std::queue<Utterance*> old_queue = utterance_queue_;
458 utterance_queue_ = std::queue<Utterance*>();
459 while (!old_queue.empty()) {
460 Utterance* utterance = old_queue.front();
461 old_queue.pop();
462 if (utterance->event_delegate() != delegate)
463 utterance_queue_.push(utterance);
464 else
465 delete utterance;
466 }
467
468 if (current_utterance_ && current_utterance_->event_delegate() == delegate) {
469 current_utterance_->set_event_delegate(NULL);
470 if (!current_utterance_->extension_id().empty()) {
471 if (tts_engine_delegate_)
472 tts_engine_delegate_->Stop(current_utterance_);
473 } else {
474 GetPlatformImpl()->clear_error();
475 GetPlatformImpl()->StopSpeaking();
476 }
477
478 FinishCurrentUtterance();
479 if (!paused_)
480 SpeakNextUtterance();
481 }
482 }
483
462 void TtsControllerImpl::SetTtsEngineDelegate( 484 void TtsControllerImpl::SetTtsEngineDelegate(
463 TtsEngineDelegate* delegate) { 485 TtsEngineDelegate* delegate) {
464 tts_engine_delegate_ = delegate; 486 tts_engine_delegate_ = delegate;
465 } 487 }
466 488
467 TtsEngineDelegate* TtsControllerImpl::GetTtsEngineDelegate() { 489 TtsEngineDelegate* TtsControllerImpl::GetTtsEngineDelegate() {
468 return tts_engine_delegate_; 490 return tts_engine_delegate_;
469 } 491 }
OLDNEW
« no previous file with comments | « chrome/browser/speech/tts_controller_impl.h ('k') | chrome/browser/speech/tts_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698