Chromium Code Reviews| Index: media/base/audio_buffer.cc |
| diff --git a/media/base/audio_buffer.cc b/media/base/audio_buffer.cc |
| index 25e8dbe1a1b77a42fef7211dae2710a78c08b486..039fefc983727a1d062c1e2e4552625a39e5d7c6 100644 |
| --- a/media/base/audio_buffer.cc |
| +++ b/media/base/audio_buffer.cc |
| @@ -263,4 +263,47 @@ void AudioBuffer::TrimEnd(int frames_to_trim) { |
| duration_ = CalculateDuration(adjusted_frame_count_, sample_rate_); |
| } |
| +void AudioBuffer::TrimRange(int start, int end) { |
| + CHECK_GE(start, 0); |
| + CHECK_LE(end, adjusted_frame_count_); |
| + |
| + const int frames_to_trim = end - start; |
| + CHECK_GE(frames_to_trim, 0); |
| + CHECK_LE(frames_to_trim, adjusted_frame_count_); |
| + |
| + const int bytes_per_channel = SampleFormatToBytesPerChannel(sample_format_); |
| + const int frames_to_copy = adjusted_frame_count_ - end; |
|
wolenetz
2014/05/05 19:01:23
nit: remove extra whitespace
wolenetz
2014/05/05 19:03:03
Never mind. My mistake for not seeing the '_' :)
|
| + if (frames_to_copy > 0) { |
| + switch (sample_format_) { |
| + case kSampleFormatPlanarS16: |
| + case kSampleFormatPlanarF32: |
| + // Planar data must be shifted per channel. |
| + for (int ch = 0; ch < channel_count_; ++ch) { |
| + memmove(channel_data_[ch] + (trim_start_ + start) * bytes_per_channel, |
| + channel_data_[ch] + (trim_start_ + end) * bytes_per_channel, |
| + bytes_per_channel * frames_to_copy); |
| + } |
| + break; |
| + case kSampleFormatU8: |
| + case kSampleFormatS16: |
| + case kSampleFormatS32: |
| + case kSampleFormatF32: { |
| + // Interleaved data can be shifted all at once. |
| + const int frame_size = channel_count_ * bytes_per_channel; |
| + memmove(channel_data_[0] + (trim_start_ + start) * frame_size, |
| + channel_data_[0] + (trim_start_ + end) * frame_size, |
| + frame_size * frames_to_copy); |
| + break; |
| + } |
| + case kUnknownSampleFormat: |
| + NOTREACHED() << "Invalid sample format!"; |
| + } |
| + } else { |
| + CHECK_EQ(frames_to_copy, 0); |
| + } |
| + |
| + // Trim the leftover data off the end of the buffer and update duration. |
| + TrimEnd(frames_to_trim); |
| +} |
| + |
| } // namespace media |