128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/* 228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle 328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Copyright 2004 Google Inc. 428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer. 1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * and/or other materials provided with the distribution. 1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * derived from this software without specific prior written permission. 1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */ 2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 284c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org#include "talk/session/media/audiomonitor.h" 2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/session/media/currentspeakermonitor.h" 30a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/gunit.h" 31a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/thread.h" 3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket { 3428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 350c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmstatic const uint32_t kSsrc1 = 1001; 360c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmstatic const uint32_t kSsrc2 = 1002; 370c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmstatic const uint32_t kMinTimeBetweenSwitches = 10; 3828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Due to limited system clock resolution, the CurrentSpeakerMonitor may 3928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// actually require more or less time between switches than that specified 4028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the call to set_min_time_between_switches. To be safe, we sleep for 4128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// 90 ms more than the min time between switches before checking for a switch. 4228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// I am assuming system clocks do not have a coarser resolution than 90 ms. 430c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmstatic const uint32_t kSleepTimeBetweenSwitches = 100; 4428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 4528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass CurrentSpeakerMonitorTest : public testing::Test, 4628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public sigslot::has_slots<> { 4728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 4828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CurrentSpeakerMonitorTest() { 49d59daf8023286d63a1b6c8af82eedb684181c1ebdeadbeef monitor_ = new CurrentSpeakerMonitor(&source_); 5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Shrink the minimum time betweeen switches to 10 ms so we don't have to 5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // slow down our tests. 5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org monitor_->set_min_time_between_switches(kMinTimeBetweenSwitches); 5328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org monitor_->SignalUpdate.connect(this, &CurrentSpeakerMonitorTest::OnUpdate); 5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org current_speaker_ = 0; 5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org num_changes_ = 0; 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org monitor_->Start(); 5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 5828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ~CurrentSpeakerMonitorTest() { 6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org delete monitor_; 614c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org } 624c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org 634c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org void SignalAudioMonitor(const AudioInfo& info) { 644c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org source_.SignalAudioMonitor(&source_, info); 6528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 684c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org AudioSourceContext source_; 6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org CurrentSpeakerMonitor* monitor_; 7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int num_changes_; 710c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint32_t current_speaker_; 7228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 730c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström void OnUpdate(CurrentSpeakerMonitor* monitor, uint32_t current_speaker) { 7428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org current_speaker_ = current_speaker; 7528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org num_changes_++; 7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 7728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic void InitAudioInfo(AudioInfo* info, int input_level, int output_level) { 8028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info->input_level = input_level; 8128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info->output_level = output_level; 8228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 8328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(CurrentSpeakerMonitorTest, NoActiveStreams) { 8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AudioInfo info; 8628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitAudioInfo(&info, 0, 0); 874c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 8828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, 0U); 9028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 0); 9128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 9228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(CurrentSpeakerMonitorTest, MultipleActiveStreams) { 9428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AudioInfo info; 9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitAudioInfo(&info, 0, 0); 9628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 3)); 9828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 7)); 994c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 10028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // No speaker recognized because the initial sample is treated as possibly 10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // just noise and disregarded. 10328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, 0U); 10428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 0); 10528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 3)); 10728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 7)); 1084c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 10928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, kSsrc2); 11128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 1); 11228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 11328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1144475905613cc5d05815b83d8f3cb3ff029fd3191andrew@webrtc.org// See: https://code.google.com/p/webrtc/issues/detail?id=2409 1154475905613cc5d05815b83d8f3cb3ff029fd3191andrew@webrtc.orgTEST_F(CurrentSpeakerMonitorTest, DISABLED_RapidSpeakerChange) { 11628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AudioInfo info; 11728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitAudioInfo(&info, 0, 0); 11828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 3)); 12028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 7)); 1214c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 12228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 12328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, 0U); 12428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 0); 12528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 12628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 3)); 12728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 7)); 1284c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 12928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 13028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, kSsrc2); 13128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 1); 13228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 13328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 9)); 13428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 1)); 1354c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 13628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 13728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // We expect no speaker change because of the rapid change. 13828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, kSsrc2); 13928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 1); 14028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 14128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 14228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(CurrentSpeakerMonitorTest, SpeakerChange) { 14328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AudioInfo info; 14428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitAudioInfo(&info, 0, 0); 14528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 14628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 3)); 14728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 7)); 1484c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 14928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 15028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, 0U); 15128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 0); 15228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 15328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 3)); 15428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 7)); 1554c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 15628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 15728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, kSsrc2); 15828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 1); 15928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 16028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Wait so the changes don't come so rapidly. 161d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::SleepMs(kSleepTimeBetweenSwitches); 16228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 16328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 9)); 16428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 1)); 1654c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 16628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 16728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, kSsrc1); 16828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 2); 16928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 17028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 17128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(CurrentSpeakerMonitorTest, InterwordSilence) { 17228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org AudioInfo info; 17328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org InitAudioInfo(&info, 0, 0); 17428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 17528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 3)); 17628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 7)); 1774c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 17828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 17928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, 0U); 18028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 0); 18128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 18228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 3)); 18328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 7)); 1844c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 18528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 18628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, kSsrc2); 18728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 1); 18828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 18928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 3)); 19028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 7)); 1914c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 19228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 19328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, kSsrc2); 19428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 1); 19528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 19628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Wait so the changes don't come so rapidly. 197d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::SleepMs(kSleepTimeBetweenSwitches); 19828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 19928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 3)); 20028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 0)); 2014c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 20228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 20328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Current speaker shouldn't have changed because we treat this as an inter- 20428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // word silence. 20528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, kSsrc2); 20628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 1); 20728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 20828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 3)); 20928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 0)); 2104c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 21128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 21228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Current speaker shouldn't have changed because we treat this as an inter- 21328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // word silence. 21428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, kSsrc2); 21528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 1); 21628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 21728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc1, 3)); 21828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org info.active_streams.push_back(std::make_pair(kSsrc2, 0)); 2194c0544ab07987fa080a832123bee5e61750fd815pthatcher@webrtc.org SignalAudioMonitor(info); 22028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 22128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // At this point, we should have concluded that SSRC2 stopped speaking. 22228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(current_speaker_, kSsrc1); 22328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(num_changes_, 2); 22428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 22528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 22628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace cricket 227