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, |