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

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: nit 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_) {
no longer working on chromium 2014/08/29 12:33:20 nit, you don't need {} here
henrika (OOO until Aug 14) 2014/08/29 12:51:30 Done.
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();
no longer working on chromium 2014/08/29 12:33:20 great.
henrika (OOO until Aug 14) 2014/08/29 12:51:30 thanks ;-)
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 }
no longer working on chromium 2014/08/29 12:33:20 ??
henrika (OOO until Aug 14) 2014/08/29 12:51:29 Done.
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
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
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()
no longer working on chromium 2014/08/29 12:33:20 shouldn't the format be like GetDataIsActive() ?
henrika (OOO until Aug 14) 2014/08/29 12:51:30 Tried that but git cl format keeps changing it bac
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
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
OLDNEW
« content/renderer/media/audio_input_message_filter.cc ('K') | « media/audio/audio_input_controller.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698