| 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..26956519b96c67f10e09223bfd3e6e0d603ebadb 100644
|
| --- a/media/base/audio_renderer_mixer.cc
|
| +++ b/media/base/audio_renderer_mixer.cc
|
| @@ -29,44 +29,57 @@ AudioRendererMixer::~AudioRendererMixer() {
|
| // AudioRendererSinks must be stopped before being destructed.
|
| audio_sink_->Stop();
|
|
|
| - // Ensures that all mixer inputs have stopped themselves prior to destruction
|
| - // and have called RemoveMixerInput().
|
| - DCHECK_EQ(mixer_inputs_.size(), 0U);
|
| + // Ensure that all mixer inputs have removed themselves prior to destruction.
|
| + DCHECK(audio_converter_.empty());
|
| + 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;
|
| 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::AddErrorCallback(const base::Closure& error_cb) {
|
| + base::AutoLock auto_lock(lock_);
|
| + error_callbacks_.push_back(error_cb);
|
| +}
|
| +
|
| +void AudioRendererMixer::RemoveErrorCallback(const base::Closure& error_cb) {
|
| + base::AutoLock auto_lock(lock_);
|
| + for (ErrorCallbackList::iterator it = error_callbacks_.begin();
|
| + it != error_callbacks_.end();
|
| + ++it) {
|
| + if (it->Equals(error_cb)) {
|
| + error_callbacks_.erase(it);
|
| + return;
|
| + }
|
| + }
|
| +
|
| + // An error callback should always exist when called.
|
| + NOTREACHED();
|
| }
|
|
|
| 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,12 +92,12 @@ int AudioRendererMixer::Render(AudioBus* audio_bus,
|
| }
|
|
|
| void AudioRendererMixer::OnRenderError() {
|
| - base::AutoLock auto_lock(mixer_inputs_lock_);
|
| -
|
| // Call each mixer input and signal an error.
|
| - for (AudioRendererMixerInputSet::iterator it = mixer_inputs_.begin();
|
| - it != mixer_inputs_.end(); ++it) {
|
| - it->second.Run();
|
| + base::AutoLock auto_lock(lock_);
|
| + for (ErrorCallbackList::const_iterator it = error_callbacks_.begin();
|
| + it != error_callbacks_.end();
|
| + ++it) {
|
| + it->Run();
|
| }
|
| }
|
|
|
|
|