25 #include <dbus/dbus.h>
26 #include <dbus/dbus-glib.h>
27 #include <dbus/dbus-glib-bindings.h>
28 #include <dbus/dbus-glib-lowlevel.h>
50 G_DEFINE_TYPE (
RemoteObject, audacious_rc, G_TYPE_OBJECT)
51 G_DEFINE_TYPE (
MprisRoot, mpris_root, G_TYPE_OBJECT)
52 G_DEFINE_TYPE (
MprisPlayer, mpris_player, G_TYPE_OBJECT)
55 #define DBUS_TYPE_G_STRING_VALUE_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE))
69 signals[
CAPS_CHANGE_SIG] = g_signal_new(
"caps_change", G_OBJECT_CLASS_TYPE(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, 0,
NULL,
NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
71 g_signal_new(
"track_change",
74 GType status_type = dbus_g_type_get_struct (
"GValueArray", G_TYPE_INT,
75 G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID);
77 g_signal_new (
"status_change", G_OBJECT_CLASS_TYPE (klass),
78 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, 0,
NULL,
NULL,
79 g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, status_type);
85 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, 0,
NULL,
NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
91 DBusGProxy *driver_proxy;
92 unsigned int request_ret;
94 AUDDBG (
"Registering remote D-Bus interfaces.\n");
103 driver_proxy = dbus_g_proxy_new_for_name(
dbus_conn, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
107 g_warning(
"Unable to register service: %s", error->message);
113 g_warning(
"Unable to register service: %s", error->message);
117 g_object_unref(driver_proxy);
136 DBusGProxy *proxy =
object->proxy;
139 dbus_g_proxy_add_signal (proxy,
"StatusChange", dbus_g_type_get_struct
140 (
"GValueArray", G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT,
141 G_TYPE_INVALID), G_TYPE_INVALID);
142 dbus_g_proxy_add_signal (proxy,
"CapsChange", G_TYPE_INT, G_TYPE_INVALID);
148 AUDDBG (
"object->proxy == NULL; not adding some signals.\n");
160 DBusGProxy *proxy =
object->proxy;
163 dbus_g_proxy_add_signal(proxy,
"TrackListChange", G_TYPE_INT, G_TYPE_INVALID);
168 AUDDBG (
"object->proxy == NULL, not adding some signals.\n");
175 DBusConnection *local_conn;
177 AUDDBG (
"Trying to initialize D-Bus.\n");
178 dbus_conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
181 g_warning(
"Unable to connect to dbus: %s", error->message);
186 g_object_new(audacious_rc_get_type(),
NULL);
187 g_object_new(mpris_root_get_type(),
NULL);
188 mpris = g_object_new(mpris_player_get_type(),
NULL);
189 mpris_tracklist = g_object_new(mpris_tracklist_get_type(),
NULL);
191 local_conn = dbus_g_connection_get_connection(
dbus_conn);
192 dbus_connection_set_exit_on_disconnect(local_conn,
FALSE);
210 val = g_new0(GValue, 1);
211 g_value_init(val, G_TYPE_STRING);
213 g_value_set_string (val, str);
219 val = g_new0(GValue, 1);
220 g_value_init(val, G_TYPE_INT);
222 g_value_set_int (val, x);
237 const char * tuple_key,
const char *key)
241 g_hash_table_insert (md, (
void *) key, value);
252 g_value_unset((GValue *) value);
253 g_free((GValue *) value);
258 GHashTable *md =
NULL;
263 value = g_malloc(
sizeof(GValue));
264 memset(value, 0,
sizeof(GValue));
265 g_value_init(value, G_TYPE_STRING);
266 g_value_take_string(value, g_strdup(filename));
267 g_hash_table_insert(md,
"location", value);
303 GHashTable * metadata =
NULL;
304 if (filename && tuple)
318 *identity = g_strdup_printf(
"Audacious %s", VERSION);
369 memset(&value, 0,
sizeof(value));
370 g_value_init(&value, G_TYPE_INT);
371 g_value_set_int(&value, tmp);
372 g_value_array_append(ar, &value);
385 *status = g_value_array_new(4);
402 * metadata = g_hash_table_new (g_str_hash, g_str_equal);
447 GHashTable *metadata;
454 if (filename && tuple)
458 g_hash_table_destroy (metadata);
465 return (filename && tuple);
470 GValueArray *ar = g_value_array_new(4);
481 g_value_array_free(ar);
500 GHashTable * * metadata, GError * *
error)
504 * metadata = g_hash_table_new (g_str_hash, g_str_equal);
552 *version = g_strdup(VERSION);
637 * status = strdup (
"stopped");
706 title, GError * *
error)
712 * title = strdup (title2);
724 * filename = strdup (filename2);
737 length, GError * *
error)
744 field, GValue * value, GError * *
error)
750 memset (value, 0,
sizeof (GValue));
751 g_value_init (value, G_VALUE_TYPE (value2));
752 g_value_copy (value2, value);
753 g_value_unset (value2);
820 * is_advance = !
get_bool (
NULL,
"no_playlist_advance");
856 * is_stopping =
get_bool (
NULL,
"stop_after_current_song");
869 event_queue(
"prefswin show", GINT_TO_POINTER(show));
875 event_queue(
"aboutwin show", GINT_TO_POINTER(show));
902 int * nch, GError * *
error)
910 hook_call(
"mainwin set always on top", &ontop);
953 qpos, GError * *
error)
960 is_queued, GError * *
error)
967 pos, GError * *
error)
989 * bands = g_array_new (
FALSE,
FALSE,
sizeof (
double));
1034 title, GError * *
error)
1037 * title = strdup (title2);
1044 DBusGConnection *connection =
NULL;
1046 connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
1047 g_clear_error(&error);