• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "remoting/host/audio_silence_detector.h"
6 
7 #include <stdlib.h>
8 
9 namespace remoting {
10 
11 namespace {
12 
13 // Silence period threshold in seconds. Silence intervals shorter than this
14 // value are still encoded and sent to the client, so that we don't disrupt
15 // playback by dropping them.
16 int kSilencePeriodThresholdSeconds = 1;
17 
18 }  // namespace
19 
AudioSilenceDetector(int threshold)20 AudioSilenceDetector::AudioSilenceDetector(int threshold)
21     : threshold_(threshold),
22       silence_length_max_(0),
23       silence_length_(0) {
24   DCHECK_GE(threshold_, 0);
25 }
26 
~AudioSilenceDetector()27 AudioSilenceDetector::~AudioSilenceDetector() {
28 }
29 
Reset(int sampling_rate,int channels)30 void AudioSilenceDetector::Reset(int sampling_rate, int channels) {
31   DCHECK_GT(sampling_rate, 0);
32   silence_length_ = 0;
33   silence_length_max_ =
34       sampling_rate * channels * kSilencePeriodThresholdSeconds;
35 }
36 
IsSilence(const int16 * samples,size_t samples_count)37 bool AudioSilenceDetector::IsSilence(const int16* samples,
38                                      size_t samples_count) {
39   bool silent_packet = true;
40   // Potentially this loop can be optimized (e.g. using SSE or adding special
41   // case for threshold_==0), but it's not worth worrying about because the
42   // amount of data it processes is relaively small.
43   for (size_t i = 0; i < samples_count; ++i) {
44     if (abs(samples[i]) > threshold_) {
45       silent_packet = false;
46       break;
47     }
48   }
49 
50   if (!silent_packet) {
51     silence_length_ = 0;
52     return false;
53   }
54 
55   silence_length_ += samples_count;
56   return silence_length_ > silence_length_max_;
57 }
58 
59 }  // namespace remoting
60