diff --git a/webrtc/audio/audio_receive_stream.cc b/webrtc/audio/audio_receive_stream.cc index 57e62f50fd..11a1c5815e 100644 --- a/webrtc/audio/audio_receive_stream.cc +++ b/webrtc/audio/audio_receive_stream.cc @@ -144,6 +144,7 @@ AudioReceiveStream::AudioReceiveStream( AudioReceiveStream::~AudioReceiveStream() { RTC_DCHECK(thread_checker_.CalledOnValidThread()); LOG(LS_INFO) << "~AudioReceiveStream: " << config_.ToString(); + Stop(); channel_proxy_->DeRegisterExternalTransport(); channel_proxy_->ResetCongestionControlObjects(); channel_proxy_->SetRtcEventLog(nullptr); diff --git a/webrtc/audio/audio_receive_stream_unittest.cc b/webrtc/audio/audio_receive_stream_unittest.cc index 94bfabd74b..d30eb110ce 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -119,6 +119,7 @@ struct ConfigHelper { .After(expect_set); return channel_proxy_; })); + EXPECT_CALL(voice_engine_, StopPlayout(kChannelId)).WillOnce(Return(0)); stream_config_.voe_channel_id = kChannelId; stream_config_.rtp.local_ssrc = kLocalSsrc; stream_config_.rtp.remote_ssrc = kRemoteSsrc; diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc index 358c142a1b..71803cbee3 100644 --- a/webrtc/media/engine/webrtcvoiceengine.cc +++ b/webrtc/media/engine/webrtcvoiceengine.cc @@ -1424,6 +1424,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { LOG(LS_INFO) << "Stopping playout for channel #" << channel(); stream_->Stop(); } + playout_ = playout; } private: @@ -1444,6 +1445,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { RTC_DCHECK(!stream_); stream_ = call_->CreateAudioReceiveStream(config_); RTC_CHECK(stream_); + SetPlayout(playout_); } rtc::ThreadChecker worker_thread_checker_; @@ -1452,6 +1454,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { // The stream is owned by WebRtcAudioReceiveStream and may be reallocated if // configuration changes. webrtc::AudioReceiveStream* stream_ = nullptr; + bool playout_ = false; RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcAudioReceiveStream); }; diff --git a/webrtc/media/engine/webrtcvoiceengine_unittest.cc b/webrtc/media/engine/webrtcvoiceengine_unittest.cc index e40bc773b6..8be3b9d249 100644 --- a/webrtc/media/engine/webrtcvoiceengine_unittest.cc +++ b/webrtc/media/engine/webrtcvoiceengine_unittest.cc @@ -3340,6 +3340,21 @@ TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) { call_.GetNetworkState(webrtc::MediaType::VIDEO)); } +// Test that playout is still started after changing parameters +TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) { + SetupRecvStream(); + channel_->SetPlayout(true); + EXPECT_TRUE(GetRecvStream(kSsrc1).started()); + + // Changing RTP header extensions will recreate the AudioReceiveStream. + cricket::AudioRecvParameters parameters; + parameters.extensions.push_back( + webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12)); + channel_->SetRecvParameters(parameters); + + EXPECT_TRUE(GetRecvStream(kSsrc1).started()); +} + // Tests that the library initializes and shuts down properly. TEST(WebRtcVoiceEngineTest, StartupShutdown) { // If the VoiceEngine wants to gather available codecs early, that's fine but