Index: webrtc/pc/rtpsender.cc |
diff --git a/webrtc/pc/rtpsender.cc b/webrtc/pc/rtpsender.cc |
index 3e8c7e122e11bbb0604b29dca7bff844f12f304f..c8ac830bf342ce4b7bcf0b3c83560b69c1984885 100644 |
--- a/webrtc/pc/rtpsender.cc |
+++ b/webrtc/pc/rtpsender.cc |
@@ -57,6 +57,7 @@ AudioRtpSender::AudioRtpSender(AudioTrackInterface* track, |
sink_adapter_(new LocalAudioSinkAdapter()) { |
track_->RegisterObserver(this); |
track_->AddSink(sink_adapter_.get()); |
+ CreateDtmfSender(); |
} |
AudioRtpSender::AudioRtpSender(AudioTrackInterface* track, |
@@ -71,6 +72,7 @@ AudioRtpSender::AudioRtpSender(AudioTrackInterface* track, |
sink_adapter_(new LocalAudioSinkAdapter()) { |
track_->RegisterObserver(this); |
track_->AddSink(sink_adapter_.get()); |
+ CreateDtmfSender(); |
} |
AudioRtpSender::AudioRtpSender(cricket::VoiceChannel* channel, |
@@ -79,12 +81,50 @@ AudioRtpSender::AudioRtpSender(cricket::VoiceChannel* channel, |
stream_id_(rtc::CreateRandomUuid()), |
channel_(channel), |
stats_(stats), |
- sink_adapter_(new LocalAudioSinkAdapter()) {} |
+ sink_adapter_(new LocalAudioSinkAdapter()) { |
+ CreateDtmfSender(); |
+} |
AudioRtpSender::~AudioRtpSender() { |
+ // For DtmfSender. |
+ SignalDestroyed(); |
Stop(); |
} |
+bool AudioRtpSender::CanInsertDtmf() { |
+ if (!channel_) { |
+ LOG(LS_ERROR) << "CanInsertDtmf: No audio channel exists."; |
+ return false; |
+ } |
+ // Check that this RTP sender is active (description has been applied that |
+ // matches an SSRC to its ID). |
+ if (!ssrc_) { |
+ LOG(LS_ERROR) << "CanInsertDtmf: Sender does not have SSRC."; |
+ return false; |
+ } |
+ return channel_->CanInsertDtmf(); |
+} |
+ |
+bool AudioRtpSender::InsertDtmf(int code, int duration) { |
+ if (!channel_) { |
+ LOG(LS_ERROR) << "CanInsertDtmf: No audio channel exists."; |
+ return false; |
+ } |
+ if (!ssrc_) { |
+ LOG(LS_ERROR) << "CanInsertDtmf: Sender does not have SSRC."; |
+ return false; |
+ } |
+ if (!channel_->InsertDtmf(ssrc_, code, duration)) { |
+ LOG(LS_ERROR) << "Failed to insert DTMF to channel."; |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+sigslot::signal0<>* AudioRtpSender::GetOnDestroyedSignal() { |
+ return &SignalDestroyed; |
+} |
+ |
void AudioRtpSender::OnChanged() { |
TRACE_EVENT0("webrtc", "AudioRtpSender::OnChanged"); |
RTC_DCHECK(!stopped_); |
@@ -158,6 +198,10 @@ bool AudioRtpSender::SetParameters(const RtpParameters& parameters) { |
return channel_->SetRtpSendParameters(ssrc_, parameters); |
} |
+rtc::scoped_refptr<DtmfSenderInterface> AudioRtpSender::GetDtmfSender() const { |
+ return dtmf_sender_proxy_; |
+} |
+ |
void AudioRtpSender::SetSsrc(uint32_t ssrc) { |
TRACE_EVENT0("webrtc", "AudioRtpSender::SetSsrc"); |
if (stopped_ || ssrc == ssrc_) { |
@@ -237,6 +281,20 @@ void AudioRtpSender::ClearAudioSend() { |
} |
} |
+void AudioRtpSender::CreateDtmfSender() { |
+ // Should be on signaling thread. |
+ // TODO(deadbeef): Add thread checking to RtpSender/RtpReceiver |
+ // implementations. |
+ rtc::scoped_refptr<DtmfSenderInterface> sender( |
+ DtmfSender::Create(track_, rtc::Thread::Current(), this)); |
+ if (!sender.get()) { |
+ LOG(LS_ERROR) << "CreateDtmfSender failed on DtmfSender::Create."; |
+ RTC_NOTREACHED(); |
+ } |
+ dtmf_sender_proxy_ = |
+ DtmfSenderProxy::Create(rtc::Thread::Current(), sender.get()); |
+} |
+ |
VideoRtpSender::VideoRtpSender(VideoTrackInterface* track, |
const std::string& stream_id, |
cricket::VideoChannel* channel) |
@@ -336,6 +394,11 @@ bool VideoRtpSender::SetParameters(const RtpParameters& parameters) { |
return channel_->SetRtpSendParameters(ssrc_, parameters); |
} |
+rtc::scoped_refptr<DtmfSenderInterface> VideoRtpSender::GetDtmfSender() const { |
+ LOG(LS_ERROR) << "Tried to get DTMF sender from video sender."; |
+ return nullptr; |
+} |
+ |
void VideoRtpSender::SetSsrc(uint32_t ssrc) { |
TRACE_EVENT0("webrtc", "VideoRtpSender::SetSsrc"); |
if (stopped_ || ssrc == ssrc_) { |