Index: media/base/audio_renderer_mixer_input.cc |
diff --git a/media/base/audio_renderer_mixer_input.cc b/media/base/audio_renderer_mixer_input.cc |
index 5743700f04b0a62c1c3c6eaf0f2d0bfa54aef0f5..e47cbea3845af27576be54424e3485382f27f37a 100644 |
--- a/media/base/audio_renderer_mixer_input.cc |
+++ b/media/base/audio_renderer_mixer_input.cc |
@@ -32,12 +32,14 @@ AudioRendererMixerInput::AudioRendererMixerInput( |
base::Unretained(this))) {} |
AudioRendererMixerInput::~AudioRendererMixerInput() { |
+ DCHECK(!started_); |
DCHECK(!mixer_); |
} |
void AudioRendererMixerInput::Initialize( |
const AudioParameters& params, |
AudioRendererSink::RenderCallback* callback) { |
+ DCHECK(!started_); |
DCHECK(!mixer_); |
DCHECK(callback); |
@@ -106,6 +108,7 @@ void AudioRendererMixerInput::Pause() { |
} |
bool AudioRendererMixerInput::SetVolume(double volume) { |
+ base::AutoLock auto_lock(volume_lock_); |
volume_ = volume; |
return true; |
} |
@@ -190,7 +193,13 @@ double AudioRendererMixerInput::ProvideInput(AudioBus* audio_bus, |
frames_filled, audio_bus->frames() - frames_filled); |
} |
- return frames_filled > 0 ? volume_ : 0; |
+ // We're reading |volume_| from the audio device thread and must avoid racing |
+ // with the main/media thread calls to SetVolume(). See thread safety comment |
+ // in the header file. |
+ { |
+ base::AutoLock auto_lock(volume_lock_); |
+ return frames_filled > 0 ? volume_ : 0; |
+ } |
} |
void AudioRendererMixerInput::OnRenderError() { |