summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis de Bethencourt <luis@debethencourt.com>2011-03-24 20:43:56 +0100
committerLuis de Bethencourt <luis@debethencourt.com>2011-05-19 11:46:03 +0200
commit693a319b578b8fbad3ed36c1ed3eca0053dcd6b7 (patch)
treee7bb6311a2ef83d63119da115310582d96cab6ad
parent2c574d284ec9675a7fb1a59cbd1badca1ff0832a (diff)
dlna: work in progress OpenUri signal to engine
-rw-r--r--src/mpris.c117
-rw-r--r--src/mpris.h10
-rw-r--r--src/snappy.c11
3 files changed, 108 insertions, 30 deletions
diff --git a/src/mpris.c b/src/mpris.c
index f01aa09..2f1ca9a 100644
--- a/src/mpris.c
+++ b/src/mpris.c
@@ -138,11 +138,18 @@ static const GDBusInterfaceVTable root_vtable = {
NULL
};
-
static GDBusNodeInfo *introspection_data = NULL;
+
G_DEFINE_TYPE (MediaPlayer2, my_object, G_TYPE_OBJECT);
static void
+my_object_init (MediaPlayer2 * object)
+{
+ object->count = 0;
+ object->name = NULL;
+}
+
+static void
my_object_finalize (GObject * object)
{
MediaPlayer2 *myobj = (MediaPlayer2 *) object;
@@ -153,13 +160,6 @@ my_object_finalize (GObject * object)
}
static void
-my_object_init (MediaPlayer2 * object)
-{
- object->count = 0;
- object->name = NULL;
-}
-
-static void
my_object_get_property (GObject * object,
guint prop_id, GValue * value, GParamSpec * pspec)
{
@@ -217,6 +217,18 @@ my_object_class_init (MediaPlayer2Class * class)
g_object_class_install_property (gobject_class,
PROP_NAME,
g_param_spec_string ("name", "Name", "Name", NULL, G_PARAM_READWRITE));
+
+ mediaplayer_signals[OPEN_URI] =
+ g_signal_newv ("open-uri",
+ G_TYPE_FROM_CLASS (class),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+ NULL,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0,
+ NULL);
}
/* A method that we want to export */
@@ -228,6 +240,17 @@ my_object_change_count (MediaPlayer2 * myobj, gint change)
g_object_notify (G_OBJECT (myobj), "count");
}
+void
+my_object_change_uri (MediaPlayer2 * myobj, gchar * uri)
+{
+ myobj->uri = uri;
+
+ g_print ("changing uri: %s\n", uri);
+ g_object_notify (G_OBJECT (myobj), "uri");
+ g_signal_emit (myobj, mediaplayer_signals[OPEN_URI], 0);
+ g_object_set (G_OBJECT (myobj), "uri", uri, NULL);
+}
+
static void
handle_result (GDBusMethodInvocation * invocation, gboolean ret, GError * error)
{
@@ -259,12 +282,12 @@ handle_method_call (GDBusConnection * connection,
gboolean ret = TRUE;
GError *error = NULL;
- g_print ("handle_method_call\n");
+ g_print ("handle_method_call: %s\n", method_name);
if (g_strcmp0 (method_name, "ChangeCount") == 0) {
gint change;
- g_variant_get (parameters, "(i)", &change);
+ g_variant_get (parameters, "(i)", &change);
my_object_change_count (myobj, change);
g_dbus_method_invocation_return_value (invocation, NULL);
@@ -273,12 +296,20 @@ handle_method_call (GDBusConnection * connection,
/// ToDo: next track call
handle_result (invocation, ret, error);
} else if (g_strcmp0 (method_name, "OpenUri") == 0) {
- const gchar *uri;
+ gchar *uri;
+
+ g_variant_get (parameters, "(s)", &uri);
+ my_object_change_uri (myobj, uri);
- g_variant_get (parameters, "(&s)", &uri);
- g_print ("set uri: %s\n", uri);
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ } else if (g_strcmp0 (method_name, "Play") == 0) {
+ // send play signal
+ handle_result (invocation, ret, error);
+ } else if (g_strcmp0 (method_name, "Stop") == 0) {
+ // send stop signal
handle_result (invocation, ret, error);
}
+
}
GVariant *
@@ -308,7 +339,23 @@ handle_get_property (GDBusConnection * connection,
ret = g_variant_new_strv (strv, -1);
} else if (g_strcmp0 (property_name, "Position") == 0) {
ret = g_variant_new_double (0);
+ } else if (g_strcmp0 (property_name, "Identity") == 0) {
+ return g_variant_new_string ("snappy");
+ } else if (g_strcmp0 (property_name, "SupportedUriSchemes") == 0) {
+ /* not planning to support this seriously */
+ const char *fake_supported_schemes[] = {
+ "file", "http", "cdda", "smb", "sftp", NULL
+ };
+ return g_variant_new_strv (fake_supported_schemes, -1);
+ } else if (g_strcmp0 (property_name, "SupportedMimeTypes") == 0) {
+ /* nor this */
+ const char *fake_supported_mimetypes[] = {
+ "application/ogg", "audio/x-vorbis+ogg", "audio/x-flac", "audio/mpeg",
+ NULL
+ };
+ return g_variant_new_strv (fake_supported_mimetypes, -1);
}
+
return ret;
}
@@ -433,6 +480,8 @@ send_property_change (GObject * obj,
g_variant_builder_add (builder,
"{sv}", "Name", g_variant_new_string (myobj->name ? myobj->name : ""));
+ g_print ("some property changed %s\n", pspec->name);
+
g_dbus_connection_emit_signal (connection,
NULL,
"org/mpris/MediaPlayer2",
@@ -448,14 +497,18 @@ on_bus_acquired (GDBusConnection * connection,
{
MediaPlayer2 *myobj = user_data;
guint registration_id;
+ GError *error = NULL;
g_print ("on bus acquired\n");
g_signal_connect (myobj, "notify",
G_CALLBACK (send_property_change), connection);
- registration_id = g_dbus_connection_register_object (connection, "/org/mpris/MediaPlayer2", introspection_data->interfaces[0], &interface_vtable, myobj, NULL, /* user_data_free_func */
- NULL); /* GError** */
- // g_assert (registration_id > 0);
+ registration_id = g_dbus_connection_register_object (connection,
+ "/org/mpris/MediaPlayer2", introspection_data->interfaces[0],
+ &interface_vtable, myobj,
+ NULL, /* user_data_free_func */
+ &error);
+ g_assert (registration_id > 0);
}
static void
@@ -481,6 +534,7 @@ load_mpris (MediaPlayer2 *mp)
g_type_init ();
+
connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
/* Build the introspection data structures from the XML */
@@ -488,30 +542,33 @@ load_mpris (MediaPlayer2 *mp)
g_dbus_node_info_new_for_xml (mpris_introspection_xml, NULL);
g_assert (introspection_data != NULL);
- /* register root interface */
- ifaceinfo =
- g_dbus_node_info_lookup_interface (introspection_data,
- MPRIS_ROOT_INTERFACE);
- mp->root_id =
- g_dbus_connection_register_object (connection, MPRIS_OBJECT_NAME,
- ifaceinfo, &root_vtable, NULL, NULL, &error);
- if (error != NULL) {
- g_warning ("unable to register MPRIS root interface: %s", error->message);
- g_error_free (error);
- }
-
/* register player interface */
ifaceinfo =
g_dbus_node_info_lookup_interface (introspection_data,
MPRIS_PLAYER_INTERFACE);
mp->player_id =
- g_dbus_connection_register_object (connection, MPRIS_OBJECT_NAME,
- ifaceinfo, &interface_vtable, NULL, NULL, &error);
+ g_dbus_connection_register_object (connection, MPRIS_OBJECT_NAME,
+ ifaceinfo, &interface_vtable, mp, NULL, &error);
+
+ /* register root interface */
+ // ifaceinfo =
+ // g_dbus_node_info_lookup_interface (introspection_data,
+ // MPRIS_ROOT_INTERFACE);
+ // mp->root_id =
+ // g_dbus_connection_register_object (connection, MPRIS_OBJECT_NAME,
+ // ifaceinfo, &root_vtable, NULL, NULL, &error);
+ // if (error != NULL) {
+ // g_warning ("unable to register MPRIS root interface: %s", error->message);
+ // g_error_free (error);
+ // }
+
+
mp->owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
"org.mpris.MediaPlayer2.snappy",
G_BUS_NAME_OWNER_FLAGS_NONE,
on_bus_acquired, on_name_acquired, on_name_lost, mp, NULL);
+ g_assert (mp->owner_id > 0);
return TRUE;
}
diff --git a/src/mpris.h b/src/mpris.h
index 573a4e3..bd597f0 100644
--- a/src/mpris.h
+++ b/src/mpris.h
@@ -66,6 +66,8 @@ struct _MediaPlayer2
guint property_emit_id;
gint64 last_elapsed;
+
+ gchar *uri;
};
enum
@@ -75,6 +77,14 @@ enum
PROP_NAME
};
+enum {
+ OPEN_URI,
+ LAST_SIGNAL
+};
+
+static guint
+mediaplayer_signals[LAST_SIGNAL] = { 0 };
+
// Declaration of non-static functions
gboolean load_mpris (MediaPlayer2 *mp_obj);
gboolean close_mpris (MediaPlayer2 *mp_obj);
diff --git a/src/snappy.c b/src/snappy.c
index 4fc0575..37f5706 100644
--- a/src/snappy.c
+++ b/src/snappy.c
@@ -49,6 +49,12 @@ close_down (UserInterface * ui, GstEngine * engine)
gst_object_unref (G_OBJECT (engine->player));
}
+void
+open_uri_callback (MediaPlayer2 *self, gpointer user_data)
+{
+ g_print ("received the open-uri signal!\n");
+}
+
gboolean
config_load ()
{
@@ -187,6 +193,11 @@ main (int argc, char *argv[])
change_state (engine, "Paused");
change_state (engine, "Playing");
+ mp_obj = g_new (MediaPlayer2, 1);
+ load_mpris (mp_obj);
+ g_signal_connect (mp_obj, "open-uri",
+ G_CALLBACK (open_uri_callback), engine);
+
clutter_main ();
close_down (ui, engine);