OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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.h" | 5 #include "chrome/browser/speech/tts_controller.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 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 // empty VoiceData with native = true, which will give the native | 149 // empty VoiceData with native = true, which will give the native |
150 // speech synthesizer a chance to try to synthesize the utterance | 150 // speech synthesizer a chance to try to synthesize the utterance |
151 // anyway. | 151 // anyway. |
152 VoiceData voice; | 152 VoiceData voice; |
153 if (index >= 0 && index < static_cast<int>(voices.size())) | 153 if (index >= 0 && index < static_cast<int>(voices.size())) |
154 voice = voices[index]; | 154 voice = voices[index]; |
155 else | 155 else |
156 voice.native = true; | 156 voice.native = true; |
157 | 157 |
158 if (!voice.native) { | 158 if (!voice.native) { |
| 159 #if !defined(OS_ANDROID) |
159 DCHECK(!voice.extension_id.empty()); | 160 DCHECK(!voice.extension_id.empty()); |
160 current_utterance_ = utterance; | 161 current_utterance_ = utterance; |
161 utterance->set_extension_id(voice.extension_id); | 162 utterance->set_extension_id(voice.extension_id); |
162 ExtensionTtsEngineSpeak(utterance, voice); | 163 ExtensionTtsEngineSpeak(utterance, voice); |
163 bool sends_end_event = | 164 bool sends_end_event = |
164 voice.events.find(TTS_EVENT_END) != voice.events.end(); | 165 voice.events.find(TTS_EVENT_END) != voice.events.end(); |
165 if (!sends_end_event) { | 166 if (!sends_end_event) { |
166 utterance->Finish(); | 167 utterance->Finish(); |
167 delete utterance; | 168 delete utterance; |
168 current_utterance_ = NULL; | 169 current_utterance_ = NULL; |
169 SpeakNextUtterance(); | 170 SpeakNextUtterance(); |
170 } | 171 } |
| 172 #endif |
171 } else { | 173 } else { |
172 GetPlatformImpl()->clear_error(); | 174 GetPlatformImpl()->clear_error(); |
173 bool success = GetPlatformImpl()->Speak( | 175 bool success = GetPlatformImpl()->Speak( |
174 utterance->id(), | 176 utterance->id(), |
175 utterance->text(), | 177 utterance->text(), |
176 utterance->lang(), | 178 utterance->lang(), |
177 voice, | 179 voice, |
178 utterance->continuous_parameters()); | 180 utterance->continuous_parameters()); |
179 | 181 |
180 // If the native voice wasn't able to process this speech, see if | 182 // If the native voice wasn't able to process this speech, see if |
181 // the browser has built-in TTS that isn't loaded yet. | 183 // the browser has built-in TTS that isn't loaded yet. |
182 if (!success && | 184 if (!success && |
183 GetPlatformImpl()->LoadBuiltInTtsExtension(utterance->profile())) { | 185 GetPlatformImpl()->LoadBuiltInTtsExtension(utterance->profile())) { |
184 utterance_queue_.push(utterance); | 186 utterance_queue_.push(utterance); |
185 return; | 187 return; |
186 } | 188 } |
187 | 189 |
188 if (!success) { | 190 if (!success) { |
189 utterance->OnTtsEvent(TTS_EVENT_ERROR, kInvalidCharIndex, | 191 utterance->OnTtsEvent(TTS_EVENT_ERROR, kInvalidCharIndex, |
190 GetPlatformImpl()->error()); | 192 GetPlatformImpl()->error()); |
191 delete utterance; | 193 delete utterance; |
192 return; | 194 return; |
193 } | 195 } |
194 current_utterance_ = utterance; | 196 current_utterance_ = utterance; |
195 } | 197 } |
196 } | 198 } |
197 | 199 |
198 void TtsController::Stop() { | 200 void TtsController::Stop() { |
199 if (current_utterance_ && !current_utterance_->extension_id().empty()) { | 201 if (current_utterance_ && !current_utterance_->extension_id().empty()) { |
| 202 #if !defined(OS_ANDROID) |
200 ExtensionTtsEngineStop(current_utterance_); | 203 ExtensionTtsEngineStop(current_utterance_); |
| 204 #endif |
201 } else { | 205 } else { |
202 GetPlatformImpl()->clear_error(); | 206 GetPlatformImpl()->clear_error(); |
203 GetPlatformImpl()->StopSpeaking(); | 207 GetPlatformImpl()->StopSpeaking(); |
204 } | 208 } |
205 | 209 |
206 if (current_utterance_) | 210 if (current_utterance_) |
207 current_utterance_->OnTtsEvent(TTS_EVENT_INTERRUPTED, kInvalidCharIndex, | 211 current_utterance_->OnTtsEvent(TTS_EVENT_INTERRUPTED, kInvalidCharIndex, |
208 std::string()); | 212 std::string()); |
209 FinishCurrentUtterance(); | 213 FinishCurrentUtterance(); |
210 ClearUtteranceQueue(true); // Send events. | 214 ClearUtteranceQueue(true); // Send events. |
(...skipping 12 matching lines...) Expand all Loading... |
223 | 227 |
224 current_utterance_->OnTtsEvent(event_type, char_index, error_message); | 228 current_utterance_->OnTtsEvent(event_type, char_index, error_message); |
225 if (current_utterance_->finished()) { | 229 if (current_utterance_->finished()) { |
226 FinishCurrentUtterance(); | 230 FinishCurrentUtterance(); |
227 SpeakNextUtterance(); | 231 SpeakNextUtterance(); |
228 } | 232 } |
229 } | 233 } |
230 | 234 |
231 void TtsController::GetVoices(Profile* profile, | 235 void TtsController::GetVoices(Profile* profile, |
232 std::vector<VoiceData>* out_voices) { | 236 std::vector<VoiceData>* out_voices) { |
| 237 #if !defined(OS_ANDROID) |
233 if (profile) | 238 if (profile) |
234 GetExtensionVoices(profile, out_voices); | 239 GetExtensionVoices(profile, out_voices); |
| 240 #endif |
235 | 241 |
236 TtsPlatformImpl* platform_impl = GetPlatformImpl(); | 242 TtsPlatformImpl* platform_impl = GetPlatformImpl(); |
237 if (platform_impl && platform_impl->PlatformImplAvailable()) | 243 if (platform_impl && platform_impl->PlatformImplAvailable()) |
238 platform_impl->GetVoices(out_voices); | 244 platform_impl->GetVoices(out_voices); |
239 } | 245 } |
240 | 246 |
241 bool TtsController::IsSpeaking() { | 247 bool TtsController::IsSpeaking() { |
242 return current_utterance_ != NULL || GetPlatformImpl()->IsSpeaking(); | 248 return current_utterance_ != NULL || GetPlatformImpl()->IsSpeaking(); |
243 } | 249 } |
244 | 250 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 continue; | 352 continue; |
347 } | 353 } |
348 | 354 |
349 return static_cast<int>(i); | 355 return static_cast<int>(i); |
350 } | 356 } |
351 } | 357 } |
352 | 358 |
353 return -1; | 359 return -1; |
354 } | 360 } |
355 | 361 |
| 362 void TtsController::VoicesChanged() { |
| 363 for (std::set<VoicesChangedDelegate*>::iterator iter = |
| 364 voices_changed_delegates_.begin(); |
| 365 iter != voices_changed_delegates_.end(); ++iter) { |
| 366 (*iter)->OnVoicesChanged(); |
| 367 } |
| 368 } |
| 369 |
| 370 void TtsController::AddVoicesChangedDelegate(VoicesChangedDelegate* delegate) { |
| 371 voices_changed_delegates_.insert(delegate); |
| 372 } |
| 373 |
| 374 void TtsController::RemoveVoicesChangedDelegate( |
| 375 VoicesChangedDelegate* delegate) { |
| 376 voices_changed_delegates_.erase(delegate); |
| 377 } |
| 378 |
OLD | NEW |