[Xfce4-commits] <parole:ochosi/audiobox> Functional completion of the audiobox.
Sean Davis
noreply at xfce.org
Thu Nov 29 00:28:01 CET 2012
Updating branch refs/heads/ochosi/audiobox
to 1f038f0094329fcd96584f185968bfd10e03569d (commit)
from 5383ba33003b6884a18633447aa48e30f59c8ad1 (commit)
commit 1f038f0094329fcd96584f185968bfd10e03569d
Author: Sean Davis <smd.seandavis at gmail.com>
Date: Wed Nov 28 13:43:44 2012 -0500
Functional completion of the audiobox.
configure.ac.in | 5 ++
src/gst/Makefile.am | 1 +
src/gst/parole-gst.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++
src/misc/parole-stream.c | 30 ++++++++++++++
src/misc/parole-stream.h | 5 ++
src/parole-player.c | 15 ++++++-
6 files changed, 154 insertions(+), 2 deletions(-)
diff --git a/configure.ac.in b/configure.ac.in
index 50eb9d3..143b089 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -103,6 +103,11 @@ XDT_CHECK_PACKAGE([GST_VIDEO], [gstreamer-video-0.10], [gstreamer_minimum_versio
XDT_CHECK_PACKAGE([GST_INTERFACES], [gstreamer-interfaces-0.10], [gstreamer_minimum_version])
XDT_CHECK_PACKAGE([GST_PBUTILS], [gstreamer-pbutils-0.10], [0.10.2])
+GST_MAJORMINOR=0.10
+GST_REQS=0.10.30
+GSTPLUG_REQS=0.10.30
+GST_LIBS="$GST_LIBS -lgstbase-$GST_MAJORMINOR -lgstinterfaces-$GST_MAJORMINOR -lgstvideo-$GST_MAJORMINOR -lgstaudio-$GST_MAJORMINOR -lgstpbutils-$GST_MAJORMINOR -lgsttag-$GST_MAJORMINOR"
+
XDT_CHECK_PACKAGE([DBUS], [dbus-1], [dbus_minimum_version])
XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [dbus_glib_minimum_version])
diff --git a/src/gst/Makefile.am b/src/gst/Makefile.am
index 5f2de02..62771b7 100644
--- a/src/gst/Makefile.am
+++ b/src/gst/Makefile.am
@@ -31,6 +31,7 @@ libparolegst_la_CFLAGS = \
libparolegst_la_LIBADD = \
$(top_builddir)/src/misc/libparole.la\
$(top_builddir)/src/common/libparolecommon.la\
+ $(GST_LIBS) \
$(GST_PBUTILS_LIBS)
parole_glib_enum_headers = \
diff --git a/src/gst/parole-gst.c b/src/gst/parole-gst.c
index f023609..0b310fb 100644
--- a/src/gst/parole-gst.c
+++ b/src/gst/parole-gst.c
@@ -34,6 +34,7 @@
#include <gst/pbutils/install-plugins.h>
#include <gst/video/video.h>
+#include <gst/tag/tag.h>
#include <libxfce4util/libxfce4util.h>
#include <libxfce4ui/libxfce4ui.h>
@@ -65,6 +66,8 @@ static void parole_gst_terminate_internal (ParoleGst *gst,
static void parole_gst_seek_cdda_track (ParoleGst *gst,
gint track);
+
+static GdkPixbuf * parole_gst_tag_list_get_cover (GstTagList *tag_list);
typedef enum
{
@@ -999,6 +1002,94 @@ out:
;
}
+static GdkPixbuf *
+parole_gst_buffer_to_pixbuf (GstBuffer *buffer)
+{
+ GdkPixbufLoader *loader;
+ GdkPixbuf *pixbuf = NULL;
+ GError *err = NULL;
+
+ loader = gdk_pixbuf_loader_new ();
+
+ if (gdk_pixbuf_loader_write (loader, buffer->data, buffer->size, &err) &&
+ gdk_pixbuf_loader_close (loader, &err)) {
+ pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+ if (pixbuf)
+ g_object_ref (pixbuf);
+ } else {
+ GST_WARNING("could not convert tag image to pixbuf: %s", err->message);
+ g_error_free (err);
+ }
+
+ g_object_unref (loader);
+ return pixbuf;
+}
+
+static const GValue *
+parole_gst_tag_list_get_cover_real (GstTagList *tag_list)
+{
+ const GValue *cover_value = NULL;
+ guint i;
+
+ for (i = 0; ; i++) {
+ const GValue *value;
+ GstBuffer *buffer;
+ GstStructure *caps_struct;
+ int type;
+
+ value = gst_tag_list_get_value_index (tag_list,
+ GST_TAG_IMAGE,
+ i);
+ if (value == NULL)
+ break;
+
+ buffer = gst_value_get_buffer (value);
+
+ caps_struct = gst_caps_get_structure (buffer->caps, 0);
+
+ gst_structure_get_enum (caps_struct,
+ "image-type",
+ GST_TYPE_TAG_IMAGE_TYPE,
+ &type);
+ if (type == GST_TAG_IMAGE_TYPE_UNDEFINED) {
+ if (cover_value == NULL)
+ cover_value = value;
+ } else if (type == GST_TAG_IMAGE_TYPE_FRONT_COVER) {
+ cover_value = value;
+ break;
+ }
+ }
+
+ return cover_value;
+}
+
+GdkPixbuf *
+parole_gst_tag_list_get_cover (GstTagList *tag_list)
+{
+ const GValue *cover_value;
+
+ g_return_val_if_fail (tag_list != NULL, FALSE);
+
+ cover_value = parole_gst_tag_list_get_cover_real (tag_list);
+ /* Fallback to preview */
+ if (!cover_value) {
+ cover_value = gst_tag_list_get_value_index (tag_list,
+ GST_TAG_PREVIEW_IMAGE,
+ 0);
+ }
+
+ if (cover_value) {
+ GstBuffer *buffer;
+ GdkPixbuf *pixbuf;
+
+ buffer = gst_value_get_buffer (cover_value);
+ pixbuf = parole_gst_buffer_to_pixbuf (buffer);
+ return pixbuf;
+ }
+
+ return NULL;
+}
+
static void
parole_gst_get_meta_data_cdda (ParoleGst *gst, GstTagList *tag)
{
@@ -1022,6 +1113,7 @@ parole_gst_get_meta_data_local_file (ParoleGst *gst, GstTagList *tag)
{
gchar *str;
GDate *date;
+ GdkPixbuf *pixbuf;
if ( gst_tag_list_get_string_index (tag, GST_TAG_TITLE, 0, &str) )
{
@@ -1071,6 +1163,13 @@ parole_gst_get_meta_data_local_file (ParoleGst *gst, GstTagList *tag)
NULL);
g_free (str);
}
+
+ pixbuf = parole_gst_tag_list_get_cover (tag);
+ if (pixbuf)
+ {
+ parole_stream_set_image (G_OBJECT (gst->priv->stream), pixbuf);
+ g_object_unref (pixbuf);
+ }
g_object_set (G_OBJECT (gst->priv->stream),
"tag-available", TRUE,
@@ -1414,6 +1513,7 @@ parole_gst_play_file_internal (ParoleGst *gst)
if ( gst->priv->update_vis)
parole_gst_update_vis (gst);
+ parole_stream_set_image (G_OBJECT (gst->priv->stream), NULL);
g_object_get (G_OBJECT (gst->priv->stream),
"uri", &uri,
diff --git a/src/misc/parole-stream.c b/src/misc/parole-stream.c
index a333499..2a9f8fe 100644
--- a/src/misc/parole-stream.c
+++ b/src/misc/parole-stream.c
@@ -68,6 +68,7 @@ struct _ParoleStreamPrivate
gchar *year;
gchar *album;
gchar *comment;
+ GdkPixbuf *image;
ParoleMediaType media_type;
};
@@ -311,6 +312,35 @@ parole_stream_finalize (GObject *object)
G_OBJECT_CLASS (parole_stream_parent_class)->finalize (object);
}
+void
+parole_stream_set_image (GObject *object, GdkPixbuf *pixbuf)
+{
+ ParoleStream *stream;
+
+ stream = PAROLE_STREAM (object);
+
+ if (pixbuf)
+ PAROLE_STREAM_GET_PRIVATE (stream)->image = gdk_pixbuf_copy(pixbuf);
+ else
+ PAROLE_STREAM_GET_PRIVATE (stream)->image = NULL;
+}
+
+GdkPixbuf *
+parole_stream_get_image (GObject *object)
+{
+ ParoleStream *stream;
+ GdkPixbuf *pixbuf;
+
+ stream = PAROLE_STREAM (object);
+
+ if (PAROLE_STREAM_GET_PRIVATE (stream)->image)
+ pixbuf = gdk_pixbuf_copy(GDK_PIXBUF(PAROLE_STREAM_GET_PRIVATE (stream)->image));
+ else
+ pixbuf = NULL;
+
+ return pixbuf;
+}
+
static void
parole_stream_class_init (ParoleStreamClass *klass)
{
diff --git a/src/misc/parole-stream.h b/src/misc/parole-stream.h
index 46e7ef1..8fa4ef5 100644
--- a/src/misc/parole-stream.h
+++ b/src/misc/parole-stream.h
@@ -26,6 +26,7 @@
#define __PAROLE_STREAM_H
#include <glib-object.h>
+#include <gdk/gdkx.h>
G_BEGIN_DECLS
@@ -74,6 +75,10 @@ struct _ParoleStreamClass
GType parole_stream_get_type (void) G_GNUC_CONST;
+void parole_stream_set_image (GObject *object, GdkPixbuf *pixbuf);
+
+GdkPixbuf *parole_stream_get_image (GObject *object);
+
ParoleStream *parole_stream_new (void);
void parole_stream_init_properties (ParoleStream *stream);
diff --git a/src/parole-player.c b/src/parole-player.c
index 6a96ab1..8c81b92 100644
--- a/src/parole-player.c
+++ b/src/parole-player.c
@@ -70,6 +70,7 @@
#include "common/parole-common.h"
+int GTK_ICON_SIZE_ARTWORK_FALLBACK;
static void
get_time_string (gchar *timestring, gint total_seconds)
@@ -263,7 +264,7 @@ static void parole_player_subtitles_radio_menu_item_changed_cb(GtkWidget *widget
gboolean parole_player_key_press (GtkWidget *widget,
GdkEventKey *ev,
ParolePlayer *player);
-
+
static GtkTargetEntry target_entry[] =
{
{ "STRING", 0, 0 },
@@ -1564,6 +1565,7 @@ parole_player_media_tag_cb (ParoleGst *gst, const ParoleStream *stream, ParolePl
gchar *title;
gchar *album;
gchar *artist;
+ GdkPixbuf *image = NULL;
if ( player->priv->row )
{
@@ -1603,6 +1605,15 @@ parole_player_media_tag_cb (ParoleGst *gst, const ParoleStream *stream, ParolePl
{
gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_artist), g_strdup_printf("<big>%s</big>", _("Unknown")));
}
+
+ image = parole_stream_get_image(G_OBJECT(stream));
+ if (image)
+ {
+ image = gdk_pixbuf_scale_simple(image, 200, 200, GDK_INTERP_BILINEAR);
+ gtk_image_set_from_pixbuf(GTK_IMAGE(player->priv->audiobox_cover), image);
+ }
+ else
+ gtk_image_set_from_icon_name(GTK_IMAGE(player->priv->audiobox_cover), "audio-x-generic", GTK_ICON_SIZE_ARTWORK_FALLBACK);
}
}
@@ -2667,7 +2678,7 @@ parole_player_init (ParolePlayer *player)
/* Audio box */
player->priv->audiobox = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox"));
- player->priv->audiobox_cover = GTK_WIDGET (gtk_builder_get_object (builder, "cover"));
+ player->priv->audiobox_cover = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox_cover"));
player->priv->audiobox_title = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox_title"));
player->priv->audiobox_album = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox_album"));
player->priv->audiobox_artist = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox_artist"));
More information about the Xfce4-commits
mailing list