1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_VOICE_ENGINE_CHANNEL_H_ 12 #define WEBRTC_VOICE_ENGINE_CHANNEL_H_ 13 14 #include "webrtc/common_audio/resampler/include/push_resampler.h" 15 #include "webrtc/common_types.h" 16 #include "webrtc/modules/audio_coding/main/interface/audio_coding_module.h" 17 #include "webrtc/modules/audio_conference_mixer/interface/audio_conference_mixer_defines.h" 18 #include "webrtc/modules/audio_processing/rms_level.h" 19 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" 20 #include "webrtc/modules/rtp_rtcp/interface/remote_ntp_time_estimator.h" 21 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" 22 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h" 23 #include "webrtc/modules/utility/interface/file_player.h" 24 #include "webrtc/modules/utility/interface/file_recorder.h" 25 #include "webrtc/system_wrappers/interface/scoped_ptr.h" 26 #include "webrtc/voice_engine/dtmf_inband.h" 27 #include "webrtc/voice_engine/dtmf_inband_queue.h" 28 #include "webrtc/voice_engine/include/voe_audio_processing.h" 29 #include "webrtc/voice_engine/include/voe_network.h" 30 #include "webrtc/voice_engine/level_indicator.h" 31 #include "webrtc/voice_engine/network_predictor.h" 32 #include "webrtc/voice_engine/shared_data.h" 33 #include "webrtc/voice_engine/voice_engine_defines.h" 34 35 #ifdef WEBRTC_DTMF_DETECTION 36 // TelephoneEventDetectionMethods, TelephoneEventObserver 37 #include "webrtc/voice_engine/include/voe_dtmf.h" 38 #endif 39 40 namespace rtc { 41 42 class TimestampWrapAroundHandler; 43 } 44 45 namespace webrtc { 46 47 class AudioDeviceModule; 48 class Config; 49 class CriticalSectionWrapper; 50 class FileWrapper; 51 class ProcessThread; 52 class ReceiveStatistics; 53 class RemoteNtpTimeEstimator; 54 class RtpDump; 55 class RTPPayloadRegistry; 56 class RtpReceiver; 57 class RTPReceiverAudio; 58 class RtpRtcp; 59 class TelephoneEventHandler; 60 class ViENetwork; 61 class VoEMediaProcess; 62 class VoERTCPObserver; 63 class VoERTPObserver; 64 class VoiceEngineObserver; 65 66 struct CallStatistics; 67 struct ReportBlock; 68 struct SenderInfo; 69 70 namespace voe { 71 72 class Statistics; 73 class StatisticsProxy; 74 class TransmitMixer; 75 class OutputMixer; 76 77 // Helper class to simplify locking scheme for members that are accessed from 78 // multiple threads. 79 // Example: a member can be set on thread T1 and read by an internal audio 80 // thread T2. Accessing the member via this class ensures that we are 81 // safe and also avoid TSan v2 warnings. 82 class ChannelState { 83 public: 84 struct State { 85 State() : rx_apm_is_enabled(false), 86 input_external_media(false), 87 output_file_playing(false), 88 input_file_playing(false), 89 playing(false), 90 sending(false), 91 receiving(false) {} 92 93 bool rx_apm_is_enabled; 94 bool input_external_media; 95 bool output_file_playing; 96 bool input_file_playing; 97 bool playing; 98 bool sending; 99 bool receiving; 100 }; 101 102 ChannelState() : lock_(CriticalSectionWrapper::CreateCriticalSection()) { 103 } 104 virtual ~ChannelState() {} 105 106 void Reset() { 107 CriticalSectionScoped lock(lock_.get()); 108 state_ = State(); 109 } 110 111 State Get() const { 112 CriticalSectionScoped lock(lock_.get()); 113 return state_; 114 } 115 116 void SetRxApmIsEnabled(bool enable) { 117 CriticalSectionScoped lock(lock_.get()); 118 state_.rx_apm_is_enabled = enable; 119 } 120 121 void SetInputExternalMedia(bool enable) { 122 CriticalSectionScoped lock(lock_.get()); 123 state_.input_external_media = enable; 124 } 125 126 void SetOutputFilePlaying(bool enable) { 127 CriticalSectionScoped lock(lock_.get()); 128 state_.output_file_playing = enable; 129 } 130 131 void SetInputFilePlaying(bool enable) { 132 CriticalSectionScoped lock(lock_.get()); 133 state_.input_file_playing = enable; 134 } 135 136 void SetPlaying(bool enable) { 137 CriticalSectionScoped lock(lock_.get()); 138 state_.playing = enable; 139 } 140 141 void SetSending(bool enable) { 142 CriticalSectionScoped lock(lock_.get()); 143 state_.sending = enable; 144 } 145 146 void SetReceiving(bool enable) { 147 CriticalSectionScoped lock(lock_.get()); 148 state_.receiving = enable; 149 } 150 151 private: 152 scoped_ptr<CriticalSectionWrapper> lock_; 153 State state_; 154 }; 155 156 class Channel: 157 public RtpData, 158 public RtpFeedback, 159 public RtcpFeedback, 160 public FileCallback, // receiving notification from file player & recorder 161 public Transport, 162 public RtpAudioFeedback, 163 public AudioPacketizationCallback, // receive encoded packets from the ACM 164 public ACMVADCallback, // receive voice activity from the ACM 165 public MixerParticipant // supplies output mixer with audio frames 166 { 167 public: 168 enum {KNumSocketThreads = 1}; 169 enum {KNumberOfSocketBuffers = 8}; 170 virtual ~Channel(); 171 static int32_t CreateChannel(Channel*& channel, 172 int32_t channelId, 173 uint32_t instanceId, 174 const Config& config); 175 Channel(int32_t channelId, uint32_t instanceId, const Config& config); 176 int32_t Init(); 177 int32_t SetEngineInformation( 178 Statistics& engineStatistics, 179 OutputMixer& outputMixer, 180 TransmitMixer& transmitMixer, 181 ProcessThread& moduleProcessThread, 182 AudioDeviceModule& audioDeviceModule, 183 VoiceEngineObserver* voiceEngineObserver, 184 CriticalSectionWrapper* callbackCritSect); 185 int32_t UpdateLocalTimeStamp(); 186 187 // API methods 188 189 // VoEBase 190 int32_t StartPlayout(); 191 int32_t StopPlayout(); 192 int32_t StartSend(); 193 int32_t StopSend(); 194 int32_t StartReceiving(); 195 int32_t StopReceiving(); 196 197 int32_t RegisterVoiceEngineObserver(VoiceEngineObserver& observer); 198 int32_t DeRegisterVoiceEngineObserver(); 199 200 // VoECodec 201 int32_t GetSendCodec(CodecInst& codec); 202 int32_t GetRecCodec(CodecInst& codec); 203 int32_t SetSendCodec(const CodecInst& codec); 204 int32_t SetVADStatus(bool enableVAD, ACMVADMode mode, bool disableDTX); 205 int32_t GetVADStatus(bool& enabledVAD, ACMVADMode& mode, bool& disabledDTX); 206 int32_t SetRecPayloadType(const CodecInst& codec); 207 int32_t GetRecPayloadType(CodecInst& codec); 208 int32_t SetSendCNPayloadType(int type, PayloadFrequencies frequency); 209 int SetOpusMaxPlaybackRate(int frequency_hz); 210 211 // VoE dual-streaming. 212 int SetSecondarySendCodec(const CodecInst& codec, int red_payload_type); 213 void RemoveSecondarySendCodec(); 214 int GetSecondarySendCodec(CodecInst* codec); 215 216 // VoENetwork 217 int32_t RegisterExternalTransport(Transport& transport); 218 int32_t DeRegisterExternalTransport(); 219 int32_t ReceivedRTPPacket(const int8_t* data, int32_t length, 220 const PacketTime& packet_time); 221 int32_t ReceivedRTCPPacket(const int8_t* data, int32_t length); 222 223 // VoEFile 224 int StartPlayingFileLocally(const char* fileName, bool loop, 225 FileFormats format, 226 int startPosition, 227 float volumeScaling, 228 int stopPosition, 229 const CodecInst* codecInst); 230 int StartPlayingFileLocally(InStream* stream, FileFormats format, 231 int startPosition, 232 float volumeScaling, 233 int stopPosition, 234 const CodecInst* codecInst); 235 int StopPlayingFileLocally(); 236 int IsPlayingFileLocally() const; 237 int RegisterFilePlayingToMixer(); 238 int StartPlayingFileAsMicrophone(const char* fileName, bool loop, 239 FileFormats format, 240 int startPosition, 241 float volumeScaling, 242 int stopPosition, 243 const CodecInst* codecInst); 244 int StartPlayingFileAsMicrophone(InStream* stream, 245 FileFormats format, 246 int startPosition, 247 float volumeScaling, 248 int stopPosition, 249 const CodecInst* codecInst); 250 int StopPlayingFileAsMicrophone(); 251 int IsPlayingFileAsMicrophone() const; 252 int StartRecordingPlayout(const char* fileName, const CodecInst* codecInst); 253 int StartRecordingPlayout(OutStream* stream, const CodecInst* codecInst); 254 int StopRecordingPlayout(); 255 256 void SetMixWithMicStatus(bool mix); 257 258 // VoEExternalMediaProcessing 259 int RegisterExternalMediaProcessing(ProcessingTypes type, 260 VoEMediaProcess& processObject); 261 int DeRegisterExternalMediaProcessing(ProcessingTypes type); 262 int SetExternalMixing(bool enabled); 263 264 // VoEVolumeControl 265 int GetSpeechOutputLevel(uint32_t& level) const; 266 int GetSpeechOutputLevelFullRange(uint32_t& level) const; 267 int SetMute(bool enable); 268 bool Mute() const; 269 int SetOutputVolumePan(float left, float right); 270 int GetOutputVolumePan(float& left, float& right) const; 271 int SetChannelOutputVolumeScaling(float scaling); 272 int GetChannelOutputVolumeScaling(float& scaling) const; 273 274 // VoENetEqStats 275 int GetNetworkStatistics(NetworkStatistics& stats); 276 void GetDecodingCallStatistics(AudioDecodingCallStats* stats) const; 277 278 // VoEVideoSync 279 bool GetDelayEstimate(int* jitter_buffer_delay_ms, 280 int* playout_buffer_delay_ms) const; 281 int least_required_delay_ms() const { return least_required_delay_ms_; } 282 int SetInitialPlayoutDelay(int delay_ms); 283 int SetMinimumPlayoutDelay(int delayMs); 284 int GetPlayoutTimestamp(unsigned int& timestamp); 285 void UpdatePlayoutTimestamp(bool rtcp); 286 int SetInitTimestamp(unsigned int timestamp); 287 int SetInitSequenceNumber(short sequenceNumber); 288 289 // VoEVideoSyncExtended 290 int GetRtpRtcp(RtpRtcp** rtpRtcpModule, RtpReceiver** rtp_receiver) const; 291 292 // VoEDtmf 293 int SendTelephoneEventOutband(unsigned char eventCode, int lengthMs, 294 int attenuationDb, bool playDtmfEvent); 295 int SendTelephoneEventInband(unsigned char eventCode, int lengthMs, 296 int attenuationDb, bool playDtmfEvent); 297 int SetDtmfPlayoutStatus(bool enable); 298 bool DtmfPlayoutStatus() const; 299 int SetSendTelephoneEventPayloadType(unsigned char type); 300 int GetSendTelephoneEventPayloadType(unsigned char& type); 301 302 // VoEAudioProcessingImpl 303 int UpdateRxVadDetection(AudioFrame& audioFrame); 304 int RegisterRxVadObserver(VoERxVadCallback &observer); 305 int DeRegisterRxVadObserver(); 306 int VoiceActivityIndicator(int &activity); 307 #ifdef WEBRTC_VOICE_ENGINE_AGC 308 int SetRxAgcStatus(bool enable, AgcModes mode); 309 int GetRxAgcStatus(bool& enabled, AgcModes& mode); 310 int SetRxAgcConfig(AgcConfig config); 311 int GetRxAgcConfig(AgcConfig& config); 312 #endif 313 #ifdef WEBRTC_VOICE_ENGINE_NR 314 int SetRxNsStatus(bool enable, NsModes mode); 315 int GetRxNsStatus(bool& enabled, NsModes& mode); 316 #endif 317 318 // VoERTP_RTCP 319 int RegisterRTCPObserver(VoERTCPObserver& observer); 320 int DeRegisterRTCPObserver(); 321 int SetLocalSSRC(unsigned int ssrc); 322 int GetLocalSSRC(unsigned int& ssrc); 323 int GetRemoteSSRC(unsigned int& ssrc); 324 int SetSendAudioLevelIndicationStatus(bool enable, unsigned char id); 325 int SetReceiveAudioLevelIndicationStatus(bool enable, unsigned char id); 326 int SetSendAbsoluteSenderTimeStatus(bool enable, unsigned char id); 327 int SetReceiveAbsoluteSenderTimeStatus(bool enable, unsigned char id); 328 int SetRTCPStatus(bool enable); 329 int GetRTCPStatus(bool& enabled); 330 int SetRTCP_CNAME(const char cName[256]); 331 int GetRemoteRTCP_CNAME(char cName[256]); 332 int GetRemoteRTCPData(unsigned int& NTPHigh, unsigned int& NTPLow, 333 unsigned int& timestamp, 334 unsigned int& playoutTimestamp, unsigned int* jitter, 335 unsigned short* fractionLost); 336 int SendApplicationDefinedRTCPPacket(unsigned char subType, 337 unsigned int name, const char* data, 338 unsigned short dataLengthInBytes); 339 int GetRTPStatistics(unsigned int& averageJitterMs, 340 unsigned int& maxJitterMs, 341 unsigned int& discardedPackets); 342 int GetRemoteRTCPReportBlocks(std::vector<ReportBlock>* report_blocks); 343 int GetRTPStatistics(CallStatistics& stats); 344 int SetREDStatus(bool enable, int redPayloadtype); 345 int GetREDStatus(bool& enabled, int& redPayloadtype); 346 int SetCodecFECStatus(bool enable); 347 bool GetCodecFECStatus(); 348 void SetNACKStatus(bool enable, int maxNumberOfPackets); 349 int StartRTPDump(const char fileNameUTF8[1024], RTPDirections direction); 350 int StopRTPDump(RTPDirections direction); 351 bool RTPDumpIsActive(RTPDirections direction); 352 // Takes ownership of the ViENetwork. 353 void SetVideoEngineBWETarget(ViENetwork* vie_network, int video_channel); 354 355 // From AudioPacketizationCallback in the ACM 356 int32_t SendData(FrameType frameType, 357 uint8_t payloadType, 358 uint32_t timeStamp, 359 const uint8_t* payloadData, 360 uint16_t payloadSize, 361 const RTPFragmentationHeader* fragmentation); 362 // From ACMVADCallback in the ACM 363 int32_t InFrameType(int16_t frameType); 364 365 int32_t OnRxVadDetected(int vadDecision); 366 367 // From RtpData in the RTP/RTCP module 368 int32_t OnReceivedPayloadData(const uint8_t* payloadData, 369 uint16_t payloadSize, 370 const WebRtcRTPHeader* rtpHeader); 371 372 bool OnRecoveredPacket(const uint8_t* packet, int packet_length); 373 374 // From RtpFeedback in the RTP/RTCP module 375 int32_t OnInitializeDecoder( 376 int32_t id, 377 int8_t payloadType, 378 const char payloadName[RTP_PAYLOAD_NAME_SIZE], 379 int frequency, 380 uint8_t channels, 381 uint32_t rate); 382 383 void OnPacketTimeout(int32_t id); 384 385 void OnReceivedPacket(int32_t id, RtpRtcpPacketType packetType); 386 387 void OnPeriodicDeadOrAlive(int32_t id, 388 RTPAliveType alive); 389 390 void OnIncomingSSRCChanged(int32_t id, 391 uint32_t ssrc); 392 393 void OnIncomingCSRCChanged(int32_t id, 394 uint32_t CSRC, bool added); 395 396 void ResetStatistics(uint32_t ssrc); 397 398 // From RtcpFeedback in the RTP/RTCP module 399 void OnApplicationDataReceived(int32_t id, 400 uint8_t subType, 401 uint32_t name, 402 uint16_t length, 403 const uint8_t* data); 404 405 // From RtpAudioFeedback in the RTP/RTCP module 406 void OnReceivedTelephoneEvent(int32_t id, 407 uint8_t event, 408 bool endOfEvent); 409 410 void OnPlayTelephoneEvent(int32_t id, 411 uint8_t event, 412 uint16_t lengthMs, 413 uint8_t volume); 414 415 // From Transport (called by the RTP/RTCP module) 416 int SendPacket(int /*channel*/, const void *data, int len); 417 int SendRTCPPacket(int /*channel*/, const void *data, int len); 418 419 // From MixerParticipant 420 int32_t GetAudioFrame(int32_t id, AudioFrame& audioFrame); 421 int32_t NeededFrequency(int32_t id); 422 423 // From MonitorObserver 424 void OnPeriodicProcess(); 425 426 // From FileCallback 427 void PlayNotification(int32_t id, 428 uint32_t durationMs); 429 void RecordNotification(int32_t id, 430 uint32_t durationMs); 431 void PlayFileEnded(int32_t id); 432 void RecordFileEnded(int32_t id); 433 434 uint32_t InstanceId() const 435 { 436 return _instanceId; 437 } 438 int32_t ChannelId() const 439 { 440 return _channelId; 441 } 442 bool Playing() const 443 { 444 return channel_state_.Get().playing; 445 } 446 bool Sending() const 447 { 448 return channel_state_.Get().sending; 449 } 450 bool Receiving() const 451 { 452 return channel_state_.Get().receiving; 453 } 454 bool ExternalTransport() const 455 { 456 CriticalSectionScoped cs(&_callbackCritSect); 457 return _externalTransport; 458 } 459 bool ExternalMixing() const 460 { 461 return _externalMixing; 462 } 463 RtpRtcp* RtpRtcpModulePtr() const 464 { 465 return _rtpRtcpModule.get(); 466 } 467 int8_t OutputEnergyLevel() const 468 { 469 return _outputAudioLevel.Level(); 470 } 471 uint32_t Demultiplex(const AudioFrame& audioFrame); 472 // Demultiplex the data to the channel's |_audioFrame|. The difference 473 // between this method and the overloaded method above is that |audio_data| 474 // does not go through transmit_mixer and APM. 475 void Demultiplex(const int16_t* audio_data, 476 int sample_rate, 477 int number_of_frames, 478 int number_of_channels); 479 uint32_t PrepareEncodeAndSend(int mixingFrequency); 480 uint32_t EncodeAndSend(); 481 482 // From BitrateObserver (called by the RTP/RTCP module). 483 void OnNetworkChanged(const uint32_t bitrate_bps, 484 const uint8_t fraction_lost, // 0 - 255. 485 const uint32_t rtt); 486 487 private: 488 bool ReceivePacket(const uint8_t* packet, int packet_length, 489 const RTPHeader& header, bool in_order); 490 bool HandleEncapsulation(const uint8_t* packet, 491 int packet_length, 492 const RTPHeader& header); 493 bool IsPacketInOrder(const RTPHeader& header) const; 494 bool IsPacketRetransmitted(const RTPHeader& header, bool in_order) const; 495 int ResendPackets(const uint16_t* sequence_numbers, int length); 496 int InsertInbandDtmfTone(); 497 int32_t MixOrReplaceAudioWithFile(int mixingFrequency); 498 int32_t MixAudioWithFile(AudioFrame& audioFrame, int mixingFrequency); 499 int32_t SendPacketRaw(const void *data, int len, bool RTCP); 500 void UpdatePacketDelay(uint32_t timestamp, 501 uint16_t sequenceNumber); 502 void RegisterReceiveCodecsToRTPModule(); 503 504 int SetRedPayloadType(int red_payload_type); 505 int SetSendRtpHeaderExtension(bool enable, RTPExtensionType type, 506 unsigned char id); 507 508 int32_t GetPlayoutFrequency(); 509 int GetRTT() const; 510 511 CriticalSectionWrapper& _fileCritSect; 512 CriticalSectionWrapper& _callbackCritSect; 513 CriticalSectionWrapper& volume_settings_critsect_; 514 uint32_t _instanceId; 515 int32_t _channelId; 516 517 ChannelState channel_state_; 518 519 scoped_ptr<RtpHeaderParser> rtp_header_parser_; 520 scoped_ptr<RTPPayloadRegistry> rtp_payload_registry_; 521 scoped_ptr<ReceiveStatistics> rtp_receive_statistics_; 522 scoped_ptr<StatisticsProxy> statistics_proxy_; 523 scoped_ptr<RtpReceiver> rtp_receiver_; 524 TelephoneEventHandler* telephone_event_handler_; 525 scoped_ptr<RtpRtcp> _rtpRtcpModule; 526 scoped_ptr<AudioCodingModule> audio_coding_; 527 RtpDump& _rtpDumpIn; 528 RtpDump& _rtpDumpOut; 529 AudioLevel _outputAudioLevel; 530 bool _externalTransport; 531 AudioFrame _audioFrame; 532 scoped_ptr<int16_t[]> mono_recording_audio_; 533 // Downsamples to the codec rate if necessary. 534 PushResampler<int16_t> input_resampler_; 535 uint8_t _audioLevel_dBov; 536 FilePlayer* _inputFilePlayerPtr; 537 FilePlayer* _outputFilePlayerPtr; 538 FileRecorder* _outputFileRecorderPtr; 539 int _inputFilePlayerId; 540 int _outputFilePlayerId; 541 int _outputFileRecorderId; 542 bool _outputFileRecording; 543 DtmfInbandQueue _inbandDtmfQueue; 544 DtmfInband _inbandDtmfGenerator; 545 bool _outputExternalMedia; 546 VoEMediaProcess* _inputExternalMediaCallbackPtr; 547 VoEMediaProcess* _outputExternalMediaCallbackPtr; 548 uint32_t _timeStamp; 549 uint8_t _sendTelephoneEventPayloadType; 550 551 RemoteNtpTimeEstimator ntp_estimator_ GUARDED_BY(ts_stats_lock_); 552 553 // Timestamp of the audio pulled from NetEq. 554 uint32_t jitter_buffer_playout_timestamp_; 555 uint32_t playout_timestamp_rtp_; 556 uint32_t playout_timestamp_rtcp_; 557 uint32_t playout_delay_ms_; 558 uint32_t _numberOfDiscardedPackets; 559 uint16_t send_sequence_number_; 560 uint8_t restored_packet_[kVoiceEngineMaxIpPacketSizeBytes]; 561 562 scoped_ptr<CriticalSectionWrapper> ts_stats_lock_; 563 564 scoped_ptr<rtc::TimestampWrapAroundHandler> rtp_ts_wraparound_handler_; 565 // The rtp timestamp of the first played out audio frame. 566 int64_t capture_start_rtp_time_stamp_; 567 // The capture ntp time (in local timebase) of the first played out audio 568 // frame. 569 int64_t capture_start_ntp_time_ms_ GUARDED_BY(ts_stats_lock_); 570 571 // uses 572 Statistics* _engineStatisticsPtr; 573 OutputMixer* _outputMixerPtr; 574 TransmitMixer* _transmitMixerPtr; 575 ProcessThread* _moduleProcessThreadPtr; 576 AudioDeviceModule* _audioDeviceModulePtr; 577 VoiceEngineObserver* _voiceEngineObserverPtr; // owned by base 578 CriticalSectionWrapper* _callbackCritSectPtr; // owned by base 579 Transport* _transportPtr; // WebRtc socket or external transport 580 RMSLevel rms_level_; 581 scoped_ptr<AudioProcessing> rx_audioproc_; // far end AudioProcessing 582 VoERxVadCallback* _rxVadObserverPtr; 583 int32_t _oldVadDecision; 584 int32_t _sendFrameType; // Send data is voice, 1-voice, 0-otherwise 585 VoERTCPObserver* _rtcpObserverPtr; 586 // VoEBase 587 bool _externalPlayout; 588 bool _externalMixing; 589 bool _mixFileWithMicrophone; 590 bool _rtcpObserver; 591 // VoEVolumeControl 592 bool _mute; 593 float _panLeft; 594 float _panRight; 595 float _outputGain; 596 // VoEDtmf 597 bool _playOutbandDtmfEvent; 598 bool _playInbandDtmfEvent; 599 // VoeRTP_RTCP 600 uint32_t _lastLocalTimeStamp; 601 int8_t _lastPayloadType; 602 bool _includeAudioLevelIndication; 603 // VoENetwork 604 bool _rtpPacketTimedOut; 605 bool _rtpPacketTimeOutIsEnabled; 606 uint32_t _rtpTimeOutSeconds; 607 bool _connectionObserver; 608 VoEConnectionObserver* _connectionObserverPtr; 609 AudioFrame::SpeechType _outputSpeechType; 610 ViENetwork* vie_network_; 611 int video_channel_; 612 // VoEVideoSync 613 uint32_t _average_jitter_buffer_delay_us; 614 int least_required_delay_ms_; 615 uint32_t _previousTimestamp; 616 uint16_t _recPacketDelayMs; 617 // VoEAudioProcessing 618 bool _RxVadDetection; 619 bool _rxAgcIsEnabled; 620 bool _rxNsIsEnabled; 621 bool restored_packet_in_use_; 622 // RtcpBandwidthObserver 623 scoped_ptr<BitrateController> bitrate_controller_; 624 scoped_ptr<RtcpBandwidthObserver> rtcp_bandwidth_observer_; 625 scoped_ptr<BitrateObserver> send_bitrate_observer_; 626 scoped_ptr<NetworkPredictor> network_predictor_; 627 }; 628 629 } // namespace voe 630 } // namespace webrtc 631 632 #endif // WEBRTC_VOICE_ENGINE_CHANNEL_H_ 633