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..89b69adeafe27fcd7ba4578442d8be89ba11a43c 100644 |
--- a/media/base/audio_renderer_mixer_input.cc |
+++ b/media/base/audio_renderer_mixer_input.cc |
@@ -29,15 +29,22 @@ AudioRendererMixerInput::AudioRendererMixerInput( |
mixer_(nullptr), |
callback_(nullptr), |
error_cb_(base::Bind(&AudioRendererMixerInput::OnRenderError, |
- base::Unretained(this))) {} |
+ base::Unretained(this))) { |
+ // Can be constructed on any thread, but sink operations should all occur |
+ // on same thread. |
+ thread_checker_.DetachFromThread(); |
+} |
AudioRendererMixerInput::~AudioRendererMixerInput() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
DCHECK(!mixer_); |
} |
void AudioRendererMixerInput::Initialize( |
const AudioParameters& params, |
AudioRendererSink::RenderCallback* callback) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(!started_); |
DCHECK(!mixer_); |
DCHECK(callback); |
@@ -46,6 +53,7 @@ void AudioRendererMixerInput::Initialize( |
} |
void AudioRendererMixerInput::Start() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
DCHECK(!started_); |
DCHECK(!mixer_); |
DCHECK(callback_); // Initialized. |
@@ -68,6 +76,8 @@ void AudioRendererMixerInput::Start() { |
} |
void AudioRendererMixerInput::Stop() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
// Stop() may be called at any time, if Pause() hasn't been called we need to |
// remove our mixer input before shutdown. |
Pause(); |
@@ -90,6 +100,8 @@ void AudioRendererMixerInput::Stop() { |
} |
void AudioRendererMixerInput::Play() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
if (playing_ || !mixer_) |
return; |
@@ -98,6 +110,8 @@ void AudioRendererMixerInput::Play() { |
} |
void AudioRendererMixerInput::Pause() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
if (!playing_ || !mixer_) |
return; |
@@ -106,6 +120,8 @@ void AudioRendererMixerInput::Pause() { |
} |
bool AudioRendererMixerInput::SetVolume(double volume) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ base::AutoLock auto_lock(volume_lock_); |
volume_ = volume; |
return true; |
} |
@@ -118,6 +134,8 @@ void AudioRendererMixerInput::SwitchOutputDevice( |
const std::string& device_id, |
const url::Origin& security_origin, |
const SwitchOutputDeviceCB& callback) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
if (!mixer_) { |
if (pending_switch_callback_.is_null()) { |
pending_switch_callback_ = callback; |
@@ -159,12 +177,16 @@ void AudioRendererMixerInput::SwitchOutputDevice( |
} |
AudioParameters AudioRendererMixerInput::GetOutputParameters() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
if (mixer_) |
return mixer_->GetOutputDevice()->GetOutputParameters(); |
return get_hardware_params_cb_.Run(device_id_, security_origin_); |
} |
OutputDeviceStatus AudioRendererMixerInput::GetDeviceStatus() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
if (mixer_) |
return mixer_->GetOutputDevice()->GetDeviceStatus(); |
@@ -176,6 +198,14 @@ OutputDeviceStatus AudioRendererMixerInput::GetDeviceStatus() { |
double AudioRendererMixerInput::ProvideInput(AudioBus* audio_bus, |
base::TimeDelta buffer_delay) { |
+ // No thread checker here. This method is called on a different thread as part |
DaleCurtis
2016/03/03 22:14:15
Move this down to l.222; it's good practice to not
chcunningham
2016/03/03 22:21:58
The method comment is "The return value is the vol
DaleCurtis
2016/03/03 22:23:36
Why not? Nothing before this point uses the volume
chcunningham
2016/03/03 23:06:14
Done.
|
+ // of audio rendering. AudioRendererMixer has locks that protect us from |
+ // things like attempting to ProvideInput while simultaneously removing |
+ // ourselves from mixer inputs (see Pause()). This method wishes return the |
+ // volume at the time the frames were rendered, so it and SetVolume share a |
+ // lock to avoid races. |
+ base::AutoLock auto_lock(volume_lock_); |
+ |
// TODO(chcunningham): Delete this conversion and change ProvideInput to more |
// precisely describe delay as a count of frames delayed instead of TimeDelta. |
// See http://crbug.com/587522. |