Index: media/audio/win/audio_low_latency_output_win.cc |
diff --git a/media/audio/win/audio_low_latency_output_win.cc b/media/audio/win/audio_low_latency_output_win.cc |
index 78c823f9acbe3d3f17bf84733a0118184751a312..a5ef19d00ff2b74e0e166bdbf08f618773fafc24 100644 |
--- a/media/audio/win/audio_low_latency_output_win.cc |
+++ b/media/audio/win/audio_low_latency_output_win.cc |
@@ -338,7 +338,8 @@ WASAPIAudioOutputStream::WASAPIAudioOutputStream(AudioManagerWin* manager, |
share_mode_(GetShareMode()), |
client_channel_count_(params.channels()), |
num_written_frames_(0), |
- source_(NULL) { |
+ source_(NULL), |
+ audio_bus_(AudioBus::Create(params)) { |
CHECK(com_init_.succeeded()); |
DCHECK(manager_); |
@@ -821,9 +822,15 @@ void WASAPIAudioOutputStream::Run() { |
if (channel_factor() == 1) { |
// Case I: no up-mixing. |
- num_filled_bytes = source_->OnMoreData( |
- audio_data, packet_size_bytes_, |
- AudioBuffersState(0, audio_delay_bytes)); |
+ int frames_filled = source_->OnMoreData( |
+ audio_bus_.get(), AudioBuffersState(0, audio_delay_bytes)); |
+ num_filled_bytes = frames_filled * frame_size_; |
+ DCHECK_LE(num_filled_bytes, packet_size_bytes_); |
+ // Note: If this ever changes to output raw float the data must be |
+ // clipped and sanitized since it may come from an untrusted |
+ // source such as NaCl. |
+ audio_bus_->ToInterleaved( |
+ frames_filled, bytes_per_sample, audio_data); |
} else { |
// Case II: up-mixing. |
const int audio_source_size_bytes = |
@@ -831,9 +838,17 @@ void WASAPIAudioOutputStream::Run() { |
scoped_array<uint8> buffer; |
buffer.reset(new uint8[audio_source_size_bytes]); |
- num_filled_bytes = source_->OnMoreData( |
- buffer.get(), audio_source_size_bytes, |
- AudioBuffersState(0, audio_delay_bytes)); |
+ int frames_filled = source_->OnMoreData( |
+ audio_bus_.get(), AudioBuffersState(0, audio_delay_bytes)); |
+ num_filled_bytes = |
+ frames_filled * bytes_per_sample * audio_bus_->channels(); |
+ DCHECK_LE(num_filled_bytes, |
+ static_cast<size_t>(audio_source_size_bytes)); |
+ // Note: If this ever changes to output raw float the data must be |
+ // clipped and sanitized since it may come from an untrusted |
+ // source such as NaCl. |
+ audio_bus_->ToInterleaved( |
+ frames_filled, bytes_per_sample, buffer.get()); |
// Do channel up-mixing on 16-bit PCM samples. |
num_filled_bytes = ChannelUpMix(buffer.get(), |