Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(297)

Side by Side Diff: media/audio/audio_input_controller.cc

Issue 495983002: Improve logging related to start/stop and failure of audio input streams in Chrome (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: xians@ Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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");
223 233
224 #if defined(AUDIO_POWER_MONITORING) 234 #if defined(AUDIO_POWER_MONITORING)
225 // Create the audio (power) level meter given the provided audio parameters. 235 // 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 236 // An AudioBus is also needed to wrap the raw data buffer from the native
227 // layer to match AudioPowerMonitor::Scan(). 237 // layer to match AudioPowerMonitor::Scan().
228 // TODO(henrika): Remove use of extra AudioBus. See http://crbug.com/375155. 238 // TODO(henrika): Remove use of extra AudioBus. See http://crbug.com/375155.
239 last_audio_level_log_time_ = base::TimeTicks::Now();
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;
233 silence_state_ = SILENCE_STATE_NO_MEASUREMENT; 244 silence_state_ = SILENCE_STATE_NO_MEASUREMENT;
234 #endif 245 #endif
235 246
236 // TODO(miu): See TODO at top of file. Until that's resolved, assume all 247 // 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 248 // 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 249 // errors. In reality, probably only Windows needs to be treated as
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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, GetDataIsActive() ?
422 "AIC::FirstCheckForNoData => data is active" :
423 "AIC::FirstCheckForNoData => data is NOT active");
424 }
403 DoCheckForNoData(); 425 DoCheckForNoData();
404 } 426 }
405 427
406 void AudioInputController::DoCheckForNoData() { 428 void AudioInputController::DoCheckForNoData() {
407 DCHECK(task_runner_->BelongsToCurrentThread()); 429 DCHECK(task_runner_->BelongsToCurrentThread());
408 430
409 if (!GetDataIsActive()) { 431 if (!GetDataIsActive()) {
410 // The data-is-active marker will be false only if it has been more than 432 // 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 433 // one second since a data packet was recorded. This can happen if a
412 // capture device has been removed or disabled. 434 // capture device has been removed or disabled.
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
580 } 602 }
581 603
582 void AudioInputController::LogSilenceState(SilenceState value) { 604 void AudioInputController::LogSilenceState(SilenceState value) {
583 UMA_HISTOGRAM_ENUMERATION("Media.AudioInputControllerSessionSilenceReport", 605 UMA_HISTOGRAM_ENUMERATION("Media.AudioInputControllerSessionSilenceReport",
584 value, 606 value,
585 SILENCE_STATE_MAX + 1); 607 SILENCE_STATE_MAX + 1);
586 } 608 }
587 #endif 609 #endif
588 610
589 } // namespace media 611 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698