Home | History | Annotate | Download | only in source
      1 /*
      2  *  Copyright (c) 2011 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_conference_mixer/source/level_indicator.h"
     12 
     13 namespace webrtc {
     14 // Array for adding smothing to level changes (ad-hoc).
     15 const uint32_t perm[] =
     16     {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};
     17 
     18 LevelIndicator::LevelIndicator()
     19     : _max(0),
     20       _count(0),
     21       _currentLevel(0)
     22 {
     23 }
     24 
     25 LevelIndicator::~LevelIndicator()
     26 {
     27 }
     28 
     29 // Level is based on the highest absolute value for all samples.
     30 void LevelIndicator::ComputeLevel(const int16_t* speech,
     31                                   const uint16_t nrOfSamples)
     32 {
     33     int32_t min = 0;
     34     for(uint32_t i = 0; i < nrOfSamples; i++)
     35     {
     36         if(_max < speech[i])
     37         {
     38             _max = speech[i];
     39         }
     40         if(min > speech[i])
     41         {
     42             min = speech[i];
     43         }
     44     }
     45 
     46     // Absolute max value.
     47     if(-min > _max)
     48     {
     49         _max = -min;
     50     }
     51 
     52     if(_count == TICKS_BEFORE_CALCULATION)
     53     {
     54         // Highest sample value maps directly to a level.
     55         int32_t position = _max / 1000;
     56         if ((position == 0) &&
     57             (_max > 250))
     58         {
     59             position = 1;
     60         }
     61         _currentLevel = perm[position];
     62         // The max value is decayed and stored so that it can be reused to slow
     63         // down decreases in level.
     64         _max = _max >> 1;
     65         _count = 0;
     66     } else {
     67         _count++;
     68     }
     69 }
     70 
     71 int32_t LevelIndicator::GetLevel()
     72 {
     73     return _currentLevel;
     74 }
     75 
     76 }  // namespace webrtc
     77