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_); |
+ 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: |