15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/accessibility/speech_monitor.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace chromeos {
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kChromeVoxEnabledMessage[] = "chrome vox spoken feedback is ready";
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // anonymous namespace
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SpeechMonitor::SpeechMonitor() {
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TtsController::GetInstance()->SetPlatformImpl(this);
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SpeechMonitor::~SpeechMonitor() {
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TtsController::GetInstance()->SetPlatformImpl(TtsPlatformImpl::GetInstance());
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string SpeechMonitor::GetNextUtterance() {
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (utterance_queue_.empty()) {
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    loop_runner_ = new content::MessageLoopRunner();
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    loop_runner_->Run();
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    loop_runner_ = NULL;
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string result = utterance_queue_.front();
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  utterance_queue_.pop_front();
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result;
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SpeechMonitor::SkipChromeVoxEnabledMessage() {
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetNextUtterance() == kChromeVoxEnabledMessage;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SpeechMonitor::PlatformImplAvailable() {
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SpeechMonitor::Speak(
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int utterance_id,
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& utterance,
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& lang,
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const VoiceData& voice,
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const UtteranceContinuousParameters& params) {
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TtsController::GetInstance()->OnTtsEvent(
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      utterance_id,
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      TTS_EVENT_END,
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<int>(utterance.size()),
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::string());
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SpeechMonitor::StopSpeaking() {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool SpeechMonitor::IsSpeaking() {
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SpeechMonitor::GetVoices(std::vector<VoiceData>* out_voices) {
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  out_voices->push_back(VoiceData());
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VoiceData& voice = out_voices->back();
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  voice.native = true;
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  voice.name = "SpeechMonitor";
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  voice.events.insert(TTS_EVENT_END);
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string SpeechMonitor::error() {
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return "";
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SpeechMonitor::WillSpeakUtteranceWithVoice(const Utterance* utterance,
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                const VoiceData& voice_data) {
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  utterance_queue_.push_back(utterance->text());
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (loop_runner_.get())
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    loop_runner_->Quit();
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace chromeos
82