12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "remoting/host/audio_silence_detector.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace remoting {
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kSamplingRate = 1000;
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestSilenceDetector(AudioSilenceDetector* target,
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const int16* samples, int samples_count,
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool silence_expected) {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->Reset(kSamplingRate, 1);
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool silence_started = false;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int threshold_length = 0;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 3 * kSamplingRate / samples_count; ++i) {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool result = target->IsSilence(samples, samples_count);
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (silence_started) {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ASSERT_TRUE(result);
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (result) {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      silence_started = true;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      threshold_length = i * samples_count;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that the silence was detected if it was expected.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(silence_expected, silence_started);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (silence_expected) {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Check that silence threshold is between 0.5 and 2 seconds.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_GE(threshold_length, kSamplingRate / 2);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_LE(threshold_length, kSamplingRate * 2);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(AudioSilenceDetectorTest, Silence) {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int16 kSamples[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AudioSilenceDetector target(0);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestSilenceDetector(&target, kSamples, arraysize(kSamples), true);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(AudioSilenceDetectorTest, Sound) {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int16 kSamples[] = {65, 73, 83, 89, 92, -1, 5, 9, 123, 0};
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AudioSilenceDetector target(0);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestSilenceDetector(&target, kSamples, arraysize(kSamples), false);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(AudioSilenceDetectorTest, Threshold) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int16 kSamples[] = {0, 0, 0, 0, 1, 0, 0, -1, 0, 0};
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AudioSilenceDetector target1(0);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestSilenceDetector(&target1, kSamples, arraysize(kSamples), false);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AudioSilenceDetector target2(1);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestSilenceDetector(&target2, kSamples, arraysize(kSamples), true);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace remoting
69