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

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

Issue 2582703003: Audio output debug recording. (Closed)
Patch Set: Code review (dalecurtis@ and maxmorin@). Created 3 years, 11 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 27 matching lines...) Expand all
38 // The singleton instance of AudioManager. This is set when Create() is called. 38 // The singleton instance of AudioManager. This is set when Create() is called.
39 AudioManager* g_last_created = nullptr; 39 AudioManager* g_last_created = nullptr;
40 40
41 // Maximum number of failed pings to the audio thread allowed. A UMA will be 41 // Maximum number of failed pings to the audio thread allowed. A UMA will be
42 // recorded once this count is reached; if enabled, a non-crash dump will be 42 // recorded once this count is reached; if enabled, a non-crash dump will be
43 // captured as well. We require at least three failed pings before recording to 43 // captured as well. We require at least three failed pings before recording to
44 // ensure unobservable power events aren't mistakenly caught (e.g., the system 44 // ensure unobservable power events aren't mistakenly caught (e.g., the system
45 // suspends before a OnSuspend() event can be fired). 45 // suspends before a OnSuspend() event can be fired).
46 const int kMaxFailedPingsCount = 3; 46 const int kMaxFailedPingsCount = 3;
47 47
48 // Dummy function for creating debug writer.
49 std::unique_ptr<AudioFileWriter> CreateAudioFileWriterDummy(
50 const AudioParameters& params) {
51 return nullptr;
52 }
53
48 // Helper class for managing global AudioManager data and hang monitor. If the 54 // Helper class for managing global AudioManager data and hang monitor. If the
49 // audio thread is hung for > |kMaxFailedPingsCount| * |max_hung_task_time_|, we 55 // audio thread is hung for > |kMaxFailedPingsCount| * |max_hung_task_time_|, we
50 // want to record a UMA and optionally a non-crash dump to find offenders in the 56 // want to record a UMA and optionally a non-crash dump to find offenders in the
51 // field. 57 // field.
52 class AudioManagerHelper : public base::PowerObserver { 58 class AudioManagerHelper : public base::PowerObserver {
53 public: 59 public:
54 // These values are histogrammed over time; do not change their ordinal 60 // These values are histogrammed over time; do not change their ordinal
55 // values. 61 // values.
56 enum ThreadStatus { 62 enum ThreadStatus {
57 THREAD_NONE = 0, 63 THREAD_NONE = 0,
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 if (!instance->GetTaskRunner()->DeleteSoon(FROM_HERE, instance)) { 300 if (!instance->GetTaskRunner()->DeleteSoon(FROM_HERE, instance)) {
295 LOG(WARNING) << "Failed to delete AudioManager instance."; 301 LOG(WARNING) << "Failed to delete AudioManager instance.";
296 } 302 }
297 #endif 303 #endif
298 } 304 }
299 305
300 // Forward declaration of the platform specific AudioManager factory function. 306 // Forward declaration of the platform specific AudioManager factory function.
301 ScopedAudioManagerPtr CreateAudioManager( 307 ScopedAudioManagerPtr CreateAudioManager(
302 scoped_refptr<base::SingleThreadTaskRunner> task_runner, 308 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
303 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner, 309 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
304 AudioLogFactory* audio_log_factory); 310 AudioLogFactory* audio_log_factory,
311 CreateAudioFileWriterCallback create_audio_file_writer_callback);
305 312
306 void AudioManager::SetMaxStreamCountForTesting(int max_input, int max_output) { 313 void AudioManager::SetMaxStreamCountForTesting(int max_input, int max_output) {
307 NOTREACHED(); 314 NOTREACHED();
308 } 315 }
309 316
310 AudioManager::AudioManager( 317 AudioManager::AudioManager(
311 scoped_refptr<base::SingleThreadTaskRunner> task_runner, 318 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
312 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner) 319 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner)
313 : task_runner_(std::move(task_runner)), 320 : task_runner_(std::move(task_runner)),
314 worker_task_runner_(std::move(worker_task_runner)) { 321 worker_task_runner_(std::move(worker_task_runner)) {
(...skipping 11 matching lines...) Expand all
326 } 333 }
327 334
328 AudioManager::~AudioManager() { 335 AudioManager::~AudioManager() {
329 DCHECK(task_runner_->BelongsToCurrentThread()); 336 DCHECK(task_runner_->BelongsToCurrentThread());
330 } 337 }
331 338
332 // static 339 // static
333 ScopedAudioManagerPtr AudioManager::Create( 340 ScopedAudioManagerPtr AudioManager::Create(
334 scoped_refptr<base::SingleThreadTaskRunner> task_runner, 341 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
335 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner, 342 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
336 AudioLogFactory* audio_log_factory) { 343 AudioLogFactory* audio_log_factory,
344 CreateAudioFileWriterCallback create_audio_file_writer_callback) {
337 DCHECK(task_runner); 345 DCHECK(task_runner);
338 DCHECK(worker_task_runner); 346 DCHECK(worker_task_runner);
339 return CreateAudioManager(std::move(task_runner), 347 return CreateAudioManager(std::move(task_runner),
340 std::move(worker_task_runner), audio_log_factory); 348 std::move(worker_task_runner), audio_log_factory,
349 std::move(create_audio_file_writer_callback));
341 } 350 }
342 351
343 // static 352 // static
344 ScopedAudioManagerPtr AudioManager::CreateForTesting( 353 ScopedAudioManagerPtr AudioManager::CreateForTesting(
345 scoped_refptr<base::SingleThreadTaskRunner> task_runner) { 354 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
346 #if defined(OS_WIN) 355 #if defined(OS_WIN)
347 g_helper.Pointer()->InitializeCOMForTesting(); 356 g_helper.Pointer()->InitializeCOMForTesting();
348 #endif 357 #endif
349 return Create(task_runner, task_runner, 358 return Create(task_runner, task_runner,
350 g_helper.Pointer()->fake_log_factory()); 359 g_helper.Pointer()->fake_log_factory(),
360 base::Bind(&CreateAudioFileWriterDummy));
351 } 361 }
352 362
353 // static 363 // static
354 void AudioManager::StartHangMonitorIfNeeded( 364 void AudioManager::StartHangMonitorIfNeeded(
355 scoped_refptr<base::SingleThreadTaskRunner> task_runner) { 365 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
356 if (g_helper.Pointer()->monitor_task_runner()) 366 if (g_helper.Pointer()->monitor_task_runner())
357 return; 367 return;
358 368
359 DCHECK(AudioManager::Get()); 369 DCHECK(AudioManager::Get());
360 DCHECK(task_runner); 370 DCHECK(task_runner);
(...skipping 19 matching lines...) Expand all
380 return g_helper.Pointer()->app_name(); 390 return g_helper.Pointer()->app_name();
381 } 391 }
382 #endif 392 #endif
383 393
384 // static 394 // static
385 AudioManager* AudioManager::Get() { 395 AudioManager* AudioManager::Get() {
386 return g_last_created; 396 return g_last_created;
387 } 397 }
388 398
389 } // namespace media 399 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698