[Rhythmbox-devel] iradio for new m-m



Hi,

The attached patch re-implements internet radio support for the new
monkey-media CVS.  Ok to commit?

Index: tests/test-cmdline.c
===================================================================
RCS file: /cvs/gnome/monkey-media/tests/test-cmdline.c,v
retrieving revision 1.6
diff -u -d -I$Id: -r1.6 test-cmdline.c
--- tests/test-cmdline.c	12 Jan 2003 19:46:11 -0000	1.6
+++ tests/test-cmdline.c	25 Jan 2003 02:30:02 -0000
@@ -28,6 +28,19 @@
 	monkey_media_main_quit ();
 }
 
+void
+info (MonkeyMediaPlayer *player,
+      MonkeyMediaStreamInfoField field,
+      GValue *value,
+      gpointer data)
+{
+	GEnumValue *enumvalue = g_enum_get_value(g_type_class_peek(MONKEY_MEDIA_TYPE_STREAM_INFO_FIELD),
+						 field);
+	char *str = g_strdup_value_contents(value);
+	fprintf(stdout, "info: %s: %s\n", enumvalue->value_name, str);
+	g_free(str);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -51,6 +64,9 @@
 		  fprintf (stderr, "Unable to load %s: %s\n", argv[1], error->message);
 		  g_error_free (error);
 	}
+
+	g_signal_connect (G_OBJECT (player), "info",
+	                  G_CALLBACK (info), NULL);
 
 	g_signal_connect (G_OBJECT (player), "eos",
 	                  G_CALLBACK (eos), NULL);
Index: src/monkey-media-player.h
===================================================================
RCS file: /cvs/gnome/monkey-media/src/monkey-media-player.h,v
retrieving revision 1.5
diff -u -d -I$Id: -r1.5 monkey-media-player.h
--- src/monkey-media-player.h	25 Jan 2003 00:06:09 -0000	1.5
+++ src/monkey-media-player.h	25 Jan 2003 02:30:02 -0000
@@ -22,6 +22,7 @@
 #define __MONKEY_MEDIA_PLAYER_H
 
 #include <glib-object.h>
+#include "monkey-media-stream-info.h"
 
 G_BEGIN_DECLS
 
@@ -59,8 +60,9 @@
 {
 	GObjectClass parent_class;
 
-	void (*eos)  (MonkeyMediaPlayer *mp);
-	void (*tick) (MonkeyMediaPlayer *mp, long elapsed);
+	void (*eos)	(MonkeyMediaPlayer *mp);
+	void (*info)	(MonkeyMediaPlayer *ms, MonkeyMediaStreamInfoField field, GValue *value);
+	void (*tick)	(MonkeyMediaPlayer *mp, long elapsed);
 } MonkeyMediaPlayerClass;
 
 GType              monkey_media_player_get_type   (void);
Index: src/monkey-media-player-gst.c
===================================================================
RCS file: /cvs/gnome/monkey-media/src/monkey-media-player-gst.c,v
retrieving revision 1.4
diff -u -d -I$Id: -r1.4 monkey-media-player-gst.c
--- src/monkey-media-player-gst.c	25 Jan 2003 00:06:09 -0000	1.4
+++ src/monkey-media-player-gst.c	25 Jan 2003 02:30:03 -0000
@@ -29,6 +29,7 @@
 #include <libgnomevfs/gnome-vfs-utils.h>
 
 #include "monkey-media.h"
+#include "monkey-media-marshal.h"
 #include "monkey-media-private.h"
 
 static void monkey_media_player_class_init (MonkeyMediaPlayerClass *klass);
@@ -63,11 +64,19 @@
 	guint tick_timeout_id;
 };
 
-enum
+typedef enum
 {
 	EOS,
+	INFO,
 	TICK,
 	LAST_SIGNAL
+} MonkeyMediaPlayerSignalType;
+
+struct MonkeyMediaPlayerInfoSignal
+{
+	GObject *object;
+	MonkeyMediaStreamInfoField info_field;
+	GValue *info;
 };
 
 static guint monkey_media_player_signals[LAST_SIGNAL] = { 0 };
@@ -119,6 +128,17 @@
 			      g_cclosure_marshal_VOID__VOID,
 			      G_TYPE_NONE,
 			      0);
+	monkey_media_player_signals[INFO] =
+		g_signal_new ("info",
+			      G_OBJECT_CLASS_TYPE (object_class),
+			      G_SIGNAL_RUN_LAST,
+			      G_STRUCT_OFFSET (MonkeyMediaPlayerClass, info),
+			      NULL, NULL,
+			      monkey_media_marshal_VOID__ENUM_POINTER,
+			      G_TYPE_NONE,
+			      2,
+			      MONKEY_MEDIA_TYPE_STREAM_INFO_FIELD,
+			      G_TYPE_POINTER);
 	monkey_media_player_signals[TICK] =
 		g_signal_new ("tick",
 			      G_OBJECT_CLASS_TYPE (object_class),
@@ -196,6 +216,60 @@
 	mp->priv->have_type = TRUE;
 }
 
+static gboolean
+signal_info_available_idle (gpointer data)
+{
+	struct MonkeyMediaPlayerInfoSignal *signal = data;
+	g_signal_emit (signal->object, monkey_media_player_signals[INFO], 0,
+		       signal->info_field, signal->info);
+	return FALSE;
+}
+
+static void
+monkey_media_player_deep_notify_cb (GstElement *element, GstElement *orig,
+				    GParamSpec *pspec, MonkeyMediaPlayer *player)
+{
+	GValue *value;
+	GEnumClass *class;
+	GEnumValue *ev = NULL;
+
+
+	if (!(pspec->flags & G_PARAM_READABLE)) return;
+
+	class = g_type_class_ref (MONKEY_MEDIA_TYPE_STREAM_INFO_FIELD);
+
+	value = g_new0 (GValue, 1);
+	g_value_init (value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+	g_object_get_property (G_OBJECT (orig), pspec->name, value);
+
+	/* Other properties from the gnomevfssrc go here */
+	if (strcmp (pspec->name, "iradio-title") == 0)
+		ev = g_enum_get_value (class, MONKEY_MEDIA_STREAM_INFO_FIELD_TITLE);
+	if (ev == NULL && strcmp (pspec->name, "iradio-url") == 0)
+		ev = g_enum_get_value (class, MONKEY_MEDIA_STREAM_INFO_FIELD_LOCATION);
+	if (ev == NULL)
+		ev = g_enum_get_value_by_nick (class, pspec->name);
+
+	/* FIXME begin hack */
+	if (ev == NULL)
+	{
+		char *tmp = g_strconcat ("audio_", pspec->name, NULL);
+		ev = g_enum_get_value_by_nick (class, tmp);
+		g_free (tmp);
+	}
+	/* FIXME end hack */
+	if (ev != NULL)
+	{
+		struct MonkeyMediaPlayerInfoSignal *signal = g_new0 (struct MonkeyMediaPlayerInfoSignal, 1);
+		signal->info_field = ev->value;
+		signal->info = value;
+		signal->object = G_OBJECT (player);
+
+		g_idle_add ((GSourceFunc) signal_info_available_idle, signal);
+	}
+	g_type_class_unref (class);
+}
+
 static void
 monkey_media_player_construct (MonkeyMediaPlayer *mp,
 			       GError **error)
@@ -236,6 +310,11 @@
 	/* playback pipeline */
 	mp->priv->pipeline = gst_thread_new ("pipeline");
 
+	g_signal_connect (G_OBJECT (mp->priv->pipeline),
+			  "deep_notify",
+			  G_CALLBACK (monkey_media_player_deep_notify_cb),
+			  mp);
+
 	mp->priv->src = gst_element_factory_make ("gnomevfssrc", "src");
 	if (mp->priv->src == NULL) {
 		g_set_error (error,
@@ -366,11 +445,19 @@
 
 	mp->priv->have_type = FALSE;
 
+	/* Internet radio support */
+	if (!strncmp ("http", uri, 4))
+	{
+		g_object_set (G_OBJECT (mp->priv->src),
+			      "iradio-mode", TRUE, NULL);
+		g_object_set (G_OBJECT (mp->priv->typefind_src),
+			      "iradio-mode", TRUE, NULL);
+	}
+
 	g_object_set (G_OBJECT (mp->priv->src),
 		      "location", uri, NULL);
 	g_object_set (G_OBJECT (mp->priv->typefind_src),
 		      "location", uri, NULL);
-
 	gst_element_set_state (mp->priv->typefind_pipeline,
 			       GST_STATE_PLAYING);
 
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/monkey-media/ChangeLog,v
retrieving revision 1.251
diff -u -d -I$Id: -r1.251 ChangeLog
--- ChangeLog	25 Jan 2003 00:06:08 -0000	1.251
+++ ChangeLog	25 Jan 2003 02:30:04 -0000
@@ -1,3 +1,15 @@
+2003-01-24  Colin Walters  <walters@verbum.org>
+
+	* src/monkey-media-player.h: Add info signal.
+	
+	* src/monkey-media-player-gst.c (monkey_media_player_class_init),
+	(signal_info_available_idle),
+	(monkey_media_player_deep_notify_cb)
+	(monkey_media_player_construct, monkey_media_player_open):
+	Implement it.
+	
+	* tests/test-cmdline.c (info), (main): Use it.
+
 2003-01-25  Jorn Baayen  <jorn@nl.linux.org>
 
 	* src/monkey-media-player-gst.c: (monkey_media_player_init),


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]