Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Unified Diff: media/audio/win/audio_unified_win.cc

Issue 12049070: Avoids irregular OnMoreData callbacks on Windows using Core Audio (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cleaned up Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/audio/win/audio_unified_win.cc
diff --git a/media/audio/win/audio_unified_win.cc b/media/audio/win/audio_unified_win.cc
index 677f9e0260aea59c10879be3e4daef4e10a206e7..bd0426b9d14bcac6a8f186af140fa30edd3ddf2b 100644
--- a/media/audio/win/audio_unified_win.cc
+++ b/media/audio/win/audio_unified_win.cc
@@ -246,12 +246,16 @@ void WASAPIUnifiedStream::Start(AudioSourceCallback* callback) {
return;
}
- // Reset the counter for number of rendered frames taking into account the
- // fact that we always initialize the render side with silence.
- UINT32 num_queued_frames = 0;
- audio_output_client_->GetCurrentPadding(&num_queued_frames);
- DCHECK_EQ(num_queued_frames, endpoint_render_buffer_size_frames_);
- num_written_frames_ = num_queued_frames;
+ // Ensure that the endpoint buffer is prepared with silence.
+ UINT32 num_filled_frames = 0;
+ if (share_mode_ == AUDCLNT_SHAREMODE_SHARED) {
+ if (!FillRenderEndpointBufferWithSilence(&num_filled_frames)) {
+ DLOG(WARNING) << "Failed to prepare endpoint buffers with silence.";
+ return;
+ }
+ DCHECK_EQ(num_filled_frames, endpoint_render_buffer_size_frames_);
+ }
+ num_written_frames_ = num_filled_frames;
// Start output streaming data between the endpoint buffer and the audio
// engine.
@@ -566,4 +570,37 @@ void WASAPIUnifiedStream::StopAndJoinThread(HRESULT err) {
HandleError(err);
}
+bool WASAPIUnifiedStream::FillRenderEndpointBufferWithSilence(
DaleCurtis 2013/01/31 02:34:33 Should this just be in CoreAudioUtil?
henrika (OOO until Aug 14) 2013/01/31 14:29:38 Good point. I will fix that.
+ UINT32* num_written_frames) {
tommi (sloooow) - chröme 2013/01/31 13:42:08 indent
henrika (OOO until Aug 14) 2013/01/31 14:29:38 Done.
+ UINT32 num_queued_frames = 0;
+ HRESULT hr = audio_output_client_->GetCurrentPadding(&num_queued_frames);
+ if (FAILED(hr))
+ return false;
+
+ BYTE* data = NULL;
+ int num_frames_to_fill =
+ endpoint_render_buffer_size_frames_ - num_queued_frames;
+ hr = audio_render_client_->GetBuffer(num_frames_to_fill, &data);
+ if (FAILED(hr))
+ return false;
+
+ // Using the AUDCLNT_BUFFERFLAGS_SILENT flag eliminates the need to
+ // explicitly write silence data to the rendering buffer.
+ DVLOG(2) << "filling up " << num_frames_to_fill << " frames with silence";
+ hr = audio_render_client_->ReleaseBuffer(num_frames_to_fill,
+ AUDCLNT_BUFFERFLAGS_SILENT);
tommi (sloooow) - chröme 2013/01/31 13:42:08 indent
henrika (OOO until Aug 14) 2013/01/31 14:29:38 Done.
+ if (FAILED(hr))
+ return false;
+
+ // Get the amount of valid, unread data that the endpoint buffer
+ // currently contains. This amount corresponds to the number of written
+ // audio frames.
+ hr = audio_output_client_->GetCurrentPadding(&num_queued_frames);
+ if (FAILED(hr))
+ return false;
+ *num_written_frames = num_queued_frames;
+
+ return SUCCEEDED(hr);
tommi (sloooow) - chröme 2013/01/31 13:42:08 nit: you've already checked hr, so you can return
henrika (OOO until Aug 14) 2013/01/31 14:29:38 I use the "hängslen och livrem" principle here ;-)
+}
+
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698