[Rhythmbox-devel] iradio for new m-m
- From: Colin Walters <walters verbum org>
- To: rhythmbox-devel gnome org
- Subject: [Rhythmbox-devel] iradio for new m-m
- Date: 24 Jan 2003 21:36:42 -0500
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]