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..a2627da37edef192aede7f48f8aa564ba54b3ee4 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,14 @@ 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(). This is the only method |
+ // called on the audio device thread. For other methods, thread safety |
+ // should be enforced by the caller. See the lock in AudioRendererMixer. |
o1ka
2016/03/16 14:31:18
It's not quite clear to me how the lock in AudioRe
chcunningham
2016/03/17 17:59:45
Woops! AudioRendererMixer should have been WebAudi
|
+ { |
+ base::AutoLock auto_lock(volume_lock_); |
+ return frames_filled > 0 ? volume_ : 0; |
+ } |
} |
void AudioRendererMixerInput::OnRenderError() { |