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 569b126fd65ad3cb75b1c64bf9b587217edbd862..90f23d6d1e2631e9f3062a1f66ed06467885508a 100644 |
--- a/media/base/audio_renderer_mixer_input.cc |
+++ b/media/base/audio_renderer_mixer_input.cc |
@@ -4,7 +4,9 @@ |
#include "media/base/audio_renderer_mixer_input.h" |
+#include "base/bind.h" |
#include "base/logging.h" |
+#include "base/message_loop.h" |
#include "media/base/audio_renderer_mixer.h" |
namespace media { |
@@ -22,9 +24,11 @@ AudioRendererMixerInput::AudioRendererMixerInput( |
} |
AudioRendererMixerInput::~AudioRendererMixerInput() { |
- // Mixer is no longer safe to use after |remove_mixer_cb_| has been called. |
- if (initialized_) |
- remove_mixer_cb_.Run(params_); |
+ // |mixer_| is no longer safe to use after |remove_mixer_cb_| has been called. |
+ if (initialized_) { |
+ remove_mixer_cb_.Run(mixer_); |
+ mixer_ = NULL; |
+ } |
} |
void AudioRendererMixerInput::Initialize( |
@@ -35,6 +39,8 @@ void AudioRendererMixerInput::Initialize( |
mixer_ = get_mixer_cb_.Run(params_); |
callback_ = callback; |
initialized_ = true; |
+ |
+ started_on_message_loop_ = base::MessageLoopProxy::current(); |
} |
void AudioRendererMixerInput::Start() { |
@@ -96,4 +102,30 @@ void AudioRendererMixerInput::OnRenderError() { |
callback_->OnRenderError(); |
} |
+void AudioRendererMixerInput::OnDeviceChange() { |
+ LOG(ERROR) << "DEVICE CHANGE SENT"; |
+ started_on_message_loop_->PostTask(FROM_HERE, base::Bind( |
+ &AudioRendererMixerInput::UpdateMixer, this)); |
+} |
+ |
+void AudioRendererMixerInput::UpdateMixer() { |
+ DCHECK(mixer_); |
+ LOG(ERROR) << "AudioRendererMixerInput::kDeviceChange"; |
+ |
+ // First see if a new mixer is actually necessary. |
+ AudioRendererMixer* new_mixer = get_mixer_cb_.Run(params_); |
+ if (new_mixer == mixer_) { |
+ remove_mixer_cb_.Run(new_mixer); |
+ return; |
+ } |
+ |
+ LOG(ERROR) << "new mixer time!"; |
+ if (playing_) |
+ mixer_->RemoveMixerInput(this); |
+ remove_mixer_cb_.Run(mixer_); |
+ mixer_ = new_mixer; |
+ if (playing_) |
+ mixer_->AddMixerInput(this); |
+} |
+ |
} // namespace media |