Index: media/audio/audio_manager.cc |
diff --git a/media/audio/audio_manager.cc b/media/audio/audio_manager.cc |
index edc327a662c3debce744c4913f60f348c8cd4821..5d5f3b3a63337dd1df6fb307a6a17f046529704b 100644 |
--- a/media/audio/audio_manager.cc |
+++ b/media/audio/audio_manager.cc |
@@ -76,9 +76,9 @@ |
} |
void StartHangTimer( |
- scoped_refptr<base::SingleThreadTaskRunner> monitor_task_runner) { |
+ const scoped_refptr<base::SingleThreadTaskRunner>& monitor_task_runner) { |
CHECK(!monitor_task_runner_); |
- monitor_task_runner_ = std::move(monitor_task_runner); |
+ monitor_task_runner_ = monitor_task_runner; |
base::PowerMonitor::Get()->AddObserver(this); |
failed_pings_ = 0; |
io_task_running_ = audio_task_running_ = true; |
@@ -255,51 +255,14 @@ |
} // namespace |
-void AudioManagerDeleter::operator()(const AudioManager* instance) const { |
- CHECK(instance); |
- // We reset g_last_created here instead of in the destructor of AudioManager |
- // because the destructor runs on the audio thread. We want to always change |
- // g_last_created from the main thread. |
- if (g_last_created == instance) { |
- g_last_created = nullptr; |
- } else { |
- // We create multiple instances of AudioManager only when testing. |
- // We should not encounter this case in production. |
- LOG(WARNING) << "Multiple instances of AudioManager detected"; |
- } |
- |
- // AudioManager must be destroyed on the audio thread. |
- if (!instance->GetTaskRunner()->DeleteSoon(FROM_HERE, instance)) { |
- LOG(WARNING) << "Failed to delete AudioManager instance."; |
- } |
-} |
- |
// Forward declaration of the platform specific AudioManager factory function. |
-ScopedAudioManagerPtr CreateAudioManager( |
- scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner, |
- AudioLogFactory* audio_log_factory); |
- |
-AudioManager::AudioManager( |
- scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner) |
- : task_runner_(std::move(task_runner)), |
- worker_task_runner_(std::move(worker_task_runner)) { |
- DCHECK(task_runner_); |
- DCHECK(worker_task_runner_); |
- |
- if (g_last_created) { |
- // We create multiple instances of AudioManager only when testing. |
- // We should not encounter this case in production. |
- LOG(WARNING) << "Multiple instances of AudioManager detected"; |
- } |
- // We always override |g_last_created| irrespective of whether it is already |
- // set or not becuase it represents the last created instance. |
- g_last_created = this; |
-} |
+AudioManager* CreateAudioManager(AudioLogFactory* audio_log_factory); |
+ |
+AudioManager::AudioManager() {} |
AudioManager::~AudioManager() { |
- DCHECK(task_runner_->BelongsToCurrentThread()); |
+ CHECK(!g_last_created || g_last_created == this); |
+ g_last_created = nullptr; |
} |
// static |
@@ -319,38 +282,37 @@ |
} |
// static |
-ScopedAudioManagerPtr AudioManager::Create( |
- scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> monitor_task_runner, |
- AudioLogFactory* audio_log_factory) { |
- DCHECK(task_runner); |
- DCHECK(worker_task_runner); |
- ScopedAudioManagerPtr manager; |
- if (g_audio_manager_factory) { |
- manager = g_audio_manager_factory->CreateInstance( |
- std::move(task_runner), std::move(worker_task_runner), |
- audio_log_factory); |
- } else { |
- manager = |
- CreateAudioManager(std::move(task_runner), |
- std::move(worker_task_runner), audio_log_factory); |
- } |
- |
- if (monitor_task_runner) |
- g_helper.Pointer()->StartHangTimer(std::move(monitor_task_runner)); |
+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; |
+} |
+ |
+// 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 |
return manager; |
} |
// static |
-ScopedAudioManagerPtr AudioManager::CreateForTesting( |
- scoped_refptr<base::SingleThreadTaskRunner> task_runner) { |
+AudioManager* AudioManager::CreateForTesting() { |
#if defined(OS_WIN) |
g_helper.Pointer()->InitializeCOMForTesting(); |
#endif |
- return Create(task_runner, task_runner, nullptr, |
- g_helper.Pointer()->fake_log_factory()); |
+ return Create(g_helper.Pointer()->fake_log_factory()); |
} |
// static |