diff src/audacious/dbus.c @ 2769:bf2d80abf76e trunk

[svn] Implemented CMD_IS_ADVANCE and CMD_TOGGLE_ADVANCE. Added partial MPRIS support. Root is complete, Player is partially implemented, and TrackList has not been started.
author magma
date Sun, 13 May 2007 18:38:53 -0700
parents ea20b1e92411
children 4585019eb82e
line wrap: on
line diff
--- a/src/audacious/dbus.c	Sun May 13 11:57:18 2007 -0700
+++ b/src/audacious/dbus.c	Sun May 13 18:38:53 2007 -0700
@@ -39,33 +39,34 @@
 #include "titlestring.h"
 #include "ui_jumptotrack.h"
 
+static DBusGConnection *dbus_conn = NULL;
+
 G_DEFINE_TYPE(RemoteObject, audacious_rc, G_TYPE_OBJECT);
+G_DEFINE_TYPE(MprisRoot, mpris_root, G_TYPE_OBJECT);
+G_DEFINE_TYPE(MprisPlayer, mpris_player, G_TYPE_OBJECT);
+// G_DEFINE_TYPE(MprisTracklist, mpris_tracklist, G_TYPE_OBJECT);
 
 void audacious_rc_class_init(RemoteObjectClass *klass) {}
+void mpris_root_class_init(MprisRootClass *klass) {}
+void mpris_player_class_init(MprisPlayerClass *klass) {}
+// void mpris_tracklist_class_init(MprisTracklistClass *klass) {}
 
 void audacious_rc_init(RemoteObject *object) {
     GError *error = NULL;
     DBusGProxy *driver_proxy;
     unsigned int request_ret;
 
-    // Initialize the DBus connection
-    object->connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
-    if (object->connection == NULL) {
-        g_warning("Unable to connect to dbus: %s", error->message);
-        g_error_free(error);
-        return;
-    }
     
     dbus_g_object_type_install_info(audacious_rc_get_type(),
                                     &dbus_glib_audacious_rc_object_info);
     
     // Register DBUS path
-    dbus_g_connection_register_g_object(object->connection,
+    dbus_g_connection_register_g_object(dbus_conn,
                                         AUDACIOUS_DBUS_PATH, G_OBJECT(object));
 
     // Register the service name, the constants here are defined in
     // dbus-glib-bindings.h
-    driver_proxy = dbus_g_proxy_new_for_name(object->connection,
+    driver_proxy = dbus_g_proxy_new_for_name(dbus_conn,
                                              DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
                                              DBUS_INTERFACE_DBUS);
 
@@ -75,15 +76,109 @@
         g_error_free(error);
     }
 
+    if (!org_freedesktop_DBus_request_name(driver_proxy,
+        AUDACIOUS_DBUS_SERVICE_MPRIS, 0, &request_ret, &error)) {
+        g_warning("Unable to register service: %s", error->message);
+        g_error_free(error);
+    }
+
     g_object_unref(driver_proxy);
 }
 
+void mpris_root_init(MprisRoot *object) {
+    dbus_g_object_type_install_info(mpris_root_get_type(),
+                                    &dbus_glib_mpris_root_object_info);
+    
+    // Register DBUS path
+    dbus_g_connection_register_g_object(dbus_conn,
+                                        AUDACIOUS_DBUS_PATH_MPRIS_ROOT,
+                                        G_OBJECT(object));
+}
+
+void mpris_player_init(MprisPlayer *object) {
+    dbus_g_object_type_install_info(mpris_player_get_type(),
+                                    &dbus_glib_mpris_player_object_info);
+    
+    // Register DBUS path
+    dbus_g_connection_register_g_object(dbus_conn,
+                                        AUDACIOUS_DBUS_PATH_MPRIS_PLAYER,
+                                        G_OBJECT(object));
+}
+
 void init_dbus() {
+    GError *error = NULL;
+    // Initialize the DBus connection
+    dbus_conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
+    if (dbus_conn == NULL) {
+        g_warning("Unable to connect to dbus: %s", error->message);
+        g_error_free(error);
+        return;
+    }
+
     g_type_init();
     g_object_new(audacious_rc_get_type(), NULL);
+    g_object_new(mpris_root_get_type(), NULL);
+    g_object_new(mpris_player_get_type(), NULL);
+    // g_object_new(mpris_tracklist_get_type(), NULL);
     g_message("D-Bus support has been activated");
 }
 
+///////////////////////////
+// MPRIS defined methods //
+///////////////////////////
+gboolean mpris_root_identity(MprisRoot *obj, gchar **identity,
+                             GError **error) {
+    *identity = g_strdup_printf("Audacious %s", VERSION);
+    return TRUE;
+}
+
+gboolean mpris_player_next(MprisPlayer *obj, GError **error) {
+    return audacious_rc_advance(obj, error);
+}
+gboolean mpris_player_prev(MprisPlayer *obj, GError **error) {
+    return audacious_rc_reverse(obj, error);
+}
+gboolean mpris_player_pause(MprisPlayer *obj, GError **error) {
+    return audacious_rc_pause(obj, error);
+}
+gboolean mpris_player_stop(MprisPlayer *obj, GError **error) {
+    return audacious_rc_stop(obj, error);
+}
+gboolean mpris_player_play(MprisPlayer *obj, GError **error) {
+    return audacious_rc_play(obj, error);
+}
+gboolean mpris_player_quit(MprisPlayer *obj, GError **error) {
+    return audacious_rc_quit(obj, error);
+}
+gboolean mpris_player_repeat(MprisPlayer *obj, gboolean rpt, GError **error) {
+    mainwin_repeat_pushed(rpt);
+    mainwin_set_noplaylistadvance(rpt);
+    return TRUE;
+}
+gboolean mpris_player_get_status(MprisPlayer *obj, gint *status,
+                                 GError **error) {
+    return TRUE;
+}
+gboolean mpris_player_get_caps(MprisPlayer *obj, gint *capabilities,
+                                 GError **error) {
+    return TRUE;
+}
+gboolean mpris_player_volume_set(MprisPlayer *obj, gint vol, GError **error) {
+    return TRUE;
+}
+gboolean mpris_player_volume_get(MprisPlayer *obj, gint *vol,
+                                 GError **error) {
+    return TRUE;
+}
+gboolean mpris_player_position_set(MprisPlayer *obj, gint pos,
+                                   GError **error) {
+    return TRUE;
+}
+gboolean mpris_player_position_get(MprisPlayer *obj, gint *pos,
+                                   GError **error) {
+    return TRUE;
+}
+
 // Audacious General Information
 gboolean audacious_rc_version(RemoteObject *obj, gchar **version,
                               GError **error) {
@@ -386,24 +481,35 @@
     return TRUE;
 }
 
-gboolean audacious_rc_repeating(RemoteObject *obj, gboolean *is_repeating,
+gboolean audacious_rc_auto_advance(RemoteObject *obj, gboolean *is_advance,
+                                   GError **error) {
+    *is_advance = cfg.no_playlist_advance;
+    return TRUE;
+}
+
+gboolean audacious_rc_toggle_auto_advance(RemoteObject *obj, GError **error) {
+    cfg.no_playlist_advance = !cfg.no_playlist_advance;
+    return TRUE;
+}
+
+gboolean audacious_rc_repeat(RemoteObject *obj, gboolean *is_repeating,
                                 GError **error) {
     *is_repeating = cfg.repeat;
     return TRUE;
 }
 
-gboolean audacious_rc_repeat(RemoteObject *obj, GError **error) {
+gboolean audacious_rc_toggle_repeat(RemoteObject *obj, GError **error) {
     mainwin_repeat_pushed(!cfg.repeat);
     return TRUE;
 }
 
-gboolean audacious_rc_shuffling(RemoteObject *obj, gboolean *is_shuffling,
+gboolean audacious_rc_shuffle(RemoteObject *obj, gboolean *is_shuffling,
                                 GError **error) {
     *is_shuffling = cfg.shuffle;
     return TRUE;
 }
 
-gboolean audacious_rc_shuffle(RemoteObject *obj, GError **error) {
+gboolean audacious_rc_toggle_shuffle(RemoteObject *obj, GError **error) {
     mainwin_shuffle_pushed(!cfg.shuffle);
     return TRUE;
 }