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

Unified Diff: media/audio/audio_output_resampler.cc

Issue 11568021: Merge 169553 (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1312/src/
Patch Set: Created 8 years 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
« no previous file with comments | « media/audio/audio_output_controller.cc ('k') | media/audio/win/waveout_output_win.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/audio/audio_output_resampler.cc
===================================================================
--- media/audio/audio_output_resampler.cc (revision 172971)
+++ media/audio/audio_output_resampler.cc (working copy)
@@ -11,6 +11,7 @@
#include "base/message_loop.h"
#include "base/metrics/histogram.h"
#include "base/time.h"
+#include "build/build_config.h"
#include "media/audio/audio_io.h"
#include "media/audio/audio_output_dispatcher_impl.h"
#include "media/audio/audio_output_proxy.h"
@@ -22,6 +23,10 @@
#include "media/base/media_switches.h"
#include "media/base/multi_channel_resampler.h"
+#if defined(OS_WIN)
+#include "media/audio/win/core_audio_util_win.h"
+#endif
+
namespace media {
class OnMoreDataResampler : public AudioOutputStream::AudioSourceCallback {
@@ -95,7 +100,11 @@
// before resampling.
bool downmix_early_;
- DISALLOW_COPY_AND_ASSIGN(OnMoreDataResampler);
+ // If we're using WaveOut on Windows' we always have to wait for DataReady()
+ // before calling |source_callback_|.
+ bool waveout_wait_hack_;
+
+ DISALLOW_COPY_AND_ASSIGN(OnMoreDataConverter);
};
// Record UMA statistics for hardware output configuration.
@@ -337,7 +346,8 @@
outstanding_audio_bytes_(0),
output_bytes_per_frame_(output_params.GetBytesPerFrame()),
input_bytes_per_frame_(input_params.GetBytesPerFrame()),
- downmix_early_(false) {
+ downmix_early_(false),
+ waveout_wait_hack_(false) {
// Handle different input and output channel layouts.
if (input_params.channel_layout() != output_params.channel_layout()) {
DVLOG(1) << "Remixing channel layout from " << input_params.channel_layout()
@@ -391,6 +401,17 @@
&OnMoreDataResampler::SourceCallback_Locked,
base::Unretained(this))));
}
+
+ // TODO(dalecurtis): We should require all render side clients to use a
+ // buffer size that's a multiple of the hardware buffer size scaled by the
+ // request_sample_rate / hw_sample_rate. Doing so ensures each hardware
+ // request for audio data results in only a single render side callback and
+ // would allow us to remove this hack. See http://crbug.com/162207.
+#if defined(OS_WIN)
+ waveout_wait_hack_ =
+ output_params.format() == AudioParameters::AUDIO_PCM_LINEAR ||
+ !CoreAudioUtil::IsSupported();
+#endif
}
OnMoreDataResampler::~OnMoreDataResampler() {}
@@ -482,6 +503,9 @@
bool needs_downmix = channel_mixer_ && downmix_early_;
AudioBus* temp_dest = needs_downmix ? unmixed_audio_.get() : dest;
+ if (waveout_wait_hack_)
+ source_callback_->WaitTillDataReady();
+
// Retrieve data from the original callback. Zero any unfilled frames.
int frames = source_callback_->OnMoreIOData(
source, temp_dest, new_buffers_state);
« no previous file with comments | « media/audio/audio_output_controller.cc ('k') | media/audio/win/waveout_output_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698