[pulseaudio-commits] r1594 - /branches/lennart/src/modules/module-hal-detect.c
svnmailer-noreply at 0pointer.de
svnmailer-noreply at 0pointer.de
Wed Aug 8 16:49:20 PDT 2007
Author: lennart
Date: Thu Aug 9 01:49:17 2007
New Revision: 1594
URL: http://0pointer.de/cgi-bin/viewcvs.cgi?rev=3D1594&root=3Dpulseaudio&vi=
ew=3Drev
Log:
modernize module-hal-detect.c and check for ALSA pcm_class !=3D modem
Modified:
branches/lennart/src/modules/module-hal-detect.c
Modified: branches/lennart/src/modules/module-hal-detect.c
URL: http://0pointer.de/cgi-bin/viewcvs.cgi/branches/lennart/src/modules/mo=
dule-hal-detect.c?rev=3D1594&root=3Dpulseaudio&r1=3D1593&r2=3D1594&view=3Dd=
iff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- branches/lennart/src/modules/module-hal-detect.c (original)
+++ branches/lennart/src/modules/module-hal-detect.c Thu Aug 9 01:49:17 20=
07
@@ -1,25 +1,25 @@
/* $Id$ */
=
/***
- This file is part of PulseAudio.
-
- Copyright 2006 Lennart Poettering
- Copyright 2006 Shams E. King
-
- 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,
- or (at your option) any later version.
-
- 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 PulseAudio; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- USA.
+ This file is part of PulseAudio.
+
+ Copyright 2006 Lennart Poettering
+ Copyright 2006 Shams E. King
+
+ PulseAudio is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as publish=
ed
+ by the Free Software Foundation; either version 2 of the License,
+ or (at your option) any later version.
+
+ 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 Licen=
se
+ along with PulseAudio; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ USA.
***/
=
#ifdef HAVE_CONFIG_H
@@ -27,7 +27,6 @@
#endif
=
#include <stdio.h>
-#include <assert.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
@@ -55,25 +54,6 @@
PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching d=
rivers")
PA_MODULE_VERSION(PACKAGE_VERSION)
=
-typedef enum {
-#ifdef HAVE_ALSA
- CAP_ALSA,
-#endif
-#ifdef HAVE_OSS
- CAP_OSS,
-#endif
- CAP_MAX
-} capability_t;
-
-static const char* const capabilities[CAP_MAX] =3D {
-#ifdef HAVE_ALSA
- [CAP_ALSA] =3D "alsa",
-#endif
-#ifdef HAVE_OSS
- [CAP_OSS] =3D "oss",
-#endif
-};
-
struct device {
uint32_t index;
char *udi;
@@ -81,13 +61,10 @@
=
struct userdata {
pa_core *core;
- LibHalContext *ctx;
- capability_t capability;
- pa_dbus_connection *conn;
+ LibHalContext *context;
+ pa_dbus_connection *connection;
pa_hashmap *devices;
-#if defined(HAVE_ALSA) && defined(HAVE_OSS)
- int use_oss;
-#endif
+ const char *capability;
};
=
struct timerdata {
@@ -95,23 +72,23 @@
char *udi;
};
=
-static const char* get_capability_name(capability_t cap) {
- if (cap >=3D CAP_MAX)
- return NULL;
- return capabilities[cap];
-}
+#define CAPABILITY_ALSA "alsa"
+#define CAPABILITY_OSS "oss"
=
static void hal_device_free(struct device* d) {
+ pa_assert(d);
+ =
pa_xfree(d->udi);
pa_xfree(d);
}
=
static void hal_device_free_cb(void *d, PA_GCC_UNUSED void *data) {
- hal_device_free((struct device*) d);
+ hal_device_free(d);
}
=
static const char *strip_udi(const char *udi) {
const char *slash;
+ =
if ((slash =3D strrchr(udi, '/')))
return slash+1;
=
@@ -119,6 +96,7 @@
}
=
#ifdef HAVE_ALSA
+
typedef enum {
ALSA_TYPE_SINK,
ALSA_TYPE_SOURCE,
@@ -126,59 +104,61 @@
ALSA_TYPE_MAX
} alsa_type_t;
=
-static alsa_type_t hal_device_get_alsa_type(LibHalContext *ctx, const char=
*udi,
- DBusError *error)
-{
+static alsa_type_t hal_alsa_device_get_type(LibHalContext *context, const =
char *udi, DBusError *error) {
char *type;
alsa_type_t t;
=
- type =3D libhal_device_get_property_string(ctx, udi, "alsa.type", erro=
r);
- if (!type || dbus_error_is_set(error))
- return FALSE;
-
- if (!strcmp(type, "playback")) {
+ if (!(type =3D libhal_device_get_property_string(context, udi, "alsa.t=
ype", error)))
+ return ALSA_TYPE_OTHER;
+
+ if (!strcmp(type, "playback")) =
t =3D ALSA_TYPE_SINK;
- } else if (!strcmp(type, "capture")) {
+ else if (!strcmp(type, "capture"))
t =3D ALSA_TYPE_SOURCE;
- } else {
+ else =
t =3D ALSA_TYPE_OTHER;
- }
+
libhal_free_string(type);
=
return t;
}
=
-static int hal_device_get_alsa_card(LibHalContext *ctx, const char *udi,
- DBusError *error)
-{
- return libhal_device_get_property_int(ctx, udi, "alsa.card", error);
-}
-
-static int hal_device_get_alsa_device(LibHalContext *ctx, const char *udi,
- DBusError *error)
-{
- return libhal_device_get_property_int(ctx, udi, "alsa.device", error);
-}
-
-static pa_module* hal_device_load_alsa(struct userdata *u, const char *udi,
- DBusError *error)
-{
+static int hal_alsa_device_is_modem(LibHalContext *context, const char *ud=
i, DBusError *error) {
+ char *class;
+ int r;
+ =
+ if (!(class =3D libhal_device_get_property_string(context, udi, "alsa.=
pcm_class", error)))
+ return 0;
+
+ r =3D strcmp(class, "modem") =3D=3D 0;
+ pa_xfree(class);
+ =
+ return r;
+}
+
+static pa_module* hal_device_load_alsa(struct userdata *u, const char *udi=
) {
char args[128];
alsa_type_t type;
int device, card;
const char *module_name;
-
- type =3D hal_device_get_alsa_type(u->ctx, udi, error);
- if (dbus_error_is_set(error) || type =3D=3D ALSA_TYPE_OTHER)
- return NULL;
-
- device =3D hal_device_get_alsa_device(u->ctx, udi, error);
- if (dbus_error_is_set(error) || device !=3D 0)
- return NULL;
-
- card =3D hal_device_get_alsa_card(u->ctx, udi, error);
- if (dbus_error_is_set(error))
- return NULL;
+ DBusError error;
+ =
+ dbus_error_init(&error);
+
+ type =3D hal_alsa_device_get_type(u->context, udi, &error);
+ if (dbus_error_is_set(&error) || type =3D=3D ALSA_TYPE_OTHER)
+ goto fail;
+
+ device =3D libhal_device_get_property_int(u->context, udi, "alsa.devic=
e", &error);
+ if (dbus_error_is_set(&error) || device !=3D 0)
+ goto fail;
+
+ card =3D libhal_device_get_property_int(u->context, udi, "alsa.card", =
&error);
+ if (dbus_error_is_set(&error))
+ goto fail;
+
+ if (hal_alsa_device_is_modem(u->context, udi, &error))
+ goto fail;
=
if (type =3D=3D ALSA_TYPE_SINK) {
module_name =3D "module-alsa-sink";
@@ -191,58 +171,67 @@
pa_log_debug("Loading %s with arguments '%s'", module_name, args);
=
return pa_module_load(u->core, module_name, args);
+
+fail:
+ if (dbus_error_is_set(&error)) {
+ pa_log_error("D-Bus error while parsing ALSA data: %s: %s", error.=
name, error.message);
+ dbus_error_free(&error);
+ }
+
+ return NULL;
}
=
#endif
=
#ifdef HAVE_OSS
-static dbus_bool_t hal_device_is_oss_pcm(LibHalContext *ctx, const char *u=
di,
- DBusError *error)
-{
- dbus_bool_t rv =3D FALSE;
- char* type, *device_file =3D NULL;
+
+static int hal_oss_device_is_pcm(LibHalContext *context, const char *udi, =
DBusError *error) {
+ char *class =3D NULL, *dev =3D NULL, *e;
int device;
-
- type =3D libhal_device_get_property_string(ctx, udi, "oss.type", error=
);
- if (!type || dbus_error_is_set(error))
- return FALSE;
-
- if (!strcmp(type, "pcm")) {
- char *e;
-
- device =3D libhal_device_get_property_int(ctx, udi, "oss.device", =
error);
- if (dbus_error_is_set(error) || device !=3D 0)
- goto exit;
-
- device_file =3D libhal_device_get_property_string(ctx, udi, "oss.d=
evice_file",
- error);
- if (!device_file || dbus_error_is_set(error))
- goto exit;
-
- /* hack to ignore /dev/audio style devices */
- if ((e =3D strrchr(device_file, '/')))
- rv =3D !pa_startswith(e + 1, "audio");
- }
-
-exit:
- libhal_free_string(type);
- libhal_free_string(device_file);
- return rv;
-}
-
-static pa_module* hal_device_load_oss(struct userdata *u, const char *udi,
- DBusError *error)
-{
+ int r =3D 0;
+
+ class =3D libhal_device_get_property_string(context, udi, "oss.type", =
error);
+ if (dbus_error_is_set(error) || !class)
+ goto finish;
+
+ if (strcmp(class, "pcm"))
+ goto finish;
+
+ dev =3D libhal_device_get_property_string(context, udi, "oss.device_fi=
le", error);
+ if (dbus_error_is_set(error) || !dev)
+ goto finish;
+
+ if ((e =3D strrchr(dev, '/')))
+ if (pa_startswith(e + 1, "audio"))
+ goto finish;
+
+ device =3D libhal_device_get_property_int(context, udi, "oss.device", =
error);
+ if (dbus_error_is_set(error) || device !=3D 0)
+ goto finish;
+
+ r =3D 1;
+
+finish:
+
+ libhal_free_string(class);
+ libhal_free_string(dev);
+ =
+ return r;
+}
+
+static pa_module* hal_device_load_oss(struct userdata *u, const char *udi)=
{
char args[256];
char* device;
-
- if (!hal_device_is_oss_pcm(u->ctx, udi, error) || dbus_error_is_set(er=
ror))
- return NULL;
-
- device =3D libhal_device_get_property_string(u->ctx, udi, "oss.device_=
file",
- error);
- if (!device || dbus_error_is_set(error))
- return NULL;
+ DBusError error;
+ =
+ dbus_error_init(&error);
+
+ if (!hal_oss_device_is_pcm(u->context, udi, &error) || dbus_error_is_s=
et(&error))
+ goto fail;
+
+ device =3D libhal_device_get_property_string(u->context, udi, "oss.dev=
ice_file", &error);
+ if (!device || dbus_error_is_set(&error))
+ goto fail;
=
pa_snprintf(args, sizeof(args), "device=3D%s sink_name=3Doss_output.%s=
source_name=3Doss_input.%s", device, strip_udi(udi), strip_udi(udi));
libhal_free_string(device);
@@ -250,139 +239,167 @@
pa_log_debug("Loading module-oss with arguments '%s'", args);
=
return pa_module_load(u->core, "module-oss", args);
-}
-#endif
-
-static dbus_bool_t hal_device_add(struct userdata *u, const char *udi,
- DBusError *error)
-{
+
+fail:
+ if (dbus_error_is_set(&error)) {
+ pa_log_error("D-Bus error while parsing OSS data: %s: %s", error.n=
ame, error.message);
+ dbus_error_free(&error);
+ }
+
+ return NULL;
+}
+#endif
+
+static int hal_device_add(struct userdata *u, const char *udi) {
pa_module* m =3D NULL;
struct device *d;
=
- switch(u->capability) {
+ pa_assert(u);
+ pa_assert(u->capability);
+
#ifdef HAVE_ALSA
- case CAP_ALSA:
- m =3D hal_device_load_alsa(u, udi, error);
- break;
+ if (strcmp(u->capability, CAPABILITY_ALSA) =3D=3D 0)
+ m =3D hal_device_load_alsa(u, udi);
#endif
#ifdef HAVE_OSS
- case CAP_OSS:
-#ifdef HAVE_ALSA
- if (u->use_oss)
-#endif
- m =3D hal_device_load_oss(u, udi, error);
- break;
-#endif
- default:
- assert(FALSE); /* never reached */
- break;
- }
-
- if (!m || dbus_error_is_set(error))
- return FALSE;
+ if (strcmp(u->capability, CAPABILITY_OSS) =3D=3D 0)
+ m =3D hal_device_load_oss(u, udi);
+#endif
+
+ if (!m)
+ return -1;
=
d =3D pa_xnew(struct device, 1);
d->udi =3D pa_xstrdup(udi);
d->index =3D m->index;
-
pa_hashmap_put(u->devices, d->udi, d);
=
- return TRUE;
-}
-
-static int hal_device_add_all(struct userdata *u, capability_t capability)
-{
- DBusError error;
- int i,n,count;
- dbus_bool_t r;
+ return 0;
+}
+
+static int hal_device_add_all(struct userdata *u, const char *capability) {
+ DBusError error;
+ int i, n, count =3D 0;
char** udis;
- const char* cap =3D get_capability_name(capability);
-
- assert(capability < CAP_MAX);
-
- pa_log_info("Trying capability %u (%s)", capability, cap);
- dbus_error_init(&error);
- udis =3D libhal_find_device_by_capability(u->ctx, cap, &n, &error);
+
+ pa_assert(u);
+ pa_assert(!u->capability);
+ =
+ dbus_error_init(&error);
+
+ pa_log_info("Trying capability %s", capability);
+
+ udis =3D libhal_find_device_by_capability(u->context, capability, &n, =
&error);
if (dbus_error_is_set(&error)) {
- pa_log_error("Error finding devices: %s: %s", error.name,
- error.message);
+ pa_log_error("Error finding devices: %s: %s", error.name, error.me=
ssage);
dbus_error_free(&error);
return -1;
}
- count =3D 0;
- u->capability =3D capability;
- for (i =3D 0; i < n; ++i) {
- r =3D hal_device_add(u, udis[i], &error);
- if (dbus_error_is_set(&error)) {
- pa_log_error("Error adding device: %s: %s", error.name,
- error.message);
- dbus_error_free(&error);
- count =3D -1;
- break;
+
+ if (n > 0) {
+ u->capability =3D capability;
+ =
+ for (i =3D 0; i < n; i++) {
+ if (hal_device_add(u, udis[i]) < 0)
+ pa_log_debug("Not loaded device %s", udis[i]);
+ else
+ count++;
}
- if (r)
- ++count;
}
=
libhal_free_string_array(udis);
return count;
}
=
-static dbus_bool_t device_has_capability(LibHalContext *ctx, const char *u=
di,
- const char* cap, DBusError *error)
-{
+static dbus_bool_t device_has_capability(LibHalContext *context, const cha=
r *udi, const char* cap, DBusError *error){
dbus_bool_t has_prop;
- has_prop =3D libhal_device_property_exists(ctx, udi, "info.capabilitie=
s",
- error);
+ =
+ has_prop =3D libhal_device_property_exists(context, udi, "info.capabil=
ities", error);
if (!has_prop || dbus_error_is_set(error))
return FALSE;
=
- return libhal_device_query_capability(ctx, udi, cap, error);
-}
-
-static void device_added_time_cb(pa_mainloop_api *ea, pa_time_event *ev,
- const struct timeval *tv, void *userdata)
-{
- DBusError error;
- struct timerdata *td =3D (struct timerdata*) userdata;
-
- dbus_error_init(&error);
- if (libhal_device_exists(td->u->ctx, td->udi, &error))
- hal_device_add(td->u, td->udi, &error);
-
+ return libhal_device_query_capability(context, udi, cap, error);
+}
+
+static void device_added_time_cb(pa_mainloop_api *ea, pa_time_event *ev, c=
onst struct timeval *tv, void *userdata) {
+ DBusError error;
+ struct timerdata *td =3D userdata;
+ int b;
+
+ dbus_error_init(&error);
+ =
+ b =3D libhal_device_exists(td->u->context, td->udi, &error);
+ =
if (dbus_error_is_set(&error)) {
- pa_log_error("Error adding device: %s: %s", error.name,
- error.message);
- dbus_error_free(&error);
- }
+ pa_log_error("Error adding device: %s: %s", error.name, error.mess=
age);
+ dbus_error_free(&error);
+ } else if (b)
+ hal_device_add(td->u, td->udi);
=
pa_xfree(td->udi);
pa_xfree(td);
ea->time_free(ev);
}
=
-static void device_added_cb(LibHalContext *ctx, const char *udi)
-{
+static void device_added_cb(LibHalContext *context, const char *udi) {
DBusError error;
struct timeval tv;
- dbus_bool_t has_cap;
struct timerdata *t;
- struct userdata *u =3D (struct userdata*) libhal_ctx_get_user_data(ctx=
);
- const char* cap =3D get_capability_name(u->capability);
-
+ struct userdata *u;
+ int good =3D 0;
+
+ pa_assert_se(u =3D libhal_ctx_get_user_data(context));
+ =
pa_log_debug("HAL Device added: %s", udi);
=
dbus_error_init(&error);
- has_cap =3D device_has_capability(ctx, udi, cap, &error);
- if (dbus_error_is_set(&error)) {
- pa_log_error("Error getting capability: %s: %s", error.name,
- error.message);
- dbus_error_free(&error);
- return;
- }
-
- /* skip it */
- if (!has_cap)
+
+ if (u->capability) {
+ =
+ good =3D device_has_capability(context, udi, u->capability, &error=
);
+
+ if (dbus_error_is_set(&error)) {
+ pa_log_error("Error getting capability: %s: %s", error.name, e=
rror.message);
+ dbus_error_free(&error);
+ return;
+ }
+ =
+ } else {
+
+#ifdef HAVE_ALSA
+ good =3D device_has_capability(context, udi, CAPABILITY_ALSA, &err=
or);
+
+ if (dbus_error_is_set(&error)) {
+ pa_log_error("Error getting capability: %s: %s", error.name, e=
rror.message);
+ dbus_error_free(&error);
+ return;
+ }
+
+ if (good)
+ u->capability =3D CAPABILITY_ALSA;
+#endif
+#if defined(HAVE_OSS) && defined(HAVE_ALSA)
+ if (!good) {
+#endif =
+#ifdef HAS_OSS
+ good =3D device_has_capability(context, udi, CAPABILITY_OSS, &=
error);
+ =
+ if (dbus_error_is_set(&error)) {
+ pa_log_error("Error getting capability: %s: %s", error.nam=
e, error.message);
+ dbus_error_free(&error);
+ return;
+ }
+
+ if (good)
+ u->capability =3D CAPABILITY_OSS;
+
+#endif
+#if defined(HAVE_OSS) && defined(HAVE_ALSA)
+ }
+#endif
+ }
+ =
+ if (!good)
return;
=
/* actually add the device 1/2 second later */
@@ -392,104 +409,81 @@
=
pa_gettimeofday(&tv);
pa_timeval_add(&tv, 500000);
- u->core->mainloop->time_new(u->core->mainloop, &tv,
- device_added_time_cb, t);
-}
-
-static void device_removed_cb(LibHalContext* ctx, const char *udi)
-{
+ u->core->mainloop->time_new(u->core->mainloop, &tv, device_added_time_=
cb, t);
+}
+
+static void device_removed_cb(LibHalContext* context, const char *udi) {
struct device *d;
- struct userdata *u =3D (struct userdata*) libhal_ctx_get_user_data(ctx=
);
+ struct userdata *u;
+
+ pa_assert_se(u =3D libhal_ctx_get_user_data(context));
=
pa_log_debug("Device removed: %s", udi);
+ =
if ((d =3D pa_hashmap_remove(u->devices, udi))) {
pa_module_unload_by_index(u->core, d->index);
hal_device_free(d);
}
}
=
-static void new_capability_cb(LibHalContext *ctx, const char *udi,
- const char* capability)
-{
- struct userdata *u =3D (struct userdata*) libhal_ctx_get_user_data(ctx=
);
- const char* capname =3D get_capability_name(u->capability);
-
- if (capname && !strcmp(capname, capability)) {
+static void new_capability_cb(LibHalContext *context, const char *udi, con=
st char* capability) {
+ struct userdata *u;
+
+ pa_assert_se(u =3D libhal_ctx_get_user_data(context));
+
+ if (!u->capability || strcmp(u->capability, capability) =3D=3D 0)
/* capability we care about, pretend it's a new device */
- device_added_cb(ctx, udi);
- }
-}
-
-static void lost_capability_cb(LibHalContext *ctx, const char *udi,
- const char* capability)
-{
- struct userdata *u =3D (struct userdata*) libhal_ctx_get_user_data(ctx=
);
- const char* capname =3D get_capability_name(u->capability);
-
- if (capname && !strcmp(capname, capability)) {
+ device_added_cb(context, udi);
+}
+
+static void lost_capability_cb(LibHalContext *context, const char *udi, co=
nst char* capability) {
+ struct userdata *u;
+
+ pa_assert_se(u =3D libhal_ctx_get_user_data(context));
+
+ if (u->capability && strcmp(u->capability, capability) =3D=3D 0)
/* capability we care about, pretend it was removed */
- device_removed_cb(ctx, udi);
- }
-}
-
-#if 0
-static void property_modified_cb(LibHalContext *ctx, const char *udi,
- const char* key,
- dbus_bool_t is_removed,
- dbus_bool_t is_added)
-{
-}
-#endif
-
-static void pa_hal_context_free(LibHalContext* hal_ctx)
-{
- DBusError error;
-
- dbus_error_init(&error);
- libhal_ctx_shutdown(hal_ctx, &error);
- libhal_ctx_free(hal_ctx);
-
- if (dbus_error_is_set(&error)) {
- dbus_error_free(&error);
- }
-}
-
-static void userdata_free(struct userdata *u) {
- pa_hal_context_free(u->ctx);
- /* free the devices with the hashmap */
- pa_hashmap_free(u->devices, hal_device_free_cb, NULL);
- pa_dbus_connection_unref(u->conn);
- pa_xfree(u);
-}
-
-static LibHalContext* pa_hal_context_new(pa_core* c, DBusConnection *conn)
-{
- DBusError error;
- LibHalContext *hal_ctx =3D NULL;
-
- dbus_error_init(&error);
- if (!(hal_ctx =3D libhal_ctx_new())) {
+ device_removed_cb(context, udi);
+}
+
+static void hal_context_free(LibHalContext* hal_context) {
+ DBusError error;
+
+ dbus_error_init(&error);
+ =
+ libhal_ctx_shutdown(hal_context, &error);
+ libhal_ctx_free(hal_context);
+
+ if (dbus_error_is_set(&error))
+ dbus_error_free(&error);
+}
+
+static LibHalContext* hal_context_new(pa_core* c, DBusConnection *conn) {
+ DBusError error;
+ LibHalContext *hal_context =3D NULL;
+
+ dbus_error_init(&error);
+ =
+ if (!(hal_context =3D libhal_ctx_new())) {
pa_log_error("libhal_ctx_new() failed");
goto fail;
}
=
- if (!libhal_ctx_set_dbus_connection(hal_ctx, conn)) {
- pa_log_error("Error establishing DBUS connection: %s: %s",
- error.name, error.message);
- goto fail;
- }
-
- if (!libhal_ctx_init(hal_ctx, &error)) {
- pa_log_error("Couldn't connect to hald: %s: %s",
- error.name, error.message);
- goto fail;
- }
-
- return hal_ctx;
+ if (!libhal_ctx_set_dbus_connection(hal_context, conn)) {
+ pa_log_error("Error establishing DBUS connection: %s: %s", error.n=
ame, error.message);
+ goto fail;
+ }
+
+ if (!libhal_ctx_init(hal_context, &error)) {
+ pa_log_error("Couldn't connect to hald: %s: %s", error.name, error=
.message);
+ goto fail;
+ }
+
+ return hal_context;
=
fail:
- if (hal_ctx)
- pa_hal_context_free(hal_ctx);
+ if (hal_context)
+ hal_context_free(hal_context);
=
if (dbus_error_is_set(&error))
dbus_error_free(&error);
@@ -501,78 +495,82 @@
DBusError error;
pa_dbus_connection *conn;
struct userdata *u =3D NULL;
- LibHalContext *hal_ctx =3D NULL;
+ LibHalContext *hal_context =3D NULL;
int n =3D 0;
-
- assert(c);
- assert(m);
-
- dbus_error_init(&error);
+ =
+ pa_assert(c);
+ pa_assert(m);
+
+ dbus_error_init(&error);
+ =
if (!(conn =3D pa_dbus_bus_get(c, DBUS_BUS_SYSTEM, &error))) {
- pa_log_error("Unable to contact DBUS system bus: %s: %s",
- error.name, error.message);
+ pa_log_error("Unable to contact DBUS system bus: %s: %s", error.na=
me, error.message);
dbus_error_free(&error);
return -1;
}
=
- if (!(hal_ctx =3D pa_hal_context_new(c, pa_dbus_connection_get(conn)))=
) {
+ if (!(hal_context =3D hal_context_new(c, pa_dbus_connection_get(conn))=
)) {
/* pa_hal_context_new() logs appropriate errors */
+ pa_dbus_connection_unref(conn);
return -1;
}
=
u =3D pa_xnew(struct userdata, 1);
u->core =3D c;
- u->ctx =3D hal_ctx;
- u->conn =3D conn;
- u->devices =3D pa_hashmap_new(pa_idxset_string_hash_func,
- pa_idxset_string_compare_func);
- m->userdata =3D (void*) u;
+ u->context =3D hal_context;
+ u->connection =3D conn;
+ u->devices =3D pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_st=
ring_compare_func);
+ u->capability =3D NULL;
+ m->userdata =3D u;
=
#ifdef HAVE_ALSA
- n =3D hal_device_add_all(u, CAP_ALSA);
+ n =3D hal_device_add_all(u, CAPABILITY_ALSA);
#endif
#if defined(HAVE_ALSA) && defined(HAVE_OSS)
- u->use_oss =3D 0;
-
- if (n <=3D 0) {
-#endif
+ if (n <=3D 0)
+#endif =
#ifdef HAVE_OSS
- n +=3D hal_device_add_all(u, CAP_OSS);
-#endif
-#if defined(HAVE_ALSA) && defined(HAVE_OSS)
-
- /* We found something with OSS, but didn't find anything with
- * ALSA. Then let's use only OSS from now on. */
- if (n > 0)
- u->use_oss =3D 1;
- }
-#endif
-
- libhal_ctx_set_user_data(hal_ctx, u);
- libhal_ctx_set_device_added(hal_ctx, device_added_cb);
- libhal_ctx_set_device_removed(hal_ctx, device_removed_cb);
- libhal_ctx_set_device_new_capability(hal_ctx, new_capability_cb);
- libhal_ctx_set_device_lost_capability(hal_ctx, lost_capability_cb);
- /*libhal_ctx_set_device_property_modified(hal_ctx, property_modified_c=
b);*/
-
- dbus_error_init(&error);
- if (!libhal_device_property_watch_all(hal_ctx, &error)) {
- pa_log_error("error monitoring device list: %s: %s",
- error.name, error.message);
- dbus_error_free(&error);
- userdata_free(u);
+ n +=3D hal_device_add_all(u, CAPABILITY_OSS);
+#endif
+
+ libhal_ctx_set_user_data(hal_context, u);
+ libhal_ctx_set_device_added(hal_context, device_added_cb);
+ libhal_ctx_set_device_removed(hal_context, device_removed_cb);
+ libhal_ctx_set_device_new_capability(hal_context, new_capability_cb);
+ libhal_ctx_set_device_lost_capability(hal_context, lost_capability_cb);
+
+ dbus_error_init(&error);
+ =
+ if (!libhal_device_property_watch_all(hal_context, &error)) {
+ pa_log_error("Error monitoring device list: %s: %s", error.name, e=
rror.message);
+ dbus_error_free(&error);
+ pa__done(c, m);
return -1;
}
=
- pa_log_info("loaded %i modules.", n);
+ pa_log_info("Loaded %i modules.", n);
=
return 0;
}
=
=
void pa__done(PA_GCC_UNUSED pa_core *c, pa_module *m) {
- assert (c && m);
-
- /* free the user data */
- userdata_free(m->userdata);
-}
+ struct userdata *u;
+ =
+ pa_assert(c);
+ pa_assert(m);
+
+ if (!(u =3D m->userdata))
+ return;
+
+ if (u->context)
+ hal_context_free(u->context);
+
+ if (u->devices)
+ pa_hashmap_free(u->devices, hal_device_free_cb, NULL);
+
+ if (u->connection)
+ pa_dbus_connection_unref(u->connection);
+ =
+ pa_xfree(u);
+}
More information about the pulseaudio-commits
mailing list