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

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: removed AudioManagerBase::Shutdown Created 4 years, 8 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 // We reset g_last_created here instead of in the destructor of AudioManager
261 // because the destructor runs on the audio thread. We want to always change
262 // g_last_created from the main thread.
263 if (g_last_created == instance) {
264 g_last_created = nullptr;
265 } else {
266 // We create multiple instances of AudioManager only when testing.
267 // We should not encounter this case in production.
268 LOG(WARNING) << "Multiple instances of AudioManager detected";
269 }
270
271 // AudioManager must be destroyed on the audio thread.
272 scoped_refptr<base::SingleThreadTaskRunner> task_runner =
273 instance->GetTaskRunner();
274 if (task_runner->BelongsToCurrentThread()) {
275 delete instance;
276 } else {
277 task_runner->DeleteSoon(FROM_HERE, instance);
278 }
279 }
280
258 // Forward declaration of the platform specific AudioManager factory function. 281 // Forward declaration of the platform specific AudioManager factory function.
259 AudioManager* CreateAudioManager(AudioLogFactory* audio_log_factory); 282 ScopedAudioManagerPtr CreateAudioManager(
283 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
284 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
285 AudioLogFactory* audio_log_factory);
260 286
261 AudioManager::AudioManager() {} 287 AudioManager::AudioManager(
288 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
289 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner)
290 : task_runner_(std::move(task_runner)),
291 worker_task_runner_(std::move(worker_task_runner)) {
292 DCHECK(task_runner_);
293 DCHECK(worker_task_runner_);
294
295 if (g_last_created) {
296 // We create multiple instances of AudioManager only when testing.
297 // We should not encounter this case in production.
298 LOG(WARNING) << "Multiple instances of AudioManager detected";
299 }
300 // We always override |g_last_created| irrespective of whether it is already
301 // set or not becuase it represents the last created instance.
302 g_last_created = this;
303 }
262 304
263 AudioManager::~AudioManager() { 305 AudioManager::~AudioManager() {
264 CHECK(!g_last_created || g_last_created == this); 306 DCHECK(task_runner_->BelongsToCurrentThread());
265 g_last_created = nullptr;
266 } 307 }
267 308
268 // static 309 // static
269 void AudioManager::SetFactory(AudioManagerFactory* factory) { 310 void AudioManager::SetFactory(AudioManagerFactory* factory) {
270 CHECK(factory); 311 CHECK(factory);
271 CHECK(!g_last_created); 312 CHECK(!g_last_created);
272 CHECK(!g_audio_manager_factory); 313 CHECK(!g_audio_manager_factory);
273 g_audio_manager_factory = factory; 314 g_audio_manager_factory = factory;
274 } 315 }
275 316
276 // static 317 // static
277 void AudioManager::ResetFactoryForTesting() { 318 void AudioManager::ResetFactoryForTesting() {
278 if (g_audio_manager_factory) { 319 if (g_audio_manager_factory) {
279 delete g_audio_manager_factory; 320 delete g_audio_manager_factory;
280 g_audio_manager_factory = nullptr; 321 g_audio_manager_factory = nullptr;
281 } 322 }
282 } 323 }
283 324
284 // static 325 // static
285 AudioManager* AudioManager::Create(AudioLogFactory* audio_log_factory) { 326 ScopedAudioManagerPtr AudioManager::Create(
286 CHECK(!g_last_created); 327 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
287 if (g_audio_manager_factory) 328 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
288 g_last_created = g_audio_manager_factory->CreateInstance(audio_log_factory); 329 scoped_refptr<base::SingleThreadTaskRunner> monitor_task_runner,
289 else 330 AudioLogFactory* audio_log_factory) {
290 g_last_created = CreateAudioManager(audio_log_factory); 331 DCHECK(task_runner);
332 DCHECK(worker_task_runner);
333 ScopedAudioManagerPtr manager;
334 if (g_audio_manager_factory) {
335 manager = g_audio_manager_factory->CreateInstance(
336 std::move(task_runner), std::move(worker_task_runner),
337 audio_log_factory);
338 } else {
339 manager =
340 CreateAudioManager(std::move(task_runner),
341 std::move(worker_task_runner), audio_log_factory);
342 }
291 343
292 return g_last_created; 344 if (monitor_task_runner)
293 } 345 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 346
307 return manager; 347 return manager;
308 } 348 }
309 349
310 // static 350 // static
311 AudioManager* AudioManager::CreateForTesting() { 351 ScopedAudioManagerPtr AudioManager::CreateForTesting(
352 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
312 #if defined(OS_WIN) 353 #if defined(OS_WIN)
313 g_helper.Pointer()->InitializeCOMForTesting(); 354 g_helper.Pointer()->InitializeCOMForTesting();
314 #endif 355 #endif
315 return Create(g_helper.Pointer()->fake_log_factory()); 356 return Create(task_runner, task_runner, nullptr,
DaleCurtis 2016/04/06 22:07:49 std::move?
alokp 2016/04/07 00:38:10 Cant do because the same task_runner is being pass
357 g_helper.Pointer()->fake_log_factory());
316 } 358 }
317 359
318 // static 360 // static
319 void AudioManager::EnableCrashKeyLoggingForAudioThreadHangs() { 361 void AudioManager::EnableCrashKeyLoggingForAudioThreadHangs() {
320 CHECK(!g_last_created); 362 CHECK(!g_last_created);
321 g_helper.Pointer()->enable_crash_key_logging(); 363 g_helper.Pointer()->enable_crash_key_logging();
322 } 364 }
323 365
324 #if defined(OS_LINUX) 366 #if defined(OS_LINUX)
325 // static 367 // static
(...skipping 26 matching lines...) Expand all
352 std::string AudioManager::GetCommunicationsDeviceName() { 394 std::string AudioManager::GetCommunicationsDeviceName() {
353 #if defined(OS_WIN) 395 #if defined(OS_WIN)
354 return GetLocalizedStringUTF8(COMMUNICATIONS_AUDIO_DEVICE_NAME); 396 return GetLocalizedStringUTF8(COMMUNICATIONS_AUDIO_DEVICE_NAME);
355 #else 397 #else
356 NOTREACHED(); 398 NOTREACHED();
357 return ""; 399 return "";
358 #endif 400 #endif
359 } 401 }
360 402
361 } // namespace media 403 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698