Chromium Code Reviews| Index: content/renderer/media/webrtc_audio_renderer.cc |
| diff --git a/content/renderer/media/webrtc_audio_renderer.cc b/content/renderer/media/webrtc_audio_renderer.cc |
| index 32c27bf8be65487b9e021bf5e6a3e95d8345ab66..9ceb960a1221dfad8d988fab2a90f98620369850 100644 |
| --- a/content/renderer/media/webrtc_audio_renderer.cc |
| +++ b/content/renderer/media/webrtc_audio_renderer.cc |
| @@ -4,6 +4,7 @@ |
| #include "content/renderer/media/webrtc_audio_renderer.h" |
| +#include <algorithm> |
| #include <utility> |
| #include "base/bind.h" |
| @@ -55,7 +56,8 @@ class SharedAudioRenderer : public MediaStreamAudioRenderer { |
| // Callback definition for a callback that is called when when Play(), Pause() |
| // or SetVolume are called (whenever the internal |playing_state_| changes). |
|
tommi (sloooow) - chröme
2017/03/17 12:44:08
add documentation for the new parameter
|
| typedef base::Callback<void(const blink::WebMediaStream&, |
| - WebRtcAudioRenderer::PlayingState*)> |
| + WebRtcAudioRenderer::PlayingState*, |
| + bool playing_state_deleted)> |
| OnPlayStateChanged; |
| SharedAudioRenderer(const scoped_refptr<MediaStreamAudioRenderer>& delegate, |
| @@ -74,6 +76,8 @@ class SharedAudioRenderer : public MediaStreamAudioRenderer { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| DVLOG(1) << __func__; |
| Stop(); |
| + // Make extra sure no reference to the playing state is left. |
| + on_play_state_changed_.Run(media_stream_, &playing_state_, true); |
| } |
| void Start() override { |
| @@ -90,7 +94,7 @@ class SharedAudioRenderer : public MediaStreamAudioRenderer { |
| if (playing_state_.playing()) |
| return; |
| playing_state_.set_playing(true); |
| - on_play_state_changed_.Run(media_stream_, &playing_state_); |
| + on_play_state_changed_.Run(media_stream_, &playing_state_, false); |
| } |
| void Pause() override { |
| @@ -99,7 +103,7 @@ class SharedAudioRenderer : public MediaStreamAudioRenderer { |
| if (!playing_state_.playing()) |
| return; |
| playing_state_.set_playing(false); |
| - on_play_state_changed_.Run(media_stream_, &playing_state_); |
| + on_play_state_changed_.Run(media_stream_, &playing_state_, false); |
| } |
| void Stop() override { |
| @@ -115,7 +119,7 @@ class SharedAudioRenderer : public MediaStreamAudioRenderer { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| DCHECK(volume >= 0.0f && volume <= 1.0f); |
| playing_state_.set_volume(volume); |
| - on_play_state_changed_.Run(media_stream_, &playing_state_); |
| + on_play_state_changed_.Run(media_stream_, &playing_state_, false); |
| } |
| media::OutputDeviceInfo GetOutputDeviceInfo() override { |
| @@ -249,7 +253,7 @@ void WebRtcAudioRenderer::Play() { |
| playing_state_.set_playing(true); |
| - OnPlayStateChanged(media_stream_, &playing_state_); |
| + OnPlayStateChanged(media_stream_, &playing_state_, false); |
| } |
| void WebRtcAudioRenderer::EnterPlayState() { |
| @@ -281,7 +285,7 @@ void WebRtcAudioRenderer::Pause() { |
| playing_state_.set_playing(false); |
| - OnPlayStateChanged(media_stream_, &playing_state_); |
| + OnPlayStateChanged(media_stream_, &playing_state_, false); |
| } |
| void WebRtcAudioRenderer::EnterPauseState() { |
| @@ -340,7 +344,7 @@ void WebRtcAudioRenderer::SetVolume(float volume) { |
| DCHECK(volume >= 0.0f && volume <= 1.0f); |
| playing_state_.set_volume(volume); |
| - OnPlayStateChanged(media_stream_, &playing_state_); |
| + OnPlayStateChanged(media_stream_, &playing_state_, false); |
| } |
| media::OutputDeviceInfo WebRtcAudioRenderer::GetOutputDeviceInfo() { |
| @@ -566,8 +570,23 @@ bool WebRtcAudioRenderer::RemovePlayingState( |
| void WebRtcAudioRenderer::OnPlayStateChanged( |
| const blink::WebMediaStream& media_stream, |
| - PlayingState* state) { |
| + PlayingState* state, |
| + bool playing_state_deleted) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| + if (playing_state_deleted) { |
| + // We must ensure that no references to playing_state remains. |
|
o1ka
2017/03/17 12:03:30
Could you add explanation and reference to a bug?
Max Morin
2017/03/17 12:21:44
Done.
|
| + for (auto it = source_playing_states_.begin(); |
| + it != source_playing_states_.end();) { |
| + PlayingStates& states = it->second; |
| + states.erase(std::remove(states.begin(), states.end(), state), |
| + states.end()); |
| + if (states.empty()) |
| + it = source_playing_states_.erase(it); |
| + else |
| + ++it; |
| + } |
| + return; |
| + } |
| blink::WebVector<blink::WebMediaStreamTrack> web_tracks; |
| media_stream.audioTracks(web_tracks); |