| // 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 <stdint.h> |
| |
| #include "base/stl_util.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace remoting { |
| |
| namespace { |
| |
| const int kSamplingRate = 1000; |
| |
| void TestSilenceDetector(AudioSilenceDetector* target, |
| const int16_t* samples, |
| int samples_count, |
| bool silence_expected) { |
| target->Reset(kSamplingRate, 1); |
| bool silence_started = false; |
| int threshold_length = 0; |
| for (int i = 0; i < 3 * kSamplingRate / samples_count; ++i) { |
| bool result = target->IsSilence(samples, samples_count); |
| if (silence_started) { |
| ASSERT_TRUE(result); |
| } else if (result) { |
| silence_started = true; |
| threshold_length = i * samples_count; |
| } |
| } |
| |
| // Check that the silence was detected if it was expected. |
| EXPECT_EQ(silence_expected, silence_started); |
| |
| if (silence_expected) { |
| // Check that silence threshold is between 0.5 and 2 seconds. |
| EXPECT_GE(threshold_length, kSamplingRate / 2); |
| EXPECT_LE(threshold_length, kSamplingRate * 2); |
| } |
| } |
| |
| } // namespace |
| |
| TEST(AudioSilenceDetectorTest, Silence) { |
| const int16_t kSamples[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; |
| |
| AudioSilenceDetector target(0); |
| TestSilenceDetector(&target, kSamples, base::size(kSamples), true); |
| } |
| |
| TEST(AudioSilenceDetectorTest, Sound) { |
| const int16_t kSamples[] = {65, 73, 83, 89, 92, -1, 5, 9, 123, 0}; |
| |
| AudioSilenceDetector target(0); |
| TestSilenceDetector(&target, kSamples, base::size(kSamples), false); |
| } |
| |
| TEST(AudioSilenceDetectorTest, Threshold) { |
| const int16_t kSamples[] = {0, 0, 0, 0, 1, 0, 0, -1, 0, 0}; |
| |
| AudioSilenceDetector target1(0); |
| TestSilenceDetector(&target1, kSamples, base::size(kSamples), false); |
| |
| AudioSilenceDetector target2(1); |
| TestSilenceDetector(&target2, kSamples, base::size(kSamples), true); |
| } |
| |
| } // namespace remoting |