Chromium Code Reviews| Index: webrtc/common_audio/channel_buffer.h |
| diff --git a/webrtc/common_audio/channel_buffer.h b/webrtc/common_audio/channel_buffer.h |
| index faecec9194ceb86be1d37104e24e7ad0a6915048..d6661de4ff7ee8629e432f3f915cb99fe919e403 100644 |
| --- a/webrtc/common_audio/channel_buffer.h |
| +++ b/webrtc/common_audio/channel_buffer.h |
| @@ -48,13 +48,14 @@ class ChannelBuffer { |
| bands_(new T*[num_channels * num_bands]), |
| num_frames_(num_frames), |
| num_frames_per_band_(num_frames / num_bands), |
| + num_allocated_channels_(num_channels), |
| num_channels_(num_channels), |
| num_bands_(num_bands) { |
| - for (size_t i = 0; i < num_channels_; ++i) { |
| + for (size_t i = 0; i < num_allocated_channels_; ++i) { |
| for (size_t j = 0; j < num_bands_; ++j) { |
| - channels_[j * num_channels_ + i] = |
| + channels_[j * num_allocated_channels_ + i] = |
| &data_[i * num_frames_ + j * num_frames_per_band_]; |
| - bands_[i * num_bands_ + j] = channels_[j * num_channels_ + i]; |
| + bands_[i * num_bands_ + j] = channels_[j * num_allocated_channels_ + i]; |
| } |
| } |
| } |
| @@ -63,7 +64,7 @@ class ChannelBuffer { |
| // Usage: |
| // channels()[channel][sample]. |
| // Where: |
| - // 0 <= channel < |num_channels_| |
| + // 0 <= channel < |num_allocated_channels_| |
| // 0 <= sample < |num_frames_| |
| T* const* channels() { return channels(0); } |
| const T* const* channels() const { return channels(0); } |
| @@ -73,11 +74,11 @@ class ChannelBuffer { |
| // channels(band)[channel][sample]. |
| // Where: |
| // 0 <= band < |num_bands_| |
| - // 0 <= channel < |num_channels_| |
| + // 0 <= channel < |num_allocated_channels_| |
| // 0 <= sample < |num_frames_per_band_| |
| const T* const* channels(size_t band) const { |
| RTC_DCHECK_LT(band, num_bands_); |
| - return &channels_[band * num_channels_]; |
| + return &channels_[band * num_allocated_channels_]; |
| } |
| T* const* channels(size_t band) { |
| const ChannelBuffer<T>* t = this; |
| @@ -118,7 +119,12 @@ class ChannelBuffer { |
| size_t num_frames_per_band() const { return num_frames_per_band_; } |
| size_t num_channels() const { return num_channels_; } |
| size_t num_bands() const { return num_bands_; } |
| - size_t size() const {return num_frames_ * num_channels_; } |
| + size_t size() const {return num_frames_ * num_allocated_channels_; } |
| + |
| + void set_num_channels(size_t num_channels) { |
| + RTC_DCHECK_LE(num_channels, num_allocated_channels_); |
|
tlegrand-webrtc
2016/06/28 13:48:04
This can never happen, unless someone do a program
aluebs-webrtc
2016/06/29 00:48:40
As of today it can't and it never should if there
|
| + num_channels_ = num_channels; |
| + } |
| void SetDataForTesting(const T* data, size_t size) { |
| RTC_CHECK_EQ(size, this->size()); |
| @@ -131,7 +137,10 @@ class ChannelBuffer { |
| std::unique_ptr<T* []> bands_; |
| const size_t num_frames_; |
| const size_t num_frames_per_band_; |
| - const size_t num_channels_; |
| + // Number of channels the internal buffer holds. |
| + const size_t num_allocated_channels_; |
| + // Number of channels the user sees. |
| + size_t num_channels_; |
| const size_t num_bands_; |
| }; |
| @@ -152,7 +161,13 @@ class IFChannelBuffer { |
| size_t num_frames() const { return ibuf_.num_frames(); } |
| size_t num_frames_per_band() const { return ibuf_.num_frames_per_band(); } |
| - size_t num_channels() const { return ibuf_.num_channels(); } |
| + size_t num_channels() const { |
| + return ivalid_ ? ibuf_.num_channels() : fbuf_.num_channels(); |
| + } |
| + void set_num_channels(size_t num_channels) { |
| + ibuf_.set_num_channels(num_channels); |
| + fbuf_.set_num_channels(num_channels); |
| + } |
| size_t num_bands() const { return ibuf_.num_bands(); } |
| private: |