Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / speech / tts_message_filter.cc
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/speech/tts_message_filter.h"
6
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "content/public/browser/browser_context.h"
10 #include "content/public/browser/render_process_host.h"
11
12 using content::BrowserThread;
13
14 TtsMessageFilter::TtsMessageFilter(int render_process_id,
15                                    content::BrowserContext* browser_context)
16     : BrowserMessageFilter(TtsMsgStart),
17       render_process_id_(render_process_id),
18       browser_context_(browser_context) {
19   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
20   TtsController::GetInstance()->AddVoicesChangedDelegate(this);
21 }
22
23 void TtsMessageFilter::OverrideThreadForMessage(
24     const IPC::Message& message, BrowserThread::ID* thread) {
25   switch (message.type()) {
26   case TtsHostMsg_InitializeVoiceList::ID:
27   case TtsHostMsg_Speak::ID:
28   case TtsHostMsg_Pause::ID:
29   case TtsHostMsg_Resume::ID:
30   case TtsHostMsg_Cancel::ID:
31     *thread = BrowserThread::UI;
32     break;
33   }
34 }
35
36 bool TtsMessageFilter::OnMessageReceived(const IPC::Message& message) {
37   bool handled = true;
38   IPC_BEGIN_MESSAGE_MAP(TtsMessageFilter, message)
39     IPC_MESSAGE_HANDLER(TtsHostMsg_InitializeVoiceList, OnInitializeVoiceList)
40     IPC_MESSAGE_HANDLER(TtsHostMsg_Speak, OnSpeak)
41     IPC_MESSAGE_HANDLER(TtsHostMsg_Pause, OnPause)
42     IPC_MESSAGE_HANDLER(TtsHostMsg_Resume, OnResume)
43     IPC_MESSAGE_HANDLER(TtsHostMsg_Cancel, OnCancel)
44     IPC_MESSAGE_UNHANDLED(handled = false)
45   IPC_END_MESSAGE_MAP()
46   return handled;
47 }
48
49 void TtsMessageFilter::OnChannelClosing() {
50   BrowserThread::PostTask(
51       BrowserThread::UI, FROM_HERE,
52       base::Bind(&TtsMessageFilter::OnChannelClosingInUIThread, this));
53 }
54
55 void TtsMessageFilter::OnDestruct() const {
56   BrowserThread::DeleteOnUIThread::Destruct(this);
57 }
58
59 void TtsMessageFilter::OnInitializeVoiceList() {
60   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
61   TtsController* tts_controller = TtsController::GetInstance();
62   std::vector<VoiceData> voices;
63   tts_controller->GetVoices(browser_context_, &voices);
64
65   std::vector<TtsVoice> out_voices;
66   out_voices.resize(voices.size());
67   for (size_t i = 0; i < voices.size(); ++i) {
68     TtsVoice& out_voice = out_voices[i];
69     out_voice.voice_uri = voices[i].name;
70     out_voice.name = voices[i].name;
71     out_voice.lang = voices[i].lang;
72     out_voice.local_service = !voices[i].remote;
73     out_voice.is_default = (i == 0);
74   }
75   Send(new TtsMsg_SetVoiceList(out_voices));
76 }
77
78 void TtsMessageFilter::OnSpeak(const TtsUtteranceRequest& request) {
79   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
80
81   scoped_ptr<Utterance> utterance(new Utterance(browser_context_));
82   utterance->set_src_id(request.id);
83   utterance->set_text(request.text);
84   utterance->set_lang(request.lang);
85   utterance->set_voice_name(request.voice);
86   utterance->set_can_enqueue(true);
87
88   UtteranceContinuousParameters params;
89   params.rate = request.rate;
90   params.pitch = request.pitch;
91   params.volume = request.volume;
92   utterance->set_continuous_parameters(params);
93
94   utterance->set_event_delegate(this->AsWeakPtr());
95
96   TtsController::GetInstance()->SpeakOrEnqueue(utterance.release());
97 }
98
99 void TtsMessageFilter::OnPause() {
100   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
101   TtsController::GetInstance()->Pause();
102 }
103
104 void TtsMessageFilter::OnResume() {
105   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
106   TtsController::GetInstance()->Resume();
107 }
108
109 void TtsMessageFilter::OnCancel() {
110   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
111   TtsController::GetInstance()->Stop();
112 }
113
114 void TtsMessageFilter::OnTtsEvent(Utterance* utterance,
115                                   TtsEventType event_type,
116                                   int char_index,
117                                   const std::string& error_message) {
118   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
119   switch (event_type) {
120     case TTS_EVENT_START:
121       Send(new TtsMsg_DidStartSpeaking(utterance->src_id()));
122       break;
123     case TTS_EVENT_END:
124       Send(new TtsMsg_DidFinishSpeaking(utterance->src_id()));
125       break;
126     case TTS_EVENT_WORD:
127       Send(new TtsMsg_WordBoundary(utterance->src_id(), char_index));
128       break;
129     case TTS_EVENT_SENTENCE:
130       Send(new TtsMsg_SentenceBoundary(utterance->src_id(), char_index));
131       break;
132     case TTS_EVENT_MARKER:
133       Send(new TtsMsg_MarkerEvent(utterance->src_id(), char_index));
134       break;
135     case TTS_EVENT_INTERRUPTED:
136       Send(new TtsMsg_WasInterrupted(utterance->src_id()));
137       break;
138     case TTS_EVENT_CANCELLED:
139       Send(new TtsMsg_WasCancelled(utterance->src_id()));
140       break;
141     case TTS_EVENT_ERROR:
142       Send(new TtsMsg_SpeakingErrorOccurred(
143           utterance->src_id(), error_message));
144       break;
145     case TTS_EVENT_PAUSE:
146       Send(new TtsMsg_DidPauseSpeaking(utterance->src_id()));
147       break;
148     case TTS_EVENT_RESUME:
149       Send(new TtsMsg_DidResumeSpeaking(utterance->src_id()));
150       break;
151   }
152 }
153
154 void TtsMessageFilter::OnVoicesChanged() {
155   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
156   OnInitializeVoiceList();
157 }
158
159 void TtsMessageFilter::OnChannelClosingInUIThread() {
160   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
161   TtsController::GetInstance()->RemoveVoicesChangedDelegate(this);
162 }
163
164 TtsMessageFilter::~TtsMessageFilter() {
165   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
166   TtsController::GetInstance()->RemoveVoicesChangedDelegate(this);
167 }