summaryrefslogtreecommitdiffstats
path: root/src/modules/gconf
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 16:03:18 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 16:03:18 +0000
commit2dd5bc6a074165ddfbd57c4bd52c2d2dac8f47a1 (patch)
tree465b29cb405d3af0b0ad50c78e1dccc636594fec /src/modules/gconf
parentInitial commit. (diff)
downloadpulseaudio-2dd5bc6a074165ddfbd57c4bd52c2d2dac8f47a1.tar.xz
pulseaudio-2dd5bc6a074165ddfbd57c4bd52c2d2dac8f47a1.zip
Adding upstream version 14.2.upstream/14.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/modules/gconf')
-rw-r--r--src/modules/gconf/gconf-helper.c133
-rw-r--r--src/modules/gconf/module-gconf.c114
2 files changed, 247 insertions, 0 deletions
diff --git a/src/modules/gconf/gconf-helper.c b/src/modules/gconf/gconf-helper.c
new file mode 100644
index 0000000..eccd073
--- /dev/null
+++ b/src/modules/gconf/gconf-helper.c
@@ -0,0 +1,133 @@
+/***
+ This file is part of PulseAudio.
+
+ Copyright 2006 Lennart Poettering
+
+ 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.1 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, see <http://www.gnu.org/licenses/>.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <gconf/gconf-client.h>
+#include <glib.h>
+
+#include <pulsecore/core-util.h>
+
+#define PA_GCONF_ROOT "/system/pulseaudio"
+#define PA_GCONF_PATH_MODULES PA_GCONF_ROOT"/modules"
+
+static void handle_module(GConfClient *client, const char *name) {
+ gchar p[1024];
+ gboolean enabled, locked;
+ int i;
+
+ pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/locked", name);
+ locked = gconf_client_get_bool(client, p, FALSE);
+
+ if (locked)
+ return;
+
+ pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/enabled", name);
+ enabled = gconf_client_get_bool(client, p, FALSE);
+
+ printf("%c%s%c", enabled ? '+' : '-', name, 0);
+
+ if (enabled) {
+
+ for (i = 0; i < 10; i++) {
+ gchar *n, *a;
+
+ pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/name%i", name, i);
+ if (!(n = gconf_client_get_string(client, p, NULL)) || !*n)
+ break;
+
+ pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/args%i", name, i);
+ a = gconf_client_get_string(client, p, NULL);
+
+ printf("%s%c%s%c", n, 0, a ? a : "", 0);
+
+ g_free(n);
+ g_free(a);
+ }
+
+ printf("%c", 0);
+ }
+
+ fflush(stdout);
+}
+
+static void modules_callback(
+ GConfClient* client,
+ guint cnxn_id,
+ GConfEntry *entry,
+ gpointer user_data) {
+
+ const char *n;
+ char buf[128];
+
+ g_assert(strncmp(entry->key, PA_GCONF_PATH_MODULES"/", sizeof(PA_GCONF_PATH_MODULES)) == 0);
+
+ n = entry->key + sizeof(PA_GCONF_PATH_MODULES);
+
+ g_strlcpy(buf, n, sizeof(buf));
+ buf[strcspn(buf, "/")] = 0;
+
+ handle_module(client, buf);
+}
+
+int main(int argc, char *argv[]) {
+ GMainLoop *g;
+ GConfClient *client;
+ GSList *modules, *m;
+
+#if !GLIB_CHECK_VERSION(2,36,0)
+ g_type_init();
+#endif
+
+ if (!(client = gconf_client_get_default()))
+ goto fail;
+
+ gconf_client_add_dir(client, PA_GCONF_ROOT, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL);
+ gconf_client_notify_add(client, PA_GCONF_PATH_MODULES, modules_callback, NULL, NULL, NULL);
+
+ modules = gconf_client_all_dirs(client, PA_GCONF_PATH_MODULES, NULL);
+
+ for (m = modules; m; m = m->next) {
+ char *e = strrchr(m->data, '/');
+ handle_module(client, e ? e+1 : m->data);
+ }
+
+ g_slist_free(modules);
+
+ /* Signal the parent that we are now initialized */
+ printf("!");
+ fflush(stdout);
+
+ g = g_main_loop_new(NULL, FALSE);
+ g_main_loop_run(g);
+ g_main_loop_unref(g);
+
+ g_object_unref(G_OBJECT(client));
+
+ return 0;
+
+fail:
+ return 1;
+}
diff --git a/src/modules/gconf/module-gconf.c b/src/modules/gconf/module-gconf.c
new file mode 100644
index 0000000..76a1f19
--- /dev/null
+++ b/src/modules/gconf/module-gconf.c
@@ -0,0 +1,114 @@
+/***
+ This file is part of PulseAudio.
+
+ Copyright 2006 Lennart Poettering
+
+ 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.1 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, see <http://www.gnu.org/licenses/>.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <pulsecore/core-error.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/start-child.h>
+
+#include "../stdin-util.h"
+
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("GConf Adapter");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(true);
+
+int pa__init(pa_module*m) {
+ struct userdata *u;
+ int r;
+
+ u = pa_xnew(struct userdata, 1);
+ u->core = m->core;
+ u->module = m;
+ m->userdata = u;
+ u->module_infos = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) module_info_free);
+ u->pid = (pid_t) -1;
+ u->fd = -1;
+ u->fd_type = 0;
+ u->io_event = NULL;
+ u->buf_fill = 0;
+
+ if ((u->fd = pa_start_child_for_read(
+#if defined(__linux__) && defined(HAVE_RUNNING_FROM_BUILD_TREE)
+ pa_run_from_build_tree() ? PA_BUILDDIR "/gconf-helper" :
+#endif
+ PA_GCONF_HELPER, NULL, &u->pid)) < 0)
+ goto fail;
+
+ u->io_event = m->core->mainloop->io_new(
+ m->core->mainloop,
+ u->fd,
+ PA_IO_EVENT_INPUT,
+ io_event_cb,
+ u);
+
+ do {
+ if ((r = handle_event(u)) < 0)
+ goto fail;
+
+ /* Read until the client signalled us that it is ready with
+ * initialization */
+ } while (r != 1);
+
+ return 0;
+
+fail:
+ pa__done(m);
+ return -1;
+}
+
+void pa__done(pa_module*m) {
+ struct userdata *u;
+
+ pa_assert(m);
+
+ if (!(u = m->userdata))
+ return;
+
+ if (u->pid != (pid_t) -1) {
+ kill(u->pid, SIGTERM);
+
+ for (;;) {
+ if (waitpid(u->pid, NULL, 0) >= 0)
+ break;
+
+ if (errno != EINTR) {
+ pa_log("waitpid() failed: %s", pa_cstrerror(errno));
+ break;
+ }
+ }
+ }
+
+ if (u->io_event)
+ m->core->mainloop->io_free(u->io_event);
+
+ if (u->fd >= 0)
+ pa_close(u->fd);
+
+ if (u->module_infos)
+ pa_hashmap_free(u->module_infos);
+
+ pa_xfree(u);
+}