blob: 17d625f878b6f6192867790ffc8121a75b5dc44b [file] [log] [blame]
// 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