blob: f44ea8e3f0e6cca496811a3248608cf6ef4bde26 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
andrew@webrtc.org63a50982012-05-02 23:56:37 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
pbos@webrtc.org956aa7e2013-05-21 13:52:32 +000011#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010012#include "webrtc/modules/include/module_common_types.h"
pbos@webrtc.org956aa7e2013-05-21 13:52:32 +000013#include "webrtc/voice_engine/level_indicator.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000014
15namespace webrtc {
16
17namespace voe {
18
niklase@google.com470e71d2011-07-07 08:21:25 +000019// Number of bars on the indicator.
20// Note that the number of elements is specified because we are indexing it
21// in the range of 0-32
pbos@webrtc.org6141e132013-04-09 10:09:10 +000022const int8_t permutation[33] =
niklase@google.com470e71d2011-07-07 08:21:25 +000023 {0,1,2,3,4,4,5,5,5,5,6,6,6,6,6,7,7,7,7,8,8,8,9,9,9,9,9,9,9,9,9,9,9};
24
25
26AudioLevel::AudioLevel() :
27 _absMax(0),
28 _count(0),
29 _currentLevel(0),
henrika@webrtc.orgd108a462013-04-03 11:25:31 +000030 _currentLevelFullRange(0) {
niklase@google.com470e71d2011-07-07 08:21:25 +000031}
32
henrika@webrtc.orgd108a462013-04-03 11:25:31 +000033AudioLevel::~AudioLevel() {
niklase@google.com470e71d2011-07-07 08:21:25 +000034}
35
henrika@webrtc.orgd108a462013-04-03 11:25:31 +000036void AudioLevel::Clear()
niklase@google.com470e71d2011-07-07 08:21:25 +000037{
tommi31fc21f2016-01-21 10:37:37 -080038 rtc::CritScope cs(&_critSect);
niklase@google.com470e71d2011-07-07 08:21:25 +000039 _absMax = 0;
40 _count = 0;
41 _currentLevel = 0;
42 _currentLevelFullRange = 0;
43}
44
henrika@webrtc.orgd108a462013-04-03 11:25:31 +000045void AudioLevel::ComputeLevel(const AudioFrame& audioFrame)
niklase@google.com470e71d2011-07-07 08:21:25 +000046{
pbos@webrtc.org6141e132013-04-09 10:09:10 +000047 int16_t absValue(0);
niklase@google.com470e71d2011-07-07 08:21:25 +000048
49 // Check speech level (works for 2 channels as well)
50 absValue = WebRtcSpl_MaxAbsValueW16(
andrew@webrtc.org63a50982012-05-02 23:56:37 +000051 audioFrame.data_,
52 audioFrame.samples_per_channel_*audioFrame.num_channels_);
henrika@webrtc.orgd108a462013-04-03 11:25:31 +000053
54 // Protect member access using a lock since this method is called on a
55 // dedicated audio thread in the RecordedDataIsAvailable() callback.
tommi31fc21f2016-01-21 10:37:37 -080056 rtc::CritScope cs(&_critSect);
henrika@webrtc.orgd108a462013-04-03 11:25:31 +000057
niklase@google.com470e71d2011-07-07 08:21:25 +000058 if (absValue > _absMax)
59 _absMax = absValue;
60
61 // Update level approximately 10 times per second
62 if (_count++ == kUpdateFrequency)
63 {
64 _currentLevelFullRange = _absMax;
65
66 _count = 0;
67
pbos@webrtc.org6141e132013-04-09 10:09:10 +000068 // Highest value for a int16_t is 0x7fff = 32767
niklase@google.com470e71d2011-07-07 08:21:25 +000069 // Divide with 1000 to get in the range of 0-32 which is the range of
70 // the permutation vector
pbos@webrtc.org6141e132013-04-09 10:09:10 +000071 int32_t position = _absMax/1000;
niklase@google.com470e71d2011-07-07 08:21:25 +000072
73 // Make it less likely that the bar stays at position 0. I.e. only if
74 // its in the range 0-250 (instead of 0-1000)
75 if ((position == 0) && (_absMax > 250))
76 {
77 position = 1;
78 }
79 _currentLevel = permutation[position];
80
81 // Decay the absolute maximum (divide by 4)
82 _absMax >>= 2;
83 }
84}
85
pbos@webrtc.org6141e132013-04-09 10:09:10 +000086int8_t AudioLevel::Level() const
niklase@google.com470e71d2011-07-07 08:21:25 +000087{
tommi31fc21f2016-01-21 10:37:37 -080088 rtc::CritScope cs(&_critSect);
niklase@google.com470e71d2011-07-07 08:21:25 +000089 return _currentLevel;
90}
91
pbos@webrtc.org6141e132013-04-09 10:09:10 +000092int16_t AudioLevel::LevelFullRange() const
niklase@google.com470e71d2011-07-07 08:21:25 +000093{
tommi31fc21f2016-01-21 10:37:37 -080094 rtc::CritScope cs(&_critSect);
niklase@google.com470e71d2011-07-07 08:21:25 +000095 return _currentLevelFullRange;
96}
97
98} // namespace voe
99
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000100} // namespace webrtc