Chromium Code Reviews| Index: media/base/audio_renderer_mixer.cc |
| diff --git a/media/base/audio_renderer_mixer.cc b/media/base/audio_renderer_mixer.cc |
| index 11b12110260d9cbf6d4325db50afbcdc438f5d42..7ee07181574e5beb7b9acac3a8ff3780157cec19 100644 |
| --- a/media/base/audio_renderer_mixer.cc |
| +++ b/media/base/audio_renderer_mixer.cc |
| @@ -31,42 +31,51 @@ AudioRendererMixer::~AudioRendererMixer() { |
| // Ensures that all mixer inputs have stopped themselves prior to destruction |
| // and have called RemoveMixerInput(). |
| - DCHECK_EQ(mixer_inputs_.size(), 0U); |
| + DCHECK_EQ(error_callbacks_.size(), 0U); |
| } |
| -void AudioRendererMixer::AddMixerInput(AudioConverter::InputCallback* input, |
| - const base::Closure& error_cb) { |
| - base::AutoLock auto_lock(mixer_inputs_lock_); |
| - |
| +void AudioRendererMixer::AddMixerInput(AudioConverter::InputCallback* input) { |
| + base::AutoLock auto_lock(lock_); |
| if (!playing_) { |
| playing_ = true; |
| last_play_time_ = base::TimeTicks::Now(); |
| audio_sink_->Play(); |
| } |
| - DCHECK(mixer_inputs_.find(input) == mixer_inputs_.end()); |
| - mixer_inputs_[input] = error_cb; |
| + DCHECK(error_callbacks_.find(input) != error_callbacks_.end()); |
| audio_converter_.AddInput(input); |
| } |
| void AudioRendererMixer::RemoveMixerInput( |
| AudioConverter::InputCallback* input) { |
| - base::AutoLock auto_lock(mixer_inputs_lock_); |
| + base::AutoLock auto_lock(lock_); |
| audio_converter_.RemoveInput(input); |
| +} |
| - DCHECK(mixer_inputs_.find(input) != mixer_inputs_.end()); |
| - mixer_inputs_.erase(input); |
| +void AudioRendererMixer::RegisterErrorCallback( |
| + AudioConverter::InputCallback* input, |
|
scherkus (not reviewing)
2014/06/03 02:01:31
would using a map/list/vector work? there doesn't
DaleCurtis
2014/06/03 20:26:19
This is using a map so I'm not sure what you're as
|
| + const base::Closure& error_cb) { |
| + base::AutoLock auto_lock(lock_); |
| + DCHECK(error_callbacks_.find(input) == error_callbacks_.end()); |
| + error_callbacks_[input] = error_cb; |
| +} |
| + |
| +void AudioRendererMixer::UnregisterErrorCallback( |
| + AudioConverter::InputCallback* input) { |
| + base::AutoLock auto_lock(lock_); |
| + DCHECK(error_callbacks_.find(input) != error_callbacks_.end()); |
| + error_callbacks_.erase(input); |
| } |
| int AudioRendererMixer::Render(AudioBus* audio_bus, |
| int audio_delay_milliseconds) { |
| - base::AutoLock auto_lock(mixer_inputs_lock_); |
| + base::AutoLock auto_lock(lock_); |
| // If there are no mixer inputs and we haven't seen one for a while, pause the |
| // sink to avoid wasting resources when media elements are present but remain |
| // in the pause state. |
| const base::TimeTicks now = base::TimeTicks::Now(); |
| - if (!mixer_inputs_.empty()) { |
| + if (!audio_converter_.empty()) { |
| last_play_time_ = now; |
| } else if (now - last_play_time_ >= pause_delay_ && playing_) { |
| audio_sink_->Pause(); |
| @@ -79,11 +88,13 @@ int AudioRendererMixer::Render(AudioBus* audio_bus, |
| } |
| void AudioRendererMixer::OnRenderError() { |
| - base::AutoLock auto_lock(mixer_inputs_lock_); |
| + base::AutoLock auto_lock(lock_); |
| // Call each mixer input and signal an error. |
| - for (AudioRendererMixerInputSet::iterator it = mixer_inputs_.begin(); |
| - it != mixer_inputs_.end(); ++it) { |
| + for (AudioRendererMixerErrorCallbackMap::iterator it = |
| + error_callbacks_.begin(); |
| + it != error_callbacks_.end(); |
| + ++it) { |
| it->second.Run(); |
| } |
| } |