| Index: talk/media/webrtc/webrtcvoiceengine.cc
|
| diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc
|
| index 80208ba0c7617b5a895ead759b4276c995e8f6cc..391052b8d4d6f0b309586d609ffb97e9ede17438 100644
|
| --- a/talk/media/webrtc/webrtcvoiceengine.cc
|
| +++ b/talk/media/webrtc/webrtcvoiceengine.cc
|
| @@ -214,11 +214,10 @@ static bool IsCodecMultiRate(const webrtc::CodecInst& codec) {
|
| static bool FindCodec(const std::vector<AudioCodec>& codecs,
|
| const AudioCodec& codec,
|
| AudioCodec* found_codec) {
|
| - for (std::vector<AudioCodec>::const_iterator it = codecs.begin();
|
| - it != codecs.end(); ++it) {
|
| - if (it->Matches(codec)) {
|
| + for (const AudioCodec& c : codecs) {
|
| + if (c.Matches(codec)) {
|
| if (found_codec != NULL) {
|
| - *found_codec = *it;
|
| + *found_codec = c;
|
| }
|
| return true;
|
| }
|
| @@ -556,9 +555,8 @@ bool WebRtcVoiceEngine::InitInternal() {
|
|
|
| // Print our codec list again for the call diagnostic log
|
| LOG(LS_INFO) << "WebRtc VoiceEngine codecs:";
|
| - for (std::vector<AudioCodec>::const_iterator it = codecs_.begin();
|
| - it != codecs_.end(); ++it) {
|
| - LOG(LS_INFO) << ToString(*it);
|
| + for (const AudioCodec& codec : codecs_) {
|
| + LOG(LS_INFO) << ToString(codec);
|
| }
|
|
|
| // Disable the DTMF playout when a tone is sent.
|
| @@ -948,9 +946,7 @@ bool WebRtcVoiceEngine::SetDevices(const Device* in_device,
|
| }
|
|
|
| // Must also pause all audio playback and capture.
|
| - for (ChannelList::const_iterator i = channels_.begin();
|
| - i != channels_.end(); ++i) {
|
| - WebRtcVoiceMediaChannel *channel = *i;
|
| + for (WebRtcVoiceMediaChannel* channel : channels_) {
|
| if (!channel->PausePlayout()) {
|
| LOG(LS_WARNING) << "Failed to pause playout";
|
| ret = false;
|
| @@ -988,9 +984,7 @@ bool WebRtcVoiceEngine::SetDevices(const Device* in_device,
|
| }
|
|
|
| // Resume all audio playback and capture.
|
| - for (ChannelList::const_iterator i = channels_.begin();
|
| - i != channels_.end(); ++i) {
|
| - WebRtcVoiceMediaChannel *channel = *i;
|
| + for (WebRtcVoiceMediaChannel* channel : channels_) {
|
| if (!channel->ResumePlayout()) {
|
| LOG(LS_WARNING) << "Failed to resume playout";
|
| ret = false;
|
| @@ -1328,11 +1322,10 @@ bool WebRtcVoiceEngine::FindChannelAndSsrc(
|
| *channel = NULL;
|
| *ssrc = 0;
|
| // Find corresponding channel and ssrc
|
| - for (ChannelList::const_iterator it = channels_.begin();
|
| - it != channels_.end(); ++it) {
|
| - DCHECK(*it != NULL);
|
| - if ((*it)->FindSsrc(channel_num, ssrc)) {
|
| - *channel = *it;
|
| + for (WebRtcVoiceMediaChannel* ch : channels_) {
|
| + DCHECK(ch != NULL);
|
| + if (ch->FindSsrc(channel_num, ssrc)) {
|
| + *channel = ch;
|
| return true;
|
| }
|
| }
|
| @@ -1349,14 +1342,13 @@ bool WebRtcVoiceEngine::FindChannelNumFromSsrc(
|
|
|
| *channel_num = -1;
|
| // Find corresponding channel for ssrc.
|
| - for (ChannelList::const_iterator it = channels_.begin();
|
| - it != channels_.end(); ++it) {
|
| - DCHECK(*it != NULL);
|
| + for (const WebRtcVoiceMediaChannel* ch : channels_) {
|
| + DCHECK(ch != NULL);
|
| if (direction & MPD_RX) {
|
| - *channel_num = (*it)->GetReceiveChannelNum(ssrc);
|
| + *channel_num = ch->GetReceiveChannelNum(ssrc);
|
| }
|
| if (*channel_num == -1 && (direction & MPD_TX)) {
|
| - *channel_num = (*it)->GetSendChannelNum(ssrc);
|
| + *channel_num = ch->GetSendChannelNum(ssrc);
|
| }
|
| if (*channel_num != -1) {
|
| return true;
|
| @@ -1860,16 +1852,15 @@ bool WebRtcVoiceMediaChannel::SetRecvCodecs(
|
| // Find all new codecs. We allow adding new codecs but don't allow changing
|
| // the payload type of codecs that is already configured since we might
|
| // already be receiving packets with that payload type.
|
| - for (std::vector<AudioCodec>::const_iterator it = codecs.begin();
|
| - it != codecs.end(); ++it) {
|
| + for (const AudioCodec& codec : codecs) {
|
| AudioCodec old_codec;
|
| - if (FindCodec(recv_codecs_, *it, &old_codec)) {
|
| - if (old_codec.id != it->id) {
|
| - LOG(LS_ERROR) << it->name << " payload type changed.";
|
| + if (FindCodec(recv_codecs_, codec, &old_codec)) {
|
| + if (old_codec.id != codec.id) {
|
| + LOG(LS_ERROR) << codec.name << " payload type changed.";
|
| return false;
|
| }
|
| } else {
|
| - new_codecs.push_back(*it);
|
| + new_codecs.push_back(codec);
|
| }
|
| }
|
| if (new_codecs.empty()) {
|
| @@ -1884,50 +1875,15 @@ bool WebRtcVoiceMediaChannel::SetRecvCodecs(
|
| PausePlayout();
|
| }
|
|
|
| - bool ret = true;
|
| - for (std::vector<AudioCodec>::const_iterator it = new_codecs.begin();
|
| - it != new_codecs.end() && ret; ++it) {
|
| - webrtc::CodecInst voe_codec;
|
| - if (engine()->FindWebRtcCodec(*it, &voe_codec)) {
|
| - LOG(LS_INFO) << ToString(*it);
|
| - voe_codec.pltype = it->id;
|
| - if (default_receive_ssrc_ == 0) {
|
| - // Set the receive codecs on the default channel explicitly if the
|
| - // default channel is not used by |receive_channels_|, this happens in
|
| - // conference mode or in non-conference mode when there is no playout
|
| - // channel.
|
| - // TODO(xians): Figure out how we use the default channel in conference
|
| - // mode.
|
| - if (engine()->voe()->codec()->SetRecPayloadType(
|
| - voe_channel(), voe_codec) == -1) {
|
| - LOG_RTCERR2(SetRecPayloadType, voe_channel(), ToString(voe_codec));
|
| - ret = false;
|
| - }
|
| - }
|
| -
|
| - // Set the receive codecs on all receiving channels.
|
| - for (ChannelMap::iterator it = receive_channels_.begin();
|
| - it != receive_channels_.end() && ret; ++it) {
|
| - if (engine()->voe()->codec()->SetRecPayloadType(
|
| - it->second->channel(), voe_codec) == -1) {
|
| - LOG_RTCERR2(SetRecPayloadType, it->second->channel(),
|
| - ToString(voe_codec));
|
| - ret = false;
|
| - }
|
| - }
|
| - } else {
|
| - LOG(LS_WARNING) << "Unknown codec " << ToString(*it);
|
| - ret = false;
|
| - }
|
| - }
|
| - if (ret) {
|
| + bool result = SetRecvCodecsInternal(new_codecs);
|
| + if (result) {
|
| recv_codecs_ = codecs;
|
| }
|
|
|
| if (desired_playout_ && !playout_) {
|
| ResumePlayout();
|
| }
|
| - return ret;
|
| + return result;
|
| }
|
|
|
| bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
| @@ -1950,17 +1906,16 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
| int opus_max_playback_rate = 0;
|
|
|
| // Set send codec (the first non-telephone-event/CN codec)
|
| - for (std::vector<AudioCodec>::const_iterator it = codecs.begin();
|
| - it != codecs.end(); ++it) {
|
| + for (const AudioCodec& codec : codecs) {
|
| // Ignore codecs we don't know about. The negotiation step should prevent
|
| // this, but double-check to be sure.
|
| webrtc::CodecInst voe_codec;
|
| - if (!engine()->FindWebRtcCodec(*it, &voe_codec)) {
|
| - LOG(LS_WARNING) << "Unknown codec " << ToString(*it);
|
| + if (!engine()->FindWebRtcCodec(codec, &voe_codec)) {
|
| + LOG(LS_WARNING) << "Unknown codec " << ToString(codec);
|
| continue;
|
| }
|
|
|
| - if (IsCodec(*it, kDtmfCodecName) || IsCodec(*it, kCnCodecName)) {
|
| + if (IsCodec(codec, kDtmfCodecName) || IsCodec(codec, kCnCodecName)) {
|
| // Skip telephone-event/CN codec, which will be handled later.
|
| continue;
|
| }
|
| @@ -1969,33 +1924,33 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
| // Be sure to use the payload type requested by the remote side.
|
| // "red", for RED audio, is a special case where the actual codec to be
|
| // used is specified in params.
|
| - if (IsCodec(*it, kRedCodecName)) {
|
| + if (IsCodec(codec, kRedCodecName)) {
|
| // Parse out the RED parameters. If we fail, just ignore RED;
|
| // we don't support all possible params/usage scenarios.
|
| - if (!GetRedSendCodec(*it, codecs, &send_codec)) {
|
| + if (!GetRedSendCodec(codec, codecs, &send_codec)) {
|
| continue;
|
| }
|
|
|
| // Enable redundant encoding of the specified codec. Treat any
|
| // failure as a fatal internal error.
|
| LOG(LS_INFO) << "Enabling RED on channel " << channel;
|
| - if (engine()->voe()->rtp()->SetREDStatus(channel, true, it->id) == -1) {
|
| - LOG_RTCERR3(SetREDStatus, channel, true, it->id);
|
| + if (engine()->voe()->rtp()->SetREDStatus(channel, true, codec.id) == -1) {
|
| + LOG_RTCERR3(SetREDStatus, channel, true, codec.id);
|
| return false;
|
| }
|
| } else {
|
| send_codec = voe_codec;
|
| - nack_enabled = IsNackEnabled(*it);
|
| + nack_enabled = IsNackEnabled(codec);
|
| // For Opus as the send codec, we are to determine inband FEC, maximum
|
| // playback rate, and opus internal dtx.
|
| - if (IsCodec(*it, kOpusCodecName)) {
|
| - GetOpusConfig(*it, &send_codec, &enable_codec_fec,
|
| + if (IsCodec(codec, kOpusCodecName)) {
|
| + GetOpusConfig(codec, &send_codec, &enable_codec_fec,
|
| &opus_max_playback_rate, &enable_opus_dtx);
|
| }
|
|
|
| // Set packet size if the AudioCodec param kCodecParamPTime is set.
|
| int ptime_ms = 0;
|
| - if (it->GetParam(kCodecParamPTime, &ptime_ms)) {
|
| + if (codec.GetParam(kCodecParamPTime, &ptime_ms)) {
|
| if (!SetPTimeAsPacketSize(&send_codec, ptime_ms)) {
|
| LOG(LS_WARNING) << "Failed to set packet size for codec "
|
| << send_codec.plname;
|
| @@ -2070,30 +2025,29 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
| }
|
|
|
| // Loop through the codecs list again to config the telephone-event/CN codec.
|
| - for (std::vector<AudioCodec>::const_iterator it = codecs.begin();
|
| - it != codecs.end(); ++it) {
|
| + for (const AudioCodec& codec : codecs) {
|
| // Ignore codecs we don't know about. The negotiation step should prevent
|
| // this, but double-check to be sure.
|
| webrtc::CodecInst voe_codec;
|
| - if (!engine()->FindWebRtcCodec(*it, &voe_codec)) {
|
| - LOG(LS_WARNING) << "Unknown codec " << ToString(*it);
|
| + if (!engine()->FindWebRtcCodec(codec, &voe_codec)) {
|
| + LOG(LS_WARNING) << "Unknown codec " << ToString(codec);
|
| continue;
|
| }
|
|
|
| // Find the DTMF telephone event "codec" and tell VoiceEngine channels
|
| // about it.
|
| - if (IsCodec(*it, kDtmfCodecName)) {
|
| + if (IsCodec(codec, kDtmfCodecName)) {
|
| if (engine()->voe()->dtmf()->SetSendTelephoneEventPayloadType(
|
| - channel, it->id) == -1) {
|
| - LOG_RTCERR2(SetSendTelephoneEventPayloadType, channel, it->id);
|
| + channel, codec.id) == -1) {
|
| + LOG_RTCERR2(SetSendTelephoneEventPayloadType, channel, codec.id);
|
| return false;
|
| }
|
| - } else if (IsCodec(*it, kCnCodecName)) {
|
| + } else if (IsCodec(codec, kCnCodecName)) {
|
| // Turn voice activity detection/comfort noise on if supported.
|
| // Set the wideband CN payload type appropriately.
|
| // (narrowband always uses the static payload type 13).
|
| webrtc::PayloadFrequencies cn_freq;
|
| - switch (it->clockrate) {
|
| + switch (codec.clockrate) {
|
| case 8000:
|
| cn_freq = webrtc::kFreq8000Hz;
|
| break;
|
| @@ -2104,7 +2058,7 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
| cn_freq = webrtc::kFreq32000Hz;
|
| break;
|
| default:
|
| - LOG(LS_WARNING) << "CN frequency " << it->clockrate
|
| + LOG(LS_WARNING) << "CN frequency " << codec.clockrate
|
| << " not supported.";
|
| continue;
|
| }
|
| @@ -2112,8 +2066,8 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
| // The CN payload type for 8000 Hz clockrate is fixed at 13.
|
| if (cn_freq != webrtc::kFreq8000Hz) {
|
| if (engine()->voe()->codec()->SetSendCNPayloadType(
|
| - channel, it->id, cn_freq) == -1) {
|
| - LOG_RTCERR3(SetSendCNPayloadType, channel, it->id, cn_freq);
|
| + channel, codec.id, cn_freq) == -1) {
|
| + LOG_RTCERR3(SetSendCNPayloadType, channel, codec.id, cn_freq);
|
| // TODO(ajm): This failure condition will be removed from VoE.
|
| // Restore the return here when we update to a new enough webrtc.
|
| //
|
| @@ -2126,7 +2080,7 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
| }
|
| // Only turn on VAD if we have a CN payload type that matches the
|
| // clockrate for the codec we are going to use.
|
| - if (it->clockrate == send_codec.plfreq && send_codec.channels != 2) {
|
| + if (codec.clockrate == send_codec.plfreq && send_codec.channels != 2) {
|
| // TODO(minyue): If CN frequency == 48000 Hz is allowed, consider the
|
| // interaction between VAD and Opus FEC.
|
| LOG(LS_INFO) << "Enabling VAD";
|
| @@ -2143,19 +2097,17 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
| bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
| const std::vector<AudioCodec>& codecs) {
|
| dtmf_allowed_ = false;
|
| - for (std::vector<AudioCodec>::const_iterator it = codecs.begin();
|
| - it != codecs.end(); ++it) {
|
| + for (const AudioCodec& codec : codecs) {
|
| // Find the DTMF telephone event "codec".
|
| - if (IsCodec(*it, kDtmfCodecName)) {
|
| + if (IsCodec(codec, kDtmfCodecName)) {
|
| dtmf_allowed_ = true;
|
| }
|
| }
|
|
|
| // Cache the codecs in order to configure the channel created later.
|
| send_codecs_ = codecs;
|
| - for (ChannelMap::iterator iter = send_channels_.begin();
|
| - iter != send_channels_.end(); ++iter) {
|
| - if (!SetSendCodecs(iter->second->channel(), codecs)) {
|
| + for (const auto& ch : send_channels_) {
|
| + if (!SetSendCodecs(ch.second->channel(), codecs)) {
|
| return false;
|
| }
|
| }
|
| @@ -2167,9 +2119,8 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
|
|
| void WebRtcVoiceMediaChannel::SetNack(const ChannelMap& channels,
|
| bool nack_enabled) {
|
| - for (ChannelMap::const_iterator it = channels.begin();
|
| - it != channels.end(); ++it) {
|
| - SetNack(it->second->channel(), nack_enabled);
|
| + for (const auto& ch : channels) {
|
| + SetNack(ch.second->channel(), nack_enabled);
|
| }
|
| }
|
|
|
| @@ -2187,9 +2138,8 @@ bool WebRtcVoiceMediaChannel::SetSendCodec(
|
| const webrtc::CodecInst& send_codec) {
|
| LOG(LS_INFO) << "Selected voice codec " << ToString(send_codec)
|
| << ", bitrate=" << send_codec.rate;
|
| - for (ChannelMap::iterator iter = send_channels_.begin();
|
| - iter != send_channels_.end(); ++iter) {
|
| - if (!SetSendCodec(iter->second->channel(), send_codec))
|
| + for (const auto& ch : send_channels_) {
|
| + if (!SetSendCodec(ch.second->channel(), send_codec))
|
| return false;
|
| }
|
|
|
| @@ -2228,10 +2178,8 @@ bool WebRtcVoiceMediaChannel::SetRecvRtpHeaderExtensions(
|
| }
|
|
|
| // Loop through all receive channels and enable/disable the extensions.
|
| - for (ChannelMap::const_iterator channel_it = receive_channels_.begin();
|
| - channel_it != receive_channels_.end(); ++channel_it) {
|
| - if (!SetChannelRecvRtpHeaderExtensions(channel_it->second->channel(),
|
| - extensions)) {
|
| + for (const auto& ch : receive_channels_) {
|
| + if (!SetChannelRecvRtpHeaderExtensions(ch.second->channel(), extensions)) {
|
| return false;
|
| }
|
| }
|
| @@ -2298,10 +2246,8 @@ bool WebRtcVoiceMediaChannel::SetSendRtpHeaderExtensions(
|
| }
|
|
|
| // Loop through all send channels and enable/disable the extensions.
|
| - for (ChannelMap::const_iterator channel_it = send_channels_.begin();
|
| - channel_it != send_channels_.end(); ++channel_it) {
|
| - if (!SetChannelSendRtpHeaderExtensions(channel_it->second->channel(),
|
| - extensions)) {
|
| + for (const auto& ch : send_channels_) {
|
| + if (!SetChannelSendRtpHeaderExtensions(ch.second->channel(), extensions)) {
|
| return false;
|
| }
|
| }
|
| @@ -2356,12 +2302,12 @@ bool WebRtcVoiceMediaChannel::ChangePlayout(bool playout) {
|
| // Only toggle the default channel if we don't have any other channels.
|
| result = SetPlayout(voe_channel(), playout);
|
| }
|
| - for (ChannelMap::iterator it = receive_channels_.begin();
|
| - it != receive_channels_.end() && result; ++it) {
|
| - if (!SetPlayout(it->second->channel(), playout)) {
|
| + for (const auto& ch : receive_channels_) {
|
| + if (!SetPlayout(ch.second->channel(), playout)) {
|
| LOG(LS_ERROR) << "SetPlayout " << playout << " on channel "
|
| - << it->second->channel() << " failed";
|
| + << ch.second->channel() << " failed";
|
| result = false;
|
| + break;
|
| }
|
| }
|
|
|
| @@ -2396,9 +2342,8 @@ bool WebRtcVoiceMediaChannel::ChangeSend(SendFlags send) {
|
| engine()->SetOptionOverrides(options_);
|
|
|
| // Change the settings on each send channel.
|
| - for (ChannelMap::iterator iter = send_channels_.begin();
|
| - iter != send_channels_.end(); ++iter) {
|
| - if (!ChangeSend(iter->second->channel(), send))
|
| + for (const auto& ch : send_channels_) {
|
| + if (!ChangeSend(ch.second->channel(), send))
|
| return false;
|
| }
|
|
|
| @@ -2472,9 +2417,8 @@ bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) {
|
| }
|
|
|
| bool default_channel_is_available = true;
|
| - for (ChannelMap::const_iterator iter = send_channels_.begin();
|
| - iter != send_channels_.end(); ++iter) {
|
| - if (IsDefaultChannel(iter->second->channel())) {
|
| + for (const auto& ch : send_channels_) {
|
| + if (IsDefaultChannel(ch.second->channel())) {
|
| default_channel_is_available = false;
|
| break;
|
| }
|
| @@ -2514,13 +2458,12 @@ bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) {
|
| // well. Receive channels have to have the same SSRC as the default channel in
|
| // order to send receiver reports with this SSRC.
|
| if (IsDefaultChannel(channel)) {
|
| - for (ChannelMap::const_iterator it = receive_channels_.begin();
|
| - it != receive_channels_.end(); ++it) {
|
| + for (const auto& ch : receive_channels_) {
|
| // Only update the SSRC for non-default channels.
|
| - if (!IsDefaultChannel(it->second->channel())) {
|
| - if (engine()->voe()->rtp()->SetLocalSSRC(it->second->channel(),
|
| + if (!IsDefaultChannel(ch.second->channel())) {
|
| + if (engine()->voe()->rtp()->SetLocalSSRC(ch.second->channel(),
|
| sp.first_ssrc()) != 0) {
|
| - LOG_RTCERR2(SetLocalSSRC, it->second->channel(), sp.first_ssrc());
|
| + LOG_RTCERR2(SetLocalSSRC, ch.second->channel(), sp.first_ssrc());
|
| return false;
|
| }
|
| }
|
| @@ -2662,11 +2605,10 @@ bool WebRtcVoiceMediaChannel::ConfigureRecvChannel(int channel) {
|
| // Use the same recv payload types as our default channel.
|
| ResetRecvCodecs(channel);
|
| if (!recv_codecs_.empty()) {
|
| - for (std::vector<AudioCodec>::const_iterator it = recv_codecs_.begin();
|
| - it != recv_codecs_.end(); ++it) {
|
| + for (const auto& codec : recv_codecs_) {
|
| webrtc::CodecInst voe_codec;
|
| - if (engine()->FindWebRtcCodec(*it, &voe_codec)) {
|
| - voe_codec.pltype = it->id;
|
| + if (engine()->FindWebRtcCodec(codec, &voe_codec)) {
|
| + voe_codec.pltype = codec.id;
|
| voe_codec.rate = 0; // Needed to make GetRecPayloadType work for ISAC
|
| if (engine()->voe()->codec()->GetRecPayloadType(
|
| voe_channel(), voe_codec) != -1) {
|
| @@ -2811,11 +2753,10 @@ bool WebRtcVoiceMediaChannel::GetActiveStreams(
|
| // In conference mode, the default channel should not be in
|
| // |receive_channels_|.
|
| actives->clear();
|
| - for (ChannelMap::iterator it = receive_channels_.begin();
|
| - it != receive_channels_.end(); ++it) {
|
| - int level = GetOutputLevel(it->second->channel());
|
| + for (const auto& ch : receive_channels_) {
|
| + int level = GetOutputLevel(ch.second->channel());
|
| if (level > 0) {
|
| - actives->push_back(std::make_pair(it->first, level));
|
| + actives->push_back(std::make_pair(ch.first, level));
|
| }
|
| }
|
| return true;
|
| @@ -2824,9 +2765,8 @@ bool WebRtcVoiceMediaChannel::GetActiveStreams(
|
| int WebRtcVoiceMediaChannel::GetOutputLevel() {
|
| // return the highest output level of all streams
|
| int highest = GetOutputLevel(voe_channel());
|
| - for (ChannelMap::iterator it = receive_channels_.begin();
|
| - it != receive_channels_.end(); ++it) {
|
| - int level = GetOutputLevel(it->second->channel());
|
| + for (const auto& ch : receive_channels_) {
|
| + int level = GetOutputLevel(ch.second->channel());
|
| highest = std::max(level, highest);
|
| }
|
| return highest;
|
| @@ -2867,9 +2807,8 @@ bool WebRtcVoiceMediaChannel::SetOutputScaling(
|
| // playout.
|
| if (default_receive_ssrc_ == 0)
|
| channels.push_back(voe_channel());
|
| - for (ChannelMap::const_iterator it = receive_channels_.begin();
|
| - it != receive_channels_.end(); ++it) {
|
| - channels.push_back(it->second->channel());
|
| + for (const auto& ch : receive_channels_) {
|
| + channels.push_back(ch.second->channel());
|
| }
|
| } else { // Collect only the channel of the specified ssrc.
|
| int channel = GetReceiveChannelNum(ssrc);
|
| @@ -2887,22 +2826,21 @@ bool WebRtcVoiceMediaChannel::SetOutputScaling(
|
| left /= scale;
|
| right /= scale;
|
| }
|
| - for (std::vector<int>::const_iterator it = channels.begin();
|
| - it != channels.end(); ++it) {
|
| + for (int ch_id : channels) {
|
| if (-1 == engine()->voe()->volume()->SetChannelOutputVolumeScaling(
|
| - *it, scale)) {
|
| - LOG_RTCERR2(SetChannelOutputVolumeScaling, *it, scale);
|
| + ch_id, scale)) {
|
| + LOG_RTCERR2(SetChannelOutputVolumeScaling, ch_id, scale);
|
| return false;
|
| }
|
| if (-1 == engine()->voe()->volume()->SetOutputVolumePan(
|
| - *it, static_cast<float>(left), static_cast<float>(right))) {
|
| - LOG_RTCERR3(SetOutputVolumePan, *it, left, right);
|
| + ch_id, static_cast<float>(left), static_cast<float>(right))) {
|
| + LOG_RTCERR3(SetOutputVolumePan, ch_id, left, right);
|
| // Do not return if fails. SetOutputVolumePan is not available for all
|
| // pltforms.
|
| }
|
| LOG(LS_INFO) << "SetOutputScaling to left=" << left * scale
|
| << " right=" << right * scale
|
| - << " for channel " << *it << " and ssrc " << ssrc;
|
| + << " for channel " << ch_id << " and ssrc " << ssrc;
|
| }
|
| return true;
|
| }
|
| @@ -3003,9 +2941,8 @@ bool WebRtcVoiceMediaChannel::InsertDtmf(uint32 ssrc, int event,
|
| int channel = -1;
|
| if (ssrc == 0) {
|
| bool default_channel_is_inuse = false;
|
| - for (ChannelMap::const_iterator iter = send_channels_.begin();
|
| - iter != send_channels_.end(); ++iter) {
|
| - if (IsDefaultChannel(iter->second->channel())) {
|
| + for (const auto& ch : send_channels_) {
|
| + if (IsDefaultChannel(ch.second->channel())) {
|
| default_channel_is_inuse = true;
|
| break;
|
| }
|
| @@ -3121,15 +3058,14 @@ void WebRtcVoiceMediaChannel::OnRtcpReceived(
|
| // SR may continue RR and any RR entry may correspond to any one of the send
|
| // channels. So all RTCP packets must be forwarded all send channels. VoE
|
| // will filter out RR internally.
|
| - for (ChannelMap::iterator iter = send_channels_.begin();
|
| - iter != send_channels_.end(); ++iter) {
|
| + for (const auto& ch : send_channels_) {
|
| // Make sure not sending the same packet to default channel more than once.
|
| - if (IsDefaultChannel(iter->second->channel()) &&
|
| + if (IsDefaultChannel(ch.second->channel()) &&
|
| has_sent_to_default_channel)
|
| continue;
|
|
|
| engine()->voe()->network()->ReceivedRTCPPacket(
|
| - iter->second->channel(), packet->data(), packet->size());
|
| + ch.second->channel(), packet->data(), packet->size());
|
| }
|
| }
|
|
|
| @@ -3148,11 +3084,13 @@ bool WebRtcVoiceMediaChannel::MuteStream(uint32 ssrc, bool muted) {
|
| // the mic channel is muted/unmuted. We can't do it today because there
|
| // is no good way to know which stream is mapping to the mic channel.
|
| bool all_muted = muted;
|
| - for (ChannelMap::const_iterator iter = send_channels_.begin();
|
| - iter != send_channels_.end() && all_muted; ++iter) {
|
| - if (engine()->voe()->volume()->GetInputMute(iter->second->channel(),
|
| + for (const auto& ch : send_channels_) {
|
| + if (!all_muted) {
|
| + break;
|
| + }
|
| + if (engine()->voe()->volume()->GetInputMute(ch.second->channel(),
|
| all_muted)) {
|
| - LOG_RTCERR1(GetInputMute, iter->second->channel());
|
| + LOG_RTCERR1(GetInputMute, ch.second->channel());
|
| return false;
|
| }
|
| }
|
| @@ -3251,9 +3189,8 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
|
| webrtc::CodecInst codec;
|
| unsigned int level;
|
|
|
| - for (ChannelMap::const_iterator channel_iter = send_channels_.begin();
|
| - channel_iter != send_channels_.end(); ++channel_iter) {
|
| - const int channel = channel_iter->second->channel();
|
| + for (const auto& ch : send_channels_) {
|
| + const int channel = ch.second->channel();
|
|
|
| // Fill in the sender info, based on what we know, and what the
|
| // remote side told us it got from its RTCP report.
|
| @@ -3282,19 +3219,17 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
|
| if (engine()->voe()->rtp()->GetRemoteRTCPReportBlocks(
|
| channel, &receive_blocks) != -1 &&
|
| engine()->voe()->codec()->GetSendCodec(channel, codec) != -1) {
|
| - std::vector<webrtc::ReportBlock>::iterator iter;
|
| - for (iter = receive_blocks.begin(); iter != receive_blocks.end();
|
| - ++iter) {
|
| + for (const webrtc::ReportBlock& block : receive_blocks) {
|
| // Lookup report for send ssrc only.
|
| - if (iter->source_SSRC == sinfo.ssrc()) {
|
| + if (block.source_SSRC == sinfo.ssrc()) {
|
| // Convert Q8 to floating point.
|
| - sinfo.fraction_lost = static_cast<float>(iter->fraction_lost) / 256;
|
| + sinfo.fraction_lost = static_cast<float>(block.fraction_lost) / 256;
|
| // Convert samples to milliseconds.
|
| if (codec.plfreq / 1000 > 0) {
|
| - sinfo.jitter_ms = iter->interarrival_jitter / (codec.plfreq / 1000);
|
| + sinfo.jitter_ms = block.interarrival_jitter / (codec.plfreq / 1000);
|
| }
|
| - sinfo.packets_lost = iter->cumulative_num_packets_lost;
|
| - sinfo.ext_seqnum = iter->extended_highest_sequence_number;
|
| + sinfo.packets_lost = block.cumulative_num_packets_lost;
|
| + sinfo.ext_seqnum = block.extended_highest_sequence_number;
|
| break;
|
| }
|
| }
|
| @@ -3323,21 +3258,19 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
|
| // Build the list of receivers, one for each receiving channel, or 1 in
|
| // a 1:1 call.
|
| std::vector<int> channels;
|
| - for (ChannelMap::const_iterator it = receive_channels_.begin();
|
| - it != receive_channels_.end(); ++it) {
|
| - channels.push_back(it->second->channel());
|
| + for (const auto& ch : receive_channels_) {
|
| + channels.push_back(ch.second->channel());
|
| }
|
| if (channels.empty()) {
|
| channels.push_back(voe_channel());
|
| }
|
|
|
| // Get the SSRC and stats for each receiver, based on our own calculations.
|
| - for (std::vector<int>::const_iterator it = channels.begin();
|
| - it != channels.end(); ++it) {
|
| + for (int ch_id : channels) {
|
| memset(&cs, 0, sizeof(cs));
|
| - if (engine()->voe()->rtp()->GetRemoteSSRC(*it, ssrc) != -1 &&
|
| - engine()->voe()->rtp()->GetRTCPStatistics(*it, cs) != -1 &&
|
| - engine()->voe()->codec()->GetRecCodec(*it, codec) != -1) {
|
| + if (engine()->voe()->rtp()->GetRemoteSSRC(ch_id, ssrc) != -1 &&
|
| + engine()->voe()->rtp()->GetRTCPStatistics(ch_id, cs) != -1 &&
|
| + engine()->voe()->codec()->GetRecCodec(ch_id, codec) != -1) {
|
| VoiceReceiverInfo rinfo;
|
| rinfo.add_ssrc(ssrc);
|
| rinfo.bytes_rcvd = cs.bytesReceived;
|
| @@ -3360,7 +3293,7 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
|
| webrtc::NetworkStatistics ns;
|
| if (engine()->voe()->neteq() &&
|
| engine()->voe()->neteq()->GetNetworkStatistics(
|
| - *it, ns) != -1) {
|
| + ch_id, ns) != -1) {
|
| rinfo.jitter_buffer_ms = ns.currentBufferSize;
|
| rinfo.jitter_buffer_preferred_ms = ns.preferredBufferSize;
|
| rinfo.expand_rate =
|
| @@ -3378,7 +3311,7 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
|
| webrtc::AudioDecodingCallStats ds;
|
| if (engine()->voe()->neteq() &&
|
| engine()->voe()->neteq()->GetDecodingCallStatistics(
|
| - *it, &ds) != -1) {
|
| + ch_id, &ds) != -1) {
|
| rinfo.decoding_calls_to_silence_generator =
|
| ds.calls_to_silence_generator;
|
| rinfo.decoding_calls_to_neteq = ds.calls_to_neteq;
|
| @@ -3392,14 +3325,14 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
|
| int jitter_buffer_delay_ms = 0;
|
| int playout_buffer_delay_ms = 0;
|
| engine()->voe()->sync()->GetDelayEstimate(
|
| - *it, &jitter_buffer_delay_ms, &playout_buffer_delay_ms);
|
| + ch_id, &jitter_buffer_delay_ms, &playout_buffer_delay_ms);
|
| rinfo.delay_estimate_ms = jitter_buffer_delay_ms +
|
| playout_buffer_delay_ms;
|
| }
|
|
|
| // Get speech level.
|
| rinfo.audio_level = (engine()->voe()->volume()->
|
| - GetSpeechOutputLevelFullRange(*it, level) != -1) ? level : -1;
|
| + GetSpeechOutputLevelFullRange(ch_id, level) != -1) ? level : -1;
|
| info->receivers.push_back(rinfo);
|
| }
|
| }
|
| @@ -3427,9 +3360,8 @@ bool WebRtcVoiceMediaChannel::FindSsrc(int channel_num, uint32* ssrc) {
|
| return true;
|
| } else {
|
| // Check whether this is a sending channel.
|
| - for (ChannelMap::const_iterator it = send_channels_.begin();
|
| - it != send_channels_.end(); ++it) {
|
| - if (it->second->channel() == channel_num) {
|
| + for (const auto& ch : send_channels_) {
|
| + if (ch.second->channel() == channel_num) {
|
| // This is a sending channel.
|
| uint32 local_ssrc = 0;
|
| if (engine()->voe()->rtp()->GetLocalSSRC(
|
| @@ -3441,10 +3373,9 @@ bool WebRtcVoiceMediaChannel::FindSsrc(int channel_num, uint32* ssrc) {
|
| }
|
|
|
| // Check whether this is a receiving channel.
|
| - for (ChannelMap::const_iterator it = receive_channels_.begin();
|
| - it != receive_channels_.end(); ++it) {
|
| - if (it->second->channel() == channel_num) {
|
| - *ssrc = it->first;
|
| + for (const auto& ch : receive_channels_) {
|
| + if (ch.second->channel() == channel_num) {
|
| + *ssrc = ch.first;
|
| return true;
|
| }
|
| }
|
| @@ -3468,15 +3399,15 @@ int WebRtcVoiceMediaChannel::GetOutputLevel(int channel) {
|
| return (ret == 0) ? static_cast<int>(ulevel) : -1;
|
| }
|
|
|
| -int WebRtcVoiceMediaChannel::GetReceiveChannelNum(uint32 ssrc) {
|
| - ChannelMap::iterator it = receive_channels_.find(ssrc);
|
| +int WebRtcVoiceMediaChannel::GetReceiveChannelNum(uint32 ssrc) const {
|
| + ChannelMap::const_iterator it = receive_channels_.find(ssrc);
|
| if (it != receive_channels_.end())
|
| return it->second->channel();
|
| return (ssrc == default_receive_ssrc_) ? voe_channel() : -1;
|
| }
|
|
|
| -int WebRtcVoiceMediaChannel::GetSendChannelNum(uint32 ssrc) {
|
| - ChannelMap::iterator it = send_channels_.find(ssrc);
|
| +int WebRtcVoiceMediaChannel::GetSendChannelNum(uint32 ssrc) const {
|
| + ChannelMap::const_iterator it = send_channels_.find(ssrc);
|
| if (it != send_channels_.end())
|
| return it->second->channel();
|
|
|
| @@ -3523,22 +3454,19 @@ bool WebRtcVoiceMediaChannel::GetRedSendCodec(const AudioCodec& red_codec,
|
| }
|
|
|
| // Try to find red_pt in |codecs|.
|
| - std::vector<AudioCodec>::const_iterator codec;
|
| - for (codec = all_codecs.begin(); codec != all_codecs.end(); ++codec) {
|
| - if (codec->id == red_pt)
|
| - break;
|
| - }
|
| -
|
| - // If we find the right codec, that will be the codec we pass to
|
| - // SetSendCodec, with the desired payload type.
|
| - if (codec != all_codecs.end() &&
|
| - engine()->FindWebRtcCodec(*codec, send_codec)) {
|
| - } else {
|
| - LOG(LS_WARNING) << "RED params " << red_params << " are invalid.";
|
| - return false;
|
| + for (const AudioCodec& codec : all_codecs) {
|
| + if (codec.id == red_pt) {
|
| + // If we find the right codec, that will be the codec we pass to
|
| + // SetSendCodec, with the desired payload type.
|
| + if (engine()->FindWebRtcCodec(codec, send_codec)) {
|
| + return true;
|
| + } else {
|
| + break;
|
| + }
|
| + }
|
| }
|
| -
|
| - return true;
|
| + LOG(LS_WARNING) << "RED params " << red_params << " are invalid.";
|
| + return false;
|
| }
|
|
|
| bool WebRtcVoiceMediaChannel::EnableRtcp(int channel) {
|
| @@ -3677,6 +3605,44 @@ void WebRtcVoiceMediaChannel::TryRemoveAudioRecvStream(uint32 ssrc) {
|
| }
|
| }
|
|
|
| +bool WebRtcVoiceMediaChannel::SetRecvCodecsInternal(
|
| + const std::vector<AudioCodec>& new_codecs) {
|
| + for (const AudioCodec& codec : new_codecs) {
|
| + webrtc::CodecInst voe_codec;
|
| + if (engine()->FindWebRtcCodec(codec, &voe_codec)) {
|
| + LOG(LS_INFO) << ToString(codec);
|
| + voe_codec.pltype = codec.id;
|
| + if (default_receive_ssrc_ == 0) {
|
| + // Set the receive codecs on the default channel explicitly if the
|
| + // default channel is not used by |receive_channels_|, this happens in
|
| + // conference mode or in non-conference mode when there is no playout
|
| + // channel.
|
| + // TODO(xians): Figure out how we use the default channel in conference
|
| + // mode.
|
| + if (engine()->voe()->codec()->SetRecPayloadType(
|
| + voe_channel(), voe_codec) == -1) {
|
| + LOG_RTCERR2(SetRecPayloadType, voe_channel(), ToString(voe_codec));
|
| + return false;
|
| + }
|
| + }
|
| +
|
| + // Set the receive codecs on all receiving channels.
|
| + for (const auto& ch : receive_channels_) {
|
| + if (engine()->voe()->codec()->SetRecPayloadType(
|
| + ch.second->channel(), voe_codec) == -1) {
|
| + LOG_RTCERR2(SetRecPayloadType, ch.second->channel(),
|
| + ToString(voe_codec));
|
| + return false;
|
| + }
|
| + }
|
| + } else {
|
| + LOG(LS_WARNING) << "Unknown codec " << ToString(codec);
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| int WebRtcSoundclipStream::Read(void *buf, size_t len) {
|
| size_t res = 0;
|
| mem_.Read(buf, len, &res, NULL);
|
|
|