| Index: media/audio/audio_manager.cc
|
| diff --git a/media/audio/audio_manager.cc b/media/audio/audio_manager.cc
|
| index 5d5f3b3a63337dd1df6fb307a6a17f046529704b..08c1049c94dfed17bc9367448f1c0ed90d8fec5f 100644
|
| --- a/media/audio/audio_manager.cc
|
| +++ b/media/audio/audio_manager.cc
|
| @@ -21,7 +21,6 @@
|
| #include "base/strings/stringprintf.h"
|
| #include "build/build_config.h"
|
| #include "media/audio/audio_manager_factory.h"
|
| -#include "media/audio/fake_audio_log_factory.h"
|
| #include "media/base/media_resources.h"
|
| #include "media/base/media_switches.h"
|
|
|
| @@ -183,8 +182,6 @@ class AudioManagerHelper : public base::PowerObserver {
|
| max_hung_task_time_ / 5);
|
| }
|
|
|
| - AudioLogFactory* fake_log_factory() { return &fake_log_factory_; }
|
| -
|
| #if defined(OS_WIN)
|
| // This should be called before creating an AudioManager in tests to ensure
|
| // that the creating thread is COM initialized.
|
| @@ -224,8 +221,6 @@ class AudioManagerHelper : public base::PowerObserver {
|
| #endif
|
| }
|
|
|
| - FakeAudioLogFactory fake_log_factory_;
|
| -
|
| const base::TimeDelta max_hung_task_time_ = base::TimeDelta::FromMinutes(1);
|
| scoped_refptr<base::SingleThreadTaskRunner> monitor_task_runner_;
|
|
|
| @@ -256,13 +251,22 @@ base::LazyInstance<AudioManagerHelper>::Leaky g_helper =
|
| } // namespace
|
|
|
| // Forward declaration of the platform specific AudioManager factory function.
|
| -AudioManager* CreateAudioManager(AudioLogFactory* audio_log_factory);
|
| -
|
| -AudioManager::AudioManager() {}
|
| +AudioManager* CreateAudioManager(
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner,
|
| + AudioLogFactory* audio_log_factory);
|
| +
|
| +AudioManager::AudioManager(
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner)
|
| + : task_runner_(task_runner), worker_task_runner_(worker_task_runner) {
|
| + DCHECK(task_runner_);
|
| + DCHECK(worker_task_runner_);
|
| + g_last_created = this;
|
| +}
|
|
|
| AudioManager::~AudioManager() {
|
| - CHECK(!g_last_created || g_last_created == this);
|
| - g_last_created = nullptr;
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| }
|
|
|
| // static
|
| @@ -282,37 +286,45 @@ void AudioManager::ResetFactoryForTesting() {
|
| }
|
|
|
| // static
|
| -AudioManager* AudioManager::Create(AudioLogFactory* audio_log_factory) {
|
| - CHECK(!g_last_created);
|
| - if (g_audio_manager_factory)
|
| - g_last_created = g_audio_manager_factory->CreateInstance(audio_log_factory);
|
| - else
|
| - g_last_created = CreateAudioManager(audio_log_factory);
|
| -
|
| - return g_last_created;
|
| -}
|
| +AudioManager* AudioManager::Create(
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner,
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& monitor_task_runner,
|
| + AudioLogFactory* audio_log_factory) {
|
| + AudioManager* manager = nullptr;
|
| + if (g_audio_manager_factory) {
|
| + manager = g_audio_manager_factory->CreateInstance(
|
| + task_runner, worker_task_runner, audio_log_factory);
|
| + } else {
|
| + manager =
|
| + CreateAudioManager(task_runner, worker_task_runner, audio_log_factory);
|
| + }
|
|
|
| -// static
|
| -AudioManager* AudioManager::CreateWithHangTimer(
|
| - AudioLogFactory* audio_log_factory,
|
| - const scoped_refptr<base::SingleThreadTaskRunner>& monitor_task_runner) {
|
| - AudioManager* manager = Create(audio_log_factory);
|
| -
|
| -// On OSX the audio thread is the UI thread, for which a hang monitor is not
|
| -// necessary or recommended.
|
| -#if !defined(OS_MACOSX)
|
| - g_helper.Pointer()->StartHangTimer(monitor_task_runner);
|
| -#endif
|
| + if (monitor_task_runner)
|
| + g_helper.Pointer()->StartHangTimer(monitor_task_runner);
|
|
|
| return manager;
|
| }
|
|
|
| // static
|
| -AudioManager* AudioManager::CreateForTesting() {
|
| -#if defined(OS_WIN)
|
| - g_helper.Pointer()->InitializeCOMForTesting();
|
| -#endif
|
| - return Create(g_helper.Pointer()->fake_log_factory());
|
| +void AudioManager::Destroy(AudioManager* instance) {
|
| + CHECK(instance);
|
| + CHECK_EQ(g_last_created, instance);
|
| +
|
| + // AudioManager must be destroyed on the audio thread.
|
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner =
|
| + instance->GetTaskRunner();
|
| + if (task_runner->BelongsToCurrentThread()) {
|
| + delete instance;
|
| + } else {
|
| + task_runner->DeleteSoon(FROM_HERE, instance);
|
| + }
|
| +
|
| + // We reset g_last_created here instead of in the destructor of AudioManager
|
| + // to allow construction of another AudioManager while the current instance
|
| + // is being destroyed. This overlap does not happen in production - only in
|
| + // unittests.
|
| + g_last_created = nullptr;
|
| }
|
|
|
| // static
|
|
|