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
3 // found in the LICENSE file.
4 
5 #include <memory>
6 
7 #include "base/command_line.h"
8 #include "base/metrics/histogram_macros.h"
9 #include "media/audio/fake_audio_manager.h"
10 #include "media/base/media_switches.h"
11 
12 #if defined(USE_ALSA)
13 #include "media/audio/alsa/audio_manager_alsa.h"
14 #endif
15 #if defined(USE_CRAS)
16 #include "media/audio/cras/audio_manager_cras.h"
17 #endif
18 #if defined(USE_PULSEAUDIO)
19 #include "media/audio/pulse/audio_manager_pulse.h"
20 #include "media/audio/pulse/pulse_util.h"
21 #endif
22 
23 namespace media {
24 
25 enum LinuxAudioIO {
26   kPulse,
27   kAlsa,
28   kCras,
29   kAudioIOMax = kCras  // Must always be equal to largest logged entry.
30 };
31 
CreateAudioManager(std::unique_ptr<AudioThread> audio_thread,AudioLogFactory * audio_log_factory)32 std::unique_ptr<media::AudioManager> CreateAudioManager(
33     std::unique_ptr<AudioThread> audio_thread,
34     AudioLogFactory* audio_log_factory) {
35   // For testing allow audio output to be disabled.
36   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
37           switches::kDisableAudioOutput)) {
38     return std::make_unique<FakeAudioManager>(std::move(audio_thread),
39                                               audio_log_factory);
40   }
41 
42 #if defined(USE_CRAS)
43   if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseCras)) {
44     UMA_HISTOGRAM_ENUMERATION("Media.LinuxAudioIO", kCras, kAudioIOMax + 1);
45     return std::make_unique<AudioManagerCras>(std::move(audio_thread),
46                                               audio_log_factory);
47   }
48 #endif
49 
50 #if defined(USE_PULSEAUDIO)
51   pa_threaded_mainloop* pa_mainloop = nullptr;
52   pa_context* pa_context = nullptr;
53   if (pulse::InitPulse(&pa_mainloop, &pa_context)) {
54     UMA_HISTOGRAM_ENUMERATION("Media.LinuxAudioIO", kPulse, kAudioIOMax + 1);
55     return std::make_unique<AudioManagerPulse>(
56         std::move(audio_thread), audio_log_factory, pa_mainloop, pa_context);
57   }
58   LOG(WARNING) << "Falling back to ALSA for audio output. PulseAudio is not "
59                   "available or could not be initialized.";
60 #endif
61 
62 #if defined(USE_ALSA)
63   UMA_HISTOGRAM_ENUMERATION("Media.LinuxAudioIO", kAlsa, kAudioIOMax + 1);
64   return std::make_unique<AudioManagerAlsa>(std::move(audio_thread),
65                                             audio_log_factory);
66 #else
67   return std::make_unique<FakeAudioManager>(std::move(audio_thread),
68                                             audio_log_factory);
69 #endif
70 }
71 
72 }  // namespace media
73