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

Side by Side Diff: media/audio/linux/alsa_input.cc

Issue 9702019: Adds Analog Gain Control (AGC) to the WebRTC client. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 8 years, 8 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
« no previous file with comments | « media/audio/linux/alsa_input.h ('k') | media/audio/mac/audio_input_mac.h » ('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/linux/alsa_input.h" 5 #include "media/audio/linux/alsa_input.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 FROM_HERE, 192 FROM_HERE,
193 base::Bind(&AlsaPcmInputStream::ReadAudio, weak_factory_.GetWeakPtr()), 193 base::Bind(&AlsaPcmInputStream::ReadAudio, weak_factory_.GetWeakPtr()),
194 next_check_time); 194 next_check_time);
195 return; 195 return;
196 } 196 }
197 197
198 int num_buffers = frames / params_.frames_per_buffer(); 198 int num_buffers = frames / params_.frames_per_buffer();
199 int num_buffers_read = num_buffers; 199 int num_buffers_read = num_buffers;
200 uint32 hardware_delay_bytes = 200 uint32 hardware_delay_bytes =
201 static_cast<uint32>(GetCurrentDelay() * params_.GetBytesPerFrame()); 201 static_cast<uint32>(GetCurrentDelay() * params_.GetBytesPerFrame());
202 double normalized_volume = 0.0;
203
204 // Update the AGC volume level once every second. Note that, |volume| is
205 // also updated each time SetVolume() is called through IPC by the
206 // render-side AGC.
207 QueryAgcVolume(&normalized_volume);
208
202 while (num_buffers--) { 209 while (num_buffers--) {
203 int frames_read = wrapper_->PcmReadi(device_handle_, audio_buffer_.get(), 210 int frames_read = wrapper_->PcmReadi(device_handle_, audio_buffer_.get(),
204 params_.frames_per_buffer()); 211 params_.frames_per_buffer());
205 if (frames_read == params_.frames_per_buffer()) { 212 if (frames_read == params_.frames_per_buffer()) {
206 callback_->OnData(this, audio_buffer_.get(), bytes_per_buffer_, 213 callback_->OnData(this, audio_buffer_.get(), bytes_per_buffer_,
207 hardware_delay_bytes); 214 hardware_delay_bytes, normalized_volume);
208 } else { 215 } else {
209 LOG(WARNING) << "PcmReadi returning less than expected frames: " 216 LOG(WARNING) << "PcmReadi returning less than expected frames: "
210 << frames_read << " vs. " << params_.frames_per_buffer() 217 << frames_read << " vs. " << params_.frames_per_buffer()
211 << ". Dropping this buffer."; 218 << ". Dropping this buffer.";
212 } 219 }
213 } 220 }
214 221
215 next_read_time_ += base::TimeDelta::FromMilliseconds( 222 next_read_time_ += base::TimeDelta::FromMilliseconds(
216 buffer_duration_ms_ * num_buffers_read); 223 buffer_duration_ms_ * num_buffers_read);
217 base::TimeDelta delay = next_read_time_ - base::Time::Now(); 224 base::TimeDelta delay = next_read_time_ - base::Time::Now();
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 if (!mixer_handle_ || !mixer_element_handle_) { 303 if (!mixer_handle_ || !mixer_element_handle_) {
297 DLOG(WARNING) << "SetVolume is not supported for " << device_name_; 304 DLOG(WARNING) << "SetVolume is not supported for " << device_name_;
298 return; 305 return;
299 } 306 }
300 307
301 int error = wrapper_->MixerSelemSetCaptureVolumeAll( 308 int error = wrapper_->MixerSelemSetCaptureVolumeAll(
302 mixer_element_handle_, static_cast<long>(volume)); 309 mixer_element_handle_, static_cast<long>(volume));
303 if (error < 0) { 310 if (error < 0) {
304 DLOG(WARNING) << "Unable to set volume for " << device_name_; 311 DLOG(WARNING) << "Unable to set volume for " << device_name_;
305 } 312 }
313
314 // Update the AGC volume level based on the last setting above. Note that,
315 // the volume-level resolution is not infinite and it is therefore not
316 // possible to assume that the volume provided as input parameter can be
317 // used directly. Instead, a new query to the audio hardware is required.
318 // This method does nothing if AGC is disabled.
319 UpdateAgcVolume();
306 } 320 }
307 321
308 double AlsaPcmInputStream::GetVolume() { 322 double AlsaPcmInputStream::GetVolume() {
309 if (!mixer_handle_ || !mixer_element_handle_) { 323 if (!mixer_handle_ || !mixer_element_handle_) {
310 DLOG(WARNING) << "GetVolume is not supported for " << device_name_; 324 DLOG(WARNING) << "GetVolume is not supported for " << device_name_;
311 return 0.0; 325 return 0.0;
312 } 326 }
313 327
314 long current_volume = 0; 328 long current_volume = 0;
315 int error = wrapper_->MixerSelemGetCaptureVolume( 329 int error = wrapper_->MixerSelemGetCaptureVolume(
316 mixer_element_handle_, static_cast<snd_mixer_selem_channel_id_t>(0), 330 mixer_element_handle_, static_cast<snd_mixer_selem_channel_id_t>(0),
317 &current_volume); 331 &current_volume);
318 if (error < 0) { 332 if (error < 0) {
319 DLOG(WARNING) << "Unable to get volume for " << device_name_; 333 DLOG(WARNING) << "Unable to get volume for " << device_name_;
320 return 0.0; 334 return 0.0;
321 } 335 }
322 336
323 return static_cast<double>(current_volume); 337 return static_cast<double>(current_volume);
324 } 338 }
325 339
326 void AlsaPcmInputStream::HandleError(const char* method, int error) { 340 void AlsaPcmInputStream::HandleError(const char* method, int error) {
327 LOG(WARNING) << method << ": " << wrapper_->StrError(error); 341 LOG(WARNING) << method << ": " << wrapper_->StrError(error);
328 callback_->OnError(this, error); 342 callback_->OnError(this, error);
329 } 343 }
OLDNEW
« no previous file with comments | « media/audio/linux/alsa_input.h ('k') | media/audio/mac/audio_input_mac.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698