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