Chromium Code Reviews| 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 "media/audio/audio_input_controller.h" | 5 #include "media/audio/audio_input_controller.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "base/threading/thread_restrictions.h" | 9 #include "base/threading/thread_restrictions.h" |
| 10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 return factory_->Create( | 113 return factory_->Create( |
| 114 audio_manager, event_handler, params, user_input_monitor); | 114 audio_manager, event_handler, params, user_input_monitor); |
| 115 } | 115 } |
| 116 scoped_refptr<AudioInputController> controller( | 116 scoped_refptr<AudioInputController> controller( |
| 117 new AudioInputController(event_handler, NULL, user_input_monitor)); | 117 new AudioInputController(event_handler, NULL, user_input_monitor)); |
| 118 | 118 |
| 119 controller->task_runner_ = audio_manager->GetTaskRunner(); | 119 controller->task_runner_ = audio_manager->GetTaskRunner(); |
| 120 | 120 |
| 121 // Create and open a new audio input stream from the existing | 121 // Create and open a new audio input stream from the existing |
| 122 // audio-device thread. | 122 // audio-device thread. |
| 123 if (!controller->task_runner_->PostTask(FROM_HERE, | 123 if (!controller->task_runner_->PostTask( |
| 124 base::Bind(&AudioInputController::DoCreate, controller, | 124 FROM_HERE, |
| 125 base::Unretained(audio_manager), params, device_id))) { | 125 base::Bind(&AudioInputController::DoCreate, |
| 126 controller, | |
| 127 base::Unretained(audio_manager), | |
| 128 params, | |
| 129 device_id))) { | |
| 126 controller = NULL; | 130 controller = NULL; |
| 127 } | 131 } |
| 128 | 132 |
| 129 return controller; | 133 return controller; |
| 130 } | 134 } |
| 131 | 135 |
| 132 // static | 136 // static |
| 133 scoped_refptr<AudioInputController> AudioInputController::CreateLowLatency( | 137 scoped_refptr<AudioInputController> AudioInputController::CreateLowLatency( |
| 134 AudioManager* audio_manager, | 138 AudioManager* audio_manager, |
| 135 EventHandler* event_handler, | 139 EventHandler* event_handler, |
| 136 const AudioParameters& params, | 140 const AudioParameters& params, |
| 137 const std::string& device_id, | 141 const std::string& device_id, |
| 138 SyncWriter* sync_writer, | 142 SyncWriter* sync_writer, |
| 139 UserInputMonitor* user_input_monitor) { | 143 UserInputMonitor* user_input_monitor) { |
| 140 DCHECK(audio_manager); | 144 DCHECK(audio_manager); |
| 141 DCHECK(sync_writer); | 145 DCHECK(sync_writer); |
| 142 | 146 |
| 143 if (!params.IsValid() || (params.channels() > kMaxInputChannels)) | 147 if (!params.IsValid() || (params.channels() > kMaxInputChannels)) |
| 144 return NULL; | 148 return NULL; |
| 145 | 149 |
| 146 // Create the AudioInputController object and ensure that it runs on | 150 // Create the AudioInputController object and ensure that it runs on |
| 147 // the audio-manager thread. | 151 // the audio-manager thread. |
| 148 scoped_refptr<AudioInputController> controller( | 152 scoped_refptr<AudioInputController> controller( |
| 149 new AudioInputController(event_handler, sync_writer, user_input_monitor)); | 153 new AudioInputController(event_handler, sync_writer, user_input_monitor)); |
| 150 controller->task_runner_ = audio_manager->GetTaskRunner(); | 154 controller->task_runner_ = audio_manager->GetTaskRunner(); |
| 151 | 155 |
| 152 // Create and open a new audio input stream from the existing | 156 // Create and open a new audio input stream from the existing |
| 153 // audio-device thread. Use the provided audio-input device. | 157 // audio-device thread. Use the provided audio-input device. |
| 154 if (!controller->task_runner_->PostTask(FROM_HERE, | 158 if (!controller->task_runner_->PostTask( |
| 155 base::Bind(&AudioInputController::DoCreateForLowLatency, controller, | 159 FROM_HERE, |
| 156 base::Unretained(audio_manager), params, device_id))) { | 160 base::Bind(&AudioInputController::DoCreateForLowLatency, |
| 161 controller, | |
| 162 base::Unretained(audio_manager), | |
| 163 params, | |
| 164 device_id))) { | |
| 157 controller = NULL; | 165 controller = NULL; |
| 158 } | 166 } |
| 159 | 167 |
| 160 return controller; | 168 return controller; |
| 161 } | 169 } |
| 162 | 170 |
| 163 // static | 171 // static |
| 164 scoped_refptr<AudioInputController> AudioInputController::CreateForStream( | 172 scoped_refptr<AudioInputController> AudioInputController::CreateForStream( |
| 165 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 173 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 166 EventHandler* event_handler, | 174 EventHandler* event_handler, |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 213 void AudioInputController::SetAutomaticGainControl(bool enabled) { | 221 void AudioInputController::SetAutomaticGainControl(bool enabled) { |
| 214 task_runner_->PostTask(FROM_HERE, base::Bind( | 222 task_runner_->PostTask(FROM_HERE, base::Bind( |
| 215 &AudioInputController::DoSetAutomaticGainControl, this, enabled)); | 223 &AudioInputController::DoSetAutomaticGainControl, this, enabled)); |
| 216 } | 224 } |
| 217 | 225 |
| 218 void AudioInputController::DoCreate(AudioManager* audio_manager, | 226 void AudioInputController::DoCreate(AudioManager* audio_manager, |
| 219 const AudioParameters& params, | 227 const AudioParameters& params, |
| 220 const std::string& device_id) { | 228 const std::string& device_id) { |
| 221 DCHECK(task_runner_->BelongsToCurrentThread()); | 229 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 222 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioInputController.CreateTime"); | 230 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioInputController.CreateTime"); |
| 231 if (handler_) { | |
| 232 handler_->OnLog(this, "AIC::DoCreate"); | |
| 233 } | |
| 223 | 234 |
| 224 #if defined(AUDIO_POWER_MONITORING) | 235 #if defined(AUDIO_POWER_MONITORING) |
| 225 // Create the audio (power) level meter given the provided audio parameters. | 236 // Create the audio (power) level meter given the provided audio parameters. |
| 226 // An AudioBus is also needed to wrap the raw data buffer from the native | 237 // An AudioBus is also needed to wrap the raw data buffer from the native |
| 227 // layer to match AudioPowerMonitor::Scan(). | 238 // layer to match AudioPowerMonitor::Scan(). |
| 228 // TODO(henrika): Remove use of extra AudioBus. See http://crbug.com/375155. | 239 // TODO(henrika): Remove use of extra AudioBus. See http://crbug.com/375155. |
| 229 audio_level_.reset(new media::AudioPowerMonitor( | 240 audio_level_.reset(new media::AudioPowerMonitor( |
| 230 params.sample_rate(), | 241 params.sample_rate(), |
| 231 TimeDelta::FromMilliseconds(kPowerMeasurementTimeConstantMilliseconds))); | 242 TimeDelta::FromMilliseconds(kPowerMeasurementTimeConstantMilliseconds))); |
| 232 audio_params_ = params; | 243 audio_params_ = params; |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 246 DCHECK(task_runner_->BelongsToCurrentThread()); | 257 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 247 | 258 |
| 248 #if defined(AUDIO_POWER_MONITORING) | 259 #if defined(AUDIO_POWER_MONITORING) |
| 249 // We only log silence state UMA stats for low latency mode and if we use a | 260 // We only log silence state UMA stats for low latency mode and if we use a |
| 250 // real device. | 261 // real device. |
| 251 if (params.format() != AudioParameters::AUDIO_FAKE) | 262 if (params.format() != AudioParameters::AUDIO_FAKE) |
| 252 log_silence_state_ = true; | 263 log_silence_state_ = true; |
| 253 #endif | 264 #endif |
| 254 | 265 |
| 255 DoCreate(audio_manager, params, device_id); | 266 DoCreate(audio_manager, params, device_id); |
| 256 } | 267 } |
|
tommi (sloooow) - chröme
2014/08/29 11:32:03
fix
henrika (OOO until Aug 14)
2014/08/29 12:39:37
Done.
| |
| 257 | 268 |
| 258 void AudioInputController::DoCreateForStream( | 269 void AudioInputController::DoCreateForStream( |
| 259 AudioInputStream* stream_to_control) { | 270 AudioInputStream* stream_to_control) { |
| 260 DCHECK(task_runner_->BelongsToCurrentThread()); | 271 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 261 | 272 |
| 262 DCHECK(!stream_); | 273 DCHECK(!stream_); |
| 263 stream_ = stream_to_control; | 274 stream_ = stream_to_control; |
| 264 | 275 |
| 265 if (!stream_) { | 276 if (!stream_) { |
| 266 if (handler_) | 277 if (handler_) |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 308 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioInputController.RecordTime"); | 319 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioInputController.RecordTime"); |
| 309 | 320 |
| 310 if (state_ != CREATED) | 321 if (state_ != CREATED) |
| 311 return; | 322 return; |
| 312 | 323 |
| 313 { | 324 { |
| 314 base::AutoLock auto_lock(lock_); | 325 base::AutoLock auto_lock(lock_); |
| 315 state_ = RECORDING; | 326 state_ = RECORDING; |
| 316 } | 327 } |
| 317 | 328 |
| 329 if (handler_) | |
| 330 handler_->OnLog(this, "AIC::DoRecord"); | |
| 331 | |
| 318 if (no_data_timer_) { | 332 if (no_data_timer_) { |
| 319 // Start the data timer. Once |kTimerResetIntervalSeconds| have passed, | 333 // Start the data timer. Once |kTimerResetIntervalSeconds| have passed, |
| 320 // a callback to FirstCheckForNoData() is made. | 334 // a callback to FirstCheckForNoData() is made. |
| 321 no_data_timer_->Reset(); | 335 no_data_timer_->Reset(); |
| 322 } | 336 } |
| 323 | 337 |
| 324 stream_->Start(this); | 338 stream_->Start(this); |
| 325 if (handler_) | 339 if (handler_) |
| 326 handler_->OnRecording(this); | 340 handler_->OnRecording(this); |
| 327 } | 341 } |
| 328 | 342 |
| 329 void AudioInputController::DoClose() { | 343 void AudioInputController::DoClose() { |
| 330 DCHECK(task_runner_->BelongsToCurrentThread()); | 344 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 331 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioInputController.CloseTime"); | 345 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioInputController.CloseTime"); |
| 332 | 346 |
| 333 if (state_ == CLOSED) | 347 if (state_ == CLOSED) |
| 334 return; | 348 return; |
| 335 | 349 |
| 350 if (handler_) | |
| 351 handler_->OnLog(this, "AIC::DoClose"); | |
| 352 | |
| 336 // Delete the timer on the same thread that created it. | 353 // Delete the timer on the same thread that created it. |
| 337 no_data_timer_.reset(); | 354 no_data_timer_.reset(); |
| 338 | 355 |
| 339 DoStopCloseAndClearStream(); | 356 DoStopCloseAndClearStream(); |
| 340 SetDataIsActive(false); | 357 SetDataIsActive(false); |
| 341 | 358 |
| 342 if (SharedMemoryAndSyncSocketMode()) | 359 if (SharedMemoryAndSyncSocketMode()) |
| 343 sync_writer_->Close(); | 360 sync_writer_->Close(); |
| 344 | 361 |
| 345 if (user_input_monitor_) | 362 if (user_input_monitor_) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 393 return; | 410 return; |
| 394 | 411 |
| 395 stream_->SetAutomaticGainControl(enabled); | 412 stream_->SetAutomaticGainControl(enabled); |
| 396 } | 413 } |
| 397 | 414 |
| 398 void AudioInputController::FirstCheckForNoData() { | 415 void AudioInputController::FirstCheckForNoData() { |
| 399 DCHECK(task_runner_->BelongsToCurrentThread()); | 416 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 400 LogCaptureStartupResult(GetDataIsActive() ? | 417 LogCaptureStartupResult(GetDataIsActive() ? |
| 401 CAPTURE_STARTUP_OK : | 418 CAPTURE_STARTUP_OK : |
| 402 CAPTURE_STARTUP_NO_DATA_CALLBACK); | 419 CAPTURE_STARTUP_NO_DATA_CALLBACK); |
| 420 if (handler_) { | |
| 421 handler_->OnLog(this, | |
| 422 GetDataIsActive() | |
| 423 ? "AIC::FirstCheckForNoData => data is active" | |
|
tommi (sloooow) - chröme
2014/08/29 11:32:03
nit: I think the convention is to have operators a
henrika (OOO until Aug 14)
2014/08/29 12:39:37
Actually, it was git cl format which did it ;-)
tommi (sloooow) - chröme
2014/08/29 13:12:39
Ah well, here's an example of where git cl format
| |
| 424 : "AIC::FirstCheckForNoData => data is NOT active"); | |
| 425 } | |
| 403 DoCheckForNoData(); | 426 DoCheckForNoData(); |
| 404 } | 427 } |
| 405 | 428 |
| 406 void AudioInputController::DoCheckForNoData() { | 429 void AudioInputController::DoCheckForNoData() { |
| 407 DCHECK(task_runner_->BelongsToCurrentThread()); | 430 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 408 | 431 |
| 409 if (!GetDataIsActive()) { | 432 if (!GetDataIsActive()) { |
| 410 // The data-is-active marker will be false only if it has been more than | 433 // The data-is-active marker will be false only if it has been more than |
| 411 // one second since a data packet was recorded. This can happen if a | 434 // one second since a data packet was recorded. This can happen if a |
| 412 // capture device has been removed or disabled. | 435 // capture device has been removed or disabled. |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 580 } | 603 } |
| 581 | 604 |
| 582 void AudioInputController::LogSilenceState(SilenceState value) { | 605 void AudioInputController::LogSilenceState(SilenceState value) { |
| 583 UMA_HISTOGRAM_ENUMERATION("Media.AudioInputControllerSessionSilenceReport", | 606 UMA_HISTOGRAM_ENUMERATION("Media.AudioInputControllerSessionSilenceReport", |
| 584 value, | 607 value, |
| 585 SILENCE_STATE_MAX + 1); | 608 SILENCE_STATE_MAX + 1); |
| 586 } | 609 } |
| 587 #endif | 610 #endif |
| 588 | 611 |
| 589 } // namespace media | 612 } // namespace media |
| OLD | NEW |