OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h" |
12 | 12 |
13 #include <assert.h> //assert | 13 #include <assert.h> //assert |
14 #include <string.h> //memcpy | 14 #include <string.h> //memcpy |
15 | 15 |
16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
17 #include "webrtc/system_wrappers/interface/trace_event.h" | 17 #include "webrtc/system_wrappers/interface/trace_event.h" |
18 | 18 |
19 namespace webrtc { | 19 namespace webrtc { |
20 | 20 |
21 static const int kDtmfFrequencyHz = 8000; | 21 static const int kDtmfFrequencyHz = 8000; |
22 | 22 |
23 RTPSenderAudio::RTPSenderAudio(const int32_t id, | 23 RTPSenderAudio::RTPSenderAudio(Clock* clock, |
24 Clock* clock, | |
25 RTPSender* rtpSender, | 24 RTPSender* rtpSender, |
26 RtpAudioFeedback* audio_feedback) : | 25 RtpAudioFeedback* audio_feedback) |
27 _id(id), | 26 : _clock(clock), |
28 _clock(clock), | 27 _rtpSender(rtpSender), |
29 _rtpSender(rtpSender), | 28 _audioFeedback(audio_feedback), |
30 _audioFeedback(audio_feedback), | 29 _sendAudioCritsect(CriticalSectionWrapper::CreateCriticalSection()), |
31 _sendAudioCritsect(CriticalSectionWrapper::CreateCriticalSection()), | 30 _packetSizeSamples(160), |
32 _packetSizeSamples(160), | 31 _dtmfEventIsOn(false), |
33 _dtmfEventIsOn(false), | 32 _dtmfEventFirstPacketSent(false), |
34 _dtmfEventFirstPacketSent(false), | 33 _dtmfPayloadType(-1), |
35 _dtmfPayloadType(-1), | 34 _dtmfTimestamp(0), |
36 _dtmfTimestamp(0), | 35 _dtmfKey(0), |
37 _dtmfKey(0), | 36 _dtmfLengthSamples(0), |
38 _dtmfLengthSamples(0), | 37 _dtmfLevel(0), |
39 _dtmfLevel(0), | 38 _dtmfTimeLastSent(0), |
40 _dtmfTimeLastSent(0), | 39 _dtmfTimestampLastSent(0), |
41 _dtmfTimestampLastSent(0), | 40 _REDPayloadType(-1), |
42 _REDPayloadType(-1), | 41 _inbandVADactive(false), |
43 _inbandVADactive(false), | 42 _cngNBPayloadType(-1), |
44 _cngNBPayloadType(-1), | 43 _cngWBPayloadType(-1), |
45 _cngWBPayloadType(-1), | 44 _cngSWBPayloadType(-1), |
46 _cngSWBPayloadType(-1), | 45 _cngFBPayloadType(-1), |
47 _cngFBPayloadType(-1), | 46 _lastPayloadType(-1), |
48 _lastPayloadType(-1), | 47 _audioLevel_dBov(0) {} |
49 _audioLevel_dBov(0) { | |
50 } | |
51 | 48 |
52 RTPSenderAudio::~RTPSenderAudio() { | 49 RTPSenderAudio::~RTPSenderAudio() { |
53 } | 50 } |
54 | 51 |
55 int RTPSenderAudio::AudioFrequency() const { | 52 int RTPSenderAudio::AudioFrequency() const { |
56 return kDtmfFrequencyHz; | 53 return kDtmfFrequencyHz; |
57 } | 54 } |
58 | 55 |
59 // set audio packet size, used to determine when it's time to send a DTMF packet | 56 // set audio packet size, used to determine when it's time to send a DTMF packet |
60 // in silence (CNG) | 57 // in silence (CNG) |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 _dtmfEventFirstPacketSent = false; | 194 _dtmfEventFirstPacketSent = false; |
198 _dtmfKey = key; | 195 _dtmfKey = key; |
199 _dtmfLengthSamples = (kDtmfFrequencyHz / 1000) * dtmfLengthMS; | 196 _dtmfLengthSamples = (kDtmfFrequencyHz / 1000) * dtmfLengthMS; |
200 dtmfToneStarted = true; | 197 dtmfToneStarted = true; |
201 _dtmfEventIsOn = true; | 198 _dtmfEventIsOn = true; |
202 } | 199 } |
203 } | 200 } |
204 } | 201 } |
205 if (dtmfToneStarted) { | 202 if (dtmfToneStarted) { |
206 if (_audioFeedback) | 203 if (_audioFeedback) |
207 _audioFeedback->OnPlayTelephoneEvent(_id, key, dtmfLengthMS, _dtmfLevel); | 204 _audioFeedback->OnPlayTelephoneEvent(key, dtmfLengthMS, _dtmfLevel); |
208 } | 205 } |
209 | 206 |
210 // A source MAY send events and coded audio packets for the same time | 207 // A source MAY send events and coded audio packets for the same time |
211 // but we don't support it | 208 // but we don't support it |
212 if (_dtmfEventIsOn) { | 209 if (_dtmfEventIsOn) { |
213 if (frameType == kFrameEmpty) { | 210 if (frameType == kFrameEmpty) { |
214 // kFrameEmpty is used to drive the DTMF when in CN mode | 211 // kFrameEmpty is used to drive the DTMF when in CN mode |
215 // it can be triggered more frequently than we want to send the | 212 // it can be triggered more frequently than we want to send the |
216 // DTMF packets. | 213 // DTMF packets. |
217 if (packet_size_samples > (captureTimeStamp - _dtmfTimestampLastSent)) { | 214 if (packet_size_samples > (captureTimeStamp - _dtmfTimestampLastSent)) { |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 retVal = _rtpSender->SendToNetwork(dtmfbuffer, 4, 12, -1, | 478 retVal = _rtpSender->SendToNetwork(dtmfbuffer, 4, 12, -1, |
482 kAllowRetransmission, | 479 kAllowRetransmission, |
483 PacedSender::kHighPriority); | 480 PacedSender::kHighPriority); |
484 sendCount--; | 481 sendCount--; |
485 | 482 |
486 }while (sendCount > 0 && retVal == 0); | 483 }while (sendCount > 0 && retVal == 0); |
487 | 484 |
488 return retVal; | 485 return retVal; |
489 } | 486 } |
490 } // namespace webrtc | 487 } // namespace webrtc |
OLD | NEW |