From ff3f43525d0b528d43a0480d596973d07c920580 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 16 Jul 2008 11:12:07 +0200 Subject: try to bypass alsa softvol, since it is broken when used with snd_pcm_rewind() --- src/modules/alsa-util.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/modules') diff --git a/src/modules/alsa-util.c b/src/modules/alsa-util.c index 5d52cbc9..8abf834d 100644 --- a/src/modules/alsa-util.c +++ b/src/modules/alsa-util.c @@ -574,7 +574,8 @@ snd_pcm_t *pa_alsa_open_by_device_id( SND_PCM_NONBLOCK| SND_PCM_NO_AUTO_RESAMPLE| SND_PCM_NO_AUTO_CHANNELS| - SND_PCM_NO_AUTO_FORMAT)) < 0) { + SND_PCM_NO_AUTO_FORMAT | + SND_PCM_NO_SOFTVOL)) < 0) { pa_log_info("Couldn't open PCM device %s: %s", d, snd_strerror(err)); pa_xfree(d); continue; -- cgit From 46a35c681f87b540c53d1af380ccfc65b041707f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 16 Jul 2008 11:28:46 +0200 Subject: forward process_msg calls to the generic source handler, not the generic sink handler --- src/modules/module-tunnel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/modules') diff --git a/src/modules/module-tunnel.c b/src/modules/module-tunnel.c index 1890646f..21f2f842 100644 --- a/src/modules/module-tunnel.c +++ b/src/modules/module-tunnel.c @@ -514,7 +514,7 @@ static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t off case PA_SINK_MESSAGE_SET_STATE: { int r; - if ((r = pa_sink_process_msg(o, code, data, offset, chunk)) >= 0) + if ((r = pa_source_process_msg(o, code, data, offset, chunk)) >= 0) stream_cork_within_thread(u, u->source->state == PA_SOURCE_SUSPENDED); return r; -- cgit From c415479a5518c93956213d4260b5c412e3927f2f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 23 Jul 2008 16:50:48 +0200 Subject: allow module-x11-xsmp to be loaded more than once --- src/modules/module-x11-xsmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/modules') diff --git a/src/modules/module-x11-xsmp.c b/src/modules/module-x11-xsmp.c index 696826d8..0b2e375a 100644 --- a/src/modules/module-x11-xsmp.c +++ b/src/modules/module-x11-xsmp.c @@ -47,7 +47,7 @@ PA_MODULE_AUTHOR("Lennart Poettering"); PA_MODULE_DESCRIPTION("X11 session management"); PA_MODULE_VERSION(PACKAGE_VERSION); -PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_LOAD_ONCE(FALSE); PA_MODULE_USAGE("session_manager= display="); static pa_bool_t ice_in_use = FALSE; -- cgit From 32e93d5c898e63007da3d9adcbab0cfd70f99a09 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 23 Jul 2008 16:59:55 +0200 Subject: follow consolekit's recent D-Bus API change, original patch from William Jon McCan --- src/modules/module-console-kit.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'src/modules') diff --git a/src/modules/module-console-kit.c b/src/modules/module-console-kit.c index 3adee99e..5a3975fb 100644 --- a/src/modules/module-console-kit.c +++ b/src/modules/module-console-kit.c @@ -71,7 +71,7 @@ struct userdata { static void add_session(struct userdata *u, const char *id) { DBusError error; DBusMessage *m = NULL, *reply = NULL; - int32_t uid; + uint32_t uid; struct session *session; char *t; @@ -92,10 +92,12 @@ static void add_session(struct userdata *u, const char *id) { goto fail; } - /* FIXME: Why is this in int32? and not an uint32? */ - if (!dbus_message_get_args(reply, &error, DBUS_TYPE_INT32, &uid, DBUS_TYPE_INVALID)) { - pa_log("Failed to parse GetUnixUser() result: %s: %s", error.name, error.message); - goto fail; + /* CK 0.3 this changed from int32 to uint32 */ + if (!dbus_message_get_args(reply, &error, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INVALID)) { + if (!dbus_message_get_args(reply, &error, DBUS_TYPE_INT32, &uid, DBUS_TYPE_INVALID)) { + pa_log("Failed to parse GetUnixUser() result: %s: %s", error.name, error.message); + goto fail; + } } /* We only care about our own sessions */ @@ -163,18 +165,24 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo if (dbus_message_is_signal(message, "org.freedesktop.ConsoleKit.Seat", "SessionAdded")) { - if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID) || dbus_error_is_set(&error)) { - pa_log_error("Failed to parse SessionAdded message: %s: %s", error.name, error.message); - goto finish; + /* CK API changed to match spec in 0.3 */ + if (!dbus_message_get_args(message, &error, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { + if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID)) { + pa_log_error("Failed to parse SessionAdded message: %s: %s", error.name, error.message); + goto finish; + } } add_session(u, path); } else if (dbus_message_is_signal(message, "org.freedesktop.ConsoleKit.Seat", "SessionRemoved")) { - if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID) || dbus_error_is_set(&error)) { - pa_log_error("Failed to parse SessionRemoved message: %s: %s", error.name, error.message); - goto finish; + /* CK API changed to match spec in 0.3 */ + if (!dbus_message_get_args(message, &error, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { + if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID)) { + pa_log_error("Failed to parse SessionRemoved message: %s: %s", error.name, error.message); + goto finish; + } } remove_session(u, path); -- cgit From 888256b0be254f20e291ffdec8b109fb0ada4dd0 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 24 Jul 2008 01:31:33 +0200 Subject: reset dbus error struct before retrying parsing messages --- src/modules/module-console-kit.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/modules') diff --git a/src/modules/module-console-kit.c b/src/modules/module-console-kit.c index 5a3975fb..829b43b1 100644 --- a/src/modules/module-console-kit.c +++ b/src/modules/module-console-kit.c @@ -94,6 +94,8 @@ static void add_session(struct userdata *u, const char *id) { /* CK 0.3 this changed from int32 to uint32 */ if (!dbus_message_get_args(reply, &error, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INVALID)) { + dbus_error_free(&error); + if (!dbus_message_get_args(reply, &error, DBUS_TYPE_INT32, &uid, DBUS_TYPE_INVALID)) { pa_log("Failed to parse GetUnixUser() result: %s: %s", error.name, error.message); goto fail; @@ -167,6 +169,8 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo /* CK API changed to match spec in 0.3 */ if (!dbus_message_get_args(message, &error, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { + dbus_error_free(&error); + if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID)) { pa_log_error("Failed to parse SessionAdded message: %s: %s", error.name, error.message); goto finish; @@ -179,6 +183,8 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo /* CK API changed to match spec in 0.3 */ if (!dbus_message_get_args(message, &error, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { + dbus_error_free(&error); + if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID)) { pa_log_error("Failed to parse SessionRemoved message: %s: %s", error.name, error.message); goto finish; -- cgit From 49f09d6d0eadd67d75190a9001fe715dc486cd36 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 24 Jul 2008 02:21:58 +0200 Subject: fix destruction of dbus modules: make sure we don't leave filter function registered after unreffing the dbus connection --- src/modules/module-bt-proximity.c | 1 - src/modules/module-console-kit.c | 11 ++++++++++- src/modules/module-hal-detect.c | 14 +++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) (limited to 'src/modules') diff --git a/src/modules/module-bt-proximity.c b/src/modules/module-bt-proximity.c index 77b95868..f924c3cb 100644 --- a/src/modules/module-bt-proximity.c +++ b/src/modules/module-bt-proximity.c @@ -358,7 +358,6 @@ static int add_matches(struct userdata *u, pa_bool_t add) { } else dbus_bus_remove_match(pa_dbus_connection_get(u->dbus_connection), filter2, &e); - if (add) pa_assert_se(dbus_connection_add_filter(pa_dbus_connection_get(u->dbus_connection), filter_func, u, NULL)); else diff --git a/src/modules/module-console-kit.c b/src/modules/module-console-kit.c index 829b43b1..3578212e 100644 --- a/src/modules/module-console-kit.c +++ b/src/modules/module-console-kit.c @@ -341,8 +341,17 @@ void pa__done(pa_module *m) { pa_hashmap_free(u->sessions, NULL, NULL); } - if (u->connection) + if (u->connection) { + DBusError error; + dbus_error_init(&error); + + dbus_bus_remove_match(pa_dbus_connection_get(u->connection), "type='signal',sender='org.freedesktop.ConsoleKit', interface='org.freedesktop.ConsoleKit.Seat'", &error); + dbus_error_free(&error); + + dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u); + pa_dbus_connection_unref(u->connection); + } pa_xfree(u); } diff --git a/src/modules/module-hal-detect.c b/src/modules/module-hal-detect.c index 19430a3d..ec064961 100644 --- a/src/modules/module-hal-detect.c +++ b/src/modules/module-hal-detect.c @@ -842,8 +842,20 @@ void pa__done(pa_module *m) { if (u->devices) pa_hashmap_free(u->devices, hal_device_free_cb, NULL); - if (u->connection) + if (u->connection) { + DBusError error; + dbus_error_init(&error); + + dbus_bus_remove_match(pa_dbus_connection_get(u->connection), "type='signal',sender='org.freedesktop.Hal', interface='org.freedesktop.Hal.Device.AccessControl'", &error); + dbus_error_free(&error); + + dbus_bus_remove_match(pa_dbus_connection_get(u->connection), "type='signal',interface='org.pulseaudio.Server'", &error); + dbus_error_free(&error); + + dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u); + pa_dbus_connection_unref(u->connection); + } pa_xfree(u); } -- cgit From e3fb086681bf743310f2af19bf9a01957fd34782 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 24 Jul 2008 03:02:09 +0200 Subject: make module-hal and module-ck live together in peace --- src/modules/module-console-kit.c | 4 +++- src/modules/module-hal-detect.c | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'src/modules') diff --git a/src/modules/module-console-kit.c b/src/modules/module-console-kit.c index 3578212e..e1933c28 100644 --- a/src/modules/module-console-kit.c +++ b/src/modules/module-console-kit.c @@ -178,6 +178,7 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo } add_session(u, path); + return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_signal(message, "org.freedesktop.ConsoleKit.Seat", "SessionRemoved")) { @@ -192,12 +193,13 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo } remove_session(u, path); + return DBUS_HANDLER_RESULT_HANDLED; } finish: dbus_error_free(&error); - return DBUS_HANDLER_RESULT_HANDLED; + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } static int get_session_list(struct userdata *u) { diff --git a/src/modules/module-hal-detect.c b/src/modules/module-hal-detect.c index ec064961..ab5b206f 100644 --- a/src/modules/module-hal-detect.c +++ b/src/modules/module-hal-detect.c @@ -615,6 +615,8 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo device_added_cb(u->context, udi); } + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_signal(message, "org.pulseaudio.Server", "DirtyGiveUpMessage")) { /* We use this message to avoid a dirty race condition when we get an ACLAdded message before the previously owning PA @@ -661,12 +663,14 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo } else /* Yes, we don't check the UDI for validity, but hopefully HAL will */ device_added_cb(u->context, udi); + + return DBUS_HANDLER_RESULT_HANDLED; } finish: dbus_error_free(&error); - return DBUS_HANDLER_RESULT_HANDLED; + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } static void hal_context_free(LibHalContext* hal_context) { -- cgit From 4f3193dbefd5f82955a672c7473bf86d780afafc Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 31 Jul 2008 21:24:23 +0200 Subject: allow global tsched setting for all modules loaded by module-hal --- src/modules/module-alsa-sink.c | 2 +- src/modules/module-hal-detect.c | 23 +++++++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) (limited to 'src/modules') diff --git a/src/modules/module-alsa-sink.c b/src/modules/module-alsa-sink.c index 8e66f796..aad6801e 100644 --- a/src/modules/module-alsa-sink.c +++ b/src/modules/module-alsa-sink.c @@ -1148,7 +1148,7 @@ int pa__init(pa_module*m) { } if (pa_modargs_get_value_boolean(ma, "tsched", &use_tsched) < 0) { - pa_log("Failed to parse timer_scheduling argument."); + pa_log("Failed to parse tsched argument."); goto fail; } diff --git a/src/modules/module-hal-detect.c b/src/modules/module-hal-detect.c index ab5b206f..5354717e 100644 --- a/src/modules/module-hal-detect.c +++ b/src/modules/module-hal-detect.c @@ -56,9 +56,11 @@ PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching drivers PA_MODULE_VERSION(PACKAGE_VERSION); PA_MODULE_LOAD_ONCE(TRUE); #if defined(HAVE_ALSA) && defined(HAVE_OSS) -PA_MODULE_USAGE("api="); +PA_MODULE_USAGE("api= " + "tsched="); #elif defined(HAVE_ALSA) -PA_MODULE_USAGE("api="); +PA_MODULE_USAGE("api= " + "tsched="); #elif defined(HAVE_OSS) PA_MODULE_USAGE("api="); #endif @@ -76,6 +78,9 @@ struct userdata { pa_dbus_connection *connection; pa_hashmap *devices; const char *capability; +#ifdef HAVE_ALSA + pa_bool_t use_tsched; +#endif }; struct timerdata { @@ -88,6 +93,9 @@ struct timerdata { static const char* const valid_modargs[] = { "api", +#ifdef HAVE_ALSA + "tsched", +#endif NULL }; @@ -189,12 +197,12 @@ static pa_module* hal_device_load_alsa(struct userdata *u, const char *udi, char *sink_name = pa_sprintf_malloc("alsa_output.%s", strip_udi(udi)); module_name = "module-alsa-sink"; - args = pa_sprintf_malloc("device_id=%u sink_name=%s", card, *sink_name); + args = pa_sprintf_malloc("device_id=%u sink_name=%s tsched=%i", card, *sink_name, (int) u->use_tsched); } else { *source_name = pa_sprintf_malloc("alsa_input.%s", strip_udi(udi)); module_name = "module-alsa-source"; - args = pa_sprintf_malloc("device_id=%u source_name=%s", card, *source_name); + args = pa_sprintf_malloc("device_id=%u source_name=%s tsched=%i", card, *source_name, (int) u->use_tsched); } pa_log_debug("Loading %s with arguments '%s'", module_name, args); @@ -724,6 +732,7 @@ int pa__init(pa_module*m) { int n = 0; pa_modargs *ma; const char *api; + pa_bool_t use_tsched = TRUE; pa_assert(m); @@ -734,6 +743,11 @@ int pa__init(pa_module*m) { goto fail; } + if (pa_modargs_get_value_boolean(ma, "tsched", &use_tsched) < 0) { + pa_log("Failed to parse tsched argument."); + goto fail; + } + if ((api = pa_modargs_get_value(ma, "api", NULL))) { int good = 0; @@ -775,6 +789,7 @@ int pa__init(pa_module*m) { u->connection = conn; u->devices = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); u->capability = api; + u->use_tsched = use_tsched; m->userdata = u; #ifdef HAVE_ALSA -- cgit From 5150738333dc9e612fd404b3414e0bf9e74e6051 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 31 Jul 2008 21:25:58 +0200 Subject: a bit of pa_bool_t'ization --- src/modules/module-hal-detect.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'src/modules') diff --git a/src/modules/module-hal-detect.c b/src/modules/module-hal-detect.c index 5354717e..b2f97a10 100644 --- a/src/modules/module-hal-detect.c +++ b/src/modules/module-hal-detect.c @@ -69,7 +69,7 @@ struct device { uint32_t index; char *udi; char *sink_name, *source_name; - int acl_race_fix; + pa_bool_t acl_race_fix; }; struct userdata { @@ -337,7 +337,7 @@ static struct device* hal_device_add(struct userdata *u, const char *udi) { return NULL; d = pa_xnew(struct device, 1); - d->acl_race_fix = 0; + d->acl_race_fix = FALSE; d->udi = pa_xstrdup(udi); d->index = m->index; d->sink_name = sink_name; @@ -568,9 +568,9 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo udi = dbus_message_get_path(message); if ((d = pa_hashmap_get(u->devices, udi))) { - int send_acl_race_fix_message = 0; + pa_bool_t send_acl_race_fix_message = FALSE; - d->acl_race_fix = 0; + d->acl_race_fix = FALSE; if (d->sink_name) { pa_sink *sink; @@ -583,12 +583,12 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo if (pa_sink_suspend(sink, 0) >= 0) pa_scache_play_item_by_name(u->core, "pulse-access", d->sink_name, FALSE, PA_VOLUME_NORM, NULL, NULL); else - d->acl_race_fix = 1; + d->acl_race_fix = TRUE; } else if (!prev_suspended && suspend) { /* suspend */ if (pa_sink_suspend(sink, 1) >= 0) - send_acl_race_fix_message = 1; + send_acl_race_fix_message = TRUE; } } } @@ -602,12 +602,12 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo if (prev_suspended && !suspend) { /* resume */ if (pa_source_suspend(source, 0) < 0) - d->acl_race_fix = 1; + d->acl_race_fix = TRUE; } else if (!prev_suspended && suspend) { /* suspend */ if (pa_source_suspend(source, 0) >= 0) - send_acl_race_fix_message = 1; + send_acl_race_fix_message = TRUE; } } } @@ -639,7 +639,7 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, vo if ((d = pa_hashmap_get(u->devices, udi)) && d->acl_race_fix) { pa_log_debug("Got dirty give up message for '%s', trying resume ...", udi); - d->acl_race_fix = 0; + d->acl_race_fix = FALSE; if (d->sink_name) { pa_sink *sink; -- cgit