Chromium Code Reviews| Index: talk/media/webrtc/webrtcvoiceengine.cc |
| diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc |
| index f8c3ac31646d9de7f468476d46c4be03b5966ae9..e7e6de15ed52312cd83edee2cb451e8fc1e4d43e 100644 |
| --- a/talk/media/webrtc/webrtcvoiceengine.cc |
| +++ b/talk/media/webrtc/webrtcvoiceengine.cc |
| @@ -579,9 +579,9 @@ int WebRtcVoiceEngine::GetCapabilities() { |
| return AUDIO_SEND | AUDIO_RECV; |
| } |
| -VoiceMediaChannel* WebRtcVoiceEngine::CreateChannel( |
| +VoiceMediaChannel* WebRtcVoiceEngine::CreateChannel(webrtc::Call* call, |
| const AudioOptions& options) { |
| - WebRtcVoiceMediaChannel* ch = new WebRtcVoiceMediaChannel(this); |
| + WebRtcVoiceMediaChannel* ch = new WebRtcVoiceMediaChannel(this, call); |
| if (!ch->valid()) { |
| delete ch; |
| return nullptr; |
| @@ -1688,7 +1688,8 @@ class WebRtcVoiceMediaChannel::WebRtcVoiceChannelRenderer |
| }; |
| // WebRtcVoiceMediaChannel |
| -WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine) |
| +WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine, |
| + webrtc::Call* call) |
| : engine_(engine), |
| voe_channel_(engine->CreateMediaVoiceChannel()), |
| send_bitrate_setting_(false), |
| @@ -1701,18 +1702,18 @@ WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine) |
| typing_noise_detected_(false), |
| desired_send_(SEND_NOTHING), |
| send_(SEND_NOTHING), |
| - call_(nullptr), |
| + call_(call), |
| default_receive_ssrc_(0) { |
| engine->RegisterChannel(this); |
| LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel " |
| << voe_channel(); |
| + DCHECK(nullptr != call); |
| ConfigureSendChannel(voe_channel()); |
| } |
| WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() { |
| LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel " |
| << voe_channel(); |
| - DCHECK(receive_streams_.empty() || call_); |
| // Remove any remaining send streams, the default channel will be deleted |
| // later. |
| @@ -1832,7 +1833,7 @@ bool WebRtcVoiceMediaChannel::SetOptions(const AudioOptions& options) { |
| } |
| } |
| - SetCall(call_); |
| + RecreateCallStreams(); |
| LOG(LS_INFO) << "Set voice channel options. Current options: " |
| << options_.ToString(); |
| @@ -2201,7 +2202,7 @@ bool WebRtcVoiceMediaChannel::SetRecvRtpHeaderExtensions( |
| } |
| recv_rtp_extensions_.swap(exts); |
| - SetCall(call_); |
| + RecreateCallStreams(); |
| } |
| return true; |
| @@ -2543,7 +2544,7 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { |
| new WebRtcVoiceChannelRenderer(voe_channel(), audio_transport); |
| receive_channels_.insert(std::make_pair(ssrc, channel_renderer)); |
| receive_stream_params_[ssrc] = sp; |
| - TryAddAudioRecvStream(ssrc); |
| + AddAudioRecvStream(ssrc); |
| return SetPlayout(voe_channel(), playout_); |
| } |
| @@ -2563,7 +2564,7 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { |
| new WebRtcVoiceChannelRenderer(channel, audio_transport); |
| receive_channels_.insert(std::make_pair(ssrc, channel_renderer)); |
| receive_stream_params_[ssrc] = sp; |
| - TryAddAudioRecvStream(ssrc); |
| + AddAudioRecvStream(ssrc); |
| LOG(LS_INFO) << "New audio stream " << ssrc |
| << " registered to VoiceEngine channel #" |
| @@ -2652,7 +2653,7 @@ bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32 ssrc) { |
| return false; |
| } |
| - TryRemoveAudioRecvStream(ssrc); |
| + RemoveAudioRecvStream(ssrc); |
| receive_stream_params_.erase(ssrc); |
| // Delete the WebRtcVoiceChannelRenderer object connected to the channel, this |
| @@ -2980,11 +2981,9 @@ void WebRtcVoiceMediaChannel::OnPacketReceived( |
| rtc::Buffer* packet, const rtc::PacketTime& packet_time) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| - // If hooked up to a "Call", forward packet there too. |
| - if (call_) { |
| - call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, |
| - reinterpret_cast<const uint8_t*>(packet->data()), packet->size()); |
| - } |
| + // Forward packet to Call as well. |
| + call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, |
| + reinterpret_cast<const uint8_t*>(packet->data()), packet->size()); |
| // Pick which channel to send this packet to. If this packet doesn't match |
| // any multiplexed streams, just send it to the default channel. Otherwise, |
| @@ -3021,11 +3020,9 @@ void WebRtcVoiceMediaChannel::OnRtcpReceived( |
| rtc::Buffer* packet, const rtc::PacketTime& packet_time) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| - // If hooked up to a "Call", forward packet there too. |
| - if (call_) { |
| - call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, |
| - reinterpret_cast<const uint8_t*>(packet->data()), packet->size()); |
| - } |
| + // Forward packet to Call as well. |
| + call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, |
| + reinterpret_cast<const uint8_t*>(packet->data()), packet->size()); |
| // Sending channels need all RTCP packets with feedback information. |
| // Even sender reports can contain attached report blocks. |
| @@ -3410,17 +3407,6 @@ int WebRtcVoiceMediaChannel::GetSendChannelNum(uint32 ssrc) const { |
| return -1; |
| } |
| -void WebRtcVoiceMediaChannel::SetCall(webrtc::Call* call) { |
| - DCHECK(thread_checker_.CalledOnValidThread()); |
| - for (const auto& it : receive_channels_) { |
| - TryRemoveAudioRecvStream(it.first); |
| - } |
| - call_ = call; |
| - for (const auto& it : receive_channels_) { |
| - TryAddAudioRecvStream(it.first); |
| - } |
| -} |
| - |
| bool WebRtcVoiceMediaChannel::GetRedSendCodec(const AudioCodec& red_codec, |
| const std::vector<AudioCodec>& all_codecs, webrtc::CodecInst* send_codec) { |
| // Get the RED encodings from the parameter with no name. This may |
| @@ -3567,15 +3553,21 @@ bool WebRtcVoiceMediaChannel::SetHeaderExtension(ExtensionSetterFunction setter, |
| return true; |
| } |
| -void WebRtcVoiceMediaChannel::TryAddAudioRecvStream(uint32 ssrc) { |
| +void WebRtcVoiceMediaChannel::RecreateCallStreams() { |
|
pthatcher1
2015/09/02 21:24:22
I think RecreateRecvStreams or RemoveAndAddRecvStr
the sun
2015/09/03 15:00:46
I've changed the name to RecreateAudioReceiveStrea
|
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + for (const auto& it : receive_channels_) { |
| + RemoveAudioRecvStream(it.first); |
| + } |
| + for (const auto& it : receive_channels_) { |
| + AddAudioRecvStream(it.first); |
| + } |
| +} |
| + |
| +void WebRtcVoiceMediaChannel::AddAudioRecvStream(uint32 ssrc) { |
|
pthatcher1
2015/09/02 21:24:22
Since it's obviously not video streams, why not ju
the sun
2015/09/03 15:00:47
Remember that "Stream" is an overloaded word here,
|
| DCHECK(thread_checker_.CalledOnValidThread()); |
| WebRtcVoiceChannelRenderer* channel = receive_channels_[ssrc]; |
| DCHECK(channel != nullptr); |
| DCHECK(receive_streams_.find(ssrc) == receive_streams_.end()); |
| - // If we are hooked up to a webrtc::Call, create an AudioReceiveStream too. |
| - if (!call_) { |
| - return; |
| - } |
| webrtc::AudioReceiveStream::Config config; |
| config.rtp.remote_ssrc = ssrc; |
| // Only add RTP extensions if we support combined A/V BWE. |
| @@ -3588,16 +3580,12 @@ void WebRtcVoiceMediaChannel::TryAddAudioRecvStream(uint32 ssrc) { |
| receive_streams_.insert(std::make_pair(ssrc, s)); |
| } |
| -void WebRtcVoiceMediaChannel::TryRemoveAudioRecvStream(uint32 ssrc) { |
| +void WebRtcVoiceMediaChannel::RemoveAudioRecvStream(uint32 ssrc) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| - // If we are hooked up to a webrtc::Call, assume there is an |
| - // AudioReceiveStream to destroy too. |
| - if (call_) { |
| - auto stream_it = receive_streams_.find(ssrc); |
| - if (stream_it != receive_streams_.end()) { |
| - call_->DestroyAudioReceiveStream(stream_it->second); |
| - receive_streams_.erase(stream_it); |
| - } |
| + auto stream_it = receive_streams_.find(ssrc); |
| + if (stream_it != receive_streams_.end()) { |
| + call_->DestroyAudioReceiveStream(stream_it->second); |
| + receive_streams_.erase(stream_it); |
| } |
| } |