| /* | |
| * Copyright (c) 2021 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. | |
| */ | |
| #include "modules/audio_processing/agc2/saturation_protector_buffer.h" | |
| #include <optional> | |
| #include "rtc_base/checks.h" | |
| #include "rtc_base/numerics/safe_compare.h" | |
| namespace webrtc { | |
| SaturationProtectorBuffer::SaturationProtectorBuffer() = default; | |
| SaturationProtectorBuffer::~SaturationProtectorBuffer() = default; | |
| bool SaturationProtectorBuffer::operator==( | |
| const SaturationProtectorBuffer& b) const { | |
| RTC_DCHECK_LE(size_, buffer_.size()); | |
| RTC_DCHECK_LE(b.size_, b.buffer_.size()); | |
| if (size_ != b.size_) { | |
| return false; | |
| } | |
| for (int i = 0, i0 = FrontIndex(), i1 = b.FrontIndex(); i < size_; | |
| ++i, ++i0, ++i1) { | |
| if (buffer_[i0 % buffer_.size()] != b.buffer_[i1 % b.buffer_.size()]) { | |
| return false; | |
| } | |
| } | |
| return true; | |
| } | |
| int SaturationProtectorBuffer::Capacity() const { | |
| return buffer_.size(); | |
| } | |
| int SaturationProtectorBuffer::Size() const { | |
| return size_; | |
| } | |
| void SaturationProtectorBuffer::Reset() { | |
| next_ = 0; | |
| size_ = 0; | |
| } | |
| void SaturationProtectorBuffer::PushBack(float v) { | |
| RTC_DCHECK_GE(next_, 0); | |
| RTC_DCHECK_GE(size_, 0); | |
| RTC_DCHECK_LT(next_, buffer_.size()); | |
| RTC_DCHECK_LE(size_, buffer_.size()); | |
| buffer_[next_++] = v; | |
| if (SafeEq(next_, buffer_.size())) { | |
| next_ = 0; | |
| } | |
| if (SafeLt(size_, buffer_.size())) { | |
| size_++; | |
| } | |
| } | |
| std::optional<float> SaturationProtectorBuffer::Front() const { | |
| if (size_ == 0) { | |
| return std::nullopt; | |
| } | |
| RTC_DCHECK_LT(FrontIndex(), buffer_.size()); | |
| return buffer_[FrontIndex()]; | |
| } | |
| int SaturationProtectorBuffer::FrontIndex() const { | |
| return SafeEq(size_, buffer_.size()) ? next_ : 0; | |
| } | |
| } // namespace webrtc |