| Index: talk/media/webrtc/webrtcvoiceengine.cc
|
| diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc
|
| index 43cbc2e929dbbccd87e1434f8d6698ab47dcbf22..b01bfab3d85eeffb06c81ac1959b46178cb7d258 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;
|
| @@ -1689,7 +1689,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),
|
| @@ -1702,18 +1703,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.
|
| @@ -1833,7 +1834,7 @@ bool WebRtcVoiceMediaChannel::SetOptions(const AudioOptions& options) {
|
| }
|
| }
|
|
|
| - SetCall(call_);
|
| + RecreateAudioReceiveStreams();
|
|
|
| LOG(LS_INFO) << "Set voice channel options. Current options: "
|
| << options_.ToString();
|
| @@ -2202,7 +2203,7 @@ bool WebRtcVoiceMediaChannel::SetRecvRtpHeaderExtensions(
|
| }
|
|
|
| recv_rtp_extensions_.swap(exts);
|
| - SetCall(call_);
|
| + RecreateAudioReceiveStreams();
|
| }
|
|
|
| return true;
|
| @@ -2561,7 +2562,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);
|
| + AddAudioReceiveStream(ssrc);
|
| return SetPlayout(voe_channel(), playout_);
|
| }
|
|
|
| @@ -2581,7 +2582,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);
|
| + AddAudioReceiveStream(ssrc);
|
|
|
| LOG(LS_INFO) << "New audio stream " << ssrc
|
| << " registered to VoiceEngine channel #"
|
| @@ -2670,7 +2671,7 @@ bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32 ssrc) {
|
| return false;
|
| }
|
|
|
| - TryRemoveAudioRecvStream(ssrc);
|
| + RemoveAudioReceiveStream(ssrc);
|
| receive_stream_params_.erase(ssrc);
|
|
|
| // Delete the WebRtcVoiceChannelRenderer object connected to the channel, this
|
| @@ -2964,15 +2965,12 @@ 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_) {
|
| - const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
|
| - packet_time.not_before);
|
| - call_->Receiver()->DeliverPacket(
|
| - webrtc::MediaType::AUDIO,
|
| - reinterpret_cast<const uint8_t*>(packet->data()), packet->size(),
|
| - webrtc_packet_time);
|
| - }
|
| + // Forward packet to Call as well.
|
| + const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
|
| + packet_time.not_before);
|
| + call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO,
|
| + reinterpret_cast<const uint8_t*>(packet->data()), packet->size(),
|
| + webrtc_packet_time);
|
|
|
| // 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,
|
| @@ -3009,15 +3007,12 @@ 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_) {
|
| - const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
|
| - packet_time.not_before);
|
| - call_->Receiver()->DeliverPacket(
|
| - webrtc::MediaType::AUDIO,
|
| - reinterpret_cast<const uint8_t*>(packet->data()), packet->size(),
|
| - webrtc_packet_time);
|
| - }
|
| + // Forward packet to Call as well.
|
| + const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
|
| + packet_time.not_before);
|
| + call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO,
|
| + reinterpret_cast<const uint8_t*>(packet->data()), packet->size(),
|
| + webrtc_packet_time);
|
|
|
| // Sending channels need all RTCP packets with feedback information.
|
| // Even sender reports can contain attached report blocks.
|
| @@ -3402,17 +3397,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
|
| @@ -3559,15 +3543,21 @@ bool WebRtcVoiceMediaChannel::SetHeaderExtension(ExtensionSetterFunction setter,
|
| return true;
|
| }
|
|
|
| -void WebRtcVoiceMediaChannel::TryAddAudioRecvStream(uint32 ssrc) {
|
| +void WebRtcVoiceMediaChannel::RecreateAudioReceiveStreams() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + for (const auto& it : receive_channels_) {
|
| + RemoveAudioReceiveStream(it.first);
|
| + }
|
| + for (const auto& it : receive_channels_) {
|
| + AddAudioReceiveStream(it.first);
|
| + }
|
| +}
|
| +
|
| +void WebRtcVoiceMediaChannel::AddAudioReceiveStream(uint32 ssrc) {
|
| 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.
|
| @@ -3580,16 +3570,12 @@ void WebRtcVoiceMediaChannel::TryAddAudioRecvStream(uint32 ssrc) {
|
| receive_streams_.insert(std::make_pair(ssrc, s));
|
| }
|
|
|
| -void WebRtcVoiceMediaChannel::TryRemoveAudioRecvStream(uint32 ssrc) {
|
| +void WebRtcVoiceMediaChannel::RemoveAudioReceiveStream(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);
|
| }
|
| }
|
|
|
|
|