Index: media/base/audio_bus.cc |
diff --git a/media/base/audio_bus.cc b/media/base/audio_bus.cc |
index 677a0c7a350c21edeb7842a14c283833df90768c..21072abe6259cd095daadb4e9cb672b862fe68f9 100644 |
--- a/media/base/audio_bus.cc |
+++ b/media/base/audio_bus.cc |
@@ -61,8 +61,8 @@ static void FromInterleavedInternal(const void* src, int start_frame, |
// |Format| is the destination type, |Fixed| is a type larger than |Format| |
// such that operations can be made without overflowing. |
template<class Format, class Fixed> |
-static void ToInterleavedInternal(const AudioBus* source, int frames, |
- void* dst) { |
+static void ToInterleavedInternal(const AudioBus* source, int start_frame, |
+ int frames, void* dst) { |
Format* dest = static_cast<Format*>(dst); |
static const Format kBias = std::numeric_limits<Format>::is_signed ? 0 : |
@@ -75,7 +75,8 @@ static void ToInterleavedInternal(const AudioBus* source, int frames, |
int channels = source->channels(); |
for (int ch = 0; ch < channels; ++ch) { |
const float* channel_data = source->channel(ch); |
- for (int i = 0, offset = ch; i < frames; ++i, offset += channels) { |
+ for (int i = start_frame, offset = ch; i < frames; |
+ ++i, offset += channels) { |
float v = channel_data[i]; |
Fixed sample = v * (v < 0 ? -kMinValue : kMaxValue); |
@@ -268,19 +269,24 @@ void AudioBus::FromInterleaved(const void* source, int frames, |
FromInterleavedPartial(source, 0, frames, bytes_per_sample); |
} |
-// TODO(dalecurtis): See if intrinsic optimizations help any here. |
void AudioBus::ToInterleaved(int frames, int bytes_per_sample, |
void* dest) const { |
- CheckOverflow(0, frames, frames_); |
+ ToInterleavedPartial(0, frames, bytes_per_sample, dest); |
+} |
+ |
+// TODO(dalecurtis): See if intrinsic optimizations help any here. |
+void AudioBus::ToInterleavedPartial(int start_frame, int frames, |
+ int bytes_per_sample, void* dest) const { |
+ CheckOverflow(start_frame, frames, frames_); |
switch (bytes_per_sample) { |
case 1: |
- ToInterleavedInternal<uint8, int16>(this, frames, dest); |
+ ToInterleavedInternal<uint8, int16>(this, start_frame, frames, dest); |
break; |
case 2: |
- ToInterleavedInternal<int16, int32>(this, frames, dest); |
+ ToInterleavedInternal<int16, int32>(this, start_frame, frames, dest); |
break; |
case 4: |
- ToInterleavedInternal<int32, int64>(this, frames, dest); |
+ ToInterleavedInternal<int32, int64>(this, start_frame, frames, dest); |
break; |
default: |
NOTREACHED() << "Unsupported bytes per sample encountered."; |