From 77312d06c887c49f44451392a334ac6d8ce3ac39 Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Wed, 16 Dec 2009 11:51:27 +0200 Subject: alsa-mixer: Use pa_xfree() instead of pa_xstrdup() for freeing a string. --- src/modules/alsa/alsa-mixer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/modules') diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c index 93f2ed05..3ccd8871 100644 --- a/src/modules/alsa/alsa-mixer.c +++ b/src/modules/alsa/alsa-mixer.c @@ -2683,7 +2683,7 @@ static int mapping_parse_description( pa_assert(ps); if ((m = mapping_get(ps, section))) { - pa_xstrdup(m->description); + pa_xfree(m->description); m->description = pa_xstrdup(rvalue); } else if ((p = profile_get(ps, section))) { pa_xfree(p->description); -- cgit From 6a5f0ba431a012ccee38c28e222e7258be13d3ea Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Tue, 29 Dec 2009 14:53:40 +0200 Subject: alsa-mixer: Replace erroneous PA_ALSA_VOLUME_IGNORE with PA_ALSA_ENUMERATION_IGNORE. This fix doesn't have any concrete effect, because the two constants have the same value. --- src/modules/alsa/alsa-mixer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/modules') diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c index 3ccd8871..b2888a36 100644 --- a/src/modules/alsa/alsa-mixer.c +++ b/src/modules/alsa/alsa-mixer.c @@ -1037,7 +1037,7 @@ static int element_probe(pa_alsa_element *e, snd_mixer_t *m) { e->switch_use = PA_ALSA_SWITCH_IGNORE; e->volume_use = PA_ALSA_VOLUME_IGNORE; - e->enumeration_use = PA_ALSA_VOLUME_IGNORE; + e->enumeration_use = PA_ALSA_ENUMERATION_IGNORE; return 0; } -- cgit From 7bc5cd78454bee5990d29a0ba04482a505a08346 Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Fri, 8 Jan 2010 11:09:25 +0200 Subject: alsa: Fix log output to inform about positive base volumes correctly. Positive base volume can happen, if the alsa volume range has been limited. For example, in an embedded environment it may be known that the sound device is capable of louder output than what the speakers can handle, so setting the max volume below 0 dB makes sense. --- src/modules/alsa/alsa-sink.c | 5 +---- src/modules/alsa/alsa-source.c | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) (limited to 'src/modules') diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c index ce7970b2..35a806c8 100644 --- a/src/modules/alsa/alsa-sink.c +++ b/src/modules/alsa/alsa-sink.c @@ -1252,10 +1252,7 @@ static int sink_set_port_cb(pa_sink *s, pa_device_port *p) { s->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB); s->n_volume_steps = PA_VOLUME_NORM+1; - if (u->mixer_path->max_dB > 0.0) - pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(s->base_volume)); - else - pa_log_info("No particular base volume set, fixing to 0 dB"); + pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(s->base_volume)); } else { s->base_volume = PA_VOLUME_NORM; s->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1; diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c index 00810c86..381a7062 100644 --- a/src/modules/alsa/alsa-source.c +++ b/src/modules/alsa/alsa-source.c @@ -1186,10 +1186,7 @@ static int source_set_port_cb(pa_source *s, pa_device_port *p) { s->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB); s->n_volume_steps = PA_VOLUME_NORM+1; - if (u->mixer_path->max_dB > 0.0) - pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(s->base_volume)); - else - pa_log_info("No particular base volume set, fixing to 0 dB"); + pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(s->base_volume)); } else { s->base_volume = PA_VOLUME_NORM; s->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1; -- cgit From a976db7c49f1f44b7ca7104be12568f49c40943c Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Wed, 17 Mar 2010 13:35:01 +0200 Subject: dbus: Make it possible to allow remote connections from outside localhost. --- src/modules/dbus/module-dbus-protocol.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src/modules') diff --git a/src/modules/dbus/module-dbus-protocol.c b/src/modules/dbus/module-dbus-protocol.c index acc6ca04..010732b8 100644 --- a/src/modules/dbus/module-dbus-protocol.c +++ b/src/modules/dbus/module-dbus-protocol.c @@ -48,7 +48,8 @@ PA_MODULE_DESCRIPTION("D-Bus interface"); PA_MODULE_USAGE( "access=local|remote|local,remote " - "tcp_port="); + "tcp_port= " + "tcp_listen="); PA_MODULE_LOAD_ONCE(TRUE); PA_MODULE_AUTHOR("Tanu Kaskinen"); PA_MODULE_VERSION(PACKAGE_VERSION); @@ -68,6 +69,7 @@ struct userdata { pa_bool_t local_access; pa_bool_t remote_access; uint32_t tcp_port; + char *tcp_listen; struct server *local_server; struct server *tcp_server; @@ -95,6 +97,7 @@ struct connection { static const char* const valid_modargs[] = { "access", "tcp_port", + "tcp_listen", NULL }; @@ -452,7 +455,7 @@ static struct server *start_tcp_server(struct userdata *u) { pa_assert(u); - address = pa_sprintf_malloc("tcp:host=127.0.0.1,port=%u", u->tcp_port); + address = pa_sprintf_malloc("tcp:host=%s,port=%u", u->tcp_listen, u->tcp_port); s = start_server(u, address, SERVER_TYPE_TCP); /* May return NULL */ @@ -537,6 +540,8 @@ int pa__init(pa_module *m) { goto fail; } + u->tcp_listen = pa_xstrdup(pa_modargs_get_value(ma, "tcp_listen", "0.0.0.0")); + if (u->local_access && !(u->local_server = start_local_server(u))) { pa_log("Starting the local D-Bus server failed."); goto fail; @@ -602,6 +607,7 @@ void pa__done(pa_module *m) { if (u->dbus_protocol) pa_dbus_protocol_unref(u->dbus_protocol); + pa_xfree(u->tcp_listen); pa_xfree(u); m->userdata = NULL; } -- cgit From ad7c8ebff5ec1dcbbaa0ae68b87f98c719ffcba1 Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Mon, 29 Mar 2010 08:23:33 +0300 Subject: dbus: Initialize properly the type field of new server structs. --- src/modules/dbus/module-dbus-protocol.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/modules') diff --git a/src/modules/dbus/module-dbus-protocol.c b/src/modules/dbus/module-dbus-protocol.c index 010732b8..fc023e41 100644 --- a/src/modules/dbus/module-dbus-protocol.c +++ b/src/modules/dbus/module-dbus-protocol.c @@ -404,6 +404,7 @@ static struct server *start_server(struct userdata *u, const char *address, enum s = pa_xnew0(struct server, 1); s->userdata = u; + s->type = type; s->dbus_server = dbus_server_listen(address, &error); if (dbus_error_is_set(&error)) { -- cgit From c161115288901b521c0465685d0ea3c307da763d Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Thu, 1 Apr 2010 11:17:52 +0300 Subject: stream-restore: Fix segfaulting. The dbus entry callbacks expect a dbus_entry pointer instead of a userdata pointer. --- src/modules/module-stream-restore.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/modules') diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c index c16a74c3..d7852d04 100644 --- a/src/modules/module-stream-restore.c +++ b/src/modules/module-stream-restore.c @@ -310,7 +310,7 @@ static struct dbus_entry *dbus_entry_new(struct userdata *u, const char *entry_n de->index = u->next_index++; de->object_path = pa_sprintf_malloc("%s/%s%u", OBJECT_PATH, ENTRY_OBJECT_NAME, de->index); - pa_assert_se(pa_dbus_protocol_add_interface(u->dbus_protocol, de->object_path, &entry_interface_info, u) >= 0); + pa_assert_se(pa_dbus_protocol_add_interface(u->dbus_protocol, de->object_path, &entry_interface_info, de) >= 0); return de; } -- cgit From 71ef5fe7e84702ca6a2869702ad4c5a15c9c2f9b Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Thu, 15 Apr 2010 13:11:57 +0300 Subject: stream-restore: When changing restore entries with D-Bus, apply the changes immediately. --- src/modules/module-stream-restore.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/modules') diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c index d7852d04..346b6ad1 100644 --- a/src/modules/module-stream-restore.c +++ b/src/modules/module-stream-restore.c @@ -765,6 +765,7 @@ static void handle_entry_set_device(DBusConnection *conn, DBusMessage *msg, DBus value.size = sizeof(struct entry); pa_assert_se(pa_database_set(de->userdata->database, &key, &value, TRUE) == 0); + apply_entry(de->userdata, de->entry_name, e); send_device_updated_signal(de, e); trigger_save(de->userdata); } @@ -829,6 +830,7 @@ static void handle_entry_set_volume(DBusConnection *conn, DBusMessage *msg, DBus value.size = sizeof(struct entry); pa_assert_se(pa_database_set(de->userdata->database, &key, &value, TRUE) == 0); + apply_entry(de->userdata, de->entry_name, e); send_volume_updated_signal(de, e); trigger_save(de->userdata); } @@ -886,6 +888,7 @@ static void handle_entry_set_mute(DBusConnection *conn, DBusMessage *msg, DBusMe value.size = sizeof(struct entry); pa_assert_se(pa_database_set(de->userdata->database, &key, &value, TRUE) == 0); + apply_entry(de->userdata, de->entry_name, e); send_mute_updated_signal(de, e); trigger_save(de->userdata); } -- cgit From 22a8c4485be336267b44f72336af859f80014c09 Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Thu, 29 Apr 2010 15:06:44 +0300 Subject: dbus: Stop polling every 10 seconds to check whether all clients are still alive. Instead, watch for org.freedesktop.DBus.Disconnected signals. --- src/modules/dbus/module-dbus-protocol.c | 50 ++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 22 deletions(-) (limited to 'src/modules') diff --git a/src/modules/dbus/module-dbus-protocol.c b/src/modules/dbus/module-dbus-protocol.c index fc023e41..aa11cdfc 100644 --- a/src/modules/dbus/module-dbus-protocol.c +++ b/src/modules/dbus/module-dbus-protocol.c @@ -54,8 +54,6 @@ PA_MODULE_LOAD_ONCE(TRUE); PA_MODULE_AUTHOR("Tanu Kaskinen"); PA_MODULE_VERSION(PACKAGE_VERSION); -#define CLEANUP_INTERVAL 10 /* seconds */ - enum server_type { SERVER_TYPE_LOCAL, SERVER_TYPE_TCP @@ -76,7 +74,7 @@ struct userdata { pa_idxset *connections; - pa_time_event *cleanup_event; + pa_defer_event *cleanup_event; pa_dbus_protocol *dbus_protocol; pa_dbusiface_core *core_iface; @@ -157,6 +155,23 @@ static dbus_bool_t user_check_cb(DBusConnection *connection, unsigned long uid, return TRUE; } +static DBusHandlerResult disconnection_filter_cb(DBusConnection *connection, DBusMessage *message, void *user_data) { + struct connection *c = user_data; + + pa_assert(connection); + pa_assert(message); + pa_assert(c); + + if (dbus_message_is_signal(message, "org.freedesktop.DBus.Local", "Disconnected")) { + /* The connection died. Now we want to free the connection object, but + * let's wait until this message is fully processed, in case someone + * else is interested in this signal too. */ + c->server->userdata->module->core->mainloop->defer_enable(c->server->userdata->cleanup_event, 1); + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + /* Called by D-Bus when a new client connection is received. */ static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_connection, void *data) { struct server *s = data; @@ -195,6 +210,8 @@ static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_conne c->client->send_event = client_send_event_cb; c->client->userdata = c; + pa_assert_se(dbus_connection_add_filter(new_connection, disconnection_filter_cb, c, NULL)); + pa_idxset_put(s->userdata->connections, c, NULL); pa_assert_se(pa_dbus_protocol_register_connection(s->userdata->dbus_protocol, new_connection, c->client) >= 0); @@ -490,33 +507,23 @@ static int get_access_arg(pa_modargs *ma, pa_bool_t *local_access, pa_bool_t *re return 0; } -/* Frees dead client connections. Called every CLEANUP_INTERVAL seconds. */ -static void cleanup_cb(pa_mainloop_api *a, pa_time_event *e, const struct timeval *tv, void *userdata) { +/* Frees dead client connections. */ +static void cleanup_cb(pa_mainloop_api *a, pa_defer_event *e, void *userdata) { struct userdata *u = userdata; struct connection *conn = NULL; uint32_t idx; - struct timeval cleanup_timeval; - unsigned free_count = 0; - for (conn = pa_idxset_first(u->connections, &idx); conn; conn = pa_idxset_next(u->connections, &idx)) { - if (!dbus_connection_get_is_connected(pa_dbus_wrap_connection_get(conn->wrap_conn))) { + PA_IDXSET_FOREACH(conn, u->connections, idx) { + if (!dbus_connection_get_is_connected(pa_dbus_wrap_connection_get(conn->wrap_conn))) connection_free(conn); - ++free_count; - } } - if (free_count > 0) - pa_log_debug("Freed %u dead D-Bus client connections.", free_count); - - pa_gettimeofday(&cleanup_timeval); - cleanup_timeval.tv_sec += CLEANUP_INTERVAL; - u->module->core->mainloop->time_restart(e, &cleanup_timeval); + u->module->core->mainloop->defer_enable(e, 0); } int pa__init(pa_module *m) { struct userdata *u = NULL; pa_modargs *ma = NULL; - struct timeval cleanup_timeval; pa_assert(m); @@ -555,9 +562,8 @@ int pa__init(pa_module *m) { u->connections = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); - pa_gettimeofday(&cleanup_timeval); - cleanup_timeval.tv_sec += CLEANUP_INTERVAL; - u->cleanup_event = m->core->mainloop->time_new(m->core->mainloop, &cleanup_timeval, cleanup_cb, u); + u->cleanup_event = m->core->mainloop->defer_new(m->core->mainloop, cleanup_cb, u); + m->core->mainloop->defer_enable(u->cleanup_event, 0); u->dbus_protocol = pa_dbus_protocol_get(m->core); u->core_iface = pa_dbusiface_core_new(m->core); @@ -594,7 +600,7 @@ void pa__done(pa_module *m) { pa_dbusiface_core_free(u->core_iface); if (u->cleanup_event) - m->core->mainloop->time_free(u->cleanup_event); + m->core->mainloop->defer_free(u->cleanup_event); if (u->connections) pa_idxset_free(u->connections, connection_free_cb, NULL); -- cgit