| Index: chrome/browser/speech/tts_message_filter.cc
|
| diff --git a/chrome/browser/speech/tts_message_filter.cc b/chrome/browser/speech/tts_message_filter.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fb6bb2829ebfe1fc016649ea01cba0cc0ef3b1c5
|
| --- /dev/null
|
| +++ b/chrome/browser/speech/tts_message_filter.cc
|
| @@ -0,0 +1,132 @@
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/speech/tts_message_filter.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/logging.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/speech/tts_controller.h"
|
| +#include "chrome/browser/speech/tts_message_filter.h"
|
| +#include "content/public/browser/browser_context.h"
|
| +#include "content/public/browser/render_process_host.h"
|
| +
|
| +using content::BrowserThread;
|
| +
|
| +TtsMessageFilter::TtsMessageFilter(int render_process_id, Profile* profile)
|
| + : render_process_id_(render_process_id),
|
| + profile_(profile) {
|
| +}
|
| +
|
| +TtsMessageFilter::~TtsMessageFilter() {
|
| +}
|
| +
|
| +void TtsMessageFilter::OverrideThreadForMessage(
|
| + const IPC::Message& message, BrowserThread::ID* thread) {
|
| + switch (message.type()) {
|
| + case TtsHostMsg_InitializeVoiceList::ID:
|
| + case TtsHostMsg_Speak::ID:
|
| + case TtsHostMsg_Pause::ID:
|
| + case TtsHostMsg_Resume::ID:
|
| + case TtsHostMsg_Cancel::ID:
|
| + *thread = BrowserThread::UI;
|
| + break;
|
| + }
|
| +}
|
| +
|
| +bool TtsMessageFilter::OnMessageReceived(const IPC::Message& message,
|
| + bool* message_was_ok) {
|
| + bool handled = true;
|
| + IPC_BEGIN_MESSAGE_MAP_EX(TtsMessageFilter, message, *message_was_ok)
|
| + IPC_MESSAGE_HANDLER(TtsHostMsg_InitializeVoiceList, OnInitializeVoiceList)
|
| + IPC_MESSAGE_HANDLER(TtsHostMsg_Speak, OnSpeak)
|
| + IPC_MESSAGE_HANDLER(TtsHostMsg_Pause, OnPause)
|
| + IPC_MESSAGE_HANDLER(TtsHostMsg_Resume, OnResume)
|
| + IPC_MESSAGE_HANDLER(TtsHostMsg_Cancel, OnCancel)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP()
|
| + return handled;
|
| +}
|
| +
|
| +void TtsMessageFilter::OnInitializeVoiceList() {
|
| + TtsController* tts_controller = TtsController::GetInstance();
|
| + std::vector<VoiceData> voices;
|
| + tts_controller->GetVoices(profile_, &voices);
|
| +
|
| + std::vector<TtsVoice> out_voices;
|
| + out_voices.resize(voices.size());
|
| + for (size_t i = 0; i < voices.size(); ++i) {
|
| + TtsVoice& out_voice = out_voices[i];
|
| + out_voice.voice_uri = voices[i].name;
|
| + out_voice.name = voices[i].name;
|
| + out_voice.lang = voices[i].lang;
|
| + out_voice.local_service = true;
|
| + out_voice.is_default = (i == 0);
|
| + }
|
| + Send(new TtsMsg_SetVoiceList(out_voices));
|
| +}
|
| +
|
| +void TtsMessageFilter::OnSpeak(const TtsUtteranceRequest& request) {
|
| + scoped_ptr<Utterance> utterance(new Utterance(profile_));
|
| + utterance->set_src_id(request.id);
|
| + utterance->set_text(request.text);
|
| + utterance->set_lang(request.lang);
|
| + utterance->set_voice_name(request.voice);
|
| + utterance->set_can_enqueue(true);
|
| +
|
| + UtteranceContinuousParameters params;
|
| + params.rate = request.rate;
|
| + params.pitch = request.pitch;
|
| + params.volume = request.volume;
|
| + utterance->set_continuous_parameters(params);
|
| +
|
| + utterance->set_event_delegate(this);
|
| +
|
| + TtsController::GetInstance()->SpeakOrEnqueue(utterance.release());
|
| +}
|
| +
|
| +void TtsMessageFilter::OnPause() {
|
| + // TODO(dmazzoni): Not supported by TtsController yet.
|
| +}
|
| +
|
| +void TtsMessageFilter::OnResume() {
|
| + // TODO(dmazzoni): Not supported by TtsController yet.
|
| +}
|
| +
|
| +void TtsMessageFilter::OnCancel() {
|
| + TtsController::GetInstance()->Stop();
|
| +}
|
| +
|
| +void TtsMessageFilter::OnTtsEvent(Utterance* utterance,
|
| + TtsEventType event_type,
|
| + int char_index,
|
| + const std::string& error_message) {
|
| + switch (event_type) {
|
| + case TTS_EVENT_START:
|
| + Send(new TtsMsg_DidStartSpeaking(utterance->src_id()));
|
| + break;
|
| + case TTS_EVENT_END:
|
| + Send(new TtsMsg_DidFinishSpeaking(utterance->src_id()));
|
| + break;
|
| + case TTS_EVENT_WORD:
|
| + Send(new TtsMsg_WordBoundary(utterance->src_id(), char_index));
|
| + break;
|
| + case TTS_EVENT_SENTENCE:
|
| + Send(new TtsMsg_SentenceBoundary(utterance->src_id(), char_index));
|
| + break;
|
| + case TTS_EVENT_MARKER:
|
| + Send(new TtsMsg_MarkerEvent(utterance->src_id(), char_index));
|
| + break;
|
| + case TTS_EVENT_INTERRUPTED:
|
| + Send(new TtsMsg_WasInterrupted(utterance->src_id()));
|
| + break;
|
| + case TTS_EVENT_CANCELLED:
|
| + Send(new TtsMsg_WasCancelled(utterance->src_id()));
|
| + break;
|
| + case TTS_EVENT_ERROR:
|
| + Send(new TtsMsg_SpeakingErrorOccurred(
|
| + utterance->src_id(), error_message));
|
| + break;
|
| + }
|
| +}
|
|
|