| /* | 
 |  *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #ifndef MODULES_AUDIO_PROCESSING_AEC3_RENDER_BUFFER_H_ | 
 | #define MODULES_AUDIO_PROCESSING_AEC3_RENDER_BUFFER_H_ | 
 |  | 
 | #include <array> | 
 | #include <memory> | 
 |  | 
 | #include "api/array_view.h" | 
 | #include "modules/audio_processing/aec3/fft_buffer.h" | 
 | #include "modules/audio_processing/aec3/fft_data.h" | 
 | #include "modules/audio_processing/aec3/matrix_buffer.h" | 
 | #include "modules/audio_processing/aec3/vector_buffer.h" | 
 | #include "rtc_base/constructormagic.h" | 
 |  | 
 | namespace webrtc { | 
 |  | 
 | // Provides a buffer of the render data for the echo remover. | 
 | class RenderBuffer { | 
 |  public: | 
 |   RenderBuffer(MatrixBuffer* block_buffer, | 
 |                VectorBuffer* spectrum_buffer, | 
 |                FftBuffer* fft_buffer); | 
 |   ~RenderBuffer(); | 
 |  | 
 |   // Get a block. | 
 |   const std::vector<std::vector<float>>& Block(int buffer_offset_blocks) const { | 
 |     int position = | 
 |         block_buffer_->OffsetIndex(block_buffer_->read, buffer_offset_blocks); | 
 |     return block_buffer_->buffer[position]; | 
 |   } | 
 |  | 
 |   // Get the spectrum from one of the FFTs in the buffer. | 
 |   rtc::ArrayView<const float> Spectrum(int buffer_offset_ffts) const { | 
 |     int position = spectrum_buffer_->OffsetIndex(spectrum_buffer_->read, | 
 |                                                  buffer_offset_ffts); | 
 |     return spectrum_buffer_->buffer[position]; | 
 |   } | 
 |  | 
 |   // Returns the circular fft buffer. | 
 |   rtc::ArrayView<const FftData> GetFftBuffer() const { | 
 |     return fft_buffer_->buffer; | 
 |   } | 
 |  | 
 |   // Returns the current position in the circular buffer. | 
 |   size_t Position() const { | 
 |     RTC_DCHECK_EQ(spectrum_buffer_->read, fft_buffer_->read); | 
 |     RTC_DCHECK_EQ(spectrum_buffer_->write, fft_buffer_->write); | 
 |     return fft_buffer_->read; | 
 |   } | 
 |  | 
 |   // Returns the sum of the spectrums for a certain number of FFTs. | 
 |   void SpectralSum(size_t num_spectra, | 
 |                    std::array<float, kFftLengthBy2Plus1>* X2) const; | 
 |  | 
 |  private: | 
 |   const MatrixBuffer* const block_buffer_; | 
 |   const VectorBuffer* const spectrum_buffer_; | 
 |   const FftBuffer* const fft_buffer_; | 
 |   RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderBuffer); | 
 | }; | 
 |  | 
 | }  // namespace webrtc | 
 |  | 
 | #endif  // MODULES_AUDIO_PROCESSING_AEC3_RENDER_BUFFER_H_ |