X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/4413b89d7a45587b545a31463ad2196767f45563..a67318f8affc4973507811946708bc17e63f1ec7:/src/modules/module-detect.c?ds=sidebyside diff --git a/src/modules/module-detect.c b/src/modules/module-detect.c index d0a37733..7b42d1a0 100644 --- a/src/modules/module-detect.c +++ b/src/modules/module-detect.c @@ -1,20 +1,22 @@ -/* $Id$ */ - /*** - This file is part of polypaudio. - - polypaudio is free software; you can redistribute it and/or modify + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + Copyright 2006 Diego Pettenò + + PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2 of the License, + by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - - polypaudio is distributed in the hope that it will be useful, but + + PulseAudio is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License - along with polypaudio; if not, write to the Free Software + along with PulseAudio; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ***/ @@ -24,7 +26,6 @@ #endif #include -#include #include #include #include @@ -33,20 +34,26 @@ #include #include -#include - -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include "module-detect-symdef.h" -PA_MODULE_AUTHOR("Lennart Poettering") -PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching drivers") -PA_MODULE_VERSION(PACKAGE_VERSION) -PA_MODULE_USAGE("just-one=") +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching drivers"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(true); +PA_MODULE_USAGE("just-one="); +PA_MODULE_DEPRECATED("Please use module-udev-detect instead of module-detect!"); + +static const char* const valid_modargs[] = { + "just-one", + NULL +}; #ifdef HAVE_ALSA @@ -54,11 +61,11 @@ static int detect_alsa(pa_core *c, int just_one) { FILE *f; int n = 0, n_sink = 0, n_source = 0; - if (!(f = fopen("/proc/asound/devices", "r"))) { + if (!(f = pa_fopen_cloexec("/proc/asound/devices", "r"))) { if (errno != ENOENT) - pa_log_error(__FILE__": open(\"/proc/asound/devices\") failed: %s", pa_cstrerror(errno)); - + pa_log_error("open(\"/proc/asound/devices\") failed: %s", pa_cstrerror(errno)); + return -1; } @@ -66,7 +73,7 @@ static int detect_alsa(pa_core *c, int just_one) { char line[64], args[64]; unsigned device, subdevice; int is_sink; - + if (!fgets(line, sizeof(line), f)) break; @@ -81,7 +88,7 @@ static int detect_alsa(pa_core *c, int just_one) { if (just_one && is_sink && n_sink >= 1) continue; - + if (just_one && !is_sink && n_source >= 1) continue; @@ -92,7 +99,7 @@ static int detect_alsa(pa_core *c, int just_one) { if (subdevice != 0) continue; - snprintf(args, sizeof(args), "device=hw:%u,0", device); + pa_snprintf(args, sizeof(args), "device_id=%u", device); if (!pa_module_load(c, is_sink ? "module-alsa-sink" : "module-alsa-source", args)) continue; @@ -105,22 +112,22 @@ static int detect_alsa(pa_core *c, int just_one) { } fclose(f); - + return n; } #endif -#ifdef HAVE_OSS +#ifdef HAVE_OSS_OUTPUT static int detect_oss(pa_core *c, int just_one) { FILE *f; int n = 0, b = 0; - - if (!(f = fopen("/dev/sndstat", "r")) && - !(f = fopen("/proc/sndstat", "r")) && - !(f = fopen("/proc/asound/oss/sndstat", "r"))) { + + if (!(f = pa_fopen_cloexec("/dev/sndstat", "r")) && + !(f = pa_fopen_cloexec("/proc/sndstat", "r")) && + !(f = pa_fopen_cloexec("/proc/asound/oss/sndstat", "r"))) { if (errno != ENOENT) - pa_log_error(__FILE__": failed to open OSS sndstat device: %s", pa_cstrerror(errno)); + pa_log_error("failed to open OSS sndstat device: %s", pa_cstrerror(errno)); return -1; } @@ -128,30 +135,36 @@ static int detect_oss(pa_core *c, int just_one) { while (!feof(f)) { char line[64], args[64]; unsigned device; - + if (!fgets(line, sizeof(line), f)) break; line[strcspn(line, "\r\n")] = 0; if (!b) { - b = strcmp(line, "Audio devices:") == 0; + b = pa_streq(line, "Audio devices:") || pa_streq(line, "Installed devices:"); continue; } if (line[0] == 0) break; - - if (sscanf(line, "%u: ", &device) != 1) - continue; - if (device == 0) - snprintf(args, sizeof(args), "device=/dev/dsp"); - else - snprintf(args, sizeof(args), "device=/dev/dsp%u", device); - - if (!pa_module_load(c, "module-oss", args)) - continue; + if (sscanf(line, "%u: ", &device) == 1) { + if (device == 0) + pa_snprintf(args, sizeof(args), "device=/dev/dsp"); + else + pa_snprintf(args, sizeof(args), "device=/dev/dsp%u", device); + + if (!pa_module_load(c, "module-oss", args)) + continue; + + } else if (sscanf(line, "pcm%u: ", &device) == 1) { + /* FreeBSD support, the devices are named /dev/dsp0.0, dsp0.1 and so on */ + pa_snprintf(args, sizeof(args), "device=/dev/dsp%u.0", device); + + if (!pa_module_load(c, "module-oss", args)) + continue; + } n++; @@ -176,14 +189,14 @@ static int detect_solaris(pa_core *c, int just_one) { if (stat(dev, &s) < 0) { if (errno != ENOENT) - pa_log_error(__FILE__": failed to open device %s: %s", dev, pa_cstrerror(errno)); + pa_log_error("failed to open device %s: %s", dev, pa_cstrerror(errno)); return -1; } if (!S_ISCHR(s.st_mode)) return 0; - snprintf(args, sizeof(args), "device=%s", dev); + pa_snprintf(args, sizeof(args), "device=%s", dev); if (!pa_module_load(c, "module-solaris", args)) return 0; @@ -205,49 +218,44 @@ static int detect_waveout(pa_core *c, int just_one) { } #endif -int pa__init(pa_core *c, pa_module*m) { - int just_one = 0, n = 0; +int pa__init(pa_module*m) { + bool just_one = false; + int n = 0; pa_modargs *ma; - static const char* const valid_modargs[] = { - "just-one", - NULL - }; - - assert(c); - assert(m); + pa_assert(m); if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { - pa_log(__FILE__": Failed to parse module arguments"); + pa_log("Failed to parse module arguments"); goto fail; } - + if (pa_modargs_get_value_boolean(ma, "just-one", &just_one) < 0) { - pa_log(__FILE__": just_one= expects a boolean argument."); + pa_log("just_one= expects a boolean argument."); goto fail; } -#if HAVE_ALSA - if ((n = detect_alsa(c, just_one)) <= 0) +#ifdef HAVE_ALSA + if ((n = detect_alsa(m->core, just_one)) <= 0) #endif -#if HAVE_OSS - if ((n = detect_oss(c, just_one)) <= 0) +#ifdef HAVE_OSS_OUTPUT + if ((n = detect_oss(m->core, just_one)) <= 0) #endif -#if HAVE_SOLARIS - if ((n = detect_solaris(c, just_one)) <= 0) +#ifdef HAVE_SOLARIS + if ((n = detect_solaris(m->core, just_one)) <= 0) #endif -#if OS_IS_WIN32 - if ((n = detect_waveout(c, just_one)) <= 0) +#ifdef OS_IS_WIN32 + if ((n = detect_waveout(m->core, just_one)) <= 0) #endif { - pa_log_warn(__FILE__": failed to detect any sound hardware."); + pa_log_warn("failed to detect any sound hardware."); goto fail; } - pa_log_info(__FILE__": loaded %i modules.", n); - + pa_log_info("loaded %i modules.", n); + /* We were successful and can unload ourselves now. */ - pa_module_unload_request(m); + pa_module_unload_request(m, true); pa_modargs_free(ma); @@ -256,12 +264,6 @@ int pa__init(pa_core *c, pa_module*m) { fail: if (ma) pa_modargs_free(ma); - - return -1; -} - -void pa__done(PA_GCC_UNUSED pa_core *c, PA_GCC_UNUSED pa_module*m) { - /* NOP */ + return -1; } -