| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 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 "content/browser/speech/speech_recognition_manager_impl.h" | 5 #include "content/browser/speech/speech_recognition_manager_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "content/browser/browser_main_loop.h" | 8 #include "content/browser/browser_main_loop.h" |
| 9 #include "content/browser/renderer_host/media/media_stream_manager.h" | 9 #include "content/browser/renderer_host/media/media_stream_manager.h" |
| 10 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" | 10 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 | 32 |
| 33 namespace content { | 33 namespace content { |
| 34 | 34 |
| 35 SpeechRecognitionManager* SpeechRecognitionManager::manager_for_tests_; | 35 SpeechRecognitionManager* SpeechRecognitionManager::manager_for_tests_; |
| 36 | 36 |
| 37 namespace { | 37 namespace { |
| 38 | 38 |
| 39 SpeechRecognitionManagerImpl* g_speech_recognition_manager_impl; | 39 SpeechRecognitionManagerImpl* g_speech_recognition_manager_impl; |
| 40 | 40 |
| 41 void ShowAudioInputSettingsOnFileThread(media::AudioManager* audio_manager) { | 41 void ShowAudioInputSettingsOnFileThread(media::AudioManager* audio_manager) { |
| 42 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 42 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
| 43 audio_manager->ShowAudioInputSettings(); | 43 audio_manager->ShowAudioInputSettings(); |
| 44 } | 44 } |
| 45 | 45 |
| 46 } // namespace | 46 } // namespace |
| 47 | 47 |
| 48 SpeechRecognitionManager* SpeechRecognitionManager::GetInstance() { | 48 SpeechRecognitionManager* SpeechRecognitionManager::GetInstance() { |
| 49 if (manager_for_tests_) | 49 if (manager_for_tests_) |
| 50 return manager_for_tests_; | 50 return manager_for_tests_; |
| 51 return SpeechRecognitionManagerImpl::GetInstance(); | 51 return SpeechRecognitionManagerImpl::GetInstance(); |
| 52 } | 52 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 // MediaStreamUIProxy must be deleted on the IO thread. | 84 // MediaStreamUIProxy must be deleted on the IO thread. |
| 85 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, | 85 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, |
| 86 it->second->ui.release()); | 86 it->second->ui.release()); |
| 87 delete it->second; | 87 delete it->second; |
| 88 } | 88 } |
| 89 sessions_.clear(); | 89 sessions_.clear(); |
| 90 } | 90 } |
| 91 | 91 |
| 92 int SpeechRecognitionManagerImpl::CreateSession( | 92 int SpeechRecognitionManagerImpl::CreateSession( |
| 93 const SpeechRecognitionSessionConfig& config) { | 93 const SpeechRecognitionSessionConfig& config) { |
| 94 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 94 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 95 | 95 |
| 96 const int session_id = GetNextSessionID(); | 96 const int session_id = GetNextSessionID(); |
| 97 DCHECK(!SessionExists(session_id)); | 97 DCHECK(!SessionExists(session_id)); |
| 98 // Set-up the new session. | 98 // Set-up the new session. |
| 99 Session* session = new Session(); | 99 Session* session = new Session(); |
| 100 sessions_[session_id] = session; | 100 sessions_[session_id] = session; |
| 101 session->id = session_id; | 101 session->id = session_id; |
| 102 session->config = config; | 102 session->config = config; |
| 103 session->context = config.initial_context; | 103 session->context = config.initial_context; |
| 104 | 104 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 config.continuous, | 153 config.continuous, |
| 154 config.interim_results, | 154 config.interim_results, |
| 155 google_remote_engine); | 155 google_remote_engine); |
| 156 #else | 156 #else |
| 157 session->recognizer = new SpeechRecognizerImplAndroid(this, session_id); | 157 session->recognizer = new SpeechRecognizerImplAndroid(this, session_id); |
| 158 #endif | 158 #endif |
| 159 return session_id; | 159 return session_id; |
| 160 } | 160 } |
| 161 | 161 |
| 162 void SpeechRecognitionManagerImpl::StartSession(int session_id) { | 162 void SpeechRecognitionManagerImpl::StartSession(int session_id) { |
| 163 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 163 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 164 if (!SessionExists(session_id)) | 164 if (!SessionExists(session_id)) |
| 165 return; | 165 return; |
| 166 | 166 |
| 167 // If there is another active session, abort that. | 167 // If there is another active session, abort that. |
| 168 if (primary_session_id_ != kSessionIDInvalid && | 168 if (primary_session_id_ != kSessionIDInvalid && |
| 169 primary_session_id_ != session_id) { | 169 primary_session_id_ != session_id) { |
| 170 AbortSession(primary_session_id_); | 170 AbortSession(primary_session_id_); |
| 171 } | 171 } |
| 172 | 172 |
| 173 primary_session_id_ = session_id; | 173 primary_session_id_ = session_id; |
| 174 | 174 |
| 175 if (delegate_) { | 175 if (delegate_) { |
| 176 delegate_->CheckRecognitionIsAllowed( | 176 delegate_->CheckRecognitionIsAllowed( |
| 177 session_id, | 177 session_id, |
| 178 base::Bind(&SpeechRecognitionManagerImpl::RecognitionAllowedCallback, | 178 base::Bind(&SpeechRecognitionManagerImpl::RecognitionAllowedCallback, |
| 179 weak_factory_.GetWeakPtr(), | 179 weak_factory_.GetWeakPtr(), |
| 180 session_id)); | 180 session_id)); |
| 181 } | 181 } |
| 182 } | 182 } |
| 183 | 183 |
| 184 void SpeechRecognitionManagerImpl::RecognitionAllowedCallback(int session_id, | 184 void SpeechRecognitionManagerImpl::RecognitionAllowedCallback(int session_id, |
| 185 bool ask_user, | 185 bool ask_user, |
| 186 bool is_allowed) { | 186 bool is_allowed) { |
| 187 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 187 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 188 if (!SessionExists(session_id)) | 188 if (!SessionExists(session_id)) |
| 189 return; | 189 return; |
| 190 | 190 |
| 191 SessionsTable::iterator iter = sessions_.find(session_id); | 191 SessionsTable::iterator iter = sessions_.find(session_id); |
| 192 DCHECK(iter != sessions_.end()); | 192 DCHECK(iter != sessions_.end()); |
| 193 Session* session = iter->second; | 193 Session* session = iter->second; |
| 194 | 194 |
| 195 if (session->abort_requested) | 195 if (session->abort_requested) |
| 196 return; | 196 return; |
| 197 | 197 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 225 weak_factory_.GetWeakPtr(), | 225 weak_factory_.GetWeakPtr(), |
| 226 session_id, | 226 session_id, |
| 227 EVENT_ABORT)); | 227 EVENT_ABORT)); |
| 228 } | 228 } |
| 229 } | 229 } |
| 230 | 230 |
| 231 void SpeechRecognitionManagerImpl::MediaRequestPermissionCallback( | 231 void SpeechRecognitionManagerImpl::MediaRequestPermissionCallback( |
| 232 int session_id, | 232 int session_id, |
| 233 const MediaStreamDevices& devices, | 233 const MediaStreamDevices& devices, |
| 234 scoped_ptr<MediaStreamUIProxy> stream_ui) { | 234 scoped_ptr<MediaStreamUIProxy> stream_ui) { |
| 235 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 235 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 236 | 236 |
| 237 SessionsTable::iterator iter = sessions_.find(session_id); | 237 SessionsTable::iterator iter = sessions_.find(session_id); |
| 238 if (iter == sessions_.end()) | 238 if (iter == sessions_.end()) |
| 239 return; | 239 return; |
| 240 | 240 |
| 241 bool is_allowed = !devices.empty(); | 241 bool is_allowed = !devices.empty(); |
| 242 if (is_allowed) { | 242 if (is_allowed) { |
| 243 // Copy the approved devices array to the context for UI indication. | 243 // Copy the approved devices array to the context for UI indication. |
| 244 iter->second->context.devices = devices; | 244 iter->second->context.devices = devices; |
| 245 | 245 |
| 246 // Save the UI object. | 246 // Save the UI object. |
| 247 iter->second->ui = stream_ui.Pass(); | 247 iter->second->ui = stream_ui.Pass(); |
| 248 } | 248 } |
| 249 | 249 |
| 250 // Clear the label to indicate the request has been done. | 250 // Clear the label to indicate the request has been done. |
| 251 iter->second->context.label.clear(); | 251 iter->second->context.label.clear(); |
| 252 | 252 |
| 253 // Notify the recognition about the request result. | 253 // Notify the recognition about the request result. |
| 254 RecognitionAllowedCallback(iter->first, false, is_allowed); | 254 RecognitionAllowedCallback(iter->first, false, is_allowed); |
| 255 } | 255 } |
| 256 | 256 |
| 257 void SpeechRecognitionManagerImpl::AbortSession(int session_id) { | 257 void SpeechRecognitionManagerImpl::AbortSession(int session_id) { |
| 258 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 258 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 259 if (!SessionExists(session_id)) | 259 if (!SessionExists(session_id)) |
| 260 return; | 260 return; |
| 261 | 261 |
| 262 SessionsTable::iterator iter = sessions_.find(session_id); | 262 SessionsTable::iterator iter = sessions_.find(session_id); |
| 263 iter->second->ui.reset(); | 263 iter->second->ui.reset(); |
| 264 | 264 |
| 265 if (iter->second->abort_requested) | 265 if (iter->second->abort_requested) |
| 266 return; | 266 return; |
| 267 | 267 |
| 268 iter->second->abort_requested = true; | 268 iter->second->abort_requested = true; |
| 269 | 269 |
| 270 base::MessageLoop::current()->PostTask( | 270 base::MessageLoop::current()->PostTask( |
| 271 FROM_HERE, | 271 FROM_HERE, |
| 272 base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, | 272 base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, |
| 273 weak_factory_.GetWeakPtr(), | 273 weak_factory_.GetWeakPtr(), |
| 274 session_id, | 274 session_id, |
| 275 EVENT_ABORT)); | 275 EVENT_ABORT)); |
| 276 } | 276 } |
| 277 | 277 |
| 278 void SpeechRecognitionManagerImpl::StopAudioCaptureForSession(int session_id) { | 278 void SpeechRecognitionManagerImpl::StopAudioCaptureForSession(int session_id) { |
| 279 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 279 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 280 if (!SessionExists(session_id)) | 280 if (!SessionExists(session_id)) |
| 281 return; | 281 return; |
| 282 | 282 |
| 283 SessionsTable::iterator iter = sessions_.find(session_id); | 283 SessionsTable::iterator iter = sessions_.find(session_id); |
| 284 iter->second->ui.reset(); | 284 iter->second->ui.reset(); |
| 285 | 285 |
| 286 base::MessageLoop::current()->PostTask( | 286 base::MessageLoop::current()->PostTask( |
| 287 FROM_HERE, | 287 FROM_HERE, |
| 288 base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, | 288 base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, |
| 289 weak_factory_.GetWeakPtr(), | 289 weak_factory_.GetWeakPtr(), |
| 290 session_id, | 290 session_id, |
| 291 EVENT_STOP_CAPTURE)); | 291 EVENT_STOP_CAPTURE)); |
| 292 } | 292 } |
| 293 | 293 |
| 294 // Here begins the SpeechRecognitionEventListener interface implementation, | 294 // Here begins the SpeechRecognitionEventListener interface implementation, |
| 295 // which will simply relay the events to the proper listener registered for the | 295 // which will simply relay the events to the proper listener registered for the |
| 296 // particular session and to the catch-all listener provided by the delegate | 296 // particular session and to the catch-all listener provided by the delegate |
| 297 // (if any). | 297 // (if any). |
| 298 | 298 |
| 299 void SpeechRecognitionManagerImpl::OnRecognitionStart(int session_id) { | 299 void SpeechRecognitionManagerImpl::OnRecognitionStart(int session_id) { |
| 300 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 300 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 301 if (!SessionExists(session_id)) | 301 if (!SessionExists(session_id)) |
| 302 return; | 302 return; |
| 303 | 303 |
| 304 SessionsTable::iterator iter = sessions_.find(session_id); | 304 SessionsTable::iterator iter = sessions_.find(session_id); |
| 305 if (iter->second->ui) { | 305 if (iter->second->ui) { |
| 306 // Notify the UI that the devices are being used. | 306 // Notify the UI that the devices are being used. |
| 307 iter->second->ui->OnStarted(base::Closure(), | 307 iter->second->ui->OnStarted(base::Closure(), |
| 308 MediaStreamUIProxy::WindowIdCallback()); | 308 MediaStreamUIProxy::WindowIdCallback()); |
| 309 } | 309 } |
| 310 | 310 |
| 311 DCHECK_EQ(primary_session_id_, session_id); | 311 DCHECK_EQ(primary_session_id_, session_id); |
| 312 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) | 312 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) |
| 313 delegate_listener->OnRecognitionStart(session_id); | 313 delegate_listener->OnRecognitionStart(session_id); |
| 314 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) | 314 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) |
| 315 listener->OnRecognitionStart(session_id); | 315 listener->OnRecognitionStart(session_id); |
| 316 } | 316 } |
| 317 | 317 |
| 318 void SpeechRecognitionManagerImpl::OnAudioStart(int session_id) { | 318 void SpeechRecognitionManagerImpl::OnAudioStart(int session_id) { |
| 319 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 319 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 320 if (!SessionExists(session_id)) | 320 if (!SessionExists(session_id)) |
| 321 return; | 321 return; |
| 322 | 322 |
| 323 DCHECK_EQ(primary_session_id_, session_id); | 323 DCHECK_EQ(primary_session_id_, session_id); |
| 324 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) | 324 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) |
| 325 delegate_listener->OnAudioStart(session_id); | 325 delegate_listener->OnAudioStart(session_id); |
| 326 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) | 326 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) |
| 327 listener->OnAudioStart(session_id); | 327 listener->OnAudioStart(session_id); |
| 328 } | 328 } |
| 329 | 329 |
| 330 void SpeechRecognitionManagerImpl::OnEnvironmentEstimationComplete( | 330 void SpeechRecognitionManagerImpl::OnEnvironmentEstimationComplete( |
| 331 int session_id) { | 331 int session_id) { |
| 332 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 332 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 333 if (!SessionExists(session_id)) | 333 if (!SessionExists(session_id)) |
| 334 return; | 334 return; |
| 335 | 335 |
| 336 DCHECK_EQ(primary_session_id_, session_id); | 336 DCHECK_EQ(primary_session_id_, session_id); |
| 337 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) | 337 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) |
| 338 delegate_listener->OnEnvironmentEstimationComplete(session_id); | 338 delegate_listener->OnEnvironmentEstimationComplete(session_id); |
| 339 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) | 339 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) |
| 340 listener->OnEnvironmentEstimationComplete(session_id); | 340 listener->OnEnvironmentEstimationComplete(session_id); |
| 341 } | 341 } |
| 342 | 342 |
| 343 void SpeechRecognitionManagerImpl::OnSoundStart(int session_id) { | 343 void SpeechRecognitionManagerImpl::OnSoundStart(int session_id) { |
| 344 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 344 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 345 if (!SessionExists(session_id)) | 345 if (!SessionExists(session_id)) |
| 346 return; | 346 return; |
| 347 | 347 |
| 348 DCHECK_EQ(primary_session_id_, session_id); | 348 DCHECK_EQ(primary_session_id_, session_id); |
| 349 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) | 349 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) |
| 350 delegate_listener->OnSoundStart(session_id); | 350 delegate_listener->OnSoundStart(session_id); |
| 351 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) | 351 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) |
| 352 listener->OnSoundStart(session_id); | 352 listener->OnSoundStart(session_id); |
| 353 } | 353 } |
| 354 | 354 |
| 355 void SpeechRecognitionManagerImpl::OnSoundEnd(int session_id) { | 355 void SpeechRecognitionManagerImpl::OnSoundEnd(int session_id) { |
| 356 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 356 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 357 if (!SessionExists(session_id)) | 357 if (!SessionExists(session_id)) |
| 358 return; | 358 return; |
| 359 | 359 |
| 360 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) | 360 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) |
| 361 delegate_listener->OnSoundEnd(session_id); | 361 delegate_listener->OnSoundEnd(session_id); |
| 362 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) | 362 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) |
| 363 listener->OnSoundEnd(session_id); | 363 listener->OnSoundEnd(session_id); |
| 364 } | 364 } |
| 365 | 365 |
| 366 void SpeechRecognitionManagerImpl::OnAudioEnd(int session_id) { | 366 void SpeechRecognitionManagerImpl::OnAudioEnd(int session_id) { |
| 367 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 367 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 368 if (!SessionExists(session_id)) | 368 if (!SessionExists(session_id)) |
| 369 return; | 369 return; |
| 370 | 370 |
| 371 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) | 371 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) |
| 372 delegate_listener->OnAudioEnd(session_id); | 372 delegate_listener->OnAudioEnd(session_id); |
| 373 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) | 373 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) |
| 374 listener->OnAudioEnd(session_id); | 374 listener->OnAudioEnd(session_id); |
| 375 base::MessageLoop::current()->PostTask( | 375 base::MessageLoop::current()->PostTask( |
| 376 FROM_HERE, | 376 FROM_HERE, |
| 377 base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, | 377 base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, |
| 378 weak_factory_.GetWeakPtr(), | 378 weak_factory_.GetWeakPtr(), |
| 379 session_id, | 379 session_id, |
| 380 EVENT_AUDIO_ENDED)); | 380 EVENT_AUDIO_ENDED)); |
| 381 } | 381 } |
| 382 | 382 |
| 383 void SpeechRecognitionManagerImpl::OnRecognitionResults( | 383 void SpeechRecognitionManagerImpl::OnRecognitionResults( |
| 384 int session_id, const SpeechRecognitionResults& results) { | 384 int session_id, const SpeechRecognitionResults& results) { |
| 385 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 385 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 386 if (!SessionExists(session_id)) | 386 if (!SessionExists(session_id)) |
| 387 return; | 387 return; |
| 388 | 388 |
| 389 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) | 389 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) |
| 390 delegate_listener->OnRecognitionResults(session_id, results); | 390 delegate_listener->OnRecognitionResults(session_id, results); |
| 391 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) | 391 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) |
| 392 listener->OnRecognitionResults(session_id, results); | 392 listener->OnRecognitionResults(session_id, results); |
| 393 } | 393 } |
| 394 | 394 |
| 395 void SpeechRecognitionManagerImpl::OnRecognitionError( | 395 void SpeechRecognitionManagerImpl::OnRecognitionError( |
| 396 int session_id, const SpeechRecognitionError& error) { | 396 int session_id, const SpeechRecognitionError& error) { |
| 397 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 397 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 398 if (!SessionExists(session_id)) | 398 if (!SessionExists(session_id)) |
| 399 return; | 399 return; |
| 400 | 400 |
| 401 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) | 401 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) |
| 402 delegate_listener->OnRecognitionError(session_id, error); | 402 delegate_listener->OnRecognitionError(session_id, error); |
| 403 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) | 403 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) |
| 404 listener->OnRecognitionError(session_id, error); | 404 listener->OnRecognitionError(session_id, error); |
| 405 } | 405 } |
| 406 | 406 |
| 407 void SpeechRecognitionManagerImpl::OnAudioLevelsChange( | 407 void SpeechRecognitionManagerImpl::OnAudioLevelsChange( |
| 408 int session_id, float volume, float noise_volume) { | 408 int session_id, float volume, float noise_volume) { |
| 409 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 409 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 410 if (!SessionExists(session_id)) | 410 if (!SessionExists(session_id)) |
| 411 return; | 411 return; |
| 412 | 412 |
| 413 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) | 413 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) |
| 414 delegate_listener->OnAudioLevelsChange(session_id, volume, noise_volume); | 414 delegate_listener->OnAudioLevelsChange(session_id, volume, noise_volume); |
| 415 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) | 415 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) |
| 416 listener->OnAudioLevelsChange(session_id, volume, noise_volume); | 416 listener->OnAudioLevelsChange(session_id, volume, noise_volume); |
| 417 } | 417 } |
| 418 | 418 |
| 419 void SpeechRecognitionManagerImpl::OnRecognitionEnd(int session_id) { | 419 void SpeechRecognitionManagerImpl::OnRecognitionEnd(int session_id) { |
| 420 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 420 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 421 if (!SessionExists(session_id)) | 421 if (!SessionExists(session_id)) |
| 422 return; | 422 return; |
| 423 | 423 |
| 424 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) | 424 if (SpeechRecognitionEventListener* delegate_listener = GetDelegateListener()) |
| 425 delegate_listener->OnRecognitionEnd(session_id); | 425 delegate_listener->OnRecognitionEnd(session_id); |
| 426 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) | 426 if (SpeechRecognitionEventListener* listener = GetListener(session_id)) |
| 427 listener->OnRecognitionEnd(session_id); | 427 listener->OnRecognitionEnd(session_id); |
| 428 base::MessageLoop::current()->PostTask( | 428 base::MessageLoop::current()->PostTask( |
| 429 FROM_HERE, | 429 FROM_HERE, |
| 430 base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, | 430 base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, |
| 431 weak_factory_.GetWeakPtr(), | 431 weak_factory_.GetWeakPtr(), |
| 432 session_id, | 432 session_id, |
| 433 EVENT_RECOGNITION_ENDED)); | 433 EVENT_RECOGNITION_ENDED)); |
| 434 } | 434 } |
| 435 | 435 |
| 436 int SpeechRecognitionManagerImpl::GetSession( | 436 int SpeechRecognitionManagerImpl::GetSession( |
| 437 int render_process_id, int render_view_id, int request_id) const { | 437 int render_process_id, int render_view_id, int request_id) const { |
| 438 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 438 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 439 SessionsTable::const_iterator iter; | 439 SessionsTable::const_iterator iter; |
| 440 for (iter = sessions_.begin(); iter != sessions_.end(); ++iter) { | 440 for (iter = sessions_.begin(); iter != sessions_.end(); ++iter) { |
| 441 const int session_id = iter->first; | 441 const int session_id = iter->first; |
| 442 const SpeechRecognitionSessionContext& context = iter->second->context; | 442 const SpeechRecognitionSessionContext& context = iter->second->context; |
| 443 if (context.render_process_id == render_process_id && | 443 if (context.render_process_id == render_process_id && |
| 444 context.render_view_id == render_view_id && | 444 context.render_view_id == render_view_id && |
| 445 context.request_id == request_id) { | 445 context.request_id == request_id) { |
| 446 return session_id; | 446 return session_id; |
| 447 } | 447 } |
| 448 } | 448 } |
| 449 return kSessionIDInvalid; | 449 return kSessionIDInvalid; |
| 450 } | 450 } |
| 451 | 451 |
| 452 SpeechRecognitionSessionContext | 452 SpeechRecognitionSessionContext |
| 453 SpeechRecognitionManagerImpl::GetSessionContext(int session_id) const { | 453 SpeechRecognitionManagerImpl::GetSessionContext(int session_id) const { |
| 454 return GetSession(session_id)->context; | 454 return GetSession(session_id)->context; |
| 455 } | 455 } |
| 456 | 456 |
| 457 void SpeechRecognitionManagerImpl::AbortAllSessionsForRenderProcess( | 457 void SpeechRecognitionManagerImpl::AbortAllSessionsForRenderProcess( |
| 458 int render_process_id) { | 458 int render_process_id) { |
| 459 // This method gracefully destroys sessions for the listener. However, since | 459 // This method gracefully destroys sessions for the listener. However, since |
| 460 // the listener itself is likely to be destroyed after this call, we avoid | 460 // the listener itself is likely to be destroyed after this call, we avoid |
| 461 // dispatching further events to it, marking the |listener_is_active| flag. | 461 // dispatching further events to it, marking the |listener_is_active| flag. |
| 462 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 462 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 463 for (SessionsTable::iterator it = sessions_.begin(); it != sessions_.end(); | 463 for (SessionsTable::iterator it = sessions_.begin(); it != sessions_.end(); |
| 464 ++it) { | 464 ++it) { |
| 465 Session* session = it->second; | 465 Session* session = it->second; |
| 466 if (session->context.render_process_id == render_process_id) { | 466 if (session->context.render_process_id == render_process_id) { |
| 467 AbortSession(session->id); | 467 AbortSession(session->id); |
| 468 session->listener_is_active = false; | 468 session->listener_is_active = false; |
| 469 } | 469 } |
| 470 } | 470 } |
| 471 } | 471 } |
| 472 | 472 |
| 473 void SpeechRecognitionManagerImpl::AbortAllSessionsForRenderView( | 473 void SpeechRecognitionManagerImpl::AbortAllSessionsForRenderView( |
| 474 int render_process_id, | 474 int render_process_id, |
| 475 int render_view_id) { | 475 int render_view_id) { |
| 476 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 476 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 477 for (SessionsTable::iterator it = sessions_.begin(); it != sessions_.end(); | 477 for (SessionsTable::iterator it = sessions_.begin(); it != sessions_.end(); |
| 478 ++it) { | 478 ++it) { |
| 479 Session* session = it->second; | 479 Session* session = it->second; |
| 480 if (session->context.render_process_id == render_process_id && | 480 if (session->context.render_process_id == render_process_id && |
| 481 session->context.render_view_id == render_view_id) { | 481 session->context.render_view_id == render_view_id) { |
| 482 AbortSession(session->id); | 482 AbortSession(session->id); |
| 483 } | 483 } |
| 484 } | 484 } |
| 485 } | 485 } |
| 486 | 486 |
| 487 // ----------------------- Core FSM implementation --------------------------- | 487 // ----------------------- Core FSM implementation --------------------------- |
| 488 void SpeechRecognitionManagerImpl::DispatchEvent(int session_id, | 488 void SpeechRecognitionManagerImpl::DispatchEvent(int session_id, |
| 489 FSMEvent event) { | 489 FSMEvent event) { |
| 490 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 490 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 491 | 491 |
| 492 // There are some corner cases in which the session might be deleted (due to | 492 // There are some corner cases in which the session might be deleted (due to |
| 493 // an EndRecognition event) between a request (e.g. Abort) and its dispatch. | 493 // an EndRecognition event) between a request (e.g. Abort) and its dispatch. |
| 494 if (!SessionExists(session_id)) | 494 if (!SessionExists(session_id)) |
| 495 return; | 495 return; |
| 496 | 496 |
| 497 Session* session = GetSession(session_id); | 497 Session* session = GetSession(session_id); |
| 498 FSMState session_state = GetSessionState(session_id); | 498 FSMState session_state = GetSessionState(session_id); |
| 499 DCHECK_LE(session_state, SESSION_STATE_MAX_VALUE); | 499 DCHECK_LE(session_state, SESSION_STATE_MAX_VALUE); |
| 500 DCHECK_LE(event, EVENT_MAX_VALUE); | 500 DCHECK_LE(event, EVENT_MAX_VALUE); |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 644 last_session_id_ = 1; | 644 last_session_id_ = 1; |
| 645 return last_session_id_; | 645 return last_session_id_; |
| 646 } | 646 } |
| 647 | 647 |
| 648 bool SpeechRecognitionManagerImpl::SessionExists(int session_id) const { | 648 bool SpeechRecognitionManagerImpl::SessionExists(int session_id) const { |
| 649 return sessions_.find(session_id) != sessions_.end(); | 649 return sessions_.find(session_id) != sessions_.end(); |
| 650 } | 650 } |
| 651 | 651 |
| 652 SpeechRecognitionManagerImpl::Session* | 652 SpeechRecognitionManagerImpl::Session* |
| 653 SpeechRecognitionManagerImpl::GetSession(int session_id) const { | 653 SpeechRecognitionManagerImpl::GetSession(int session_id) const { |
| 654 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 654 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 655 SessionsTable::const_iterator iter = sessions_.find(session_id); | 655 SessionsTable::const_iterator iter = sessions_.find(session_id); |
| 656 DCHECK(iter != sessions_.end()); | 656 DCHECK(iter != sessions_.end()); |
| 657 return iter->second; | 657 return iter->second; |
| 658 } | 658 } |
| 659 | 659 |
| 660 SpeechRecognitionEventListener* SpeechRecognitionManagerImpl::GetListener( | 660 SpeechRecognitionEventListener* SpeechRecognitionManagerImpl::GetListener( |
| 661 int session_id) const { | 661 int session_id) const { |
| 662 Session* session = GetSession(session_id); | 662 Session* session = GetSession(session_id); |
| 663 if (session->listener_is_active && session->config.event_listener) | 663 if (session->listener_is_active && session->config.event_listener) |
| 664 return session->config.event_listener.get(); | 664 return session->config.event_listener.get(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 694 SpeechRecognitionManagerImpl::Session::Session() | 694 SpeechRecognitionManagerImpl::Session::Session() |
| 695 : id(kSessionIDInvalid), | 695 : id(kSessionIDInvalid), |
| 696 abort_requested(false), | 696 abort_requested(false), |
| 697 listener_is_active(true) { | 697 listener_is_active(true) { |
| 698 } | 698 } |
| 699 | 699 |
| 700 SpeechRecognitionManagerImpl::Session::~Session() { | 700 SpeechRecognitionManagerImpl::Session::~Session() { |
| 701 } | 701 } |
| 702 | 702 |
| 703 } // namespace content | 703 } // namespace content |
| OLD | NEW |