1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef AUDIO_VOIP_AUDIO_CHANNEL_H_ 12*d9f75844SAndroid Build Coastguard Worker #define AUDIO_VOIP_AUDIO_CHANNEL_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <map> 15*d9f75844SAndroid Build Coastguard Worker #include <memory> 16*d9f75844SAndroid Build Coastguard Worker #include <queue> 17*d9f75844SAndroid Build Coastguard Worker #include <utility> 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_factory.h" 20*d9f75844SAndroid Build Coastguard Worker #include "api/voip/voip_base.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/voip/voip_statistics.h" 22*d9f75844SAndroid Build Coastguard Worker #include "audio/voip/audio_egress.h" 23*d9f75844SAndroid Build Coastguard Worker #include "audio/voip/audio_ingress.h" 24*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h" 25*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ref_count.h" 26*d9f75844SAndroid Build Coastguard Worker 27*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 28*d9f75844SAndroid Build Coastguard Worker 29*d9f75844SAndroid Build Coastguard Worker // AudioChannel represents a single media session and provides APIs over 30*d9f75844SAndroid Build Coastguard Worker // AudioIngress and AudioEgress. Note that a single RTP stack is shared with 31*d9f75844SAndroid Build Coastguard Worker // these two classes as it has both sending and receiving capabilities. 32*d9f75844SAndroid Build Coastguard Worker class AudioChannel : public rtc::RefCountInterface { 33*d9f75844SAndroid Build Coastguard Worker public: 34*d9f75844SAndroid Build Coastguard Worker AudioChannel(Transport* transport, 35*d9f75844SAndroid Build Coastguard Worker uint32_t local_ssrc, 36*d9f75844SAndroid Build Coastguard Worker TaskQueueFactory* task_queue_factory, 37*d9f75844SAndroid Build Coastguard Worker AudioMixer* audio_mixer, 38*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<AudioDecoderFactory> decoder_factory); 39*d9f75844SAndroid Build Coastguard Worker ~AudioChannel() override; 40*d9f75844SAndroid Build Coastguard Worker 41*d9f75844SAndroid Build Coastguard Worker // Set and get ChannelId that this audio channel belongs for debugging and 42*d9f75844SAndroid Build Coastguard Worker // logging purpose. SetId(ChannelId id)43*d9f75844SAndroid Build Coastguard Worker void SetId(ChannelId id) { id_ = id; } GetId()44*d9f75844SAndroid Build Coastguard Worker ChannelId GetId() const { return id_; } 45*d9f75844SAndroid Build Coastguard Worker 46*d9f75844SAndroid Build Coastguard Worker // APIs to start/stop audio channel on each direction. 47*d9f75844SAndroid Build Coastguard Worker // StartSend/StartPlay returns false if encoder/decoders 48*d9f75844SAndroid Build Coastguard Worker // have not been set, respectively. 49*d9f75844SAndroid Build Coastguard Worker bool StartSend(); 50*d9f75844SAndroid Build Coastguard Worker void StopSend(); 51*d9f75844SAndroid Build Coastguard Worker bool StartPlay(); 52*d9f75844SAndroid Build Coastguard Worker void StopPlay(); 53*d9f75844SAndroid Build Coastguard Worker 54*d9f75844SAndroid Build Coastguard Worker // APIs relayed to AudioEgress. IsSendingMedia()55*d9f75844SAndroid Build Coastguard Worker bool IsSendingMedia() const { return egress_->IsSending(); } GetAudioSender()56*d9f75844SAndroid Build Coastguard Worker AudioSender* GetAudioSender() { return egress_.get(); } SetEncoder(int payload_type,const SdpAudioFormat & encoder_format,std::unique_ptr<AudioEncoder> encoder)57*d9f75844SAndroid Build Coastguard Worker void SetEncoder(int payload_type, 58*d9f75844SAndroid Build Coastguard Worker const SdpAudioFormat& encoder_format, 59*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<AudioEncoder> encoder) { 60*d9f75844SAndroid Build Coastguard Worker egress_->SetEncoder(payload_type, encoder_format, std::move(encoder)); 61*d9f75844SAndroid Build Coastguard Worker } GetEncoderFormat()62*d9f75844SAndroid Build Coastguard Worker absl::optional<SdpAudioFormat> GetEncoderFormat() const { 63*d9f75844SAndroid Build Coastguard Worker return egress_->GetEncoderFormat(); 64*d9f75844SAndroid Build Coastguard Worker } RegisterTelephoneEventType(int rtp_payload_type,int sample_rate_hz)65*d9f75844SAndroid Build Coastguard Worker void RegisterTelephoneEventType(int rtp_payload_type, int sample_rate_hz) { 66*d9f75844SAndroid Build Coastguard Worker egress_->RegisterTelephoneEventType(rtp_payload_type, sample_rate_hz); 67*d9f75844SAndroid Build Coastguard Worker } SendTelephoneEvent(int dtmf_event,int duration_ms)68*d9f75844SAndroid Build Coastguard Worker bool SendTelephoneEvent(int dtmf_event, int duration_ms) { 69*d9f75844SAndroid Build Coastguard Worker return egress_->SendTelephoneEvent(dtmf_event, duration_ms); 70*d9f75844SAndroid Build Coastguard Worker } SetMute(bool enable)71*d9f75844SAndroid Build Coastguard Worker void SetMute(bool enable) { egress_->SetMute(enable); } 72*d9f75844SAndroid Build Coastguard Worker 73*d9f75844SAndroid Build Coastguard Worker // APIs relayed to AudioIngress. IsPlaying()74*d9f75844SAndroid Build Coastguard Worker bool IsPlaying() const { return ingress_->IsPlaying(); } ReceivedRTPPacket(rtc::ArrayView<const uint8_t> rtp_packet)75*d9f75844SAndroid Build Coastguard Worker void ReceivedRTPPacket(rtc::ArrayView<const uint8_t> rtp_packet) { 76*d9f75844SAndroid Build Coastguard Worker ingress_->ReceivedRTPPacket(rtp_packet); 77*d9f75844SAndroid Build Coastguard Worker } ReceivedRTCPPacket(rtc::ArrayView<const uint8_t> rtcp_packet)78*d9f75844SAndroid Build Coastguard Worker void ReceivedRTCPPacket(rtc::ArrayView<const uint8_t> rtcp_packet) { 79*d9f75844SAndroid Build Coastguard Worker ingress_->ReceivedRTCPPacket(rtcp_packet); 80*d9f75844SAndroid Build Coastguard Worker } SetReceiveCodecs(const std::map<int,SdpAudioFormat> & codecs)81*d9f75844SAndroid Build Coastguard Worker void SetReceiveCodecs(const std::map<int, SdpAudioFormat>& codecs) { 82*d9f75844SAndroid Build Coastguard Worker ingress_->SetReceiveCodecs(codecs); 83*d9f75844SAndroid Build Coastguard Worker } 84*d9f75844SAndroid Build Coastguard Worker IngressStatistics GetIngressStatistics(); 85*d9f75844SAndroid Build Coastguard Worker ChannelStatistics GetChannelStatistics(); 86*d9f75844SAndroid Build Coastguard Worker 87*d9f75844SAndroid Build Coastguard Worker // See comments on the methods used from AudioEgress and AudioIngress. 88*d9f75844SAndroid Build Coastguard Worker // Conversion to double is following what is done in 89*d9f75844SAndroid Build Coastguard Worker // DoubleAudioLevelFromIntAudioLevel method in rtc_stats_collector.cc to be 90*d9f75844SAndroid Build Coastguard Worker // consistent. GetInputAudioLevel()91*d9f75844SAndroid Build Coastguard Worker double GetInputAudioLevel() const { 92*d9f75844SAndroid Build Coastguard Worker return egress_->GetInputAudioLevel() / 32767.0; 93*d9f75844SAndroid Build Coastguard Worker } GetInputTotalEnergy()94*d9f75844SAndroid Build Coastguard Worker double GetInputTotalEnergy() const { return egress_->GetInputTotalEnergy(); } GetInputTotalDuration()95*d9f75844SAndroid Build Coastguard Worker double GetInputTotalDuration() const { 96*d9f75844SAndroid Build Coastguard Worker return egress_->GetInputTotalDuration(); 97*d9f75844SAndroid Build Coastguard Worker } GetOutputAudioLevel()98*d9f75844SAndroid Build Coastguard Worker double GetOutputAudioLevel() const { 99*d9f75844SAndroid Build Coastguard Worker return ingress_->GetOutputAudioLevel() / 32767.0; 100*d9f75844SAndroid Build Coastguard Worker } GetOutputTotalEnergy()101*d9f75844SAndroid Build Coastguard Worker double GetOutputTotalEnergy() const { 102*d9f75844SAndroid Build Coastguard Worker return ingress_->GetOutputTotalEnergy(); 103*d9f75844SAndroid Build Coastguard Worker } GetOutputTotalDuration()104*d9f75844SAndroid Build Coastguard Worker double GetOutputTotalDuration() const { 105*d9f75844SAndroid Build Coastguard Worker return ingress_->GetOutputTotalDuration(); 106*d9f75844SAndroid Build Coastguard Worker } 107*d9f75844SAndroid Build Coastguard Worker 108*d9f75844SAndroid Build Coastguard Worker // Internal API for testing purpose. SendRTCPReportForTesting(RTCPPacketType type)109*d9f75844SAndroid Build Coastguard Worker void SendRTCPReportForTesting(RTCPPacketType type) { 110*d9f75844SAndroid Build Coastguard Worker int32_t result = rtp_rtcp_->SendRTCP(type); 111*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(result == 0); 112*d9f75844SAndroid Build Coastguard Worker } 113*d9f75844SAndroid Build Coastguard Worker 114*d9f75844SAndroid Build Coastguard Worker private: 115*d9f75844SAndroid Build Coastguard Worker // ChannelId that this audio channel belongs for logging purpose. 116*d9f75844SAndroid Build Coastguard Worker ChannelId id_; 117*d9f75844SAndroid Build Coastguard Worker 118*d9f75844SAndroid Build Coastguard Worker // Synchronization is handled internally by AudioMixer. 119*d9f75844SAndroid Build Coastguard Worker AudioMixer* audio_mixer_; 120*d9f75844SAndroid Build Coastguard Worker 121*d9f75844SAndroid Build Coastguard Worker // Listed in order for safe destruction of AudioChannel object. 122*d9f75844SAndroid Build Coastguard Worker // Synchronization for these are handled internally. 123*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<ReceiveStatistics> receive_statistics_; 124*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<ModuleRtpRtcpImpl2> rtp_rtcp_; 125*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<AudioIngress> ingress_; 126*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<AudioEgress> egress_; 127*d9f75844SAndroid Build Coastguard Worker }; 128*d9f75844SAndroid Build Coastguard Worker 129*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 130*d9f75844SAndroid Build Coastguard Worker 131*d9f75844SAndroid Build Coastguard Worker #endif // AUDIO_VOIP_AUDIO_CHANNEL_H_ 132