| 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 "media/audio/audio_output_device.h" | 5 #include "media/audio/audio_output_device.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.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" |
| 11 #include "media/audio/audio_output_controller.h" | 11 #include "media/audio/audio_output_controller.h" |
| 12 #include "media/audio/audio_util.h" | 12 #include "media/audio/audio_util.h" |
| 13 #include "media/audio/shared_memory_util.h" |
| 13 | 14 |
| 14 namespace media { | 15 namespace media { |
| 15 | 16 |
| 16 // Takes care of invoking the render callback on the audio thread. | 17 // Takes care of invoking the render callback on the audio thread. |
| 17 // An instance of this class is created for each capture stream in | 18 // An instance of this class is created for each capture stream in |
| 18 // OnStreamCreated(). | 19 // OnStreamCreated(). |
| 19 class AudioOutputDevice::AudioThreadCallback | 20 class AudioOutputDevice::AudioThreadCallback |
| 20 : public AudioDeviceThread::Callback { | 21 : public AudioDeviceThread::Callback { |
| 21 public: | 22 public: |
| 22 AudioThreadCallback(const AudioParameters& audio_parameters, | 23 AudioThreadCallback(const AudioParameters& audio_parameters, |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 | 247 |
| 247 AudioOutputDevice::AudioThreadCallback::~AudioThreadCallback() { | 248 AudioOutputDevice::AudioThreadCallback::~AudioThreadCallback() { |
| 248 } | 249 } |
| 249 | 250 |
| 250 void AudioOutputDevice::AudioThreadCallback::MapSharedMemory() { | 251 void AudioOutputDevice::AudioThreadCallback::MapSharedMemory() { |
| 251 shared_memory_.Map(TotalSharedMemorySizeInBytes(memory_length_)); | 252 shared_memory_.Map(TotalSharedMemorySizeInBytes(memory_length_)); |
| 252 } | 253 } |
| 253 | 254 |
| 254 // Called whenever we receive notifications about pending data. | 255 // Called whenever we receive notifications about pending data. |
| 255 void AudioOutputDevice::AudioThreadCallback::Process(int pending_data) { | 256 void AudioOutputDevice::AudioThreadCallback::Process(int pending_data) { |
| 256 if (pending_data == AudioOutputController::kPauseMark) { | 257 if (pending_data == kPauseMark) { |
| 257 memset(shared_memory_.memory(), 0, memory_length_); | 258 memset(shared_memory_.memory(), 0, memory_length_); |
| 258 SetActualDataSizeInBytes(&shared_memory_, memory_length_, 0); | 259 SetActualDataSizeInBytes(&shared_memory_, memory_length_, 0); |
| 259 return; | 260 return; |
| 260 } | 261 } |
| 261 | 262 |
| 262 // Convert the number of pending bytes in the render buffer | 263 // Convert the number of pending bytes in the render buffer |
| 263 // into milliseconds. | 264 // into milliseconds. |
| 264 int audio_delay_milliseconds = pending_data / bytes_per_ms_; | 265 int audio_delay_milliseconds = pending_data / bytes_per_ms_; |
| 265 | 266 |
| 266 TRACE_EVENT0("audio", "AudioOutputDevice::FireRenderCallback"); | 267 TRACE_EVENT0("audio", "AudioOutputDevice::FireRenderCallback"); |
| 267 | 268 |
| 268 // Update the audio-delay measurement then ask client to render audio. | 269 // Update the audio-delay measurement then ask client to render audio. |
| 269 size_t num_frames = render_callback_->Render( | 270 size_t num_frames = render_callback_->Render( |
| 270 audio_bus_.get(), audio_delay_milliseconds); | 271 audio_bus_.get(), audio_delay_milliseconds); |
| 271 | 272 |
| 272 // Interleave, scale, and clip to int. | 273 // Interleave, scale, and clip to int. |
| 273 // TODO(dalecurtis): Remove this when we have float everywhere. | 274 // TODO(dalecurtis): Remove this when we have float everywhere. |
| 274 InterleaveFloatToInt( | 275 InterleaveFloatToInt( |
| 275 audio_bus_.get(), shared_memory_.memory(), num_frames, | 276 audio_bus_.get(), shared_memory_.memory(), num_frames, |
| 276 audio_parameters_.bits_per_sample() / 8); | 277 audio_parameters_.bits_per_sample() / 8); |
| 277 | 278 |
| 278 // Let the host know we are done. | 279 // Let the host know we are done. |
| 279 SetActualDataSizeInBytes( | 280 SetActualDataSizeInBytes( |
| 280 &shared_memory_, memory_length_, | 281 &shared_memory_, memory_length_, |
| 281 num_frames * audio_parameters_.GetBytesPerFrame()); | 282 num_frames * audio_parameters_.GetBytesPerFrame()); |
| 282 } | 283 } |
| 283 | 284 |
| 284 } // namespace media. | 285 } // namespace media. |
| OLD | NEW |