Remove sigslot usage from DtmfProviderInterface

Bug: webrtc:11943
Change-Id: I452efbb099affc10e9197573fa0e40094a0d90ca
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/270420
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Fredrik Solenberg <solenberg@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37681}
diff --git a/pc/dtmf_sender.cc b/pc/dtmf_sender.cc
index 91d642c..c3bd4b6 100644
--- a/pc/dtmf_sender.cc
+++ b/pc/dtmf_sender.cc
@@ -75,11 +75,14 @@
       inter_tone_gap_(kDtmfDefaultGapMs),
       comma_delay_(kDtmfDefaultCommaDelayMs) {
   RTC_DCHECK(signaling_thread_);
-  if (provider_) {
-    RTC_DCHECK(provider_->GetOnDestroyedSignal());
-    provider_->GetOnDestroyedSignal()->connect(
-        this, &DtmfSender::OnProviderDestroyed);
-  }
+  RTC_DCHECK(provider_);
+}
+
+void DtmfSender::OnDtmfProviderDestroyed() {
+  RTC_DCHECK_RUN_ON(signaling_thread_);
+  RTC_DLOG(LS_INFO) << "The Dtmf provider is deleted. Clear the sending queue.";
+  StopSending();
+  provider_ = nullptr;
 }
 
 DtmfSender::~DtmfSender() {
@@ -232,14 +235,6 @@
   QueueInsertDtmf(RTC_FROM_HERE, tone_gap);
 }
 
-void DtmfSender::OnProviderDestroyed() {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-
-  RTC_LOG(LS_INFO) << "The Dtmf provider is deleted. Clear the sending queue.";
-  StopSending();
-  provider_ = nullptr;
-}
-
 void DtmfSender::StopSending() {
   if (safety_flag_) {
     safety_flag_->SetNotAlive();
diff --git a/pc/dtmf_sender.h b/pc/dtmf_sender.h
index eb3bf5f..c295f03 100644
--- a/pc/dtmf_sender.h
+++ b/pc/dtmf_sender.h
@@ -23,7 +23,6 @@
 #include "pc/proxy.h"
 #include "rtc_base/location.h"
 #include "rtc_base/ref_count.h"
-#include "rtc_base/third_party/sigslot/sigslot.h"
 #include "rtc_base/thread_annotations.h"
 
 // DtmfSender is the native implementation of the RTCDTMFSender defined by
@@ -43,19 +42,18 @@
   // The `duration` indicates the length of the DTMF tone in ms.
   // Returns true on success and false on failure.
   virtual bool InsertDtmf(int code, int duration) = 0;
-  // Returns a `sigslot::signal0<>` signal. The signal should fire before
-  // the provider is destroyed.
-  virtual sigslot::signal0<>* GetOnDestroyedSignal() = 0;
 
  protected:
   virtual ~DtmfProviderInterface() {}
 };
 
-class DtmfSender : public DtmfSenderInterface, public sigslot::has_slots<> {
+class DtmfSender : public DtmfSenderInterface {
  public:
   static rtc::scoped_refptr<DtmfSender> Create(TaskQueueBase* signaling_thread,
                                                DtmfProviderInterface* provider);
 
+  void OnDtmfProviderDestroyed();
+
   // Implements DtmfSenderInterface.
   void RegisterObserver(DtmfSenderObserverInterface* observer) override;
   void UnregisterObserver() override;
@@ -85,8 +83,6 @@
   // The DTMF sending task.
   void DoInsertDtmf() RTC_RUN_ON(signaling_thread_);
 
-  void OnProviderDestroyed();
-
   void StopSending() RTC_RUN_ON(signaling_thread_);
 
   DtmfSenderObserverInterface* observer_ RTC_GUARDED_BY(signaling_thread_);
diff --git a/pc/dtmf_sender_unittest.cc b/pc/dtmf_sender_unittest.cc
index 922abdc..ab5ba9e 100644
--- a/pc/dtmf_sender_unittest.cc
+++ b/pc/dtmf_sender_unittest.cc
@@ -77,8 +77,6 @@
 
   FakeDtmfProvider() : last_insert_dtmf_call_(0) {}
 
-  ~FakeDtmfProvider() { SignalDestroyed(); }
-
   // Implements DtmfProviderInterface.
   bool CanInsertDtmf() override { return can_insert_; }
 
@@ -95,10 +93,6 @@
     return true;
   }
 
-  sigslot::signal0<>* GetOnDestroyedSignal() override {
-    return &SignalDestroyed;
-  }
-
   // getter and setter
   const std::vector<DtmfInfo>& dtmf_info_queue() const {
     return dtmf_info_queue_;
@@ -111,7 +105,6 @@
   bool can_insert_ = false;
   std::vector<DtmfInfo> dtmf_info_queue_;
   int64_t last_insert_dtmf_call_;
-  sigslot::signal0<> SignalDestroyed;
 };
 
 class DtmfSenderTest : public ::testing::Test {
@@ -273,6 +266,7 @@
   EXPECT_TRUE_SIMULATED_WAIT(observer_->tones().size() == 1, kMaxWaitMs,
                              fake_clock_);
   // Delete provider.
+  dtmf_->OnDtmfProviderDestroyed();
   provider_.reset();
   // The queue should be discontinued so no more tone callbacks.
   SIMULATED_WAIT(false, 200, fake_clock_);
diff --git a/pc/rtp_sender.cc b/pc/rtp_sender.cc
index 0b9642d..bf41f97 100644
--- a/pc/rtp_sender.cc
+++ b/pc/rtp_sender.cc
@@ -467,14 +467,13 @@
                                SetStreamsObserver* set_streams_observer)
     : RtpSenderBase(worker_thread, id, set_streams_observer),
       legacy_stats_(legacy_stats),
-      dtmf_sender_proxy_(DtmfSenderProxy::Create(
-          rtc::Thread::Current(),
-          DtmfSender::Create(rtc::Thread::Current(), this))),
+      dtmf_sender_(DtmfSender::Create(rtc::Thread::Current(), this)),
+      dtmf_sender_proxy_(
+          DtmfSenderProxy::Create(rtc::Thread::Current(), dtmf_sender_)),
       sink_adapter_(new LocalAudioSinkAdapter()) {}
 
 AudioRtpSender::~AudioRtpSender() {
-  // For DtmfSender.
-  SignalDestroyed();
+  dtmf_sender_->OnDtmfProviderDestroyed();
   Stop();
 }
 
@@ -511,10 +510,6 @@
   return success;
 }
 
-sigslot::signal0<>* AudioRtpSender::GetOnDestroyedSignal() {
-  return &SignalDestroyed;
-}
-
 void AudioRtpSender::OnChanged() {
   RTC_DCHECK_RUN_ON(signaling_thread_);
   TRACE_EVENT0("webrtc", "AudioRtpSender::OnChanged");
diff --git a/pc/rtp_sender.h b/pc/rtp_sender.h
index f552df0..6e07dde 100644
--- a/pc/rtp_sender.h
+++ b/pc/rtp_sender.h
@@ -40,7 +40,6 @@
 #include "pc/legacy_stats_collector_interface.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/synchronization/mutex.h"
-#include "rtc_base/third_party/sigslot/sigslot.h"
 #include "rtc_base/thread.h"
 #include "rtc_base/thread_annotations.h"
 
@@ -314,7 +313,6 @@
   // DtmfSenderProvider implementation.
   bool CanInsertDtmf() override;
   bool InsertDtmf(int code, int duration) override;
-  sigslot::signal0<>* GetOnDestroyedSignal() override;
 
   // ObserverInterface implementation.
   void OnChanged() override;
@@ -351,9 +349,9 @@
     return rtc::scoped_refptr<AudioTrackInterface>(
         static_cast<AudioTrackInterface*>(track_.get()));
   }
-  sigslot::signal0<> SignalDestroyed;
 
   LegacyStatsCollectorInterface* legacy_stats_ = nullptr;
+  rtc::scoped_refptr<DtmfSender> dtmf_sender_;
   rtc::scoped_refptr<DtmfSenderInterface> dtmf_sender_proxy_;
   bool cached_track_enabled_ = false;
 
diff --git a/pc/rtp_sender_receiver_unittest.cc b/pc/rtp_sender_receiver_unittest.cc
index 94b79f4..333fde5 100644
--- a/pc/rtp_sender_receiver_unittest.cc
+++ b/pc/rtp_sender_receiver_unittest.cc
@@ -63,7 +63,6 @@
 #include "rtc_base/checks.h"
 #include "rtc_base/gunit.h"
 #include "rtc_base/location.h"
-#include "rtc_base/third_party/sigslot/sigslot.h"
 #include "rtc_base/thread.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
@@ -102,8 +101,7 @@
 
 class RtpSenderReceiverTest
     : public ::testing::Test,
-      public ::testing::WithParamInterface<std::pair<RidList, RidList>>,
-      public sigslot::has_slots<> {
+      public ::testing::WithParamInterface<std::pair<RidList, RidList>> {
  public:
   RtpSenderReceiverTest()
       : network_thread_(rtc::Thread::Current()),
@@ -209,8 +207,6 @@
     audio_rtp_sender_->SetStreams({local_stream_->id()});
     audio_rtp_sender_->SetMediaChannel(voice_media_channel());
     audio_rtp_sender_->SetSsrc(kAudioSsrc);
-    audio_rtp_sender_->GetOnDestroyedSignal()->connect(
-        this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
     VerifyVoiceChannelInput();
   }
 
@@ -220,8 +216,6 @@
     audio_rtp_sender_->SetMediaChannel(voice_media_channel());
   }
 
-  void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
-
   void CreateVideoRtpSender(uint32_t ssrc) {
     CreateVideoRtpSender(false, ssrc);
   }
@@ -528,7 +522,6 @@
   rtc::scoped_refptr<MediaStreamInterface> local_stream_;
   rtc::scoped_refptr<VideoTrackInterface> video_track_;
   rtc::scoped_refptr<AudioTrackInterface> audio_track_;
-  bool audio_sender_destroyed_signal_fired_ = false;
   webrtc::test::ScopedKeyValueConfig field_trials_;
 };
 
@@ -1621,15 +1614,6 @@
                               send_ssrc, 2, expected_duration));
 }
 
-// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
-// destroyed, which is needed for the DTMF sender.
-TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
-  CreateAudioRtpSender();
-  EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
-  audio_rtp_sender_ = nullptr;
-  EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
-}
-
 // Validate that the default FrameEncryptor setting is nullptr.
 TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
   CreateAudioRtpSender();