| 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);
 | 
| 
 |