Index: media/audio/win/waveout_output_win.cc |
diff --git a/media/audio/win/waveout_output_win.cc b/media/audio/win/waveout_output_win.cc |
index 75bfed4bbff0d2b1b0c037b531feeaac4558533e..b5b8926e29a1beefbdc2ac22cb67fb1d25b7b24f 100644 |
--- a/media/audio/win/waveout_output_win.cc |
+++ b/media/audio/win/waveout_output_win.cc |
@@ -90,7 +90,8 @@ PCMWaveOutAudioOutputStream::PCMWaveOutAudioOutputStream( |
volume_(1), |
channels_(params.channels()), |
pending_bytes_(0), |
- waiting_handle_(NULL) { |
+ waiting_handle_(NULL), |
+ audio_bus_(AudioBus::Create(params)) { |
format_.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; |
format_.Format.nChannels = params.channels(); |
format_.Format.nSamplesPerSec = params.sample_rate(); |
@@ -341,10 +342,15 @@ void PCMWaveOutAudioOutputStream::QueueNextPacket(WAVEHDR *buffer) { |
uint32 scaled_pending_bytes = pending_bytes_ * channels_ / |
format_.Format.nChannels; |
// TODO(sergeyu): Specify correct hardware delay for AudioBuffersState. |
- uint32 used = callback_->OnMoreData( |
- reinterpret_cast<uint8*>(buffer->lpData), buffer_size_, |
- AudioBuffersState(scaled_pending_bytes, 0)); |
+ int frames_filled = callback_->OnMoreData( |
+ audio_bus_.get(), AudioBuffersState(scaled_pending_bytes, 0)); |
+ uint32 used = frames_filled * audio_bus_->channels() * |
+ format_.Format.wBitsPerSample / 8; |
+ |
if (used <= buffer_size_) { |
+ audio_bus_->ToInterleaved( |
+ frames_filled, format_.Format.wBitsPerSample / 8, buffer->lpData); |
+ |
buffer->dwBufferLength = used * format_.Format.nChannels / channels_; |
if (channels_ > 2 && format_.Format.nChannels == 2) { |
media::FoldChannels(buffer->lpData, used, |