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

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

Issue 1864483002: Forward output glitch information from stream WebRTC log (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 6 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
« no previous file with comments | « media/audio/audio_input_controller.h ('k') | media/audio/audio_input_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/metrics/histogram_macros.h" 10 #include "base/metrics/histogram_macros.h"
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 void LogCaptureStartupResult(CaptureStartupResult result) { 110 void LogCaptureStartupResult(CaptureStartupResult result) {
111 UMA_HISTOGRAM_ENUMERATION("Media.AudioInputControllerCaptureStartupSuccess", 111 UMA_HISTOGRAM_ENUMERATION("Media.AudioInputControllerCaptureStartupSuccess",
112 result, 112 result,
113 CAPTURE_STARTUP_RESULT_MAX + 1); 113 CAPTURE_STARTUP_RESULT_MAX + 1);
114 114
115 } 115 }
116 116
117 namespace media { 117 namespace media {
118 118
119 // static 119 // static
120 AudioInputController::Factory* AudioInputController::factory_ = NULL; 120 AudioInputController::Factory* AudioInputController::factory_ = nullptr;
121 121
122 AudioInputController::AudioInputController(EventHandler* handler, 122 AudioInputController::AudioInputController(EventHandler* handler,
123 SyncWriter* sync_writer, 123 SyncWriter* sync_writer,
124 UserInputMonitor* user_input_monitor, 124 UserInputMonitor* user_input_monitor,
125 const bool agc_is_enabled) 125 const bool agc_is_enabled)
126 : creator_task_runner_(base::ThreadTaskRunnerHandle::Get()), 126 : creator_task_runner_(base::ThreadTaskRunnerHandle::Get()),
127 handler_(handler), 127 handler_(handler),
128 stream_(NULL), 128 stream_(nullptr),
129 data_is_active_(false), 129 data_is_active_(false),
130 state_(CLOSED), 130 state_(CLOSED),
131 sync_writer_(sync_writer), 131 sync_writer_(sync_writer),
132 max_volume_(0.0), 132 max_volume_(0.0),
133 user_input_monitor_(user_input_monitor), 133 user_input_monitor_(user_input_monitor),
134 agc_is_enabled_(agc_is_enabled), 134 agc_is_enabled_(agc_is_enabled),
135 #if defined(AUDIO_POWER_MONITORING) 135 #if defined(AUDIO_POWER_MONITORING)
136 power_measurement_is_enabled_(false), 136 power_measurement_is_enabled_(false),
137 log_silence_state_(false), 137 log_silence_state_(false),
138 silence_state_(SILENCE_STATE_NO_MEASUREMENT), 138 silence_state_(SILENCE_STATE_NO_MEASUREMENT),
(...skipping 10 matching lines...) Expand all
149 // static 149 // static
150 scoped_refptr<AudioInputController> AudioInputController::Create( 150 scoped_refptr<AudioInputController> AudioInputController::Create(
151 AudioManager* audio_manager, 151 AudioManager* audio_manager,
152 EventHandler* event_handler, 152 EventHandler* event_handler,
153 const AudioParameters& params, 153 const AudioParameters& params,
154 const std::string& device_id, 154 const std::string& device_id,
155 UserInputMonitor* user_input_monitor) { 155 UserInputMonitor* user_input_monitor) {
156 DCHECK(audio_manager); 156 DCHECK(audio_manager);
157 157
158 if (!params.IsValid() || (params.channels() > kMaxInputChannels)) 158 if (!params.IsValid() || (params.channels() > kMaxInputChannels))
159 return NULL; 159 return nullptr;
160 160
161 if (factory_) { 161 if (factory_) {
162 return factory_->Create( 162 return factory_->Create(
163 audio_manager, event_handler, params, user_input_monitor); 163 audio_manager, event_handler, params, user_input_monitor);
164 } 164 }
165 scoped_refptr<AudioInputController> controller( 165 scoped_refptr<AudioInputController> controller(new AudioInputController(
166 new AudioInputController(event_handler, NULL, user_input_monitor, false)); 166 event_handler, nullptr, user_input_monitor, false));
167 167
168 controller->task_runner_ = audio_manager->GetTaskRunner(); 168 controller->task_runner_ = audio_manager->GetTaskRunner();
169 169
170 // Create and open a new audio input stream from the existing 170 // Create and open a new audio input stream from the existing
171 // audio-device thread. 171 // audio-device thread.
172 if (!controller->task_runner_->PostTask( 172 if (!controller->task_runner_->PostTask(
173 FROM_HERE, 173 FROM_HERE,
174 base::Bind(&AudioInputController::DoCreate, 174 base::Bind(&AudioInputController::DoCreate,
175 controller, 175 controller,
176 base::Unretained(audio_manager), 176 base::Unretained(audio_manager),
177 params, 177 params,
178 device_id))) { 178 device_id))) {
179 controller = NULL; 179 controller = nullptr;
180 } 180 }
181 181
182 return controller; 182 return controller;
183 } 183 }
184 184
185 // static 185 // static
186 scoped_refptr<AudioInputController> AudioInputController::CreateLowLatency( 186 scoped_refptr<AudioInputController> AudioInputController::CreateLowLatency(
187 AudioManager* audio_manager, 187 AudioManager* audio_manager,
188 EventHandler* event_handler, 188 EventHandler* event_handler,
189 const AudioParameters& params, 189 const AudioParameters& params,
190 const std::string& device_id, 190 const std::string& device_id,
191 SyncWriter* sync_writer, 191 SyncWriter* sync_writer,
192 UserInputMonitor* user_input_monitor, 192 UserInputMonitor* user_input_monitor,
193 const bool agc_is_enabled) { 193 const bool agc_is_enabled) {
194 DCHECK(audio_manager); 194 DCHECK(audio_manager);
195 DCHECK(sync_writer); 195 DCHECK(sync_writer);
196 196
197 if (!params.IsValid() || (params.channels() > kMaxInputChannels)) 197 if (!params.IsValid() || (params.channels() > kMaxInputChannels))
198 return NULL; 198 return nullptr;
199 199
200 // Create the AudioInputController object and ensure that it runs on 200 // Create the AudioInputController object and ensure that it runs on
201 // the audio-manager thread. 201 // the audio-manager thread.
202 scoped_refptr<AudioInputController> controller(new AudioInputController( 202 scoped_refptr<AudioInputController> controller(new AudioInputController(
203 event_handler, sync_writer, user_input_monitor, agc_is_enabled)); 203 event_handler, sync_writer, user_input_monitor, agc_is_enabled));
204 controller->task_runner_ = audio_manager->GetTaskRunner(); 204 controller->task_runner_ = audio_manager->GetTaskRunner();
205 205
206 // Create and open a new audio input stream from the existing 206 // Create and open a new audio input stream from the existing
207 // audio-device thread. Use the provided audio-input device. 207 // audio-device thread. Use the provided audio-input device.
208 if (!controller->task_runner_->PostTask( 208 if (!controller->task_runner_->PostTask(
209 FROM_HERE, 209 FROM_HERE,
210 base::Bind(&AudioInputController::DoCreateForLowLatency, 210 base::Bind(&AudioInputController::DoCreateForLowLatency,
211 controller, 211 controller,
212 base::Unretained(audio_manager), 212 base::Unretained(audio_manager),
213 params, 213 params,
214 device_id))) { 214 device_id))) {
215 controller = NULL; 215 controller = nullptr;
216 } 216 }
217 217
218 return controller; 218 return controller;
219 } 219 }
220 220
221 // static 221 // static
222 scoped_refptr<AudioInputController> AudioInputController::CreateForStream( 222 scoped_refptr<AudioInputController> AudioInputController::CreateForStream(
223 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 223 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
224 EventHandler* event_handler, 224 EventHandler* event_handler,
225 AudioInputStream* stream, 225 AudioInputStream* stream,
(...skipping 11 matching lines...) Expand all
237 // TODO(miu): See TODO at top of file. Until that's resolved, we need to 237 // TODO(miu): See TODO at top of file. Until that's resolved, we need to
238 // disable the error auto-detection here (since the audio mirroring 238 // disable the error auto-detection here (since the audio mirroring
239 // implementation will reliably report error and close events). Note, of 239 // implementation will reliably report error and close events). Note, of
240 // course, that we're assuming CreateForStream() has been called for the audio 240 // course, that we're assuming CreateForStream() has been called for the audio
241 // mirroring use case only. 241 // mirroring use case only.
242 if (!controller->task_runner_->PostTask( 242 if (!controller->task_runner_->PostTask(
243 FROM_HERE, 243 FROM_HERE,
244 base::Bind(&AudioInputController::DoCreateForStream, 244 base::Bind(&AudioInputController::DoCreateForStream,
245 controller, 245 controller,
246 stream))) { 246 stream))) {
247 controller = NULL; 247 controller = nullptr;
248 } 248 }
249 249
250 return controller; 250 return controller;
251 } 251 }
252 252
253 void AudioInputController::Record() { 253 void AudioInputController::Record() {
254 task_runner_->PostTask(FROM_HERE, base::Bind( 254 task_runner_->PostTask(FROM_HERE, base::Bind(
255 &AudioInputController::DoRecord, this)); 255 &AudioInputController::DoRecord, this));
256 } 256 }
257 257
(...skipping 23 matching lines...) Expand all
281 // avoid adding logs and UMA for non-WebRTC clients. 281 // avoid adding logs and UMA for non-WebRTC clients.
282 power_measurement_is_enabled_ = agc_is_enabled_; 282 power_measurement_is_enabled_ = agc_is_enabled_;
283 last_audio_level_log_time_ = base::TimeTicks::Now(); 283 last_audio_level_log_time_ = base::TimeTicks::Now();
284 silence_state_ = SILENCE_STATE_NO_MEASUREMENT; 284 silence_state_ = SILENCE_STATE_NO_MEASUREMENT;
285 #endif 285 #endif
286 286
287 // TODO(miu): See TODO at top of file. Until that's resolved, assume all 287 // TODO(miu): See TODO at top of file. Until that's resolved, assume all
288 // platform audio input requires the |no_data_timer_| be used to auto-detect 288 // platform audio input requires the |no_data_timer_| be used to auto-detect
289 // errors. In reality, probably only Windows needs to be treated as 289 // errors. In reality, probably only Windows needs to be treated as
290 // unreliable here. 290 // unreliable here.
291 DoCreateForStream(audio_manager->MakeAudioInputStream(params, device_id)); 291 DoCreateForStream(audio_manager->MakeAudioInputStream(
292 params, device_id, base::Bind(&AudioInputController::LogMessage, this)));
292 } 293 }
293 294
294 void AudioInputController::DoCreateForLowLatency(AudioManager* audio_manager, 295 void AudioInputController::DoCreateForLowLatency(AudioManager* audio_manager,
295 const AudioParameters& params, 296 const AudioParameters& params,
296 const std::string& device_id) { 297 const std::string& device_id) {
297 DCHECK(task_runner_->BelongsToCurrentThread()); 298 DCHECK(task_runner_->BelongsToCurrentThread());
298 299
299 #if defined(AUDIO_POWER_MONITORING) 300 #if defined(AUDIO_POWER_MONITORING)
300 // We only log silence state UMA stats for low latency mode and if we use a 301 // We only log silence state UMA stats for low latency mode and if we use a
301 // real device. 302 // real device.
(...skipping 14 matching lines...) Expand all
316 317
317 if (!stream_) { 318 if (!stream_) {
318 if (handler_) 319 if (handler_)
319 handler_->OnError(this, STREAM_CREATE_ERROR); 320 handler_->OnError(this, STREAM_CREATE_ERROR);
320 LogCaptureStartupResult(CAPTURE_STARTUP_CREATE_STREAM_FAILED); 321 LogCaptureStartupResult(CAPTURE_STARTUP_CREATE_STREAM_FAILED);
321 return; 322 return;
322 } 323 }
323 324
324 if (stream_ && !stream_->Open()) { 325 if (stream_ && !stream_->Open()) {
325 stream_->Close(); 326 stream_->Close();
326 stream_ = NULL; 327 stream_ = nullptr;
327 if (handler_) 328 if (handler_)
328 handler_->OnError(this, STREAM_OPEN_ERROR); 329 handler_->OnError(this, STREAM_OPEN_ERROR);
329 LogCaptureStartupResult(CAPTURE_STARTUP_OPEN_STREAM_FAILED); 330 LogCaptureStartupResult(CAPTURE_STARTUP_OPEN_STREAM_FAILED);
330 return; 331 return;
331 } 332 }
332 333
333 DCHECK(!no_data_timer_.get()); 334 DCHECK(!no_data_timer_.get());
334 335
335 // Set AGC state using mode in |agc_is_enabled_| which can only be enabled in 336 // Set AGC state using mode in |agc_is_enabled_| which can only be enabled in
336 // CreateLowLatency(). 337 // CreateLowLatency().
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 FROM_HERE, 662 FROM_HERE,
662 base::Bind(&AudioInputController::DoDisableDebugRecording, 663 base::Bind(&AudioInputController::DoDisableDebugRecording,
663 this), 664 this),
664 callback); 665 callback);
665 } 666 }
666 667
667 void AudioInputController::DoStopCloseAndClearStream() { 668 void AudioInputController::DoStopCloseAndClearStream() {
668 DCHECK(task_runner_->BelongsToCurrentThread()); 669 DCHECK(task_runner_->BelongsToCurrentThread());
669 670
670 // Allow calling unconditionally and bail if we don't have a stream to close. 671 // Allow calling unconditionally and bail if we don't have a stream to close.
671 if (stream_ != NULL) { 672 if (stream_ != nullptr) {
672 stream_->Stop(); 673 stream_->Stop();
673 stream_->Close(); 674 stream_->Close();
674 stream_ = NULL; 675 stream_ = nullptr;
675 } 676 }
676 677
677 // The event handler should not be touched after the stream has been closed. 678 // The event handler should not be touched after the stream has been closed.
678 handler_ = NULL; 679 handler_ = nullptr;
679 } 680 }
680 681
681 void AudioInputController::SetDataIsActive(bool enabled) { 682 void AudioInputController::SetDataIsActive(bool enabled) {
682 base::subtle::Release_Store(&data_is_active_, enabled); 683 base::subtle::Release_Store(&data_is_active_, enabled);
683 } 684 }
684 685
685 bool AudioInputController::GetDataIsActive() { 686 bool AudioInputController::GetDataIsActive() {
686 return (base::subtle::Acquire_Load(&data_is_active_) != false); 687 return (base::subtle::Acquire_Load(&data_is_active_) != false);
687 } 688 }
688 689
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 input_writer_ = nullptr; 729 input_writer_ = nullptr;
729 } 730 }
730 731
731 void AudioInputController::WriteInputDataForDebugging( 732 void AudioInputController::WriteInputDataForDebugging(
732 std::unique_ptr<AudioBus> data) { 733 std::unique_ptr<AudioBus> data) {
733 DCHECK(task_runner_->BelongsToCurrentThread()); 734 DCHECK(task_runner_->BelongsToCurrentThread());
734 if (input_writer_) 735 if (input_writer_)
735 input_writer_->Write(std::move(data)); 736 input_writer_->Write(std::move(data));
736 } 737 }
737 738
739 void AudioInputController::LogMessage(const std::string& message) {
740 DCHECK(task_runner_->BelongsToCurrentThread());
741 handler_->OnLog(this, message);
742 }
743
738 } // namespace media 744 } // namespace media
OLDNEW
« no previous file with comments | « media/audio/audio_input_controller.h ('k') | media/audio/audio_input_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698