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 20 AudioSilenceDetector::AudioSilenceDetector(int threshold) 21 : threshold_(threshold), 22 silence_length_max_(0), 23 silence_length_(0) { 24 DCHECK_GE(threshold_, 0); 25 } 26 27 AudioSilenceDetector::~AudioSilenceDetector() { 28 } 29 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 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