Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2026)

Unified Diff: content/renderer/media/audio_renderer_mixer_manager.cc

Issue 1942803002: Caching AudioOutputDevice instances in mixer manager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase, fix for sleep() compile error on win and a bit of cleanup around timeouts. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..b1ce5502ddc965426178e4029817f3098c05c222 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,15 @@
namespace content {
-AudioRendererMixerManager::AudioRendererMixerManager() {}
+// static
+std::unique_ptr<AudioRendererMixerManager> AudioRendererMixerManager::Create() {
+ return base::WrapUnique(
+ new AudioRendererMixerManager(AudioRendererSinkCache::CreateDefault()));
+}
+
+AudioRendererMixerManager::AudioRendererMixerManager(
+ std::unique_ptr<AudioRendererSinkCache> sink_cache)
+ : sink_cache_(std::move(sink_cache)) {}
miu 2016/05/12 21:53:06 nit: Looks like all the code assumes |sink_cache_|
o1ka 2016/05/17 17:17:23 Done.
AudioRendererMixerManager::~AudioRendererMixerManager() {
// References to AudioRendererMixers may be owned by garbage collected
@@ -37,10 +46,13 @@ media::AudioRendererMixerInput* AudioRendererMixerManager::CreateInput(
source_render_frame_id),
base::Bind(&AudioRendererMixerManager::RemoveMixer,
base::Unretained(this), source_render_frame_id),
+ base::Bind(&AudioRendererMixerManager::GetOutputDeviceInfo,
+ base::Unretained(this), source_render_frame_id, 0 /*sink id*/),
media::AudioDeviceDescription::UseSessionIdToSelectDevice(session_id,
device_id)
- ? AudioDeviceFactory::GetOutputDeviceInfo(
- source_render_frame_id, session_id, device_id, security_origin)
+ ? sink_cache_
chcunningham 2016/05/12 19:56:31 Can you make this call AudioRendererMixerManager::
o1ka 2016/05/17 17:17:23 Done.
+ ->GetSinkInfo(source_render_frame_id, session_id, device_id,
+ security_origin)
.device_id()
: device_id,
security_origin);
@@ -68,15 +80,14 @@ media::AudioRendererMixer* AudioRendererMixerManager::GetMixer(
return it->second.mixer;
}
- scoped_refptr<media::AudioRendererSink> sink =
- AudioDeviceFactory::NewAudioRendererMixerSink(source_render_frame_id, 0,
- device_id, security_origin);
+ media::AudioRendererSink* sink =
+ 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(sink);
return nullptr;
}
@@ -107,8 +118,10 @@ media::AudioRendererMixer* AudioRendererMixerManager::GetMixer(
sample_rate, 16, buffer_size);
DCHECK(output_params.IsValid());
- media::AudioRendererMixer* mixer =
- new media::AudioRendererMixer(output_params, sink);
+ // |sink_cache_| will outlive any mixers, so it's fine to use Unretained().
chcunningham 2016/05/12 19:56:31 I'm not sure sink_cache_ really will outlive mixer
o1ka 2016/05/17 17:17:23 I made some changes around that, mostly because if
+ media::AudioRendererMixer* mixer = new media::AudioRendererMixer(
+ output_params, sink, base::Bind(&AudioRendererSinkCache::ReleaseSink,
+ base::Unretained(sink_cache_.get())));
AudioRendererMixerReference mixer_reference = { mixer, 1 };
mixers_[key] = mixer_reference;
return mixer;
@@ -134,6 +147,15 @@ void AudioRendererMixerManager::RemoveMixer(
}
}
+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,

Powered by Google App Engine
This is Rietveld 408576698