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