| 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 "content/renderer/media/audio_input_device.h" | 5 #include "content/renderer/media/audio_input_device.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
| 9 #include "base/threading/thread_restrictions.h" | 9 #include "base/threading/thread_restrictions.h" |
| 10 #include "base/time.h" | 10 #include "base/time.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 virtual void MapSharedMemory() OVERRIDE; | 30 virtual void MapSharedMemory() OVERRIDE; |
| 31 | 31 |
| 32 // Called whenever we receive notifications about pending data. | 32 // Called whenever we receive notifications about pending data. |
| 33 virtual void Process(int pending_data) OVERRIDE; | 33 virtual void Process(int pending_data) OVERRIDE; |
| 34 | 34 |
| 35 private: | 35 private: |
| 36 CaptureCallback* capture_callback_; | 36 CaptureCallback* capture_callback_; |
| 37 DISALLOW_COPY_AND_ASSIGN(AudioThreadCallback); | 37 DISALLOW_COPY_AND_ASSIGN(AudioThreadCallback); |
| 38 }; | 38 }; |
| 39 | 39 |
| 40 AudioInputDevice::AudioInputDevice(size_t buffer_size, | 40 AudioInputDevice::AudioInputDevice(const AudioParameters& params, |
| 41 int channels, | |
| 42 double sample_rate, | |
| 43 CaptureCallback* callback, | 41 CaptureCallback* callback, |
| 44 CaptureEventHandler* event_handler) | 42 CaptureEventHandler* event_handler) |
| 45 : ScopedLoopObserver(ChildProcess::current()->io_message_loop()), | 43 : ScopedLoopObserver(ChildProcess::current()->io_message_loop()), |
| 44 audio_parameters_(params), |
| 46 callback_(callback), | 45 callback_(callback), |
| 47 event_handler_(event_handler), | 46 event_handler_(event_handler), |
| 48 volume_(1.0), | 47 volume_(1.0), |
| 49 stream_id_(0), | 48 stream_id_(0), |
| 50 session_id_(0), | 49 session_id_(0), |
| 51 pending_device_ready_(false) { | 50 pending_device_ready_(false) { |
| 52 filter_ = RenderThreadImpl::current()->audio_input_message_filter(); | 51 filter_ = RenderThreadImpl::current()->audio_input_message_filter(); |
| 53 #if defined(OS_MACOSX) | |
| 54 DVLOG(1) << "Using AUDIO_PCM_LOW_LATENCY as input mode on Mac OS X."; | |
| 55 audio_parameters_.format = AudioParameters::AUDIO_PCM_LOW_LATENCY; | |
| 56 #elif defined(OS_WIN) | |
| 57 DVLOG(1) << "Using AUDIO_PCM_LOW_LATENCY as input mode on Windows."; | |
| 58 audio_parameters_.format = AudioParameters::AUDIO_PCM_LOW_LATENCY; | |
| 59 #else | |
| 60 // TODO(henrika): add support for AUDIO_PCM_LOW_LATENCY on Linux as well. | |
| 61 audio_parameters_.format = AudioParameters::AUDIO_PCM_LINEAR; | |
| 62 #endif | |
| 63 audio_parameters_.channels = channels; | |
| 64 audio_parameters_.sample_rate = static_cast<int>(sample_rate); | |
| 65 audio_parameters_.bits_per_sample = 16; | |
| 66 audio_parameters_.samples_per_packet = buffer_size; | |
| 67 } | 52 } |
| 68 | 53 |
| 69 AudioInputDevice::~AudioInputDevice() { | 54 AudioInputDevice::~AudioInputDevice() { |
| 70 // TODO(henrika): The current design requires that the user calls | 55 // TODO(henrika): The current design requires that the user calls |
| 71 // Stop before deleting this class. | 56 // Stop before deleting this class. |
| 72 CHECK_EQ(0, stream_id_); | 57 CHECK_EQ(0, stream_id_); |
| 73 } | 58 } |
| 74 | 59 |
| 75 void AudioInputDevice::Start() { | 60 void AudioInputDevice::Start() { |
| 76 DVLOG(1) << "Start()"; | 61 DVLOG(1) << "Start()"; |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 AudioInputDevice::AudioThreadCallback::~AudioThreadCallback() { | 281 AudioInputDevice::AudioThreadCallback::~AudioThreadCallback() { |
| 297 } | 282 } |
| 298 | 283 |
| 299 void AudioInputDevice::AudioThreadCallback::MapSharedMemory() { | 284 void AudioInputDevice::AudioThreadCallback::MapSharedMemory() { |
| 300 shared_memory_.Map(memory_length_); | 285 shared_memory_.Map(memory_length_); |
| 301 } | 286 } |
| 302 | 287 |
| 303 void AudioInputDevice::AudioThreadCallback::Process(int pending_data) { | 288 void AudioInputDevice::AudioThreadCallback::Process(int pending_data) { |
| 304 int audio_delay_milliseconds = pending_data / bytes_per_ms_; | 289 int audio_delay_milliseconds = pending_data / bytes_per_ms_; |
| 305 int16* memory = reinterpret_cast<int16*>(shared_memory_.memory()); | 290 int16* memory = reinterpret_cast<int16*>(shared_memory_.memory()); |
| 306 const size_t number_of_frames = audio_parameters_.samples_per_packet; | 291 const size_t number_of_frames = audio_parameters_.frames_per_buffer(); |
| 307 const int bytes_per_sample = sizeof(memory[0]); | 292 const int bytes_per_sample = sizeof(memory[0]); |
| 308 | 293 |
| 309 // Deinterleave each channel and convert to 32-bit floating-point | 294 // Deinterleave each channel and convert to 32-bit floating-point |
| 310 // with nominal range -1.0 -> +1.0. | 295 // with nominal range -1.0 -> +1.0. |
| 311 for (int channel_index = 0; channel_index < audio_parameters_.channels; | 296 for (int channel_index = 0; channel_index < audio_parameters_.channels(); |
| 312 ++channel_index) { | 297 ++channel_index) { |
| 313 media::DeinterleaveAudioChannel(memory, | 298 media::DeinterleaveAudioChannel(memory, |
| 314 audio_data_[channel_index], | 299 audio_data_[channel_index], |
| 315 audio_parameters_.channels, | 300 audio_parameters_.channels(), |
| 316 channel_index, | 301 channel_index, |
| 317 bytes_per_sample, | 302 bytes_per_sample, |
| 318 number_of_frames); | 303 number_of_frames); |
| 319 } | 304 } |
| 320 | 305 |
| 321 // Deliver captured data to the client in floating point format | 306 // Deliver captured data to the client in floating point format |
| 322 // and update the audio-delay measurement. | 307 // and update the audio-delay measurement. |
| 323 capture_callback_->Capture(audio_data_, number_of_frames, | 308 capture_callback_->Capture(audio_data_, number_of_frames, |
| 324 audio_delay_milliseconds); | 309 audio_delay_milliseconds); |
| 325 } | 310 } |
| OLD | NEW |