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

Side by Side Diff: media/audio/audio_manager.cc

Issue 1806313003: Pass task runners to AudioManager constructor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressed comments Created 4 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/audio/audio_manager.h" 5 #include "media/audio/audio_manager.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 AudioManagerHelper() {} 69 AudioManagerHelper() {}
70 ~AudioManagerHelper() override {} 70 ~AudioManagerHelper() override {}
71 71
72 void HistogramThreadStatus(ThreadStatus status) { 72 void HistogramThreadStatus(ThreadStatus status) {
73 audio_thread_status_ = status; 73 audio_thread_status_ = status;
74 UMA_HISTOGRAM_ENUMERATION("Media.AudioThreadStatus", audio_thread_status_, 74 UMA_HISTOGRAM_ENUMERATION("Media.AudioThreadStatus", audio_thread_status_,
75 THREAD_MAX + 1); 75 THREAD_MAX + 1);
76 } 76 }
77 77
78 void StartHangTimer( 78 void StartHangTimer(
79 const scoped_refptr<base::SingleThreadTaskRunner>& monitor_task_runner) { 79 scoped_refptr<base::SingleThreadTaskRunner> monitor_task_runner) {
80 CHECK(!monitor_task_runner_); 80 CHECK(!monitor_task_runner_);
81 monitor_task_runner_ = monitor_task_runner; 81 monitor_task_runner_ = std::move(monitor_task_runner);
82 base::PowerMonitor::Get()->AddObserver(this); 82 base::PowerMonitor::Get()->AddObserver(this);
83 failed_pings_ = 0; 83 failed_pings_ = 0;
84 io_task_running_ = audio_task_running_ = true; 84 io_task_running_ = audio_task_running_ = true;
85 UpdateLastAudioThreadTimeTick(); 85 UpdateLastAudioThreadTimeTick();
86 RecordAudioThreadStatus(); 86 RecordAudioThreadStatus();
87 } 87 }
88 88
89 // Disable hang detection when the system goes into the suspend state. 89 // Disable hang detection when the system goes into the suspend state.
90 void OnSuspend() override { 90 void OnSuspend() override {
91 base::AutoLock lock(hang_lock_); 91 base::AutoLock lock(hang_lock_);
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 #endif 248 #endif
249 249
250 DISALLOW_COPY_AND_ASSIGN(AudioManagerHelper); 250 DISALLOW_COPY_AND_ASSIGN(AudioManagerHelper);
251 }; 251 };
252 252
253 base::LazyInstance<AudioManagerHelper>::Leaky g_helper = 253 base::LazyInstance<AudioManagerHelper>::Leaky g_helper =
254 LAZY_INSTANCE_INITIALIZER; 254 LAZY_INSTANCE_INITIALIZER;
255 255
256 } // namespace 256 } // namespace
257 257
258 void AudioManagerDeleter::operator()(const AudioManager* instance) const {
259 CHECK(instance);
260 CHECK_EQ(g_last_created, instance);
261
262 // We reset g_last_created here instead of in the destructor of AudioManager
263 // because the destructor runs on the audio thread. We want to always change
264 // g_last_created from the main thread.
265 g_last_created = nullptr;
266
267 // AudioManager must be destroyed on the audio thread.
268 scoped_refptr<base::SingleThreadTaskRunner> task_runner =
269 instance->GetTaskRunner();
270 if (task_runner->BelongsToCurrentThread()) {
271 delete instance;
272 } else {
273 task_runner->DeleteSoon(FROM_HERE, instance);
274 }
275 }
276
258 // Forward declaration of the platform specific AudioManager factory function. 277 // Forward declaration of the platform specific AudioManager factory function.
259 AudioManager* CreateAudioManager(AudioLogFactory* audio_log_factory); 278 ScopedAudioManagerPtr CreateAudioManager(
279 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
280 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
281 AudioLogFactory* audio_log_factory);
260 282
261 AudioManager::AudioManager() {} 283 AudioManager::AudioManager(
284 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
285 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner)
286 : task_runner_(std::move(task_runner)),
287 worker_task_runner_(std::move(worker_task_runner)) {
288 DCHECK(task_runner_);
289 DCHECK(worker_task_runner_);
290 g_last_created = this;
291 }
262 292
263 AudioManager::~AudioManager() { 293 AudioManager::~AudioManager() {
264 CHECK(!g_last_created || g_last_created == this); 294 DCHECK(task_runner_->BelongsToCurrentThread());
265 g_last_created = nullptr;
266 } 295 }
267 296
268 // static 297 // static
269 void AudioManager::SetFactory(AudioManagerFactory* factory) { 298 void AudioManager::SetFactory(AudioManagerFactory* factory) {
270 CHECK(factory); 299 CHECK(factory);
271 CHECK(!g_last_created); 300 CHECK(!g_last_created);
272 CHECK(!g_audio_manager_factory); 301 CHECK(!g_audio_manager_factory);
273 g_audio_manager_factory = factory; 302 g_audio_manager_factory = factory;
274 } 303 }
275 304
276 // static 305 // static
277 void AudioManager::ResetFactoryForTesting() { 306 void AudioManager::ResetFactoryForTesting() {
278 if (g_audio_manager_factory) { 307 if (g_audio_manager_factory) {
279 delete g_audio_manager_factory; 308 delete g_audio_manager_factory;
280 g_audio_manager_factory = nullptr; 309 g_audio_manager_factory = nullptr;
281 } 310 }
282 } 311 }
283 312
284 // static 313 // static
285 AudioManager* AudioManager::Create(AudioLogFactory* audio_log_factory) { 314 ScopedAudioManagerPtr AudioManager::Create(
286 CHECK(!g_last_created); 315 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
287 if (g_audio_manager_factory) 316 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
288 g_last_created = g_audio_manager_factory->CreateInstance(audio_log_factory); 317 scoped_refptr<base::SingleThreadTaskRunner> monitor_task_runner,
289 else 318 AudioLogFactory* audio_log_factory) {
290 g_last_created = CreateAudioManager(audio_log_factory); 319 DCHECK(task_runner && worker_task_runner);
DaleCurtis 2016/03/22 21:58:27 split dcheck so failures are easy to understand.
alokp 2016/03/22 22:23:39 Done.
320 ScopedAudioManagerPtr manager;
321 if (g_audio_manager_factory) {
322 manager = g_audio_manager_factory->CreateInstance(
323 std::move(task_runner), std::move(worker_task_runner),
324 audio_log_factory);
325 } else {
326 manager =
327 CreateAudioManager(std::move(task_runner),
328 std::move(worker_task_runner), audio_log_factory);
329 }
291 330
292 return g_last_created; 331 if (monitor_task_runner)
293 } 332 g_helper.Pointer()->StartHangTimer(std::move(monitor_task_runner));
294
295 // static
296 AudioManager* AudioManager::CreateWithHangTimer(
297 AudioLogFactory* audio_log_factory,
298 const scoped_refptr<base::SingleThreadTaskRunner>& monitor_task_runner) {
299 AudioManager* manager = Create(audio_log_factory);
300
301 // On OSX the audio thread is the UI thread, for which a hang monitor is not
302 // necessary or recommended.
303 #if !defined(OS_MACOSX)
304 g_helper.Pointer()->StartHangTimer(monitor_task_runner);
305 #endif
306 333
307 return manager; 334 return manager;
308 } 335 }
309 336
310 // static 337 // static
311 AudioManager* AudioManager::CreateForTesting() { 338 ScopedAudioManagerPtr AudioManager::CreateForTesting(
339 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
312 #if defined(OS_WIN) 340 #if defined(OS_WIN)
313 g_helper.Pointer()->InitializeCOMForTesting(); 341 g_helper.Pointer()->InitializeCOMForTesting();
314 #endif 342 #endif
315 return Create(g_helper.Pointer()->fake_log_factory()); 343 return Create(task_runner, task_runner, nullptr,
344 g_helper.Pointer()->fake_log_factory());
316 } 345 }
317 346
318 // static 347 // static
319 void AudioManager::EnableCrashKeyLoggingForAudioThreadHangs() { 348 void AudioManager::EnableCrashKeyLoggingForAudioThreadHangs() {
320 CHECK(!g_last_created); 349 CHECK(!g_last_created);
321 g_helper.Pointer()->enable_crash_key_logging(); 350 g_helper.Pointer()->enable_crash_key_logging();
322 } 351 }
323 352
324 #if defined(OS_LINUX) 353 #if defined(OS_LINUX)
325 // static 354 // static
(...skipping 26 matching lines...) Expand all
352 std::string AudioManager::GetCommunicationsDeviceName() { 381 std::string AudioManager::GetCommunicationsDeviceName() {
353 #if defined(OS_WIN) 382 #if defined(OS_WIN)
354 return GetLocalizedStringUTF8(COMMUNICATIONS_AUDIO_DEVICE_NAME); 383 return GetLocalizedStringUTF8(COMMUNICATIONS_AUDIO_DEVICE_NAME);
355 #else 384 #else
356 NOTREACHED(); 385 NOTREACHED();
357 return ""; 386 return "";
358 #endif 387 #endif
359 } 388 }
360 389
361 } // namespace media 390 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698