| /* |
| * Copyright (c) 2018 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_AGC2_RNN_VAD_RING_BUFFER_H_ |
| #define MODULES_AUDIO_PROCESSING_AGC2_RNN_VAD_RING_BUFFER_H_ |
| |
| #include <array> |
| #include <cstring> |
| #include <type_traits> |
| |
| #include "api/array_view.h" |
| |
| namespace webrtc { |
| namespace rnn_vad { |
| |
| // Ring buffer for N arrays of type T each one with size S. |
| template <typename T, int S, int N> |
| class RingBuffer { |
| static_assert(S > 0, ""); |
| static_assert(N > 0, ""); |
| static_assert(std::is_arithmetic<T>::value, |
| "Integral or floating point required."); |
| |
| public: |
| RingBuffer() : tail_(0) {} |
| RingBuffer(const RingBuffer&) = delete; |
| RingBuffer& operator=(const RingBuffer&) = delete; |
| ~RingBuffer() = default; |
| // Set the ring buffer values to zero. |
| void Reset() { buffer_.fill(0); } |
| // Replace the least recently pushed array in the buffer with `new_values`. |
| void Push(rtc::ArrayView<const T, S> new_values) { |
| std::memcpy(buffer_.data() + S * tail_, new_values.data(), S * sizeof(T)); |
| tail_ += 1; |
| if (tail_ == N) |
| tail_ = 0; |
| } |
| // Return an array view onto the array with a given delay. A view on the last |
| // and least recently push array is returned when `delay` is 0 and N - 1 |
| // respectively. |
| rtc::ArrayView<const T, S> GetArrayView(int delay) const { |
| RTC_DCHECK_LE(0, delay); |
| RTC_DCHECK_LT(delay, N); |
| int offset = tail_ - 1 - delay; |
| if (offset < 0) |
| offset += N; |
| return {buffer_.data() + S * offset, S}; |
| } |
| |
| private: |
| int tail_; // Index of the least recently pushed sub-array. |
| std::array<T, S * N> buffer_{}; |
| }; |
| |
| } // namespace rnn_vad |
| } // namespace webrtc |
| |
| #endif // MODULES_AUDIO_PROCESSING_AGC2_RNN_VAD_RING_BUFFER_H_ |