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 // http://crbug.com/114700 | 275 // http://crbug.com/114700 |
275 audio_bus_->ToInterleaved(num_frames, audio_parameters_.bits_per_sample() / 8, | 276 audio_bus_->ToInterleaved(num_frames, audio_parameters_.bits_per_sample() / 8, |
276 shared_memory_.memory()); | 277 shared_memory_.memory()); |
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 |