summaryrefslogtreecommitdiffstats
path: root/content/browser/renderer_host/media/audio_sync_reader.cc
diff options
context:
space:
mode:
authorgrunell <grunell@chromium.org>2015-12-14 01:52:11 -0800
committerCommit bot <commit-bot@chromium.org>2015-12-14 09:53:19 +0000
commitdb03a8d1128783ff4803364ba616ae5fac8822f7 (patch)
treefa0eec2acc5818b93c089bcc37d643e5c13deed1 /content/browser/renderer_host/media/audio_sync_reader.cc
parentb4f1d4eb29f6580db9cba6af36f4fd7a0c96f861 (diff)
downloadchromium_src-db03a8d1128783ff4803364ba616ae5fac8822f7.zip
chromium_src-db03a8d1128783ff4803364ba616ae5fac8822f7.tar.gz
chromium_src-db03a8d1128783ff4803364ba616ae5fac8822f7.tar.bz2
Forward the number of skipped frames by the OS in audio playout.
* Only for Mac. Will be done in follow-up CLs: * Windows. * Hooking this up to the AEC. BUG=560371 Review URL: https://codereview.chromium.org/1487983002 Cr-Commit-Position: refs/heads/master@{#364990}
Diffstat (limited to 'content/browser/renderer_host/media/audio_sync_reader.cc')
-rw-r--r--content/browser/renderer_host/media/audio_sync_reader.cc20
1 files changed, 17 insertions, 3 deletions
diff --git a/content/browser/renderer_host/media/audio_sync_reader.cc b/content/browser/renderer_host/media/audio_sync_reader.cc
index f6b3d6c..ea794a2 100644
--- a/content/browser/renderer_host/media/audio_sync_reader.cc
+++ b/content/browser/renderer_host/media/audio_sync_reader.cc
@@ -15,6 +15,7 @@
#include "media/audio/audio_parameters.h"
using media::AudioBus;
+using media::AudioOutputBuffer;
namespace {
@@ -51,8 +52,12 @@ AudioSyncReader::AudioSyncReader(base::SharedMemory* shared_memory,
maximum_wait_time_(base::TimeDelta::FromMilliseconds(20)),
#endif
buffer_index_(0) {
- DCHECK_EQ(packet_size_, AudioBus::CalculateMemorySize(params));
- output_bus_ = AudioBus::WrapMemory(params, shared_memory->memory());
+ DCHECK_EQ(static_cast<size_t>(packet_size_),
+ sizeof(media::AudioOutputBufferParameters) +
+ AudioBus::CalculateMemorySize(params));
+ AudioOutputBuffer* buffer =
+ reinterpret_cast<AudioOutputBuffer*>(shared_memory_->memory());
+ output_bus_ = AudioBus::WrapMemory(params, buffer->audio);
output_bus_->Zero();
}
@@ -81,10 +86,19 @@ AudioSyncReader::~AudioSyncReader() {
}
// media::AudioOutputController::SyncReader implementations.
-void AudioSyncReader::UpdatePendingBytes(uint32 bytes) {
+void AudioSyncReader::UpdatePendingBytes(uint32_t bytes,
+ uint32_t frames_skipped) {
+ // Increase the number of skipped frames stored in shared memory. We don't
+ // send it over the socket since sending more than 4 bytes might lead to being
+ // descheduled. The reading side will zero it when consumed.
+ AudioOutputBuffer* buffer =
+ reinterpret_cast<AudioOutputBuffer*>(shared_memory_->memory());
+ buffer->params.frames_skipped += frames_skipped;
+
// Zero out the entire output buffer to avoid stuttering/repeating-buffers
// in the anomalous case if the renderer is unable to keep up with real-time.
output_bus_->Zero();
+
socket_->Send(&bytes, sizeof(bytes));
++buffer_index_;
}