diff src/audacious/dbus.c @ 2694:c2b82432c1b6 trunk

[svn] Added basic DBus support, disabled by default with a configuration option to enable it. The general and playback information/manipulation methods are currently the only ones implemented. That is version, play, pause, stop, playing, paused, stopped, status, and seek. There are stubs for many unimplemented methods.
author magma
date Sat, 05 May 2007 15:37:54 -0700
parents
children 4c4c8b294287
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/audacious/dbus.c	Sat May 05 15:37:54 2007 -0700
@@ -0,0 +1,229 @@
+/*
+*
+* Author: Ben Tucker <bnt@interchange.ubc.ca>, (C) 2007
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the
+* Free Software Foundation; either version 2 of the License, or (at your
+* option) any later version.
+*
+* This program 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 General Public License along
+* with this program; if not, write to the Free Software Foundation, Inc.,
+* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+*
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <glib.h>
+#include <dbus/dbus-glib-bindings.h>
+#include "dbus.h"
+#include "dbus-bindings.h"
+
+#include "main.h"
+#include "ui_equalizer.h"
+#include "ui_main.h"
+#include "input.h"
+#include "playback.h"
+#include "playlist.h"
+#include "ui_playlist.h"
+#include "ui_preferences.h"
+#include "libaudacious/beepctrl.h"
+#include "memorypool.h"
+#include "titlestring.h"
+#include "ui_jumptotrack.h"
+
+G_DEFINE_TYPE(RemoteObject, audacious_remote, G_TYPE_OBJECT);
+
+void audacious_remote_class_init(RemoteObjectClass *class) {}
+
+void audacious_remote_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_remote_get_type(),
+																	&dbus_glib_audacious_remote_object_info);
+	
+	// Register DBUS path
+	dbus_g_connection_register_g_object(object->connection, DBUS_OBJECT_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,
+																					 DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
+																					 DBUS_INTERFACE_DBUS);
+
+	if (!org_freedesktop_DBus_request_name(driver_proxy, DBUS_SERVICE, 0,
+			&request_ret, &error)) {
+		g_warning("Unable to register service: %s", error->message);
+		g_error_free(error);
+	}
+	
+	g_object_unref(driver_proxy);
+}
+
+RemoteObject *init_dbus() {
+	RemoteObject *object;
+	g_type_init();
+	object = g_object_new(audacious_remote_get_type(), NULL);
+	return object;
+}
+
+// Audacious General Information
+gboolean audacious_remote_version(RemoteObject *obj, gchar **version,
+																	GError **error) {
+	*version = g_strdup(VERSION);
+	return TRUE;
+}
+
+// Playback Information/Manipulation
+gboolean audacious_remote_play(RemoteObject *obj, GError **error) {
+	if (playback_get_paused())
+		playback_pause();
+	else if (playlist_get_length(playlist_get_active()))
+		playback_initiate();
+	else
+		mainwin_eject_pushed();
+	return TRUE;
+}
+
+gboolean audacious_remote_pause(RemoteObject *obj, GError **error) {
+	playback_pause();
+	return TRUE;
+}
+
+gboolean audacious_remote_stop(RemoteObject *obj, GError **error) {
+	ip_data.stop = TRUE;
+	playback_stop();
+	ip_data.stop = FALSE;
+	mainwin_clear_song_info();
+	return TRUE;
+}
+
+gboolean audacious_remote_playing(RemoteObject *obj, gboolean *is_playing,
+																	GError **error) {
+	*is_playing = playback_get_playing();
+	return TRUE;
+}
+
+gboolean audacious_remote_paused(RemoteObject *obj, gboolean *is_paused,
+																 GError **error) {
+	*is_paused = playback_get_paused();
+	return TRUE;
+}
+
+gboolean audacious_remote_stopped(RemoteObject *obj, gboolean *is_stopped,
+																	GError **error) {
+	*is_stopped = !playback_get_playing();
+	return TRUE;
+}
+
+gboolean audacious_remote_status(RemoteObject *obj, gchar **status,
+																 GError **error) {
+	if (playback_get_paused())
+		*status = g_strdup("paused");
+	else if (playback_get_playing())
+		*status = g_strdup("playing");
+	else
+		*status = g_strdup("stopped");
+	return TRUE;
+}
+
+gboolean audacious_remote_seek(RemoteObject *obj, guint pos, GError **error) {
+	if (playlist_get_current_length(playlist_get_active()) > 0 &&
+			pos < (guint)playlist_get_current_length(playlist_get_active()))
+			playback_seek(pos / 1000);
+
+	return TRUE;
+}
+
+// Playlist Information/Manipulation
+gboolean audacious_remote_position(RemoteObject *obj, int *pos, GError **error)
+{
+	return TRUE;
+}
+
+gboolean audacious_remote_advance(RemoteObject *obj, GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_reverse(RemoteObject *obj, GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_length(RemoteObject *obj, int *length,
+																 GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_song_title(RemoteObject *obj, int pos,
+																		 gchar **title, GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_song_filename(RemoteObject *obj, int pos,
+																				gchar **filename, GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_song_length(RemoteObject *obj, int pos, int *length,
+																			GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_song_frames(RemoteObject *obj, int pos, int *length,
+																			GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_jump(RemoteObject *obj, int pos, GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_add_url(RemoteObject *obj, gchar *url,
+																	GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_delete(RemoteObject *obj, int pos, GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_clear(RemoteObject *obj, GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_repeating(RemoteObject *obj, gboolean *is_repeating,
+																		GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_repeat(RemoteObject *obj, GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_shuffling(RemoteObject *obj, gboolean *is_shuffling,
+																		GError **error) {
+	return TRUE;
+}
+
+gboolean audacious_remote_shuffle(RemoteObject *obj, GError **error) {
+	return TRUE;
+}