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

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

Issue 1901583005: Revert of Pass task runners to AudioManager constructor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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 scoped_refptr<base::SingleThreadTaskRunner> monitor_task_runner) { 79 const scoped_refptr<base::SingleThreadTaskRunner>& monitor_task_runner) {
80 CHECK(!monitor_task_runner_); 80 CHECK(!monitor_task_runner_);
81 monitor_task_runner_ = std::move(monitor_task_runner); 81 monitor_task_runner_ = 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 { 258 // Forward declaration of the platform specific AudioManager factory function.
259 CHECK(instance); 259 AudioManager* CreateAudioManager(AudioLogFactory* audio_log_factory);
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 260
271 // AudioManager must be destroyed on the audio thread. 261 AudioManager::AudioManager() {}
272 if (!instance->GetTaskRunner()->DeleteSoon(FROM_HERE, instance)) {
273 LOG(WARNING) << "Failed to delete AudioManager instance.";
274 }
275 }
276
277 // Forward declaration of the platform specific AudioManager factory function.
278 ScopedAudioManagerPtr CreateAudioManager(
279 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
280 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
281 AudioLogFactory* audio_log_factory);
282
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 }
300 262
301 AudioManager::~AudioManager() { 263 AudioManager::~AudioManager() {
302 DCHECK(task_runner_->BelongsToCurrentThread()); 264 CHECK(!g_last_created || g_last_created == this);
265 g_last_created = nullptr;
303 } 266 }
304 267
305 // static 268 // static
306 void AudioManager::SetFactory(AudioManagerFactory* factory) { 269 void AudioManager::SetFactory(AudioManagerFactory* factory) {
307 CHECK(factory); 270 CHECK(factory);
308 CHECK(!g_last_created); 271 CHECK(!g_last_created);
309 CHECK(!g_audio_manager_factory); 272 CHECK(!g_audio_manager_factory);
310 g_audio_manager_factory = factory; 273 g_audio_manager_factory = factory;
311 } 274 }
312 275
313 // static 276 // static
314 void AudioManager::ResetFactoryForTesting() { 277 void AudioManager::ResetFactoryForTesting() {
315 if (g_audio_manager_factory) { 278 if (g_audio_manager_factory) {
316 delete g_audio_manager_factory; 279 delete g_audio_manager_factory;
317 g_audio_manager_factory = nullptr; 280 g_audio_manager_factory = nullptr;
318 } 281 }
319 } 282 }
320 283
321 // static 284 // static
322 ScopedAudioManagerPtr AudioManager::Create( 285 AudioManager* AudioManager::Create(AudioLogFactory* audio_log_factory) {
323 scoped_refptr<base::SingleThreadTaskRunner> task_runner, 286 CHECK(!g_last_created);
324 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner, 287 if (g_audio_manager_factory)
325 scoped_refptr<base::SingleThreadTaskRunner> monitor_task_runner, 288 g_last_created = g_audio_manager_factory->CreateInstance(audio_log_factory);
326 AudioLogFactory* audio_log_factory) { 289 else
327 DCHECK(task_runner); 290 g_last_created = CreateAudioManager(audio_log_factory);
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 }
339 291
340 if (monitor_task_runner) 292 return g_last_created;
341 g_helper.Pointer()->StartHangTimer(std::move(monitor_task_runner)); 293 }
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
342 306
343 return manager; 307 return manager;
344 } 308 }
345 309
346 // static 310 // static
347 ScopedAudioManagerPtr AudioManager::CreateForTesting( 311 AudioManager* AudioManager::CreateForTesting() {
348 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
349 #if defined(OS_WIN) 312 #if defined(OS_WIN)
350 g_helper.Pointer()->InitializeCOMForTesting(); 313 g_helper.Pointer()->InitializeCOMForTesting();
351 #endif 314 #endif
352 return Create(task_runner, task_runner, nullptr, 315 return Create(g_helper.Pointer()->fake_log_factory());
353 g_helper.Pointer()->fake_log_factory());
354 } 316 }
355 317
356 // static 318 // static
357 void AudioManager::EnableCrashKeyLoggingForAudioThreadHangs() { 319 void AudioManager::EnableCrashKeyLoggingForAudioThreadHangs() {
358 CHECK(!g_last_created); 320 CHECK(!g_last_created);
359 g_helper.Pointer()->enable_crash_key_logging(); 321 g_helper.Pointer()->enable_crash_key_logging();
360 } 322 }
361 323
362 #if defined(OS_LINUX) 324 #if defined(OS_LINUX)
363 // static 325 // static
(...skipping 26 matching lines...) Expand all
390 std::string AudioManager::GetCommunicationsDeviceName() { 352 std::string AudioManager::GetCommunicationsDeviceName() {
391 #if defined(OS_WIN) 353 #if defined(OS_WIN)
392 return GetLocalizedStringUTF8(COMMUNICATIONS_AUDIO_DEVICE_NAME); 354 return GetLocalizedStringUTF8(COMMUNICATIONS_AUDIO_DEVICE_NAME);
393 #else 355 #else
394 NOTREACHED(); 356 NOTREACHED();
395 return ""; 357 return "";
396 #endif 358 #endif
397 } 359 }
398 360
399 } // namespace media 361 } // 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