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