1/*
2 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "webrtc/modules/audio_processing/level_estimator_impl.h"
12
13#include "webrtc/modules/audio_processing/audio_buffer.h"
14#include "webrtc/modules/audio_processing/rms_level.h"
15#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
16
17namespace webrtc {
18
19LevelEstimatorImpl::LevelEstimatorImpl(rtc::CriticalSection* crit)
20    : crit_(crit), rms_(new RMSLevel()) {
21  RTC_DCHECK(crit);
22}
23
24LevelEstimatorImpl::~LevelEstimatorImpl() {}
25
26void LevelEstimatorImpl::Initialize() {
27  rtc::CritScope cs(crit_);
28  rms_->Reset();
29}
30
31void LevelEstimatorImpl::ProcessStream(AudioBuffer* audio) {
32  RTC_DCHECK(audio);
33  rtc::CritScope cs(crit_);
34  if (!enabled_) {
35    return;
36  }
37
38  for (size_t i = 0; i < audio->num_channels(); i++) {
39    rms_->Process(audio->channels_const()[i], audio->num_frames());
40  }
41}
42
43int LevelEstimatorImpl::Enable(bool enable) {
44  rtc::CritScope cs(crit_);
45  if (enable && !enabled_) {
46    rms_->Reset();
47  }
48  enabled_ = enable;
49  return AudioProcessing::kNoError;
50}
51
52bool LevelEstimatorImpl::is_enabled() const {
53  rtc::CritScope cs(crit_);
54  return enabled_;
55}
56
57int LevelEstimatorImpl::RMS() {
58  rtc::CritScope cs(crit_);
59  if (!enabled_) {
60    return AudioProcessing::kNotEnabledError;
61  }
62
63  return rms_->RMS();
64}
65}  // namespace webrtc
66