| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "remoting/host/audio_silence_detector.h" |
| |
| #include <stdlib.h> |
| |
| namespace remoting { |
| |
| namespace { |
| |
| // Silence period threshold in seconds. Silence intervals shorter than this |
| // value are still encoded and sent to the client, so that we don't disrupt |
| // playback by dropping them. |
| int kSilencePeriodThresholdSeconds = 1; |
| |
| } // namespace |
| |
| AudioSilenceDetector::AudioSilenceDetector(int threshold) |
| : threshold_(threshold), |
| silence_length_max_(0), |
| silence_length_(0) { |
| DCHECK_GE(threshold_, 0); |
| } |
| |
| AudioSilenceDetector::~AudioSilenceDetector() { |
| } |
| |
| void AudioSilenceDetector::Reset(int sampling_rate, int channels) { |
| DCHECK_GT(sampling_rate, 0); |
| silence_length_ = 0; |
| silence_length_max_ = |
| sampling_rate * channels * kSilencePeriodThresholdSeconds; |
| } |
| |
| bool AudioSilenceDetector::IsSilence(const int16* samples, |
| size_t samples_count) { |
| bool silent_packet = true; |
| // Potentially this loop can be optimized (e.g. using SSE or adding special |
| // case for threshold_==0), but it's not worth worrying about because the |
| // amount of data it processes is relaively small. |
| for (size_t i = 0; i < samples_count; ++i) { |
| if (abs(samples[i]) > threshold_) { |
| silent_packet = false; |
| break; |
| } |
| } |
| |
| if (!silent_packet) { |
| silence_length_ = 0; |
| return false; |
| } |
| |
| silence_length_ += samples_count; |
| return silence_length_ > silence_length_max_; |
| } |
| |
| } // namespace remoting |