diff options
Diffstat (limited to 'webrtc/voice_engine/channel.cc')
-rw-r--r-- | webrtc/voice_engine/channel.cc | 434 |
1 files changed, 295 insertions, 139 deletions
diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc index 013f908d34..b1b55e8acc 100644 --- a/webrtc/voice_engine/channel.cc +++ b/webrtc/voice_engine/channel.cc @@ -11,23 +11,26 @@ #include "webrtc/voice_engine/channel.h" #include <algorithm> +#include <utility> #include "webrtc/base/checks.h" #include "webrtc/base/format_macros.h" +#include "webrtc/base/logging.h" +#include "webrtc/base/thread_checker.h" #include "webrtc/base/timeutils.h" #include "webrtc/common.h" #include "webrtc/config.h" #include "webrtc/modules/audio_device/include/audio_device.h" #include "webrtc/modules/audio_processing/include/audio_processing.h" -#include "webrtc/modules/interface/module_common_types.h" -#include "webrtc/modules/rtp_rtcp/interface/receive_statistics.h" -#include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h" -#include "webrtc/modules/rtp_rtcp/interface/rtp_receiver.h" +#include "webrtc/modules/include/module_common_types.h" +#include "webrtc/modules/pacing/packet_router.h" +#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" +#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h" +#include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" #include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h" -#include "webrtc/modules/utility/interface/audio_frame_operations.h" -#include "webrtc/modules/utility/interface/process_thread.h" +#include "webrtc/modules/utility/include/audio_frame_operations.h" +#include "webrtc/modules/utility/include/process_thread.h" #include "webrtc/system_wrappers/include/critical_section_wrapper.h" -#include "webrtc/system_wrappers/include/logging.h" #include "webrtc/system_wrappers/include/trace.h" #include "webrtc/voice_engine/include/voe_base.h" #include "webrtc/voice_engine/include/voe_external_media.h" @@ -44,6 +47,104 @@ namespace webrtc { namespace voe { +class TransportFeedbackProxy : public TransportFeedbackObserver { + public: + TransportFeedbackProxy() : feedback_observer_(nullptr) { + pacer_thread_.DetachFromThread(); + network_thread_.DetachFromThread(); + } + + void SetTransportFeedbackObserver( + TransportFeedbackObserver* feedback_observer) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); + rtc::CritScope lock(&crit_); + feedback_observer_ = feedback_observer; + } + + // Implements TransportFeedbackObserver. + void AddPacket(uint16_t sequence_number, + size_t length, + bool was_paced) override { + RTC_DCHECK(pacer_thread_.CalledOnValidThread()); + rtc::CritScope lock(&crit_); + if (feedback_observer_) + feedback_observer_->AddPacket(sequence_number, length, was_paced); + } + void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override { + RTC_DCHECK(network_thread_.CalledOnValidThread()); + rtc::CritScope lock(&crit_); + if (feedback_observer_) + feedback_observer_->OnTransportFeedback(feedback); + } + + private: + rtc::CriticalSection crit_; + rtc::ThreadChecker thread_checker_; + rtc::ThreadChecker pacer_thread_; + rtc::ThreadChecker network_thread_; + TransportFeedbackObserver* feedback_observer_ GUARDED_BY(&crit_); +}; + +class TransportSequenceNumberProxy : public TransportSequenceNumberAllocator { + public: + TransportSequenceNumberProxy() : seq_num_allocator_(nullptr) { + pacer_thread_.DetachFromThread(); + } + + void SetSequenceNumberAllocator( + TransportSequenceNumberAllocator* seq_num_allocator) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); + rtc::CritScope lock(&crit_); + seq_num_allocator_ = seq_num_allocator; + } + + // Implements TransportSequenceNumberAllocator. + uint16_t AllocateSequenceNumber() override { + RTC_DCHECK(pacer_thread_.CalledOnValidThread()); + rtc::CritScope lock(&crit_); + if (!seq_num_allocator_) + return 0; + return seq_num_allocator_->AllocateSequenceNumber(); + } + + private: + rtc::CriticalSection crit_; + rtc::ThreadChecker thread_checker_; + rtc::ThreadChecker pacer_thread_; + TransportSequenceNumberAllocator* seq_num_allocator_ GUARDED_BY(&crit_); +}; + +class RtpPacketSenderProxy : public RtpPacketSender { + public: + RtpPacketSenderProxy() : rtp_packet_sender_(nullptr) { + } + + void SetPacketSender(RtpPacketSender* rtp_packet_sender) { + RTC_DCHECK(thread_checker_.CalledOnValidThread()); + rtc::CritScope lock(&crit_); + rtp_packet_sender_ = rtp_packet_sender; + } + + // Implements RtpPacketSender. + void InsertPacket(Priority priority, + uint32_t ssrc, + uint16_t sequence_number, + int64_t capture_time_ms, + size_t bytes, + bool retransmission) override { + rtc::CritScope lock(&crit_); + if (rtp_packet_sender_) { + rtp_packet_sender_->InsertPacket(priority, ssrc, sequence_number, + capture_time_ms, bytes, retransmission); + } + } + + private: + rtc::ThreadChecker thread_checker_; + rtc::CriticalSection crit_; + RtpPacketSender* rtp_packet_sender_ GUARDED_BY(&crit_); +}; + // Extend the default RTCP statistics struct with max_jitter, defined as the // maximum jitter value seen in an RTCP report block. struct ChannelStatistics : public RtcpStatistics { @@ -318,11 +419,11 @@ int32_t Channel::OnInitializeDecoder( int8_t payloadType, const char payloadName[RTP_PAYLOAD_NAME_SIZE], int frequency, - uint8_t channels, + size_t channels, uint32_t rate) { WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,_channelId), "Channel::OnInitializeDecoder(payloadType=%d, " - "payloadName=%s, frequency=%u, channels=%u, rate=%u)", + "payloadName=%s, frequency=%u, channels=%" PRIuS ", rate=%u)", payloadType, payloadName, frequency, channels, rate); CodecInst receiveCodec = {0}; @@ -358,7 +459,7 @@ Channel::OnReceivedPayloadData(const uint8_t* payloadData, { WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,_channelId), "Channel::OnReceivedPayloadData(payloadSize=%" PRIuS "," - " payloadType=%u, audioChannel=%u)", + " payloadType=%u, audioChannel=%" PRIuS ")", payloadSize, rtpHeader->header.payloadType, rtpHeader->type.Audio.channel); @@ -460,6 +561,21 @@ int32_t Channel::GetAudioFrame(int32_t id, AudioFrame* audioFrame) } } + { + // Pass the audio buffers to an optional sink callback, before applying + // scaling/panning, as that applies to the mix operation. + // External recipients of the audio (e.g. via AudioTrack), will do their + // own mixing/dynamic processing. + CriticalSectionScoped cs(&_callbackCritSect); + if (audio_sink_) { + AudioSinkInterface::Data data( + &audioFrame->data_[0], + audioFrame->samples_per_channel_, audioFrame->sample_rate_hz_, + audioFrame->num_channels_, audioFrame->timestamp_); + audio_sink_->OnData(data); + } + } + float output_gain = 1.0f; float left_pan = 1.0f; float right_pan = 1.0f; @@ -508,13 +624,10 @@ int32_t Channel::GetAudioFrame(int32_t id, AudioFrame* audioFrame) const bool isStereo = (audioFrame->num_channels_ == 2); if (_outputExternalMediaCallbackPtr) { - _outputExternalMediaCallbackPtr->Process( - _channelId, - kPlaybackPerChannel, - (int16_t*)audioFrame->data_, - audioFrame->samples_per_channel_, - audioFrame->sample_rate_hz_, - isStereo); + _outputExternalMediaCallbackPtr->Process( + _channelId, kPlaybackPerChannel, (int16_t*)audioFrame->data_, + audioFrame->samples_per_channel_, audioFrame->sample_rate_hz_, + isStereo); } } @@ -690,89 +803,97 @@ Channel::Channel(int32_t channelId, uint32_t instanceId, RtcEventLog* const event_log, const Config& config) - : _fileCritSect(*CriticalSectionWrapper::CreateCriticalSection()), - _callbackCritSect(*CriticalSectionWrapper::CreateCriticalSection()), - volume_settings_critsect_(*CriticalSectionWrapper::CreateCriticalSection()), - _instanceId(instanceId), - _channelId(channelId), - event_log_(event_log), - rtp_header_parser_(RtpHeaderParser::Create()), - rtp_payload_registry_( - new RTPPayloadRegistry(RTPPayloadStrategy::CreateStrategy(true))), - rtp_receive_statistics_( - ReceiveStatistics::Create(Clock::GetRealTimeClock())), - rtp_receiver_( - RtpReceiver::CreateAudioReceiver(Clock::GetRealTimeClock(), - this, - this, - this, - rtp_payload_registry_.get())), - telephone_event_handler_(rtp_receiver_->GetTelephoneEventHandler()), - _outputAudioLevel(), - _externalTransport(false), - _inputFilePlayerPtr(NULL), - _outputFilePlayerPtr(NULL), - _outputFileRecorderPtr(NULL), - // Avoid conflict with other channels by adding 1024 - 1026, - // won't use as much as 1024 channels. - _inputFilePlayerId(VoEModuleId(instanceId, channelId) + 1024), - _outputFilePlayerId(VoEModuleId(instanceId, channelId) + 1025), - _outputFileRecorderId(VoEModuleId(instanceId, channelId) + 1026), - _outputFileRecording(false), - _inbandDtmfQueue(VoEModuleId(instanceId, channelId)), - _inbandDtmfGenerator(VoEModuleId(instanceId, channelId)), - _outputExternalMedia(false), - _inputExternalMediaCallbackPtr(NULL), - _outputExternalMediaCallbackPtr(NULL), - _timeStamp(0), // This is just an offset, RTP module will add it's own - // random offset - _sendTelephoneEventPayloadType(106), - ntp_estimator_(Clock::GetRealTimeClock()), - jitter_buffer_playout_timestamp_(0), - playout_timestamp_rtp_(0), - playout_timestamp_rtcp_(0), - playout_delay_ms_(0), - _numberOfDiscardedPackets(0), - send_sequence_number_(0), - ts_stats_lock_(CriticalSectionWrapper::CreateCriticalSection()), - rtp_ts_wraparound_handler_(new rtc::TimestampWrapAroundHandler()), - capture_start_rtp_time_stamp_(-1), - capture_start_ntp_time_ms_(-1), - _engineStatisticsPtr(NULL), - _outputMixerPtr(NULL), - _transmitMixerPtr(NULL), - _moduleProcessThreadPtr(NULL), - _audioDeviceModulePtr(NULL), - _voiceEngineObserverPtr(NULL), - _callbackCritSectPtr(NULL), - _transportPtr(NULL), - _rxVadObserverPtr(NULL), - _oldVadDecision(-1), - _sendFrameType(0), - _externalMixing(false), - _mixFileWithMicrophone(false), - _mute(false), - _panLeft(1.0f), - _panRight(1.0f), - _outputGain(1.0f), - _playOutbandDtmfEvent(false), - _playInbandDtmfEvent(false), - _lastLocalTimeStamp(0), - _lastPayloadType(0), - _includeAudioLevelIndication(false), - _outputSpeechType(AudioFrame::kNormalSpeech), - video_sync_lock_(CriticalSectionWrapper::CreateCriticalSection()), - _average_jitter_buffer_delay_us(0), - _previousTimestamp(0), - _recPacketDelayMs(20), - _RxVadDetection(false), - _rxAgcIsEnabled(false), - _rxNsIsEnabled(false), - restored_packet_in_use_(false), - rtcp_observer_(new VoERtcpObserver(this)), - network_predictor_(new NetworkPredictor(Clock::GetRealTimeClock())), - assoc_send_channel_lock_(CriticalSectionWrapper::CreateCriticalSection()), - associate_send_channel_(ChannelOwner(nullptr)) { + : _fileCritSect(*CriticalSectionWrapper::CreateCriticalSection()), + _callbackCritSect(*CriticalSectionWrapper::CreateCriticalSection()), + volume_settings_critsect_( + *CriticalSectionWrapper::CreateCriticalSection()), + _instanceId(instanceId), + _channelId(channelId), + event_log_(event_log), + rtp_header_parser_(RtpHeaderParser::Create()), + rtp_payload_registry_( + new RTPPayloadRegistry(RTPPayloadStrategy::CreateStrategy(true))), + rtp_receive_statistics_( + ReceiveStatistics::Create(Clock::GetRealTimeClock())), + rtp_receiver_( + RtpReceiver::CreateAudioReceiver(Clock::GetRealTimeClock(), + this, + this, + this, + rtp_payload_registry_.get())), + telephone_event_handler_(rtp_receiver_->GetTelephoneEventHandler()), + _outputAudioLevel(), + _externalTransport(false), + _inputFilePlayerPtr(NULL), + _outputFilePlayerPtr(NULL), + _outputFileRecorderPtr(NULL), + // Avoid conflict with other channels by adding 1024 - 1026, + // won't use as much as 1024 channels. + _inputFilePlayerId(VoEModuleId(instanceId, channelId) + 1024), + _outputFilePlayerId(VoEModuleId(instanceId, channelId) + 1025), + _outputFileRecorderId(VoEModuleId(instanceId, channelId) + 1026), + _outputFileRecording(false), + _inbandDtmfQueue(VoEModuleId(instanceId, channelId)), + _inbandDtmfGenerator(VoEModuleId(instanceId, channelId)), + _outputExternalMedia(false), + _inputExternalMediaCallbackPtr(NULL), + _outputExternalMediaCallbackPtr(NULL), + _timeStamp(0), // This is just an offset, RTP module will add it's own + // random offset + _sendTelephoneEventPayloadType(106), + ntp_estimator_(Clock::GetRealTimeClock()), + jitter_buffer_playout_timestamp_(0), + playout_timestamp_rtp_(0), + playout_timestamp_rtcp_(0), + playout_delay_ms_(0), + _numberOfDiscardedPackets(0), + send_sequence_number_(0), + ts_stats_lock_(CriticalSectionWrapper::CreateCriticalSection()), + rtp_ts_wraparound_handler_(new rtc::TimestampWrapAroundHandler()), + capture_start_rtp_time_stamp_(-1), + capture_start_ntp_time_ms_(-1), + _engineStatisticsPtr(NULL), + _outputMixerPtr(NULL), + _transmitMixerPtr(NULL), + _moduleProcessThreadPtr(NULL), + _audioDeviceModulePtr(NULL), + _voiceEngineObserverPtr(NULL), + _callbackCritSectPtr(NULL), + _transportPtr(NULL), + _rxVadObserverPtr(NULL), + _oldVadDecision(-1), + _sendFrameType(0), + _externalMixing(false), + _mixFileWithMicrophone(false), + _mute(false), + _panLeft(1.0f), + _panRight(1.0f), + _outputGain(1.0f), + _playOutbandDtmfEvent(false), + _playInbandDtmfEvent(false), + _lastLocalTimeStamp(0), + _lastPayloadType(0), + _includeAudioLevelIndication(false), + _outputSpeechType(AudioFrame::kNormalSpeech), + video_sync_lock_(CriticalSectionWrapper::CreateCriticalSection()), + _average_jitter_buffer_delay_us(0), + _previousTimestamp(0), + _recPacketDelayMs(20), + _RxVadDetection(false), + _rxAgcIsEnabled(false), + _rxNsIsEnabled(false), + restored_packet_in_use_(false), + rtcp_observer_(new VoERtcpObserver(this)), + network_predictor_(new NetworkPredictor(Clock::GetRealTimeClock())), + assoc_send_channel_lock_(CriticalSectionWrapper::CreateCriticalSection()), + associate_send_channel_(ChannelOwner(nullptr)), + pacing_enabled_(config.Get<VoicePacing>().enabled), + feedback_observer_proxy_(pacing_enabled_ ? new TransportFeedbackProxy() + : nullptr), + seq_num_allocator_proxy_( + pacing_enabled_ ? new TransportSequenceNumberProxy() : nullptr), + rtp_packet_sender_proxy_(pacing_enabled_ ? new RtpPacketSenderProxy() + : nullptr) { WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId,_channelId), "Channel::Channel() - ctor"); AudioCodingModule::Config acm_config; @@ -797,6 +918,10 @@ Channel::Channel(int32_t channelId, configuration.audio_messages = this; configuration.receive_statistics = rtp_receive_statistics_.get(); configuration.bandwidth_callback = rtcp_observer_.get(); + configuration.paced_sender = rtp_packet_sender_proxy_.get(); + configuration.transport_sequence_number_allocator = + seq_num_allocator_proxy_.get(); + configuration.transport_feedback_callback = feedback_observer_proxy_.get(); _rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration)); @@ -954,8 +1079,8 @@ Channel::Init() { WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId,_channelId), - "Channel::Init() unable to register %s (%d/%d/%d/%d) " - "to RTP/RTCP receiver", + "Channel::Init() unable to register %s " + "(%d/%d/%" PRIuS "/%d) to RTP/RTCP receiver", codec.plname, codec.pltype, codec.plfreq, codec.channels, codec.rate); } @@ -963,8 +1088,8 @@ Channel::Init() { WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,_channelId), - "Channel::Init() %s (%d/%d/%d/%d) has been added to " - "the RTP/RTCP receiver", + "Channel::Init() %s (%d/%d/%" PRIuS "/%d) has been " + "added to the RTP/RTCP receiver", codec.plname, codec.pltype, codec.plfreq, codec.channels, codec.rate); } @@ -1020,11 +1145,11 @@ Channel::Init() } if (rx_audioproc_->noise_suppression()->set_level(kDefaultNsMode) != 0) { - LOG_FERR1(LS_ERROR, noise_suppression()->set_level, kDefaultNsMode); + LOG(LS_ERROR) << "noise_suppression()->set_level(kDefaultNsMode) failed."; return -1; } if (rx_audioproc_->gain_control()->set_mode(kDefaultRxAgcMode) != 0) { - LOG_FERR1(LS_ERROR, gain_control()->set_mode, kDefaultRxAgcMode); + LOG(LS_ERROR) << "gain_control()->set_mode(kDefaultRxAgcMode) failed."; return -1; } @@ -1060,6 +1185,11 @@ Channel::UpdateLocalTimeStamp() return 0; } +void Channel::SetSink(rtc::scoped_ptr<AudioSinkInterface> sink) { + CriticalSectionScoped cs(&_callbackCritSect); + audio_sink_ = std::move(sink); +} + int32_t Channel::StartPlayout() { @@ -1242,7 +1372,12 @@ Channel::DeRegisterVoiceEngineObserver() int32_t Channel::GetSendCodec(CodecInst& codec) { - return (audio_coding_->SendCodec(&codec)); + auto send_codec = audio_coding_->SendCodec(); + if (send_codec) { + codec = *send_codec; + return 0; + } + return -1; } int32_t @@ -1456,7 +1591,7 @@ Channel::SetSendCNPayloadType(int type, PayloadFrequencies frequency) CodecInst codec; int32_t samplingFreqHz(-1); - const int kMono = 1; + const size_t kMono = 1; if (frequency == kFreq32000Hz) samplingFreqHz = 32000; else if (frequency == kFreq16000Hz) @@ -2367,6 +2502,9 @@ int Channel::SendTelephoneEventOutband(unsigned char eventCode, WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), "Channel::SendTelephoneEventOutband(..., playDtmfEvent=%d)", playDtmfEvent); + if (!Sending()) { + return -1; + } _playOutbandDtmfEvent = playDtmfEvent; @@ -2779,6 +2917,38 @@ int Channel::SetReceiveAbsoluteSenderTimeStatus(bool enable, unsigned char id) { return 0; } +void Channel::EnableSendTransportSequenceNumber(int id) { + int ret = + SetSendRtpHeaderExtension(true, kRtpExtensionTransportSequenceNumber, id); + RTC_DCHECK_EQ(0, ret); +} + +void Channel::SetCongestionControlObjects( + RtpPacketSender* rtp_packet_sender, + TransportFeedbackObserver* transport_feedback_observer, + PacketRouter* packet_router) { + RTC_DCHECK(packet_router != nullptr || packet_router_ != nullptr); + if (transport_feedback_observer) { + RTC_DCHECK(feedback_observer_proxy_.get()); + feedback_observer_proxy_->SetTransportFeedbackObserver( + transport_feedback_observer); + } + if (rtp_packet_sender) { + RTC_DCHECK(rtp_packet_sender_proxy_.get()); + rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender); + } + if (seq_num_allocator_proxy_.get()) { + seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router); + } + _rtpRtcpModule->SetStorePacketsStatus(rtp_packet_sender != nullptr, 600); + if (packet_router != nullptr) { + packet_router->AddRtpModule(_rtpRtcpModule.get()); + } else { + packet_router_->RemoveRtpModule(_rtpRtcpModule.get()); + } + packet_router_ = packet_router; +} + void Channel::SetRTCPStatus(bool enable) { WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), "Channel::SetRTCPStatus()"); @@ -3122,9 +3292,8 @@ Channel::GetREDStatus(bool& enabled, int& redPayloadtype) enabled = audio_coding_->REDStatus(); if (enabled) { - int8_t payloadType(0); - if (_rtpRtcpModule->SendREDPayloadType(payloadType) != 0) - { + int8_t payloadType = 0; + if (_rtpRtcpModule->SendREDPayloadType(&payloadType) != 0) { _engineStatisticsPtr->SetLastError( VE_RTP_RTCP_MODULE_ERROR, kTraceError, "GetREDStatus() failed to retrieve RED PT from RTP/RTCP " @@ -3157,7 +3326,9 @@ bool Channel::GetCodecFECStatus() { void Channel::SetNACKStatus(bool enable, int maxNumberOfPackets) { // None of these functions can fail. - _rtpRtcpModule->SetStorePacketsStatus(enable, maxNumberOfPackets); + // If pacing is enabled we always store packets. + if (!pacing_enabled_) + _rtpRtcpModule->SetStorePacketsStatus(enable, maxNumberOfPackets); rtp_receive_statistics_->SetMaxReorderingThreshold(maxNumberOfPackets); rtp_receiver_->SetNACKStatus(enable ? kNackRtcp : kNackOff); if (enable) @@ -3184,7 +3355,7 @@ Channel::Demultiplex(const AudioFrame& audioFrame) void Channel::Demultiplex(const int16_t* audio_data, int sample_rate, size_t number_of_frames, - int number_of_channels) { + size_t number_of_channels) { CodecInst codec; GetSendCodec(codec); @@ -3410,33 +3581,17 @@ bool Channel::GetDelayEstimate(int* jitter_buffer_delay_ms, return true; } -int Channel::LeastRequiredDelayMs() const { - return audio_coding_->LeastRequiredDelayMs(); +uint32_t Channel::GetDelayEstimate() const { + int jitter_buffer_delay_ms = 0; + int playout_buffer_delay_ms = 0; + GetDelayEstimate(&jitter_buffer_delay_ms, &playout_buffer_delay_ms); + return jitter_buffer_delay_ms + playout_buffer_delay_ms; } -int Channel::SetInitialPlayoutDelay(int delay_ms) -{ - WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,_channelId), - "Channel::SetInitialPlayoutDelay()"); - if ((delay_ms < kVoiceEngineMinMinPlayoutDelayMs) || - (delay_ms > kVoiceEngineMaxMinPlayoutDelayMs)) - { - _engineStatisticsPtr->SetLastError( - VE_INVALID_ARGUMENT, kTraceError, - "SetInitialPlayoutDelay() invalid min delay"); - return -1; - } - if (audio_coding_->SetInitialPlayoutDelay(delay_ms) != 0) - { - _engineStatisticsPtr->SetLastError( - VE_AUDIO_CODING_MODULE_ERROR, kTraceError, - "SetInitialPlayoutDelay() failed to set min playout delay"); - return -1; - } - return 0; +int Channel::LeastRequiredDelayMs() const { + return audio_coding_->LeastRequiredDelayMs(); } - int Channel::SetMinimumPlayoutDelay(int delayMs) { @@ -3687,7 +3842,7 @@ Channel::InsertInbandDtmfTone() sample < _audioFrame.samples_per_channel_; sample++) { - for (int channel = 0; + for (size_t channel = 0; channel < _audioFrame.num_channels_; channel++) { @@ -3821,7 +3976,8 @@ Channel::RegisterReceiveCodecsToRTPModule() kTraceVoice, VoEId(_instanceId, _channelId), "Channel::RegisterReceiveCodecsToRTPModule() unable" - " to register %s (%d/%d/%d/%d) to RTP/RTCP receiver", + " to register %s (%d/%d/%" PRIuS "/%d) to RTP/RTCP " + "receiver", codec.plname, codec.pltype, codec.plfreq, codec.channels, codec.rate); } @@ -3831,7 +3987,7 @@ Channel::RegisterReceiveCodecsToRTPModule() kTraceVoice, VoEId(_instanceId, _channelId), "Channel::RegisterReceiveCodecsToRTPModule() %s " - "(%d/%d/%d/%d) has been added to the RTP/RTCP " + "(%d/%d/%" PRIuS "/%d) has been added to the RTP/RTCP " "receiver", codec.plname, codec.pltype, codec.plfreq, codec.channels, codec.rate); |