diff --git a/content/renderer/media/stream/webmediaplayer_ms.cc b/content/renderer/media/stream/webmediaplayer_ms.cc index 7ce45f5b81ee..d8483027e0a4 100644 --- a/content/renderer/media/stream/webmediaplayer_ms.cc +++ b/content/renderer/media/stream/webmediaplayer_ms.cc @@ -424,6 +424,7 @@ void WebMediaPlayerMS::TrackRemoved(const blink::WebMediaStreamTrack& track) { } void WebMediaPlayerMS::ActiveStateChanged(bool is_active) { + DCHECK(thread_checker_.CalledOnValidThread()); // The case when the stream becomes active is handled by TrackAdded(). if (is_active) return; diff --git a/content/renderer/media/webrtc/webrtc_audio_renderer.cc b/content/renderer/media/webrtc/webrtc_audio_renderer.cc index 4143171f4d7b..b18f49d21f83 100644 --- a/content/renderer/media/webrtc/webrtc_audio_renderer.cc +++ b/content/renderer/media/webrtc/webrtc_audio_renderer.cc @@ -374,10 +374,14 @@ void WebRtcAudioRenderer::SwitchOutputDevice( const media::OutputDeviceStatusCB& callback) { DVLOG(1) << "WebRtcAudioRenderer::SwitchOutputDevice()"; DCHECK(thread_checker_.CalledOnValidThread()); + if (!source_) { + callback.Run(media::OUTPUT_DEVICE_STATUS_ERROR_INTERNAL); + return; + } + DCHECK_GE(session_id_, 0); { base::AutoLock auto_lock(lock_); - DCHECK(source_); DCHECK_NE(state_, UNINITIALIZED); } diff --git a/content/renderer/media/webrtc/webrtc_audio_renderer_unittest.cc b/content/renderer/media/webrtc/webrtc_audio_renderer_unittest.cc index 054d86257744..7e886d27945c 100644 --- a/content/renderer/media/webrtc/webrtc_audio_renderer_unittest.cc +++ b/content/renderer/media/webrtc/webrtc_audio_renderer_unittest.cc @@ -297,4 +297,22 @@ TEST_F(WebRtcAudioRendererTest, InitializeWithInvalidDevice) { mock_sink_->GetOutputDeviceInfo().device_id()); } +TEST_F(WebRtcAudioRendererTest, SwitchOutputDeviceStoppedSource) { + SetupRenderer(kDefaultOutputDeviceId); + auto original_sink = mock_sink_; + renderer_proxy_->Start(); + + EXPECT_CALL(*original_sink.get(), Stop()); + EXPECT_CALL(*source_.get(), RemoveAudioRenderer(renderer_.get())); + EXPECT_CALL(*this, MockSwitchDeviceCallback( + media::OUTPUT_DEVICE_STATUS_ERROR_INTERNAL)); + base::RunLoop loop; + renderer_proxy_->Stop(); + renderer_proxy_->SwitchOutputDevice( + kInvalidOutputDeviceId, + base::BindRepeating(&WebRtcAudioRendererTest::SwitchDeviceCallback, + base::Unretained(this), &loop)); + loop.Run(); +} + } // namespace content