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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 // Select the matching voice, but if none was found, initialize an | 159 // Select the matching voice, but if none was found, initialize an |
160 // empty VoiceData with native = true, which will give the native | 160 // empty VoiceData with native = true, which will give the native |
161 // speech synthesizer a chance to try to synthesize the utterance | 161 // speech synthesizer a chance to try to synthesize the utterance |
162 // anyway. | 162 // anyway. |
163 VoiceData voice; | 163 VoiceData voice; |
164 if (index >= 0 && index < static_cast<int>(voices.size())) | 164 if (index >= 0 && index < static_cast<int>(voices.size())) |
165 voice = voices[index]; | 165 voice = voices[index]; |
166 else | 166 else |
167 voice.native = true; | 167 voice.native = true; |
168 | 168 |
| 169 GetPlatformImpl()->WillSpeakUtteranceWithVoice(utterance, voice); |
| 170 |
169 if (!voice.native) { | 171 if (!voice.native) { |
170 #if !defined(OS_ANDROID) | 172 #if !defined(OS_ANDROID) |
171 DCHECK(!voice.extension_id.empty()); | 173 DCHECK(!voice.extension_id.empty()); |
172 current_utterance_ = utterance; | 174 current_utterance_ = utterance; |
173 utterance->set_extension_id(voice.extension_id); | 175 utterance->set_extension_id(voice.extension_id); |
174 ExtensionTtsEngineSpeak(utterance, voice); | 176 ExtensionTtsEngineSpeak(utterance, voice); |
175 bool sends_end_event = | 177 bool sends_end_event = |
176 voice.events.find(TTS_EVENT_END) != voice.events.end(); | 178 voice.events.find(TTS_EVENT_END) != voice.events.end(); |
177 if (!sends_end_event) { | 179 if (!sends_end_event) { |
178 utterance->Finish(); | 180 utterance->Finish(); |
179 delete utterance; | 181 delete utterance; |
180 current_utterance_ = NULL; | 182 current_utterance_ = NULL; |
181 SpeakNextUtterance(); | 183 SpeakNextUtterance(); |
182 } | 184 } |
183 #endif | 185 #endif |
184 } else { | 186 } else { |
185 // It's possible for certain platforms to send start events immediately | 187 // It's possible for certain platforms to send start events immediately |
186 // during |speak|. | 188 // during |speak|. |
187 current_utterance_ = utterance; | 189 current_utterance_ = utterance; |
188 GetPlatformImpl()->clear_error(); | 190 GetPlatformImpl()->clear_error(); |
189 bool success = GetPlatformImpl()->Speak( | 191 bool success = GetPlatformImpl()->Speak( |
190 utterance->id(), | 192 utterance->id(), |
191 utterance->text(), | 193 utterance->text(), |
192 utterance->lang(), | 194 utterance->lang(), |
193 voice, | 195 voice, |
194 utterance->continuous_parameters()); | 196 utterance->continuous_parameters()); |
195 if (!success) | 197 if (!success) |
196 current_utterance_ = NULL; | 198 current_utterance_ = NULL; |
197 | 199 |
198 // If the native voice wasn't able to process this speech, see if | |
199 // the browser has built-in TTS that isn't loaded yet. | |
200 if (!success && | |
201 GetPlatformImpl()->LoadBuiltInTtsExtension(utterance->profile())) { | |
202 utterance_queue_.push(utterance); | |
203 return; | |
204 } | |
205 | |
206 if (!success) { | 200 if (!success) { |
207 utterance->OnTtsEvent(TTS_EVENT_ERROR, kInvalidCharIndex, | 201 utterance->OnTtsEvent(TTS_EVENT_ERROR, kInvalidCharIndex, |
208 GetPlatformImpl()->error()); | 202 GetPlatformImpl()->error()); |
209 delete utterance; | 203 delete utterance; |
210 return; | 204 return; |
211 } | 205 } |
212 } | 206 } |
213 } | 207 } |
214 | 208 |
215 void TtsController::Stop() { | 209 void TtsController::Stop() { |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 | 300 |
307 // Start speaking the next utterance in the queue. Keep trying in case | 301 // Start speaking the next utterance in the queue. Keep trying in case |
308 // one fails but there are still more in the queue to try. | 302 // one fails but there are still more in the queue to try. |
309 while (!utterance_queue_.empty() && !current_utterance_) { | 303 while (!utterance_queue_.empty() && !current_utterance_) { |
310 Utterance* utterance = utterance_queue_.front(); | 304 Utterance* utterance = utterance_queue_.front(); |
311 utterance_queue_.pop(); | 305 utterance_queue_.pop(); |
312 SpeakNow(utterance); | 306 SpeakNow(utterance); |
313 } | 307 } |
314 } | 308 } |
315 | 309 |
316 void TtsController::RetrySpeakingQueuedUtterances() { | |
317 if (current_utterance_ == NULL && !utterance_queue_.empty()) | |
318 SpeakNextUtterance(); | |
319 } | |
320 | |
321 void TtsController::ClearUtteranceQueue(bool send_events) { | 310 void TtsController::ClearUtteranceQueue(bool send_events) { |
322 while (!utterance_queue_.empty()) { | 311 while (!utterance_queue_.empty()) { |
323 Utterance* utterance = utterance_queue_.front(); | 312 Utterance* utterance = utterance_queue_.front(); |
324 utterance_queue_.pop(); | 313 utterance_queue_.pop(); |
325 if (send_events) | 314 if (send_events) |
326 utterance->OnTtsEvent(TTS_EVENT_CANCELLED, kInvalidCharIndex, | 315 utterance->OnTtsEvent(TTS_EVENT_CANCELLED, kInvalidCharIndex, |
327 std::string()); | 316 std::string()); |
328 else | 317 else |
329 utterance->Finish(); | 318 utterance->Finish(); |
330 delete utterance; | 319 delete utterance; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 } | 402 } |
414 | 403 |
415 void TtsController::AddVoicesChangedDelegate(VoicesChangedDelegate* delegate) { | 404 void TtsController::AddVoicesChangedDelegate(VoicesChangedDelegate* delegate) { |
416 voices_changed_delegates_.insert(delegate); | 405 voices_changed_delegates_.insert(delegate); |
417 } | 406 } |
418 | 407 |
419 void TtsController::RemoveVoicesChangedDelegate( | 408 void TtsController::RemoveVoicesChangedDelegate( |
420 VoicesChangedDelegate* delegate) { | 409 VoicesChangedDelegate* delegate) { |
421 voices_changed_delegates_.erase(delegate); | 410 voices_changed_delegates_.erase(delegate); |
422 } | 411 } |
OLD | NEW |