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

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: address comments from patch 48 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
« no previous file with comments | « media/audio/audio_manager.h ('k') | media/audio/audio_manager_base.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 if (!instance->GetTaskRunner()->DeleteSoon(FROM_HERE, instance)) {
273 LOG(WARNING) << "Failed to delete AudioManager 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
291 if (g_last_created) {
292 // We create multiple instances of AudioManager only when testing.
293 // We should not encounter this case in production.
294 LOG(WARNING) << "Multiple instances of AudioManager detected";
295 }
296 // We always override |g_last_created| irrespective of whether it is already
297 // set or not becuase it represents the last created instance.
298 g_last_created = this;
299 }
262 300
263 AudioManager::~AudioManager() { 301 AudioManager::~AudioManager() {
264 CHECK(!g_last_created || g_last_created == this); 302 DCHECK(task_runner_->BelongsToCurrentThread());
265 g_last_created = nullptr;
266 } 303 }
267 304
268 // static 305 // static
269 void AudioManager::SetFactory(AudioManagerFactory* factory) { 306 void AudioManager::SetFactory(AudioManagerFactory* factory) {
270 CHECK(factory); 307 CHECK(factory);
271 CHECK(!g_last_created); 308 CHECK(!g_last_created);
272 CHECK(!g_audio_manager_factory); 309 CHECK(!g_audio_manager_factory);
273 g_audio_manager_factory = factory; 310 g_audio_manager_factory = factory;
274 } 311 }
275 312
276 // static 313 // static
277 void AudioManager::ResetFactoryForTesting() { 314 void AudioManager::ResetFactoryForTesting() {
278 if (g_audio_manager_factory) { 315 if (g_audio_manager_factory) {
279 delete g_audio_manager_factory; 316 delete g_audio_manager_factory;
280 g_audio_manager_factory = nullptr; 317 g_audio_manager_factory = nullptr;
281 } 318 }
282 } 319 }
283 320
284 // static 321 // static
285 AudioManager* AudioManager::Create(AudioLogFactory* audio_log_factory) { 322 ScopedAudioManagerPtr AudioManager::Create(
286 CHECK(!g_last_created); 323 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
287 if (g_audio_manager_factory) 324 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
288 g_last_created = g_audio_manager_factory->CreateInstance(audio_log_factory); 325 scoped_refptr<base::SingleThreadTaskRunner> monitor_task_runner,
289 else 326 AudioLogFactory* audio_log_factory) {
290 g_last_created = CreateAudioManager(audio_log_factory); 327 DCHECK(task_runner);
328 DCHECK(worker_task_runner);
329 ScopedAudioManagerPtr manager;
330 if (g_audio_manager_factory) {
331 manager = g_audio_manager_factory->CreateInstance(
332 std::move(task_runner), std::move(worker_task_runner),
333 audio_log_factory);
334 } else {
335 manager =
336 CreateAudioManager(std::move(task_runner),
337 std::move(worker_task_runner), audio_log_factory);
338 }
291 339
292 return g_last_created; 340 if (monitor_task_runner)
293 } 341 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 342
307 return manager; 343 return manager;
308 } 344 }
309 345
310 // static 346 // static
311 AudioManager* AudioManager::CreateForTesting() { 347 ScopedAudioManagerPtr AudioManager::CreateForTesting(
348 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
312 #if defined(OS_WIN) 349 #if defined(OS_WIN)
313 g_helper.Pointer()->InitializeCOMForTesting(); 350 g_helper.Pointer()->InitializeCOMForTesting();
314 #endif 351 #endif
315 return Create(g_helper.Pointer()->fake_log_factory()); 352 return Create(task_runner, task_runner, nullptr,
353 g_helper.Pointer()->fake_log_factory());
316 } 354 }
317 355
318 // static 356 // static
319 void AudioManager::EnableCrashKeyLoggingForAudioThreadHangs() { 357 void AudioManager::EnableCrashKeyLoggingForAudioThreadHangs() {
320 CHECK(!g_last_created); 358 CHECK(!g_last_created);
321 g_helper.Pointer()->enable_crash_key_logging(); 359 g_helper.Pointer()->enable_crash_key_logging();
322 } 360 }
323 361
324 #if defined(OS_LINUX) 362 #if defined(OS_LINUX)
325 // static 363 // static
(...skipping 26 matching lines...) Expand all
352 std::string AudioManager::GetCommunicationsDeviceName() { 390 std::string AudioManager::GetCommunicationsDeviceName() {
353 #if defined(OS_WIN) 391 #if defined(OS_WIN)
354 return GetLocalizedStringUTF8(COMMUNICATIONS_AUDIO_DEVICE_NAME); 392 return GetLocalizedStringUTF8(COMMUNICATIONS_AUDIO_DEVICE_NAME);
355 #else 393 #else
356 NOTREACHED(); 394 NOTREACHED();
357 return ""; 395 return "";
358 #endif 396 #endif
359 } 397 }
360 398
361 } // namespace media 399 } // namespace media
OLDNEW
« no previous file with comments | « media/audio/audio_manager.h ('k') | media/audio/audio_manager_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698