Delete unused class CurrentSpeakerMonitor.

Bug: webrtc:8760
Change-Id: Ib2f84c7d74f1f3187f02dcf697e9c16a4d5f10e3
Reviewed-on: https://webrtc-review.googlesource.com/34652
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Reviewed-by: Noah Richards <noahric@chromium.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23336}
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 0681564..e117bb3 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -29,13 +29,10 @@
   visibility = [ "*" ]
   defines = []
   sources = [
-    "audiomonitor.h",
     "channel.cc",
     "channel.h",
     "channelmanager.cc",
     "channelmanager.h",
-    "currentspeakermonitor.cc",
-    "currentspeakermonitor.h",
     "dtlssrtptransport.cc",
     "dtlssrtptransport.h",
     "externalhmac.cc",
@@ -283,7 +280,6 @@
     sources = [
       "channel_unittest.cc",
       "channelmanager_unittest.cc",
-      "currentspeakermonitor_unittest.cc",
       "dtlssrtptransport_unittest.cc",
       "jseptransport_unittest.cc",
       "jseptransportcontroller_unittest.cc",
diff --git a/pc/audiomonitor.h b/pc/audiomonitor.h
deleted file mode 100644
index 61edd32..0000000
--- a/pc/audiomonitor.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright 2004 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef PC_AUDIOMONITOR_H_
-#define PC_AUDIOMONITOR_H_
-
-#include <vector>
-#include <utility>
-
-// For ConnectionInfo/ConnectionInfos
-#include "p2p/base/port.h"
-
-namespace cricket {
-
-struct AudioInfo {
-  int input_level;
-  int output_level;
-  typedef std::vector<std::pair<uint32_t, int> > StreamList;
-  StreamList active_streams;  // ssrcs contributing to output_level
-};
-
-}  // namespace cricket
-
-#endif  // PC_AUDIOMONITOR_H_
diff --git a/pc/channel.h b/pc/channel.h
index cb068a2..9532ee4 100644
--- a/pc/channel.h
+++ b/pc/channel.h
@@ -29,7 +29,6 @@
 #include "media/base/streamparams.h"
 #include "p2p/base/dtlstransportinternal.h"
 #include "p2p/base/packettransportinternal.h"
-#include "pc/audiomonitor.h"
 #include "pc/dtlssrtptransport.h"
 #include "pc/mediasession.h"
 #include "pc/rtptransport.h"
diff --git a/pc/currentspeakermonitor.cc b/pc/currentspeakermonitor.cc
deleted file mode 100644
index 2b584196..0000000
--- a/pc/currentspeakermonitor.cc
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *  Copyright 2011 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "pc/currentspeakermonitor.h"
-
-#include <vector>
-
-#include "media/base/streamparams.h"
-#include "pc/audiomonitor.h"
-#include "rtc_base/logging.h"
-#include "rtc_base/timeutils.h"
-
-namespace cricket {
-
-namespace {
-const int kMaxAudioLevel = 9;
-// To avoid overswitching, we disable switching for a period of time after a
-// switch is done.
-const int kDefaultMinTimeBetweenSwitches = 1000;
-}
-
-CurrentSpeakerMonitor::CurrentSpeakerMonitor(
-    AudioSourceContext* audio_source_context)
-    : started_(false),
-      audio_source_context_(audio_source_context),
-      current_speaker_ssrc_(0),
-      earliest_permitted_switch_time_(0),
-      min_time_between_switches_(kDefaultMinTimeBetweenSwitches) {}
-
-CurrentSpeakerMonitor::~CurrentSpeakerMonitor() {
-  Stop();
-}
-
-void CurrentSpeakerMonitor::Start() {
-  if (!started_) {
-    audio_source_context_->SignalAudioMonitor.connect(
-        this, &CurrentSpeakerMonitor::OnAudioMonitor);
-    audio_source_context_->SignalMediaStreamsUpdate.connect(
-        this, &CurrentSpeakerMonitor::OnMediaStreamsUpdate);
-    audio_source_context_->SignalMediaStreamsReset.connect(
-        this, &CurrentSpeakerMonitor::OnMediaStreamsReset);
-
-    started_ = true;
-  }
-}
-
-void CurrentSpeakerMonitor::Stop() {
-  if (started_) {
-    audio_source_context_->SignalAudioMonitor.disconnect(this);
-    audio_source_context_->SignalMediaStreamsUpdate.disconnect(this);
-
-    started_ = false;
-    ssrc_to_speaking_state_map_.clear();
-    current_speaker_ssrc_ = 0;
-    earliest_permitted_switch_time_ = 0;
-  }
-}
-
-void CurrentSpeakerMonitor::set_min_time_between_switches(
-    int min_time_between_switches) {
-  min_time_between_switches_ = min_time_between_switches;
-}
-
-void CurrentSpeakerMonitor::OnAudioMonitor(
-    AudioSourceContext* audio_source_context, const AudioInfo& info) {
-  std::map<uint32_t, int> active_ssrc_to_level_map;
-  cricket::AudioInfo::StreamList::const_iterator stream_list_it;
-  for (stream_list_it = info.active_streams.begin();
-       stream_list_it != info.active_streams.end(); ++stream_list_it) {
-    uint32_t ssrc = stream_list_it->first;
-    active_ssrc_to_level_map[ssrc] = stream_list_it->second;
-
-    // It's possible we haven't yet added this source to our map.  If so,
-    // add it now with a "not speaking" state.
-    if (ssrc_to_speaking_state_map_.find(ssrc) ==
-        ssrc_to_speaking_state_map_.end()) {
-      ssrc_to_speaking_state_map_[ssrc] = SS_NOT_SPEAKING;
-    }
-  }
-
-  int max_level = 0;
-  uint32_t loudest_speaker_ssrc = 0;
-
-  // Update the speaking states of all participants based on the new audio
-  // level information.  Also retain loudest speaker.
-  std::map<uint32_t, SpeakingState>::iterator state_it;
-  for (state_it = ssrc_to_speaking_state_map_.begin();
-       state_it != ssrc_to_speaking_state_map_.end(); ++state_it) {
-    bool is_previous_speaker = current_speaker_ssrc_ == state_it->first;
-
-    // This uses a state machine in order to gradually identify
-    // members as having started or stopped speaking. Matches the
-    // algorithm used by the hangouts js code.
-
-    std::map<uint32_t, int>::const_iterator level_it =
-        active_ssrc_to_level_map.find(state_it->first);
-    // Note that the stream map only contains streams with non-zero audio
-    // levels.
-    int level = (level_it != active_ssrc_to_level_map.end()) ?
-        level_it->second : 0;
-    switch (state_it->second) {
-      case SS_NOT_SPEAKING:
-        if (level > 0) {
-          // Reset level because we don't think they're really speaking.
-          level = 0;
-          state_it->second = SS_MIGHT_BE_SPEAKING;
-        } else {
-          // State unchanged.
-        }
-        break;
-      case SS_MIGHT_BE_SPEAKING:
-        if (level > 0) {
-          state_it->second = SS_SPEAKING;
-        } else {
-          state_it->second = SS_NOT_SPEAKING;
-        }
-        break;
-      case SS_SPEAKING:
-        if (level > 0) {
-          // State unchanged.
-        } else {
-          state_it->second = SS_WAS_SPEAKING_RECENTLY1;
-          if (is_previous_speaker) {
-            // Assume this is an inter-word silence and assign him the highest
-            // volume.
-            level = kMaxAudioLevel;
-          }
-        }
-        break;
-      case SS_WAS_SPEAKING_RECENTLY1:
-        if (level > 0) {
-          state_it->second = SS_SPEAKING;
-        } else {
-          state_it->second = SS_WAS_SPEAKING_RECENTLY2;
-          if (is_previous_speaker) {
-            // Assume this is an inter-word silence and assign him the highest
-            // volume.
-            level = kMaxAudioLevel;
-          }
-        }
-        break;
-      case SS_WAS_SPEAKING_RECENTLY2:
-        if (level > 0) {
-          state_it->second = SS_SPEAKING;
-        } else {
-          state_it->second = SS_NOT_SPEAKING;
-        }
-        break;
-    }
-
-    if (level > max_level) {
-      loudest_speaker_ssrc = state_it->first;
-      max_level = level;
-    } else if (level > 0 && level == max_level && is_previous_speaker) {
-      // Favor continuity of loudest speakers if audio levels are equal.
-      loudest_speaker_ssrc = state_it->first;
-    }
-  }
-
-  // We avoid over-switching by disabling switching for a period of time after
-  // a switch is done.
-  int64_t now = rtc::TimeMillis();
-  if (earliest_permitted_switch_time_ <= now &&
-      current_speaker_ssrc_ != loudest_speaker_ssrc) {
-    current_speaker_ssrc_ = loudest_speaker_ssrc;
-    RTC_LOG(LS_INFO) << "Current speaker changed to " << current_speaker_ssrc_;
-    earliest_permitted_switch_time_ = now + min_time_between_switches_;
-    SignalUpdate(this, current_speaker_ssrc_);
-  }
-}
-
-void CurrentSpeakerMonitor::OnMediaStreamsUpdate(
-    AudioSourceContext* audio_source_context,
-    const MediaStreams& added,
-    const MediaStreams& removed) {
-  if (audio_source_context == audio_source_context_) {
-    // Update the speaking state map based on added and removed streams.
-    for (std::vector<cricket::StreamParams>::const_iterator
-           it = removed.audio().begin(); it != removed.audio().end(); ++it) {
-      ssrc_to_speaking_state_map_.erase(it->first_ssrc());
-    }
-
-    for (std::vector<cricket::StreamParams>::const_iterator
-           it = added.audio().begin(); it != added.audio().end(); ++it) {
-      ssrc_to_speaking_state_map_[it->first_ssrc()] = SS_NOT_SPEAKING;
-    }
-  }
-}
-
-void CurrentSpeakerMonitor::OnMediaStreamsReset(
-    AudioSourceContext* audio_source_context) {
-  if (audio_source_context == audio_source_context_) {
-    ssrc_to_speaking_state_map_.clear();
-  }
-}
-
-}  // namespace cricket
diff --git a/pc/currentspeakermonitor.h b/pc/currentspeakermonitor.h
deleted file mode 100644
index 589fb1b..0000000
--- a/pc/currentspeakermonitor.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright 2011 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-// CurrentSpeakerMonitor monitors the audio levels for a session and determines
-// which participant is currently speaking.
-
-#ifndef PC_CURRENTSPEAKERMONITOR_H_
-#define PC_CURRENTSPEAKERMONITOR_H_
-
-#include <stdint.h>
-
-#include <map>
-
-#include "rtc_base/sigslot.h"
-
-namespace cricket {
-
-struct AudioInfo;
-struct MediaStreams;
-
-class AudioSourceContext {
- public:
-  sigslot::signal2<AudioSourceContext*, const cricket::AudioInfo&>
-      SignalAudioMonitor;
-  sigslot::signal1<AudioSourceContext*> SignalMediaStreamsReset;
-  sigslot::signal3<AudioSourceContext*,
-                   const cricket::MediaStreams&,
-                   const cricket::MediaStreams&> SignalMediaStreamsUpdate;
-};
-
-// CurrentSpeakerMonitor can be used to monitor the audio-levels from
-// many audio-sources and report on changes in the loudest audio-source.
-// Its a generic type and relies on an AudioSourceContext which is aware of
-// the audio-sources. AudioSourceContext needs to provide two signals namely
-// SignalAudioInfoMonitor - provides audio info of the all current speakers.
-// SignalMediaSourcesUpdated - provides updates when a speaker leaves or joins.
-// Note that the AudioSourceContext's audio monitor must be started
-// before this is started.
-// It's recommended that the audio monitor be started with a 100 ms period.
-class CurrentSpeakerMonitor : public sigslot::has_slots<> {
- public:
-  explicit CurrentSpeakerMonitor(AudioSourceContext* audio_source_context);
-  ~CurrentSpeakerMonitor();
-
-  void Start();
-  void Stop();
-
-  // Used by tests.  Note that the actual minimum time between switches
-  // enforced by the monitor will be the given value plus or minus the
-  // resolution of the system clock.
-  void set_min_time_between_switches(int min_time_between_switches);
-
-  // This is fired when the current speaker changes, and provides his audio
-  // SSRC.  This only fires after the audio monitor on the underlying
-  // AudioSourceContext has been started.
-  sigslot::signal2<CurrentSpeakerMonitor*, uint32_t> SignalUpdate;
-
- private:
-  void OnAudioMonitor(AudioSourceContext* audio_source_context,
-                      const AudioInfo& info);
-  void OnMediaStreamsUpdate(AudioSourceContext* audio_source_context,
-                            const MediaStreams& added,
-                            const MediaStreams& removed);
-  void OnMediaStreamsReset(AudioSourceContext* audio_source_context);
-
-  // These are states that a participant will pass through so that we gradually
-  // recognize that they have started and stopped speaking.  This avoids
-  // "twitchiness".
-  enum SpeakingState {
-    SS_NOT_SPEAKING,
-    SS_MIGHT_BE_SPEAKING,
-    SS_SPEAKING,
-    SS_WAS_SPEAKING_RECENTLY1,
-    SS_WAS_SPEAKING_RECENTLY2
-  };
-
-  bool started_;
-  AudioSourceContext* audio_source_context_;
-  std::map<uint32_t, SpeakingState> ssrc_to_speaking_state_map_;
-  uint32_t current_speaker_ssrc_;
-  // To prevent overswitching, switching is disabled for some time after a
-  // switch is made.  This gives us the earliest time a switch is permitted.
-  int64_t earliest_permitted_switch_time_;
-  int min_time_between_switches_;
-};
-
-}  // namespace cricket
-
-#endif  // PC_CURRENTSPEAKERMONITOR_H_
diff --git a/pc/currentspeakermonitor_unittest.cc b/pc/currentspeakermonitor_unittest.cc
deleted file mode 100644
index fa3f0cb..0000000
--- a/pc/currentspeakermonitor_unittest.cc
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- *  Copyright 2004 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <utility>
-
-#include "pc/currentspeakermonitor.h"
-#include "pc/audiomonitor.h"
-#include "rtc_base/gunit.h"
-#include "rtc_base/thread.h"
-
-namespace cricket {
-
-static const uint32_t kSsrc1 = 1001;
-static const uint32_t kSsrc2 = 1002;
-static const uint32_t kMinTimeBetweenSwitches = 10;
-// Due to limited system clock resolution, the CurrentSpeakerMonitor may
-// actually require more or less time between switches than that specified
-// in the call to set_min_time_between_switches.  To be safe, we sleep for
-// 90 ms more than the min time between switches before checking for a switch.
-// I am assuming system clocks do not have a coarser resolution than 90 ms.
-static const uint32_t kSleepTimeBetweenSwitches = 100;
-
-class CurrentSpeakerMonitorTest : public testing::Test,
-    public sigslot::has_slots<> {
- public:
-  CurrentSpeakerMonitorTest() {
-    monitor_ = new CurrentSpeakerMonitor(&source_);
-    // Shrink the minimum time betweeen switches to 10 ms so we don't have to
-    // slow down our tests.
-    monitor_->set_min_time_between_switches(kMinTimeBetweenSwitches);
-    monitor_->SignalUpdate.connect(this, &CurrentSpeakerMonitorTest::OnUpdate);
-    current_speaker_ = 0;
-    num_changes_ = 0;
-    monitor_->Start();
-  }
-
-  ~CurrentSpeakerMonitorTest() {
-    delete monitor_;
-  }
-
-  void SignalAudioMonitor(const AudioInfo& info) {
-    source_.SignalAudioMonitor(&source_, info);
-  }
-
- protected:
-  AudioSourceContext source_;
-  CurrentSpeakerMonitor* monitor_;
-  int num_changes_;
-  uint32_t current_speaker_;
-
-  void OnUpdate(CurrentSpeakerMonitor* monitor, uint32_t current_speaker) {
-    current_speaker_ = current_speaker;
-    num_changes_++;
-  }
-};
-
-static void InitAudioInfo(AudioInfo* info, int input_level, int output_level) {
-  info->input_level = input_level;
-  info->output_level = output_level;
-}
-
-TEST_F(CurrentSpeakerMonitorTest, NoActiveStreams) {
-  AudioInfo info;
-  InitAudioInfo(&info, 0, 0);
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, 0U);
-  EXPECT_EQ(num_changes_, 0);
-}
-
-TEST_F(CurrentSpeakerMonitorTest, MultipleActiveStreams) {
-  AudioInfo info;
-  InitAudioInfo(&info, 0, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  // No speaker recognized because the initial sample is treated as possibly
-  // just noise and disregarded.
-  EXPECT_EQ(current_speaker_, 0U);
-  EXPECT_EQ(num_changes_, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-}
-
-// See: https://code.google.com/p/webrtc/issues/detail?id=2409
-TEST_F(CurrentSpeakerMonitorTest, DISABLED_RapidSpeakerChange) {
-  AudioInfo info;
-  InitAudioInfo(&info, 0, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, 0U);
-  EXPECT_EQ(num_changes_, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 9));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 1));
-  SignalAudioMonitor(info);
-
-  // We expect no speaker change because of the rapid change.
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-}
-
-// Flaky on iOS: webrtc:7057.
-#if defined(WEBRTC_IOS)
-#define MAYBE_SpeakerChange DISABLED_SpeakerChange
-#else
-#define MAYBE_SpeakerChange SpeakerChange
-#endif
-TEST_F(CurrentSpeakerMonitorTest, MAYBE_SpeakerChange) {
-  AudioInfo info;
-  InitAudioInfo(&info, 0, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, 0U);
-  EXPECT_EQ(num_changes_, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-
-  // Wait so the changes don't come so rapidly.
-  rtc::Thread::SleepMs(kSleepTimeBetweenSwitches);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 9));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 1));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, kSsrc1);
-  EXPECT_EQ(num_changes_, 2);
-}
-
-TEST_F(CurrentSpeakerMonitorTest, InterwordSilence) {
-  AudioInfo info;
-  InitAudioInfo(&info, 0, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, 0U);
-  EXPECT_EQ(num_changes_, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-
-  // Wait so the changes don't come so rapidly.
-  rtc::Thread::SleepMs(kSleepTimeBetweenSwitches);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 0));
-  SignalAudioMonitor(info);
-
-  // Current speaker shouldn't have changed because we treat this as an inter-
-  // word silence.
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 0));
-  SignalAudioMonitor(info);
-
-  // Current speaker shouldn't have changed because we treat this as an inter-
-  // word silence.
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 0));
-  SignalAudioMonitor(info);
-
-  // At this point, we should have concluded that SSRC2 stopped speaking.
-  EXPECT_EQ(current_speaker_, kSsrc1);
-  EXPECT_EQ(num_changes_, 2);
-}
-
-}  // namespace cricket