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. |
240 last_audio_level_log_time_ = base::TimeTicks::Now(); | |
tommi (sloooow) - chröme
2014/08/29 13:12:40
Nice. Perhaps we should file a bug for this issue
| |
229 audio_level_.reset(new media::AudioPowerMonitor( | 241 audio_level_.reset(new media::AudioPowerMonitor( |
230 params.sample_rate(), | 242 params.sample_rate(), |
231 TimeDelta::FromMilliseconds(kPowerMeasurementTimeConstantMilliseconds))); | 243 TimeDelta::FromMilliseconds(kPowerMeasurementTimeConstantMilliseconds))); |
232 audio_params_ = params; | 244 audio_params_ = params; |
233 silence_state_ = SILENCE_STATE_NO_MEASUREMENT; | 245 silence_state_ = SILENCE_STATE_NO_MEASUREMENT; |
234 #endif | 246 #endif |
235 | 247 |
236 // TODO(miu): See TODO at top of file. Until that's resolved, assume all | 248 // TODO(miu): See TODO at top of file. Until that's resolved, assume all |
237 // platform audio input requires the |no_data_timer_| be used to auto-detect | 249 // platform audio input requires the |no_data_timer_| be used to auto-detect |
238 // errors. In reality, probably only Windows needs to be treated as | 250 // errors. In reality, probably only Windows needs to be treated as |
239 // unreliable here. | 251 // unreliable here. |
240 DoCreateForStream(audio_manager->MakeAudioInputStream(params, device_id)); | 252 DoCreateForStream(audio_manager->MakeAudioInputStream(params, device_id)); |
241 } | 253 } |
242 | 254 |
243 void AudioInputController::DoCreateForLowLatency(AudioManager* audio_manager, | 255 void AudioInputController::DoCreateForLowLatency(AudioManager* audio_manager, |
244 const AudioParameters& params, | 256 const AudioParameters& params, |
245 const std::string& device_id) { | 257 const std::string& device_id) { |
246 DCHECK(task_runner_->BelongsToCurrentThread()); | 258 DCHECK(task_runner_->BelongsToCurrentThread()); |
247 | 259 |
248 #if defined(AUDIO_POWER_MONITORING) | 260 #if defined(AUDIO_POWER_MONITORING) |
249 // We only log silence state UMA stats for low latency mode and if we use a | 261 // We only log silence state UMA stats for low latency mode and if we use a |
250 // real device. | 262 // real device. |
251 if (params.format() != AudioParameters::AUDIO_FAKE) | 263 if (params.format() != AudioParameters::AUDIO_FAKE) |
252 log_silence_state_ = true; | 264 log_silence_state_ = true; |
253 #endif | 265 #endif |
254 | 266 |
255 DoCreate(audio_manager, params, device_id); | 267 DoCreate(audio_manager, params, device_id); |
256 } | 268 } |
257 | 269 |
258 void AudioInputController::DoCreateForStream( | 270 void AudioInputController::DoCreateForStream( |
259 AudioInputStream* stream_to_control) { | 271 AudioInputStream* stream_to_control) { |
260 DCHECK(task_runner_->BelongsToCurrentThread()); | 272 DCHECK(task_runner_->BelongsToCurrentThread()); |
261 | 273 |
262 DCHECK(!stream_); | 274 DCHECK(!stream_); |
263 stream_ = stream_to_control; | 275 stream_ = stream_to_control; |
264 | 276 |
265 if (!stream_) { | 277 if (!stream_) { |
266 if (handler_) | 278 if (handler_) |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
308 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioInputController.RecordTime"); | 320 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioInputController.RecordTime"); |
309 | 321 |
310 if (state_ != CREATED) | 322 if (state_ != CREATED) |
311 return; | 323 return; |
312 | 324 |
313 { | 325 { |
314 base::AutoLock auto_lock(lock_); | 326 base::AutoLock auto_lock(lock_); |
315 state_ = RECORDING; | 327 state_ = RECORDING; |
316 } | 328 } |
317 | 329 |
330 if (handler_) | |
331 handler_->OnLog(this, "AIC::DoRecord"); | |
332 | |
318 if (no_data_timer_) { | 333 if (no_data_timer_) { |
319 // Start the data timer. Once |kTimerResetIntervalSeconds| have passed, | 334 // Start the data timer. Once |kTimerResetIntervalSeconds| have passed, |
320 // a callback to FirstCheckForNoData() is made. | 335 // a callback to FirstCheckForNoData() is made. |
321 no_data_timer_->Reset(); | 336 no_data_timer_->Reset(); |
322 } | 337 } |
323 | 338 |
324 stream_->Start(this); | 339 stream_->Start(this); |
325 if (handler_) | 340 if (handler_) |
326 handler_->OnRecording(this); | 341 handler_->OnRecording(this); |
327 } | 342 } |
328 | 343 |
329 void AudioInputController::DoClose() { | 344 void AudioInputController::DoClose() { |
330 DCHECK(task_runner_->BelongsToCurrentThread()); | 345 DCHECK(task_runner_->BelongsToCurrentThread()); |
331 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioInputController.CloseTime"); | 346 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioInputController.CloseTime"); |
332 | 347 |
333 if (state_ == CLOSED) | 348 if (state_ == CLOSED) |
334 return; | 349 return; |
335 | 350 |
351 if (handler_) | |
352 handler_->OnLog(this, "AIC::DoClose"); | |
353 | |
336 // Delete the timer on the same thread that created it. | 354 // Delete the timer on the same thread that created it. |
337 no_data_timer_.reset(); | 355 no_data_timer_.reset(); |
338 | 356 |
339 DoStopCloseAndClearStream(); | 357 DoStopCloseAndClearStream(); |
340 SetDataIsActive(false); | 358 SetDataIsActive(false); |
341 | 359 |
342 if (SharedMemoryAndSyncSocketMode()) | 360 if (SharedMemoryAndSyncSocketMode()) |
343 sync_writer_->Close(); | 361 sync_writer_->Close(); |
344 | 362 |
345 if (user_input_monitor_) | 363 if (user_input_monitor_) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
393 return; | 411 return; |
394 | 412 |
395 stream_->SetAutomaticGainControl(enabled); | 413 stream_->SetAutomaticGainControl(enabled); |
396 } | 414 } |
397 | 415 |
398 void AudioInputController::FirstCheckForNoData() { | 416 void AudioInputController::FirstCheckForNoData() { |
399 DCHECK(task_runner_->BelongsToCurrentThread()); | 417 DCHECK(task_runner_->BelongsToCurrentThread()); |
400 LogCaptureStartupResult(GetDataIsActive() ? | 418 LogCaptureStartupResult(GetDataIsActive() ? |
401 CAPTURE_STARTUP_OK : | 419 CAPTURE_STARTUP_OK : |
402 CAPTURE_STARTUP_NO_DATA_CALLBACK); | 420 CAPTURE_STARTUP_NO_DATA_CALLBACK); |
421 if (handler_) { | |
422 handler_->OnLog(this, | |
423 GetDataIsActive() | |
424 ? "AIC::FirstCheckForNoData => data is active" | |
425 : "AIC::FirstCheckForNoData => data is NOT active"); | |
426 } | |
403 DoCheckForNoData(); | 427 DoCheckForNoData(); |
404 } | 428 } |
405 | 429 |
406 void AudioInputController::DoCheckForNoData() { | 430 void AudioInputController::DoCheckForNoData() { |
407 DCHECK(task_runner_->BelongsToCurrentThread()); | 431 DCHECK(task_runner_->BelongsToCurrentThread()); |
408 | 432 |
409 if (!GetDataIsActive()) { | 433 if (!GetDataIsActive()) { |
410 // The data-is-active marker will be false only if it has been more than | 434 // 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 | 435 // one second since a data packet was recorded. This can happen if a |
412 // capture device has been removed or disabled. | 436 // capture device has been removed or disabled. |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
580 } | 604 } |
581 | 605 |
582 void AudioInputController::LogSilenceState(SilenceState value) { | 606 void AudioInputController::LogSilenceState(SilenceState value) { |
583 UMA_HISTOGRAM_ENUMERATION("Media.AudioInputControllerSessionSilenceReport", | 607 UMA_HISTOGRAM_ENUMERATION("Media.AudioInputControllerSessionSilenceReport", |
584 value, | 608 value, |
585 SILENCE_STATE_MAX + 1); | 609 SILENCE_STATE_MAX + 1); |
586 } | 610 } |
587 #endif | 611 #endif |
588 | 612 |
589 } // namespace media | 613 } // namespace media |
OLD | NEW |