OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/base/audio_renderer_mixer_input.h" | 5 #include "media/base/audio_renderer_mixer_input.h" |
6 | 6 |
| 7 #include "base/bind.h" |
7 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/message_loop.h" |
8 #include "media/base/audio_renderer_mixer.h" | 10 #include "media/base/audio_renderer_mixer.h" |
9 | 11 |
10 namespace media { | 12 namespace media { |
11 | 13 |
12 AudioRendererMixerInput::AudioRendererMixerInput( | 14 AudioRendererMixerInput::AudioRendererMixerInput( |
13 const GetMixerCB& get_mixer_cb, const RemoveMixerCB& remove_mixer_cb) | 15 const GetMixerCB& get_mixer_cb, const RemoveMixerCB& remove_mixer_cb) |
14 : playing_(false), | 16 : playing_(false), |
15 initialized_(false), | 17 initialized_(false), |
16 volume_(1.0f), | 18 volume_(1.0f), |
17 get_mixer_cb_(get_mixer_cb), | 19 get_mixer_cb_(get_mixer_cb), |
18 remove_mixer_cb_(remove_mixer_cb), | 20 remove_mixer_cb_(remove_mixer_cb), |
19 mixer_(NULL), | 21 mixer_(NULL), |
20 callback_(NULL), | 22 callback_(NULL), |
21 current_audio_delay_milliseconds_(0) { | 23 current_audio_delay_milliseconds_(0) { |
22 } | 24 } |
23 | 25 |
24 AudioRendererMixerInput::~AudioRendererMixerInput() { | 26 AudioRendererMixerInput::~AudioRendererMixerInput() { |
25 // Mixer is no longer safe to use after |remove_mixer_cb_| has been called. | 27 // |mixer_| is no longer safe to use after |remove_mixer_cb_| has been called. |
26 if (initialized_) | 28 if (initialized_) { |
27 remove_mixer_cb_.Run(params_); | 29 remove_mixer_cb_.Run(mixer_); |
| 30 mixer_ = NULL; |
| 31 } |
28 } | 32 } |
29 | 33 |
30 void AudioRendererMixerInput::Initialize( | 34 void AudioRendererMixerInput::Initialize( |
31 const AudioParameters& params, | 35 const AudioParameters& params, |
32 AudioRendererSink::RenderCallback* callback) { | 36 AudioRendererSink::RenderCallback* callback) { |
33 DCHECK(!initialized_); | 37 DCHECK(!initialized_); |
34 params_ = params; | 38 params_ = params; |
35 mixer_ = get_mixer_cb_.Run(params_); | 39 mixer_ = get_mixer_cb_.Run(params_); |
36 callback_ = callback; | 40 callback_ = callback; |
37 initialized_ = true; | 41 initialized_ = true; |
| 42 |
| 43 started_on_message_loop_ = base::MessageLoopProxy::current(); |
38 } | 44 } |
39 | 45 |
40 void AudioRendererMixerInput::Start() { | 46 void AudioRendererMixerInput::Start() { |
41 DCHECK(initialized_); | 47 DCHECK(initialized_); |
42 DCHECK(!playing_); | 48 DCHECK(!playing_); |
43 } | 49 } |
44 | 50 |
45 void AudioRendererMixerInput::Stop() { | 51 void AudioRendererMixerInput::Stop() { |
46 // Stop() may be called at any time, if Pause() hasn't been called we need to | 52 // Stop() may be called at any time, if Pause() hasn't been called we need to |
47 // remove our mixer input before shutdown. | 53 // remove our mixer input before shutdown. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 frames_filled, audio_bus->frames() - frames_filled); | 95 frames_filled, audio_bus->frames() - frames_filled); |
90 } | 96 } |
91 | 97 |
92 return frames_filled > 0 ? volume_ : 0; | 98 return frames_filled > 0 ? volume_ : 0; |
93 } | 99 } |
94 | 100 |
95 void AudioRendererMixerInput::OnRenderError() { | 101 void AudioRendererMixerInput::OnRenderError() { |
96 callback_->OnRenderError(); | 102 callback_->OnRenderError(); |
97 } | 103 } |
98 | 104 |
| 105 void AudioRendererMixerInput::OnDeviceChange() { |
| 106 LOG(ERROR) << "DEVICE CHANGE SENT"; |
| 107 started_on_message_loop_->PostTask(FROM_HERE, base::Bind( |
| 108 &AudioRendererMixerInput::UpdateMixer, this)); |
| 109 } |
| 110 |
| 111 void AudioRendererMixerInput::UpdateMixer() { |
| 112 DCHECK(mixer_); |
| 113 LOG(ERROR) << "AudioRendererMixerInput::kDeviceChange"; |
| 114 |
| 115 // First see if a new mixer is actually necessary. |
| 116 AudioRendererMixer* new_mixer = get_mixer_cb_.Run(params_); |
| 117 if (new_mixer == mixer_) { |
| 118 remove_mixer_cb_.Run(new_mixer); |
| 119 return; |
| 120 } |
| 121 |
| 122 LOG(ERROR) << "new mixer time!"; |
| 123 if (playing_) |
| 124 mixer_->RemoveMixerInput(this); |
| 125 remove_mixer_cb_.Run(mixer_); |
| 126 mixer_ = new_mixer; |
| 127 if (playing_) |
| 128 mixer_->AddMixerInput(this); |
| 129 } |
| 130 |
99 } // namespace media | 131 } // namespace media |
OLD | NEW |