Index: content/renderer/media/audio_device.cc |
=================================================================== |
--- content/renderer/media/audio_device.cc (revision 113847) |
+++ content/renderer/media/audio_device.cc (working copy) |
@@ -287,10 +287,7 @@ |
audio_thread_->SetThreadPriority(base::kThreadPriority_RealtimeAudio); |
base::SharedMemory shared_memory(shared_memory_handle_, false); |
- shared_memory.Map(memory_length_); |
- // Allow the client to pre-populate the buffer. |
- FireRenderCallback(reinterpret_cast<int16*>(shared_memory.memory())); |
- |
+ shared_memory.Map(media::TotalSharedMemorySizeInBytes(memory_length_)); |
base::SyncSocket socket(socket_handle_); |
no longer working on chromium
2011/12/16 12:21:13
I am actually thinking about the opposite solution
enal1
2011/12/16 16:48:23
I believe I answered once. Pre-buffering does not
|
int pending_data; |
@@ -301,6 +298,7 @@ |
socket.Receive(&pending_data, sizeof(pending_data))) { |
if (pending_data == media::AudioOutputController::kPauseMark) { |
memset(shared_memory.memory(), 0, memory_length_); |
+ media::SetActualDataSizeInBytes(&shared_memory, memory_length_, 0); |
continue; |
} else if (pending_data < 0) { |
break; |
@@ -308,16 +306,24 @@ |
// Convert the number of pending bytes in the render buffer |
// into milliseconds. |
audio_delay_milliseconds_ = pending_data / bytes_per_ms; |
- FireRenderCallback(reinterpret_cast<int16*>(shared_memory.memory())); |
+ size_t num_frames = FireRenderCallback( |
+ reinterpret_cast<int16*>(shared_memory.memory())); |
+ // Let the host know we are done. |
henrika (OOO until Aug 14)
2011/12/16 10:52:17
Shouldn't comments have an empty line above when t
enal1
2011/12/16 16:48:23
Done.
|
+ media::SetActualDataSizeInBytes(&shared_memory, |
+ memory_length_, |
+ num_frames * channels_ * sizeof(int16)); |
} |
} |
-void AudioDevice::FireRenderCallback(int16* data) { |
+size_t AudioDevice::FireRenderCallback(int16* data) { |
TRACE_EVENT0("audio", "AudioDevice::FireRenderCallback"); |
+ size_t num_frames = 0; |
if (callback_) { |
// Update the audio-delay measurement then ask client to render audio. |
- callback_->Render(audio_data_, buffer_size_, audio_delay_milliseconds_); |
+ num_frames = callback_->Render(audio_data_, |
+ buffer_size_, |
+ audio_delay_milliseconds_); |
// Interleave, scale, and clip to int16. |
// TODO(crogers): avoid converting to integer here, and pass the data |
@@ -327,6 +333,7 @@ |
data, |
buffer_size_); |
} |
+ return num_frames; |
} |
void AudioDevice::ShutDownAudioThread() { |