Index: talk/media/webrtc/webrtcvoiceengine.cc |
diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc |
index 01355bbdb1e58446a95e3a4e115542fcbe48f223..e2832ff83f620283564200394171e57c63228f44 100644 |
--- a/talk/media/webrtc/webrtcvoiceengine.cc |
+++ b/talk/media/webrtc/webrtcvoiceengine.cc |
@@ -133,6 +133,12 @@ const char kAecDumpByAudioOptionFilename[] = "/sdcard/audio.aecdump"; |
const char kAecDumpByAudioOptionFilename[] = "audio.aecdump"; |
#endif |
+// Constants from voice_engine_defines.h. |
+const int kMinTelephoneEventCode = 0; // RFC4733 (Section 2.3.1) |
+const int kMaxTelephoneEventCode = 255; |
+const int kMinTelephoneEventDuration = 100; |
+const int kMaxTelephoneEventDuration = 60000; // Actual limit is 2^16 |
+ |
bool ValidateStreamParams(const StreamParams& sp) { |
if (sp.ssrcs.empty()) { |
LOG(LS_ERROR) << "No SSRCs in stream parameters: " << sp.ToString(); |
@@ -595,12 +601,6 @@ bool WebRtcVoiceEngine::InitInternal() { |
LOG(LS_INFO) << ToString(codec); |
} |
- // Disable the DTMF playout when a tone is sent. |
- // PlayDtmfTone will be used if local playout is needed. |
- if (voe_wrapper_->dtmf()->SetDtmfFeedbackStatus(false) == -1) { |
- LOG_RTCERR1(SetDtmfFeedbackStatus, false); |
- } |
- |
initialized_ = true; |
return true; |
} |
@@ -1330,6 +1330,13 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream |
renderer_ = nullptr; |
} |
+ // Accessor to the Call stream. |
+ webrtc::AudioSendStream* stream() { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
+ RTC_DCHECK(stream_); |
+ return stream_; |
pthatcher1
2015/12/02 18:45:37
Rather than expose the stream underneath, it seems
the sun
2015/12/03 09:57:47
Done.
|
+ } |
+ |
// Accessor to the VoE channel ID. |
int channel() const { |
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
@@ -1613,7 +1620,7 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs( |
engine()->voe()->codec()->SetFECStatus(channel, false); |
// Scan through the list to figure out the codec to use for sending, along |
- // with the proper configuration for VAD and DTMF. |
+ // with the proper configuration for VAD. |
bool found_send_codec = false; |
webrtc::CodecInst send_codec; |
memset(&send_codec, 0, sizeof(send_codec)); |
@@ -1742,7 +1749,7 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs( |
SetSendBitrateInternal(send_bitrate_bps_); |
} |
- // Loop through the codecs list again to config the telephone-event/CN codec. |
+ // Loop through the codecs list again to config the CN codec. |
for (const AudioCodec& codec : codecs) { |
// Ignore codecs we don't know about. The negotiation step should prevent |
// this, but double-check to be sure. |
@@ -1752,15 +1759,7 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs( |
continue; |
} |
- // Find the DTMF telephone event "codec" and tell VoiceEngine channels |
- // about it. |
- if (IsCodec(codec, kDtmfCodecName)) { |
- if (engine()->voe()->dtmf()->SetSendTelephoneEventPayloadType( |
- channel, codec.id) == -1) { |
- LOG_RTCERR2(SetSendTelephoneEventPayloadType, channel, codec.id); |
- return false; |
- } |
- } else if (IsCodec(codec, kCnCodecName)) { |
+ if (IsCodec(codec, kCnCodecName)) { |
// Turn voice activity detection/comfort noise on if supported. |
// Set the wideband CN payload type appropriately. |
// (narrowband always uses the static payload type 13). |
@@ -1815,12 +1814,16 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs( |
bool WebRtcVoiceMediaChannel::SetSendCodecs( |
const std::vector<AudioCodec>& codecs) { |
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
+ // TODO(solenberg): Validate input - that payload types don't overlap, are |
+ // within range, filter out codecs we don't support, |
+ // redundant codecs etc. |
- dtmf_allowed_ = false; |
+ // Find the DTMF telephone event "codec" payload type. |
+ dtmf_payload_type_ = rtc::Optional<int>(); |
for (const AudioCodec& codec : codecs) { |
- // Find the DTMF telephone event "codec". |
if (IsCodec(codec, kDtmfCodecName)) { |
- dtmf_allowed_ = true; |
+ dtmf_payload_type_ = rtc::Optional<int>(codec.id); |
+ break; |
} |
} |
@@ -2283,38 +2286,40 @@ bool WebRtcVoiceMediaChannel::SetOutputVolume(uint32_t ssrc, double volume) { |
} |
bool WebRtcVoiceMediaChannel::CanInsertDtmf() { |
- return dtmf_allowed_; |
+ return dtmf_payload_type_ ? true : false; |
} |
bool WebRtcVoiceMediaChannel::InsertDtmf(uint32_t ssrc, int event, |
int duration) { |
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
- if (!dtmf_allowed_) { |
+ LOG(LS_INFO) << "WebRtcVoiceMediaChannel::InsertDtmf"; |
+ if (!dtmf_payload_type_) { |
return false; |
} |
- // Send the event. |
- int channel = -1; |
+ // Figure out which WebRtcAudioSendStream to send the event on. |
+ auto it = send_streams_.end(); |
if (ssrc == 0) { |
- if (send_streams_.size() > 0) { |
- channel = send_streams_.begin()->second->channel(); |
- } |
+ it = send_streams_.begin(); |
} else { |
- channel = GetSendChannelId(ssrc); |
+ it = send_streams_.find(ssrc); |
} |
pthatcher1
2015/12/02 18:45:37
Does this work?
audio it = ssrc ? send_streams_.f
the sun
2015/12/03 09:57:47
Nice one!
Except "audio" is not a recognized C++
|
- if (channel == -1) { |
- LOG(LS_WARNING) << "InsertDtmf - The specified ssrc " |
- << ssrc << " is not in use."; |
+ if (it == send_streams_.end()) { |
+ LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use."; |
return false; |
} |
- // Send DTMF using out-of-band DTMF. ("true", as 3rd arg) |
- if (engine()->voe()->dtmf()->SendTelephoneEvent( |
- channel, event, true, duration) == -1) { |
- LOG_RTCERR4(SendTelephoneEvent, channel, event, true, duration); |
+ if (event < kMinTelephoneEventCode || |
+ event > kMaxTelephoneEventCode) { |
+ LOG(LS_WARNING) << "DTMF event code " << event << " out of range."; |
return false; |
} |
- |
- return true; |
+ if (duration < kMinTelephoneEventDuration || |
+ duration > kMaxTelephoneEventDuration) { |
+ LOG(LS_WARNING) << "DTMF event duration " << duration << " out of range."; |
+ return false; |
+ } |
+ return it->second->stream()->SendTelephoneEvent(*dtmf_payload_type_, event, |
+ duration); |
} |
void WebRtcVoiceMediaChannel::OnPacketReceived( |