Chromium Code Reviews| Index: content/renderer/media/audio_renderer_mixer_manager.cc |
| diff --git a/content/renderer/media/audio_renderer_mixer_manager.cc b/content/renderer/media/audio_renderer_mixer_manager.cc |
| index 75b7ed60f306a71abaf34b8144bf639f0791882f..547e6be8db59b69f59fcb8bb0da8ba7766046ebe 100644 |
| --- a/content/renderer/media/audio_renderer_mixer_manager.cc |
| +++ b/content/renderer/media/audio_renderer_mixer_manager.cc |
| @@ -8,8 +8,9 @@ |
| #include "base/bind.h" |
| #include "base/bind_helpers.h" |
| +#include "base/memory/ptr_util.h" |
| #include "build/build_config.h" |
| -#include "content/renderer/media/audio_device_factory.h" |
| +#include "content/renderer/media/audio_renderer_sink_cache.h" |
| #include "media/audio/audio_device_description.h" |
| #include "media/base/audio_hardware_config.h" |
| #include "media/base/audio_renderer_mixer.h" |
| @@ -17,7 +18,17 @@ |
| namespace content { |
| -AudioRendererMixerManager::AudioRendererMixerManager() {} |
| +// static |
| +std::unique_ptr<AudioRendererMixerManager> AudioRendererMixerManager::Create() { |
| + return base::WrapUnique( |
| + new AudioRendererMixerManager(AudioRendererSinkCache::Create())); |
| +} |
| + |
| +AudioRendererMixerManager::AudioRendererMixerManager( |
| + std::unique_ptr<AudioRendererSinkCache> sink_cache) |
| + : sink_cache_(std::move(sink_cache)) { |
| + DCHECK(sink_cache_); |
| +} |
| AudioRendererMixerManager::~AudioRendererMixerManager() { |
| // References to AudioRendererMixers may be owned by garbage collected |
| @@ -33,14 +44,11 @@ media::AudioRendererMixerInput* AudioRendererMixerManager::CreateInput( |
| // base::Unretained() is safe since AudioRendererMixerManager lives on the |
|
miu
2016/05/19 22:27:15
This comment is obsolete now.
o1ka
2016/05/23 16:16:54
Done.
|
| // renderer thread and is destroyed on renderer thread destruction. |
| return new media::AudioRendererMixerInput( |
| - base::Bind(&AudioRendererMixerManager::GetMixer, base::Unretained(this), |
| - source_render_frame_id), |
| - base::Bind(&AudioRendererMixerManager::RemoveMixer, |
| - base::Unretained(this), source_render_frame_id), |
| + this, source_render_frame_id, |
| media::AudioDeviceDescription::UseSessionIdToSelectDevice(session_id, |
| device_id) |
| - ? AudioDeviceFactory::GetOutputDeviceInfo( |
| - source_render_frame_id, session_id, device_id, security_origin) |
| + ? GetOutputDeviceInfo(source_render_frame_id, session_id, device_id, |
| + security_origin) |
| .device_id() |
| : device_id, |
| security_origin); |
| @@ -69,14 +77,15 @@ media::AudioRendererMixer* AudioRendererMixerManager::GetMixer( |
| } |
| scoped_refptr<media::AudioRendererSink> sink = |
| - AudioDeviceFactory::NewAudioRendererMixerSink(source_render_frame_id, 0, |
| - device_id, security_origin); |
| + sink_cache_->GetSink(source_render_frame_id, device_id, security_origin); |
| const media::OutputDeviceInfo& device_info = sink->GetOutputDeviceInfo(); |
| if (device_status) |
| *device_status = device_info.device_status(); |
| if (device_info.device_status() != media::OUTPUT_DEVICE_STATUS_OK) { |
| sink->Stop(); |
| + sink_cache_->ReleaseSink(source_render_frame_id, device_id, security_origin, |
| + sink.get()); |
| return nullptr; |
| } |
| @@ -114,7 +123,7 @@ media::AudioRendererMixer* AudioRendererMixerManager::GetMixer( |
| return mixer; |
| } |
| -void AudioRendererMixerManager::RemoveMixer( |
| +void AudioRendererMixerManager::ReturnMixer( |
| int source_render_frame_id, |
| const media::AudioParameters& params, |
| const std::string& device_id, |
| @@ -129,11 +138,23 @@ void AudioRendererMixerManager::RemoveMixer( |
| // Only remove the mixer if AudioRendererMixerManager is the last owner. |
| it->second.ref_count--; |
| if (it->second.ref_count == 0) { |
| + // The mixer will be deleted now, so release the sink. |
| + sink_cache_->ReleaseSink(source_render_frame_id, device_id, security_origin, |
| + it->second.mixer->sink_ptr()); |
| delete it->second.mixer; |
| mixers_.erase(it); |
| } |
| } |
| +media::OutputDeviceInfo AudioRendererMixerManager::GetOutputDeviceInfo( |
| + int source_render_frame_id, |
| + int session_id, |
| + const std::string& device_id, |
| + const url::Origin& security_origin) { |
| + return sink_cache_->GetSinkInfo(source_render_frame_id, session_id, device_id, |
| + security_origin); |
| +} |
| + |
| AudioRendererMixerManager::MixerKey::MixerKey( |
| int source_render_frame_id, |
| const media::AudioParameters& params, |