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