]>
code.delx.au - pulseaudio/blob - src/modules/module-detect.c
2 This file is part of PulseAudio.
4 Copyright 2006 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
6 Copyright 2006 Diego Pettenò
8 PulseAudio is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published
10 by the Free Software Foundation; either version 2.1 of the License,
11 or (at your option) any later version.
13 PulseAudio is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with PulseAudio; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
34 #include <sys/types.h>
37 #include <pulse/xmalloc.h>
39 #include <pulsecore/core-error.h>
40 #include <pulsecore/module.h>
41 #include <pulsecore/modargs.h>
42 #include <pulsecore/log.h>
43 #include <pulsecore/core-util.h>
44 #include <pulsecore/macro.h>
46 #include "module-detect-symdef.h"
48 PA_MODULE_AUTHOR("Lennart Poettering");
49 PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching drivers");
50 PA_MODULE_VERSION(PACKAGE_VERSION
);
51 PA_MODULE_LOAD_ONCE(TRUE
);
52 PA_MODULE_USAGE("just-one=<boolean>");
54 static const char* const valid_modargs
[] = {
61 static int detect_alsa(pa_core
*c
, int just_one
) {
63 int n
= 0, n_sink
= 0, n_source
= 0;
65 if (!(f
= fopen("/proc/asound/devices", "r"))) {
68 pa_log_error("open(\"/proc/asound/devices\") failed: %s", pa_cstrerror(errno
));
74 char line
[64], args
[64];
75 unsigned device
, subdevice
;
78 if (!fgets(line
, sizeof(line
), f
))
81 line
[strcspn(line
, "\r\n")] = 0;
83 if (pa_endswith(line
, "digital audio playback"))
85 else if (pa_endswith(line
, "digital audio capture"))
90 if (just_one
&& is_sink
&& n_sink
>= 1)
93 if (just_one
&& !is_sink
&& n_source
>= 1)
96 if (sscanf(line
, " %*i: [%u- %u]: ", &device
, &subdevice
) != 2)
99 /* Only one sink per device */
103 pa_snprintf(args
, sizeof(args
), "device_id=%u", device
);
104 if (!pa_module_load(c
, is_sink
? "module-alsa-sink" : "module-alsa-source", args
))
122 static int detect_oss(pa_core
*c
, int just_one
) {
126 if (!(f
= fopen("/dev/sndstat", "r")) &&
127 !(f
= fopen("/proc/sndstat", "r")) &&
128 !(f
= fopen("/proc/asound/oss/sndstat", "r"))) {
131 pa_log_error("failed to open OSS sndstat device: %s", pa_cstrerror(errno
));
137 char line
[64], args
[64];
140 if (!fgets(line
, sizeof(line
), f
))
143 line
[strcspn(line
, "\r\n")] = 0;
146 b
= strcmp(line
, "Audio devices:") == 0 || strcmp(line
, "Installed devices:") == 0;
153 if (sscanf(line
, "%u: ", &device
) == 1) {
155 pa_snprintf(args
, sizeof(args
), "device=/dev/dsp");
157 pa_snprintf(args
, sizeof(args
), "device=/dev/dsp%u", device
);
159 if (!pa_module_load(c
, "module-oss", args
))
162 } else if (sscanf(line
, "pcm%u: ", &device
) == 1) {
163 /* FreeBSD support, the devices are named /dev/dsp0.0, dsp0.1 and so on */
164 pa_snprintf(args
, sizeof(args
), "device=/dev/dsp%u.0", device
);
166 if (!pa_module_load(c
, "module-oss", args
))
182 static int detect_solaris(pa_core
*c
, int just_one
) {
187 dev
= getenv("AUDIODEV");
191 if (stat(dev
, &s
) < 0) {
193 pa_log_error("failed to open device %s: %s", dev
, pa_cstrerror(errno
));
197 if (!S_ISCHR(s
.st_mode
))
200 pa_snprintf(args
, sizeof(args
), "device=%s", dev
);
202 if (!pa_module_load(c
, "module-solaris", args
))
210 static int detect_waveout(pa_core
*c
, int just_one
) {
212 * FIXME: No point in enumerating devices until the plugin supports
213 * selecting anything but the first.
215 if (!pa_module_load(c
, "module-waveout", ""))
222 int pa__init(pa_module
*m
) {
223 pa_bool_t just_one
= FALSE
;
229 if (!(ma
= pa_modargs_new(m
->argument
, valid_modargs
))) {
230 pa_log("Failed to parse module arguments");
234 if (pa_modargs_get_value_boolean(ma
, "just-one", &just_one
) < 0) {
235 pa_log("just_one= expects a boolean argument.");
240 if ((n
= detect_alsa(m
->core
, just_one
)) <= 0)
243 if ((n
= detect_oss(m
->core
, just_one
)) <= 0)
246 if ((n
= detect_solaris(m
->core
, just_one
)) <= 0)
249 if ((n
= detect_waveout(m
->core
, just_one
)) <= 0)
252 pa_log_warn("failed to detect any sound hardware.");
256 pa_log_info("loaded %i modules.", n
);
258 /* We were successful and can unload ourselves now. */
259 pa_module_unload_request(m
, TRUE
);