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