Index: media/audio/audio_output_proxy.cc |
diff --git a/media/audio/audio_output_proxy.cc b/media/audio/audio_output_proxy.cc |
index a69cbc9522e8cd207bf8d002023e8f3e61a0f17c..fdbb8bcda0846d4c28197e5e4755aeb9b9868006 100644 |
--- a/media/audio/audio_output_proxy.cc |
+++ b/media/audio/audio_output_proxy.cc |
@@ -11,10 +11,10 @@ |
namespace media { |
-AudioOutputProxy::AudioOutputProxy(AudioOutputDispatcher* dispatcher) |
- : dispatcher_(dispatcher), |
- state_(kCreated), |
- volume_(1.0) { |
+AudioOutputProxy::AudioOutputProxy( |
+ base::WeakPtr<AudioOutputDispatcher> dispatcher) |
+ : dispatcher_(std::move(dispatcher)), state_(kCreated), volume_(1.0) { |
+ DCHECK(dispatcher_); |
} |
AudioOutputProxy::~AudioOutputProxy() { |
@@ -26,7 +26,7 @@ bool AudioOutputProxy::Open() { |
DCHECK(CalledOnValidThread()); |
DCHECK_EQ(state_, kCreated); |
- if (!dispatcher_->OpenStream()) { |
+ if (!dispatcher_ || !dispatcher_->OpenStream()) { |
state_ = kOpenError; |
return false; |
} |
@@ -43,7 +43,7 @@ void AudioOutputProxy::Start(AudioSourceCallback* callback) { |
// calls to succeed after failing, so we allow it to be called again. |
DCHECK(state_ == kOpened || state_ == kStartError); |
- if (!dispatcher_->StartStream(callback, this)) { |
+ if (!dispatcher_ || !dispatcher_->StartStream(callback, this)) { |
state_ = kStartError; |
callback->OnError(this); |
return; |
@@ -56,14 +56,17 @@ void AudioOutputProxy::Stop() { |
if (state_ != kPlaying) |
return; |
- dispatcher_->StopStream(this); |
+ if (dispatcher_) |
+ dispatcher_->StopStream(this); |
state_ = kOpened; |
} |
void AudioOutputProxy::SetVolume(double volume) { |
DCHECK(CalledOnValidThread()); |
volume_ = volume; |
- dispatcher_->StreamVolumeSet(this, volume); |
+ |
+ if (dispatcher_) |
+ dispatcher_->StreamVolumeSet(this, volume); |
} |
void AudioOutputProxy::GetVolume(double* volume) { |
@@ -78,7 +81,7 @@ void AudioOutputProxy::Close() { |
// kStartError means OpenStream() succeeded and the stream must be closed |
// before destruction. |
- if (state_ != kCreated && state_ != kOpenError) |
+ if (state_ != kCreated && state_ != kOpenError && dispatcher_) |
dispatcher_->CloseStream(this); |
state_ = kClosed; |