Index: content/renderer/media/webrtc/media_stream_remote_audio_track.cc |
diff --git a/content/renderer/media/webrtc/media_stream_remote_audio_track.cc b/content/renderer/media/webrtc/media_stream_remote_audio_track.cc |
index 17df845f81c491b3c9a0631d3a20835f1b05aa1a..84b89fe2dedda731f2dd7f6804e15908904a1517 100644 |
--- a/content/renderer/media/webrtc/media_stream_remote_audio_track.cc |
+++ b/content/renderer/media/webrtc/media_stream_remote_audio_track.cc |
@@ -8,6 +8,8 @@ |
#include <list> |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
#include "base/logging.h" |
#include "content/public/renderer/media_stream_audio_sink.h" |
#include "third_party/webrtc/api/mediastreaminterface.h" |
@@ -115,12 +117,24 @@ class MediaStreamRemoteAudioSource::AudioSink |
MediaStreamRemoteAudioTrack::MediaStreamRemoteAudioTrack( |
const blink::WebMediaStreamSource& source, bool enabled) |
: MediaStreamAudioTrack(false), source_(source), enabled_(enabled) { |
- DCHECK(source.extraData()); // Make sure the source has a native source. |
+ DCHECK(source.extraData()); |
+ |
+ // Stop means that a track should be stopped permanently. But |
+ // since there is no proper way of doing that on a remote track, we can |
+ // at least disable the track. Blink will not call down to the content layer |
+ // after a track has been stopped. |
+ MediaStreamAudioTrack::AddStopObserver(base::Bind( |
+ &MediaStreamRemoteAudioTrack::SetEnabled, base::Unretained(this), false)); |
} |
MediaStreamRemoteAudioTrack::~MediaStreamRemoteAudioTrack() { |
DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
source()->RemoveAll(this); |
+ |
+ // Even though the base class calls Stop(), do it here because the stop |
+ // callback added in this class's constructor needs to be run before the data |
+ // members of this class are destroyed. |
+ Stop(); |
} |
void MediaStreamRemoteAudioTrack::SetEnabled(bool enabled) { |
@@ -139,15 +153,6 @@ void MediaStreamRemoteAudioTrack::SetEnabled(bool enabled) { |
source()->SetSinksEnabled(this, enabled); |
} |
-void MediaStreamRemoteAudioTrack::Stop() { |
- DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
- // Stop means that a track should be stopped permanently. But |
- // since there is no proper way of doing that on a remote track, we can |
- // at least disable the track. Blink will not call down to the content layer |
- // after a track has been stopped. |
- SetEnabled(false); |
-} |
- |
void MediaStreamRemoteAudioTrack::AddSink(MediaStreamAudioSink* sink) { |
DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
return source()->AddSink(sink, this, enabled_); |