summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO54
-rw-r--r--Don-t-use-the-new-decoded-pad-signal-of-decodebin.patch62
-rw-r--r--Initial-port-to-GStreamer-1.0.patch1022
-rw-r--r--PKGBUILD74
-rw-r--r--Remove-IDBusExportable-inheritance-from-exported-int.patch132
-rw-r--r--Remove-build-time-enable-gapless-playback-option.patch202
-rw-r--r--Use-dbus-2.patch66
-rw-r--r--Use-new-style-GStreamer-1.0-raw-audio-caps-in-the-WA.patch21
-rw-r--r--sqlite_fix.patch147
9 files changed, 1780 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..8c914901993a
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,54 @@
+pkgbase = banshee
+ pkgdesc = Music management and playback for GNOME
+ pkgver = 2.6.2
+ pkgrel = 9
+ url = http://banshee.fm/
+ arch = i686
+ arch = x86_64
+ license = MIT
+ makedepends = intltool
+ makedepends = gnome-doc-utils
+ makedepends = gtk-sharp-beans
+ makedepends = gnome-common
+ depends = libxxf86vm
+ depends = gst-plugins-base-libs
+ depends = mono-addins
+ depends = dbus-sharp-glib
+ depends = webkitgtk2
+ depends = libsoup-gnome
+ depends = gdata-sharp
+ depends = taglib-sharp-git
+ depends = gudev-sharp
+ depends = gkeyfile-sharp
+ depends = gconf-sharp
+ depends = libmtp
+ depends = libgpod
+ depends = mono-zeroconf
+ depends = hicolor-icon-theme
+ depends = media-player-info
+ depends = gst-plugins-bad
+ depends = mono-upnp
+ depends = gst-plugins-good
+ depends = gvfs
+ optdepends = gst-plugins-ugly: Extra media codecs
+ optdepends = gst-libav: Extra media codecs
+ optdepends = brasero: CD burning
+ source = http://download.gnome.org/sources/banshee/2.6/banshee-2.6.2.tar.xz
+ source = Initial-port-to-GStreamer-1.0.patch
+ source = Remove-build-time-enable-gapless-playback-option.patch
+ source = Don-t-use-the-new-decoded-pad-signal-of-decodebin.patch
+ source = Use-new-style-GStreamer-1.0-raw-audio-caps-in-the-WA.patch
+ source = sqlite_fix.patch
+ source = Remove-IDBusExportable-inheritance-from-exported-int.patch
+ source = Use-dbus-2.patch
+ md5sums = 12dbb8a996783f7081d538062a8589b7
+ md5sums = 16cbe2ef60e6f9b22015585bb3209648
+ md5sums = 0bf7ee4241b12538779c9ecc401d142a
+ md5sums = f87534f54029794bd7be2a123ab01300
+ md5sums = d092827720e4a11549587eb3131123ae
+ md5sums = 2677e6edc2e0d2ce8994adc852dda362
+ md5sums = 3b28f10e167c0aae27157dcc3b828b67
+ md5sums = 2c4436f7aba58fdd0c5a38d709d73e5c
+
+pkgname = banshee
+
diff --git a/Don-t-use-the-new-decoded-pad-signal-of-decodebin.patch b/Don-t-use-the-new-decoded-pad-signal-of-decodebin.patch
new file mode 100644
index 000000000000..3a012c990776
--- /dev/null
+++ b/Don-t-use-the-new-decoded-pad-signal-of-decodebin.patch
@@ -0,0 +1,62 @@
+From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <slomo@circular-chaos.org>
+Date: Tue, 28 May 2013 11:36:04 +0200
+Subject: Don't use the new-decoded-pad signal of decodebin
+
+It is not available anymore in 1.0 and pad-added should be used.
+---
+ libbanshee/banshee-bpmdetector.c | 8 ++++----
+ libbanshee/banshee-transcoder.c | 8 ++++----
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/libbanshee/banshee-bpmdetector.c b/libbanshee/banshee-bpmdetector.c
+index 68b0419..131d2e5 100644
+--- a/libbanshee/banshee-bpmdetector.c
++++ b/libbanshee/banshee-bpmdetector.c
+@@ -159,8 +159,8 @@ bbd_pipeline_bus_callback (GstBus *bus, GstMessage *message, gpointer data)
+ }
+
+ static void
+-bbd_new_decoded_pad(GstElement *decodebin, GstPad *pad,
+- gboolean last, gpointer data)
++bbd_pad_added(GstElement *decodebin, GstPad *pad,
++ gpointer data)
+ {
+ GstCaps *caps;
+ GstStructure *str;
+@@ -244,8 +244,8 @@ bbd_pipeline_construct (BansheeBpmDetector *detector)
+ }
+
+ // decodebin and audioconvert are linked dynamically when the decodebin creates a new pad
+- g_signal_connect(detector->decodebin, "new-decoded-pad",
+- G_CALLBACK(bbd_new_decoded_pad), detector);
++ g_signal_connect(detector->decodebin, "pad-added",
++ G_CALLBACK(bbd_pad_added), detector);
+
+ if (!gst_element_link_many (detector->audioconvert, detector->bpmdetect, detector->fakesink, NULL)) {
+ bbd_raise_error (detector, _("Could not link pipeline elements"), NULL);
+diff --git a/libbanshee/banshee-transcoder.c b/libbanshee/banshee-transcoder.c
+index 0e241f0..f678838 100644
+--- a/libbanshee/banshee-transcoder.c
++++ b/libbanshee/banshee-transcoder.c
+@@ -185,8 +185,8 @@ gst_transcoder_build_encoder(const gchar *encoder_pipeline)
+ }
+
+ static void
+-gst_transcoder_new_decoded_pad(GstElement *decodebin, GstPad *pad,
+- gboolean last, gpointer data)
++gst_transcoder_pad_added(GstElement *decodebin, GstPad *pad,
++ gpointer data)
+ {
+ GstCaps *caps;
+ GstStructure *str;
+@@ -293,8 +293,8 @@ gst_transcoder_create_pipeline(GstTranscoder *transcoder,
+
+ gst_element_link(source_elem, decoder_elem);
+
+- g_signal_connect(decoder_elem, "new-decoded-pad",
+- G_CALLBACK(gst_transcoder_new_decoded_pad), transcoder);
++ g_signal_connect(decoder_elem, "pad-added",
++ G_CALLBACK(gst_transcoder_pad_added), transcoder);
+
+ gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(transcoder->pipeline)),
+ gst_transcoder_bus_callback, transcoder);
diff --git a/Initial-port-to-GStreamer-1.0.patch b/Initial-port-to-GStreamer-1.0.patch
new file mode 100644
index 000000000000..be6593715263
--- /dev/null
+++ b/Initial-port-to-GStreamer-1.0.patch
@@ -0,0 +1,1022 @@
+From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian.droege@collabora.co.uk>
+Date: Wed, 19 Sep 2012 11:34:06 +0200
+Subject: Initial port to GStreamer 1.0
+
+---
+ build/m4/banshee/gstreamer.m4 | 19 +++---
+ data/audio-profiles/wav.xml.in | 5 +-
+ libbanshee/banshee-bpmdetector.c | 11 ++--
+ libbanshee/banshee-gst.h | 4 +-
+ libbanshee/banshee-player-cdda.c | 5 +-
+ libbanshee/banshee-player-dvd.c | 4 +-
+ libbanshee/banshee-player-equalizer.c | 4 +-
+ libbanshee/banshee-player-missing-elements.c | 2 +-
+ libbanshee/banshee-player-pipeline.c | 37 ++++++-----
+ libbanshee/banshee-player-private.h | 13 ++--
+ libbanshee/banshee-player-replaygain.c | 29 ++++-----
+ libbanshee/banshee-player-video.c | 89 +++++++++++++-------------
+ libbanshee/banshee-player-vis.c | 88 ++++++++-----------------
+ libbanshee/banshee-player.c | 11 ++--
+ libbanshee/banshee-ripper.c | 16 ++---
+ libbanshee/banshee-tagger.c | 2 +-
+ libbanshee/banshee-transcoder.c | 19 +++---
+ 17 files changed, 156 insertions(+), 202 deletions(-)
+
+diff --git a/build/m4/banshee/gstreamer.m4 b/build/m4/banshee/gstreamer.m4
+index 6267cce..917cf58 100644
+--- a/build/m4/banshee/gstreamer.m4
++++ b/build/m4/banshee/gstreamer.m4
+@@ -1,17 +1,18 @@
+ AC_DEFUN([BANSHEE_CHECK_GSTREAMER],
+ [
+- GSTREAMER_REQUIRED_VERSION=0.10.26
++ GSTREAMER_REQUIRED_VERSION=0.11.99
+ AC_SUBST(GSTREAMER_REQUIRED_VERSION)
+
+ PKG_CHECK_MODULES(GST,
+- gstreamer-0.10 >= $GSTREAMER_REQUIRED_VERSION
+- gstreamer-base-0.10 >= $GSTREAMER_REQUIRED_VERSION
+- gstreamer-plugins-base-0.10 >= $GSTREAMER_REQUIRED_VERSION
+- gstreamer-controller-0.10 >= $GSTREAMER_REQUIRED_VERSION
+- gstreamer-dataprotocol-0.10 >= $GSTREAMER_REQUIRED_VERSION
+- gstreamer-fft-0.10 >= $GSTREAMER_REQUIRED_VERSION)
+-
+- GST_LIBS="$GST_LIBS -lgstvideo-0.10 -lgstinterfaces-0.10 -lgstcdda-0.10 -lgstpbutils-0.10 -lgsttag-0.10"
++ gstreamer-1.0 >= $GSTREAMER_REQUIRED_VERSION
++ gstreamer-base-1.0 >= $GSTREAMER_REQUIRED_VERSION
++ gstreamer-controller-1.0 >= $GSTREAMER_REQUIRED_VERSION
++ gstreamer-plugins-base-1.0 >= $GSTREAMER_REQUIRED_VERSION
++ gstreamer-audio-1.0 >= $GSTREAMER_REQUIRED_VERSION
++ gstreamer-fft-1.0 >= $GSTREAMER_REQUIRED_VERSION
++ gstreamer-pbutils-1.0 >= $GSTREAMER_REQUIRED_VERSION
++ gstreamer-tag-1.0 >= $GSTREAMER_REQUIRED_VERSION
++ gstreamer-video-1.0 >= $GSTREAMER_REQUIRED_VERSION)
+
+ AC_SUBST(GST_CFLAGS)
+ AC_SUBST(GST_LIBS)
+diff --git a/data/audio-profiles/wav.xml.in b/data/audio-profiles/wav.xml.in
+index 35cd1d2..6dc1bab 100644
+--- a/data/audio-profiles/wav.xml.in
++++ b/data/audio-profiles/wav.xml.in
+@@ -14,10 +14,7 @@
+ "audioresample"
+ "audioconvert"
+ (+ "audio/x-raw-int, "
+- "endianness=(int)1234, "
+- "width=(int)16, "
+- "depth=(int)16, "
+- "signed=(boolean)true, "
++ "format=(string)S16LE, "
+ "rate=(int)44100, "
+ "channels=(int)2" )
+ "wavenc")
+diff --git a/libbanshee/banshee-bpmdetector.c b/libbanshee/banshee-bpmdetector.c
+index c06ffcb..68b0419 100644
+--- a/libbanshee/banshee-bpmdetector.c
++++ b/libbanshee/banshee-bpmdetector.c
+@@ -30,6 +30,7 @@
+ # include "config.h"
+ #endif
+
++#include <stdio.h>
+ #include <string.h>
+ #include <glib/gi18n.h>
+
+@@ -50,7 +51,7 @@ struct BansheeBpmDetector {
+
+ /*
+ * You can run this pipeline on the cmd line with:
+- * gst-launch -m filesrc location=/path/to/my.mp3 ! decodebin2 ! \
++ * gst-launch -m filesrc location=/path/to/my.mp3 ! decodebin ! \
+ * audioconvert ! bpmdetect ! fakesink
+ */
+
+@@ -168,14 +169,14 @@ bbd_new_decoded_pad(GstElement *decodebin, GstPad *pad,
+
+ g_return_if_fail(detector != NULL);
+
+- audiopad = gst_element_get_pad(detector->audioconvert, "sink");
++ audiopad = gst_element_get_static_pad(detector->audioconvert, "sink");
+
+ if(GST_PAD_IS_LINKED(audiopad)) {
+ g_object_unref(audiopad);
+ return;
+ }
+
+- caps = gst_pad_get_caps(pad);
++ caps = gst_pad_query_caps(pad, NULL);
+ str = gst_caps_get_structure(caps, 0);
+
+ if(!g_strrstr(gst_structure_get_name(str), "audio")) {
+@@ -209,9 +210,9 @@ bbd_pipeline_construct (BansheeBpmDetector *detector)
+ return FALSE;
+ }
+
+- detector->decodebin = gst_element_factory_make ("decodebin2", "decodebin2");
++ detector->decodebin = gst_element_factory_make ("decodebin", "decodebin");
+ if (detector->decodebin == NULL) {
+- bbd_raise_error (detector, _("Could not create decodebin2 plugin"), NULL);
++ bbd_raise_error (detector, _("Could not create decodebin plugin"), NULL);
+ return FALSE;
+ }
+
+diff --git a/libbanshee/banshee-gst.h b/libbanshee/banshee-gst.h
+index 85662cf..332f356 100644
+--- a/libbanshee/banshee-gst.h
++++ b/libbanshee/banshee-gst.h
+@@ -41,9 +41,11 @@
+ #define BANSHEE_GST_ITERATOR_ITERATE(iter,child_type,child_name,free,block) { \
+ gboolean iter##_done = FALSE; \
+ while (!iter##_done) { \
++ GValue child_value = {0, }; \
+ child_type child_name; \
+- switch (gst_iterator_next (iter, (gpointer)&child_name)) { \
++ switch (gst_iterator_next (iter, &child_value)) { \
+ case GST_ITERATOR_OK: { \
++ child_name = (child_type) g_value_get_object(&child_value); \
+ { block; } \
+ break; \
+ } \
+diff --git a/libbanshee/banshee-player-cdda.c b/libbanshee/banshee-player-cdda.c
+index 8be2bdd..401edf0 100644
+--- a/libbanshee/banshee-player-cdda.c
++++ b/libbanshee/banshee-player-cdda.c
+@@ -28,7 +28,8 @@
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ //
+
+-#include <gst/cdda/gstcddabasesrc.h>
++#include <stdlib.h>
++#include <gst/audio/gstaudiocdsrc.h>
+ #include "banshee-player-cdda.h"
+
+ // ---------------------------------------------------------------------------
+@@ -46,7 +47,7 @@ bp_cdda_get_cdda_source (GstElement *playbin)
+
+ g_object_get (playbin, "source", &source, NULL);
+
+- if (source == NULL || !GST_IS_CDDA_BASE_SRC (source)) {
++ if (source == NULL || !GST_IS_AUDIO_CD_SRC (source)) {
+ if (source != NULL) {
+ g_object_unref (source);
+ }
+diff --git a/libbanshee/banshee-player-dvd.c b/libbanshee/banshee-player-dvd.c
+index 55d499c..991b506 100644
+--- a/libbanshee/banshee-player-dvd.c
++++ b/libbanshee/banshee-player-dvd.c
+@@ -296,7 +296,7 @@ bp_dvd_go_to_next_chapter (BansheePlayer *player)
+ {
+ gint64 index;
+ GstFormat format = gst_format_get_by_nick ("chapter");
+- gst_element_query_position (player->playbin, &format, &index);
++ gst_element_query_position (player->playbin, format, &index);
+ gst_element_seek (player->playbin, 1.0, format, GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_TYPE_SET, index + 1, GST_SEEK_TYPE_NONE, 0);
+ }
+@@ -306,7 +306,7 @@ bp_dvd_go_to_previous_chapter (BansheePlayer *player)
+ {
+ gint64 index;
+ GstFormat format = gst_format_get_by_nick ("chapter");
+- gst_element_query_position (player->playbin, &format, &index);
++ gst_element_query_position (player->playbin, format, &index);
+ gst_element_seek (player->playbin, 1.0, format, GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_TYPE_SET, index - 1, GST_SEEK_TYPE_NONE, 0);
+ }
+diff --git a/libbanshee/banshee-player-equalizer.c b/libbanshee/banshee-player-equalizer.c
+index a496ada..0cbb3b7 100644
+--- a/libbanshee/banshee-player-equalizer.c
++++ b/libbanshee/banshee-player-equalizer.c
+@@ -122,7 +122,7 @@ bp_equalizer_set_gain (BansheePlayer *player, guint bandnum, gdouble gain)
+ g_return_if_fail (IS_BANSHEE_PLAYER (player));
+
+ if (player->equalizer != NULL) {
+- GstObject *band;
++ GObject *band;
+
+ g_return_if_fail (bandnum < gst_child_proxy_get_children_count (GST_CHILD_PROXY (player->equalizer)));
+
+@@ -188,7 +188,7 @@ bp_equalizer_get_frequencies (BansheePlayer *player, gdouble **freq)
+ count = gst_child_proxy_get_children_count (GST_CHILD_PROXY (player->equalizer));
+
+ for (i = 0; i < count; i++) {
+- GstObject *band;
++ GObject *band;
+
+ band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (player->equalizer), i);
+ g_object_get (G_OBJECT (band), "freq", &(*freq)[i], NULL);
+diff --git a/libbanshee/banshee-player-missing-elements.c b/libbanshee/banshee-player-missing-elements.c
+index 20804c4..30118c5 100644
+--- a/libbanshee/banshee-player-missing-elements.c
++++ b/libbanshee/banshee-player-missing-elements.c
+@@ -170,7 +170,7 @@ _bp_missing_elements_handle_state_changed (BansheePlayer *player, GstState old,
+ }
+ #endif
+
+- install_return = gst_install_plugins_async (details, player->install_plugins_context,
++ install_return = gst_install_plugins_async ((const gchar * const*) details, player->install_plugins_context,
+ bp_missing_elements_handle_install_result, player);
+
+ if (install_return != GST_INSTALL_PLUGINS_STARTED_OK) {
+diff --git a/libbanshee/banshee-player-pipeline.c b/libbanshee/banshee-player-pipeline.c
+index ed845f3..6c2af35 100644
+--- a/libbanshee/banshee-player-pipeline.c
++++ b/libbanshee/banshee-player-pipeline.c
+@@ -76,7 +76,7 @@ playbin_stream_changed_cb (GstElement * element, BansheePlayer *player)
+ GstMessage *msg;
+
+ // We're being called from the streaming thread, so don't do anything here
+- msg = gst_message_new_application (GST_OBJECT (player->playbin), gst_structure_new ("stream-changed", NULL));
++ msg = gst_message_new_application (GST_OBJECT (player->playbin), gst_structure_new_empty ("stream-changed"));
+ gst_element_post_message (player->playbin, msg);
+ }
+
+@@ -218,6 +218,11 @@ bp_pipeline_bus_callback (GstBus *bus, GstMessage *message, gpointer userdata)
+ break;
+ }
+
++ case GST_MESSAGE_STREAM_START: {
++ bp_next_track_starting (player);
++ break;
++ }
++
+ case GST_MESSAGE_APPLICATION: {
+ const gchar * name;
+ const GstStructure * s = gst_message_get_structure (message);
+@@ -289,11 +294,11 @@ _bp_pipeline_construct (BansheePlayer *player)
+
+ // Playbin is the core element that handles autoplugging (finding the right
+ // source and decoder elements) based on source URI and stream content
+- player->playbin = gst_element_factory_make ("playbin2", "playbin");
++ player->playbin = gst_element_factory_make ("playbin", "playbin");
+
+ #ifdef ENABLE_GAPLESS
+ // FIXME: Connect a proxy about-to-finish callback that will generate a next-track-starting callback.
+- // This can be removed once playbin2 generates its own next-track signal.
++ // This can be removed once playbin generates its own next-track signal.
+ // bgo#584987 - this is included in >= 0.10.26
+ g_signal_connect (player->playbin, "about-to-finish", G_CALLBACK (bp_about_to_finish_callback), player);
+ #endif //ENABLE_GAPLESS
+@@ -305,18 +310,13 @@ _bp_pipeline_construct (BansheePlayer *player)
+ g_signal_connect (player->playbin, "audio-changed", G_CALLBACK (playbin_stream_changed_cb), player);
+ g_signal_connect (player->playbin, "text-changed", G_CALLBACK (playbin_stream_changed_cb), player);
+
+- // Try to find an audio sink, prefer gconf, which typically is set to auto these days,
+- // fall back on auto, which should work on windows, and as a last ditch, try alsa
+- audiosink = gst_element_factory_make ("gconfaudiosink", "audiosink");
+- if (audiosink == NULL) {
+- audiosink = gst_element_factory_make ("directsoundsink", "audiosink");
+- if (audiosink != NULL) {
+- g_object_set (G_OBJECT (audiosink), "volume", 1.0, NULL);
+- } else {
+- audiosink = gst_element_factory_make ("autoaudiosink", "audiosink");
+- if (audiosink == NULL) {
+- audiosink = gst_element_factory_make ("alsasink", "audiosink");
+- }
++ audiosink = gst_element_factory_make ("directsoundsink", "audiosink");
++ if (audiosink != NULL) {
++ g_object_set (G_OBJECT (audiosink), "volume", 1.0, NULL);
++ } else {
++ audiosink = gst_element_factory_make ("autoaudiosink", "audiosink");
++ if (audiosink == NULL) {
++ audiosink = gst_element_factory_make ("alsasink", "audiosink");
+ }
+ }
+
+@@ -341,7 +341,6 @@ _bp_pipeline_construct (BansheePlayer *player)
+ GstIterator *elem_iter = gst_bin_iterate_recurse (GST_BIN (audiosink));
+ BANSHEE_GST_ITERATOR_ITERATE (elem_iter, GstElement *, element, TRUE, {
+ player->audiosink_has_volume |= g_object_class_find_property (G_OBJECT_GET_CLASS (element), "volume") != NULL;
+- gst_object_unref (element);
+ });
+ }
+ bp_debug ("Audiosink has volume: %s",
+@@ -383,7 +382,7 @@ _bp_pipeline_construct (BansheePlayer *player)
+ }
+
+ // Ghost pad the audio bin so audio is passed from the bin into the tee
+- teepad = gst_element_get_pad (player->audiotee, "sink");
++ teepad = gst_element_get_static_pad (player->audiotee, "sink");
+ gst_element_add_pad (player->audiobin, gst_ghost_pad_new ("sink", teepad));
+ gst_object_unref (teepad);
+
+@@ -411,8 +410,8 @@ _bp_pipeline_construct (BansheePlayer *player)
+ gst_bus_add_watch (bus, bp_pipeline_bus_callback, player);
+
+ // Link the first tee pad to the primary audio sink queue
+- GstPad *sinkpad = gst_element_get_pad (audiosinkqueue, "sink");
+- pad = gst_element_get_request_pad (player->audiotee, "src%d");
++ GstPad *sinkpad = gst_element_get_static_pad (audiosinkqueue, "sink");
++ pad = gst_element_get_request_pad (player->audiotee, "src_%u");
+ g_object_set(player->audiotee, "alloc-pad", pad, NULL);
+ gst_pad_link (pad, sinkpad);
+ gst_object_unref (GST_OBJECT (pad));
+diff --git a/libbanshee/banshee-player-private.h b/libbanshee/banshee-player-private.h
+index 9fed356..9346911 100644
+--- a/libbanshee/banshee-player-private.h
++++ b/libbanshee/banshee-player-private.h
+@@ -42,14 +42,14 @@
+ #include <gst/fft/gstfftf32.h>
+ #include <gst/pbutils/pbutils.h>
+ #include <gst/tag/tag.h>
+-#include <gst/interfaces/navigation.h>
++#include <gst/video/navigation.h>
+
+ #if defined(GDK_WINDOWING_X11)
+ # include <gdk/gdkx.h>
+-# include <gst/interfaces/xoverlay.h>
++# include <gst/video/videooverlay.h>
+ #elif defined(GDK_WINDOWING_WIN32)
+ # include <gdk/gdkwin32.h>
+-# include <gst/interfaces/xoverlay.h>
++# include <gst/video/videooverlay.h>
+ #endif
+
+ #include "banshee-gst.h"
+@@ -155,11 +155,11 @@ struct BansheePlayer {
+ // Video State
+ BpVideoDisplayContextType video_display_context_type;
+ #if defined(GDK_WINDOWING_X11)
+- GstXOverlay *xoverlay;
++ GstVideoOverlay *video_overlay;
+ GdkWindow *video_window;
+ XID video_window_xid;
+ #elif defined(GDK_WINDOWING_WIN32)
+- GstXOverlay *xoverlay;
++ GstVideoOverlay *video_overlay;
+ GdkWindow *video_window;
+ HWND video_window_xid;
+ #endif
+@@ -179,6 +179,8 @@ struct BansheePlayer {
+ GstFFTF32 *vis_fft;
+ GstFFTF32Complex *vis_fft_buffer;
+ gfloat *vis_fft_sample_buffer;
++ GstPad *vis_event_probe_pad;
++ gulong vis_event_probe_id;
+
+ // Plugin Installer State
+ GdkWindow *window;
+@@ -197,6 +199,7 @@ struct BansheePlayer {
+ // http://replaygain.hydrogenaudio.org/player_scale.html
+ gdouble rg_gain_history[10];
+ gint history_size;
++ gulong rg_pad_block_id;
+
+ //dvd navigation
+ GstNavigation *navigation;
+diff --git a/libbanshee/banshee-player-replaygain.c b/libbanshee/banshee-player-replaygain.c
+index a479d4a..e42b197 100644
+--- a/libbanshee/banshee-player-replaygain.c
++++ b/libbanshee/banshee-player-replaygain.c
+@@ -79,17 +79,13 @@ static void on_target_gain_changed (GstElement *rgvolume, GParamSpec *pspec, Ban
+ _bp_rgvolume_print_volume (player);
+ }
+
+-static void
+-pad_block_cb (GstPad *srcPad, gboolean blocked, gpointer user_data)
++static GstPadProbeReturn
++pad_block_cb (GstPad *srcPad, GstPadProbeInfo *info, gpointer user_data)
+ {
+ BansheePlayer* player;
+
+- if (!blocked) {
+- return;
+- }
+-
+ player = (BansheePlayer*) user_data;
+- g_return_if_fail (IS_BANSHEE_PLAYER (player));
++ g_return_val_if_fail (IS_BANSHEE_PLAYER (player), GST_PAD_PROBE_OK);
+
+ // The pad_block_cb can get triggered multiple times, on different threads.
+ // Lock around the link/unlink code, so we don't end up going through here
+@@ -99,11 +95,9 @@ pad_block_cb (GstPad *srcPad, gboolean blocked, gpointer user_data)
+ if ((player->replaygain_enabled && player->rgvolume_in_pipeline) ||
+ (!player->replaygain_enabled && !player->rgvolume_in_pipeline)) {
+ // The pipeline is already in the correct state. Unblock the pad, and return.
++ player->rg_pad_block_id = 0;
+ g_mutex_unlock (player->replaygain_mutex);
+- if (gst_pad_is_blocked (srcPad)) {
+- gst_pad_set_blocked_async (srcPad, FALSE, &pad_block_cb, player);
+- }
+- return;
++ return GST_PAD_PROBE_REMOVE;
+ }
+
+ if (player->rgvolume_in_pipeline) {
+@@ -139,13 +133,12 @@ pad_block_cb (GstPad *srcPad, gboolean blocked, gpointer user_data)
+ }
+
+ // Our state is now consistent
++ player->rg_pad_block_id = 0;
+ g_mutex_unlock (player->replaygain_mutex);
+
+- if (gst_pad_is_blocked (srcPad)) {
+- gst_pad_set_blocked_async (srcPad, FALSE, &pad_block_cb, player);
+- }
+-
+ _bp_rgvolume_print_volume (player);
++
++ return GST_PAD_PROBE_REMOVE;
+ }
+
+ // ---------------------------------------------------------------------------
+@@ -187,9 +180,9 @@ void _bp_replaygain_pipeline_rebuild (BansheePlayer* player)
+ srcPad = gst_element_get_static_pad (player->before_rgvolume, "src");
+
+ if (gst_pad_is_active (srcPad) && !gst_pad_is_blocked (srcPad)) {
+- gst_pad_set_blocked_async (srcPad, TRUE, &pad_block_cb, player);
+- } else if (srcPad->block_callback == NULL) {
+- pad_block_cb (srcPad, TRUE, player);
++ player->rg_pad_block_id = gst_pad_add_probe (srcPad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM, &pad_block_cb, player, NULL);
++ } else if (!player->rg_pad_block_id) {
++ pad_block_cb (srcPad, NULL, player);
+ }
+ }
+
+diff --git a/libbanshee/banshee-player-video.c b/libbanshee/banshee-player-video.c
+index b901354..eb95c3f 100644
+--- a/libbanshee/banshee-player-video.c
++++ b/libbanshee/banshee-player-video.c
+@@ -37,54 +37,54 @@
+ #if defined(GDK_WINDOWING_X11) || defined(GDK_WINDOWING_WIN32)
+
+ static gboolean
+-bp_video_find_xoverlay (BansheePlayer *player)
++bp_video_find_video_overlay (BansheePlayer *player)
+ {
+ GstElement *video_sink = NULL;
+- GstElement *xoverlay;
+- GstXOverlay *previous_xoverlay;
+- gboolean found_xoverlay;
++ GstElement *video_overlay;
++ GstVideoOverlay *previous_video_overlay;
++ gboolean found_video_overlay;
+
+ g_object_get (player->playbin, "video-sink", &video_sink, NULL);
+
+ g_mutex_lock (player->video_mutex);
+- previous_xoverlay = player->xoverlay;
++ previous_video_overlay = player->video_overlay;
+
+ if (video_sink == NULL) {
+- player->xoverlay = NULL;
+- if (previous_xoverlay != NULL) {
+- gst_object_unref (previous_xoverlay);
++ player->video_overlay = NULL;
++ if (previous_video_overlay != NULL) {
++ gst_object_unref (previous_video_overlay);
+ }
+ g_mutex_unlock (player->video_mutex);
+ return FALSE;
+ }
+
+- xoverlay = GST_IS_BIN (video_sink)
+- ? gst_bin_get_by_interface (GST_BIN (video_sink), GST_TYPE_X_OVERLAY)
++ video_overlay = GST_IS_BIN (video_sink)
++ ? gst_bin_get_by_interface (GST_BIN (video_sink), GST_TYPE_VIDEO_OVERLAY)
+ : video_sink;
+
+- player->xoverlay = GST_IS_X_OVERLAY (xoverlay) ? GST_X_OVERLAY (xoverlay) : NULL;
++ player->video_overlay = GST_IS_VIDEO_OVERLAY (video_overlay) ? GST_VIDEO_OVERLAY (video_overlay) : NULL;
+
+- if (previous_xoverlay != NULL) {
+- gst_object_unref (previous_xoverlay);
++ if (previous_video_overlay != NULL) {
++ gst_object_unref (previous_video_overlay);
+ }
+
+ #if !defined(GDK_WINDOWING_WIN32) // We can't rely on aspect ratio from dshowvideosink
+- if (player->xoverlay != NULL && g_object_class_find_property (
+- G_OBJECT_GET_CLASS (player->xoverlay), "force-aspect-ratio")) {
+- g_object_set (G_OBJECT (player->xoverlay), "force-aspect-ratio", TRUE, NULL);
++ if (player->video_overlay != NULL && g_object_class_find_property (
++ G_OBJECT_GET_CLASS (player->video_overlay), "force-aspect-ratio")) {
++ g_object_set (G_OBJECT (player->video_overlay), "force-aspect-ratio", TRUE, NULL);
+ }
+ #endif
+
+- if (player->xoverlay != NULL && g_object_class_find_property (
+- G_OBJECT_GET_CLASS (player->xoverlay), "handle-events")) {
+- g_object_set (G_OBJECT (player->xoverlay), "handle-events", FALSE, NULL);
++ if (player->video_overlay != NULL && g_object_class_find_property (
++ G_OBJECT_GET_CLASS (player->video_overlay), "handle-events")) {
++ g_object_set (G_OBJECT (player->video_overlay), "handle-events", FALSE, NULL);
+ }
+
+ gst_object_unref (video_sink);
+- found_xoverlay = (player->xoverlay != NULL) ? TRUE : FALSE;
++ found_video_overlay = (player->video_overlay != NULL) ? TRUE : FALSE;
+
+ g_mutex_unlock (player->video_mutex);
+- return found_xoverlay;
++ return found_video_overlay;
+ }
+
+ #endif /* GDK_WINDOWING_X11 || GDK_WINDOWING_WIN32 */
+@@ -130,27 +130,27 @@ bp_video_sink_element_added (GstBin *videosink, GstElement *element, BansheePlay
+ g_return_if_fail (IS_BANSHEE_PLAYER (player));
+
+ #if defined(GDK_WINDOWING_X11) || defined(GDK_WINDOWING_WIN32)
+- bp_video_find_xoverlay (player);
++ bp_video_find_video_overlay (player);
+ #endif
+ }
+
+ static void
+ bp_video_bus_element_sync_message (GstBus *bus, GstMessage *message, BansheePlayer *player)
+ {
+- gboolean found_xoverlay;
++ gboolean found_video_overlay;
+
+ g_return_if_fail (IS_BANSHEE_PLAYER (player));
+
+ #if defined(GDK_WINDOWING_X11) || defined(GDK_WINDOWING_WIN32)
+
+- if (message->structure == NULL || !gst_structure_has_name (message->structure, "prepare-xwindow-id")) {
++ if (!gst_is_video_overlay_prepare_window_handle_message (message)) {
+ return;
+ }
+
+- found_xoverlay = bp_video_find_xoverlay (player);
++ found_video_overlay = bp_video_find_video_overlay (player);
+
+- if (found_xoverlay) {
+- gst_x_overlay_set_xwindow_id (player->xoverlay, player->video_window_xid);
++ if (found_video_overlay) {
++ gst_video_overlay_set_window_handle (player->video_overlay, player->video_window_xid);
+ }
+
+ #endif
+@@ -164,7 +164,7 @@ static void
+ cb_caps_set (GObject *obj, GParamSpec *pspec, BansheePlayer *p)
+ {
+ GstStructure * s = NULL;
+- GstCaps * caps = gst_pad_get_negotiated_caps (GST_PAD (obj));
++ GstCaps * caps = gst_pad_get_current_caps (GST_PAD (obj));
+
+ if (G_UNLIKELY (!caps)) {
+ return;
+@@ -219,7 +219,7 @@ _bp_parse_stream_info (BansheePlayer *player)
+ }
+
+ if (G_LIKELY (vpad)) {
+- GstCaps *caps = gst_pad_get_negotiated_caps (vpad);
++ GstCaps *caps = gst_pad_get_current_caps (vpad);
+ if (G_LIKELY (caps)) {
+ cb_caps_set (G_OBJECT (vpad), NULL, player);
+ gst_caps_unref (caps);
+@@ -249,21 +249,18 @@ _bp_video_pipeline_setup (BansheePlayer *player, GstBus *bus)
+
+ player->video_display_context_type = BP_VIDEO_DISPLAY_CONTEXT_GDK_WINDOW;
+
+- videosink = gst_element_factory_make ("gconfvideosink", "videosink");
++ videosink = gst_element_factory_make ("autovideosink", "videosink");
+ if (videosink == NULL) {
+- videosink = gst_element_factory_make ("autovideosink", "videosink");
+- if (videosink == NULL) {
+- player->video_display_context_type = BP_VIDEO_DISPLAY_CONTEXT_UNSUPPORTED;
+- videosink = gst_element_factory_make ("fakesink", "videosink");
+- if (videosink != NULL) {
+- g_object_set (G_OBJECT (videosink), "sync", TRUE, NULL);
+- }
++ player->video_display_context_type = BP_VIDEO_DISPLAY_CONTEXT_UNSUPPORTED;
++ videosink = gst_element_factory_make ("fakesink", "videosink");
++ if (videosink != NULL) {
++ g_object_set (G_OBJECT (videosink), "sync", TRUE, NULL);
+ }
+ }
+
+ g_object_set (G_OBJECT (player->playbin), "video-sink", videosink, NULL);
+
+- gst_bus_set_sync_handler (bus, gst_bus_sync_signal_handler, player);
++ gst_bus_set_sync_handler (bus, gst_bus_sync_signal_handler, player, NULL);
+ g_signal_connect (bus, "sync-message::element", G_CALLBACK (bp_video_bus_element_sync_message), player);
+
+ if (GST_IS_BIN (videosink)) {
+@@ -349,21 +346,21 @@ bp_video_window_expose (BansheePlayer *player, GdkWindow *window, gboolean direc
+ {
+ g_return_if_fail (IS_BANSHEE_PLAYER (player));
+
+- if (direct && player->xoverlay != NULL && GST_IS_X_OVERLAY (player->xoverlay)) {
+- gst_x_overlay_expose (player->xoverlay);
++ if (direct && player->video_overlay != NULL && GST_IS_VIDEO_OVERLAY (player->video_overlay)) {
++ gst_video_overlay_expose (player->video_overlay);
+ return;
+ }
+
+- if (player->xoverlay == NULL && !bp_video_find_xoverlay (player)) {
++ if (player->video_overlay == NULL && !bp_video_find_video_overlay (player)) {
+ return;
+ }
+
+- gst_object_ref (player->xoverlay);
++ gst_object_ref (player->video_overlay);
+
+- gst_x_overlay_set_xwindow_id (player->xoverlay, player->video_window_xid);
+- gst_x_overlay_expose (player->xoverlay);
++ gst_video_overlay_set_window_handle (player->video_overlay, player->video_window_xid);
++ gst_video_overlay_expose (player->video_overlay);
+
+- gst_object_unref (player->xoverlay);
++ gst_object_unref (player->video_overlay);
+ }
+
+ // MUST be called from the GTK main thread; calling it in OnRealized will do the right thing.
+@@ -379,7 +376,7 @@ bp_video_window_realize (BansheePlayer *player, GdkWindow *window)
+ // //Explicitly create the native window. GDK_WINDOW_XWINDOW will call this
+ // //function anyway, but this way we can raise a more useful message should it fail.
+ // if (!gdk_window_ensure_native (window)) {
+-// banshee_log (BANSHEE_LOG_TYPE_ERROR, "player-video", "Couldn't create native window needed for GstXOverlay!");
++// banshee_log (BANSHEE_LOG_TYPE_ERROR, "player-video", "Couldn't create native window needed for GstVideoOverlay!");
+ // }
+ //#endif
+
+diff --git a/libbanshee/banshee-player-vis.c b/libbanshee/banshee-player-vis.c
+index 5787c87..7e7dc78 100644
+--- a/libbanshee/banshee-player-vis.c
++++ b/libbanshee/banshee-player-vis.c
+@@ -27,17 +27,17 @@
+ //
+
+ #include <math.h>
++#include <gst/audio/audio.h>
+
+ #include "banshee-player-vis.h"
+
+ #define SLICE_SIZE 735
+
+ static GstStaticCaps vis_data_sink_caps = GST_STATIC_CAPS (
+- "audio/x-raw-float, "
++ "audio/x-raw, "
++ "format = (string) " GST_AUDIO_NE(F32) ", "
+ "rate = (int) 44100, "
+- "channels = (int) 2, "
+- "endianness = (int) BYTE_ORDER, "
+- "width = (int) 32"
++ "channels = (int) 2"
+ );
+
+ // ---------------------------------------------------------------------------
+@@ -48,6 +48,7 @@ static void
+ bp_vis_pcm_handoff (GstElement *sink, GstBuffer *buffer, GstPad *pad, gpointer userdata)
+ {
+ BansheePlayer *player = (BansheePlayer*)userdata;
++ GstCaps *caps;
+ GstStructure *structure;
+ gint channels, wanted_size;
+ gfloat *data;
+@@ -69,14 +70,16 @@ bp_vis_pcm_handoff (GstElement *sink, GstBuffer *buffer, GstPad *pad, gpointer u
+ player->vis_thawing = FALSE;
+ }
+
+- structure = gst_caps_get_structure (gst_buffer_get_caps (buffer), 0);
++ caps = gst_pad_get_current_caps (pad);
++ structure = gst_caps_get_structure (caps, 0);
+ gst_structure_get_int (structure, "channels", &channels);
++ gst_caps_unref (caps);
+
+ wanted_size = channels * SLICE_SIZE * sizeof (gfloat);
+
+- gst_adapter_push (player->vis_buffer, gst_buffer_copy (buffer));
++ gst_adapter_push (player->vis_buffer, gst_buffer_ref (buffer));
+
+- while ((data = (gfloat *)gst_adapter_peek (player->vis_buffer, wanted_size)) != NULL) {
++ while ((data = (gfloat *)gst_adapter_map (player->vis_buffer, wanted_size)) != NULL) {
+ gfloat *deinterlaced = g_malloc (wanted_size);
+ gfloat *specbuf = g_new (gfloat, SLICE_SIZE * 2);
+
+@@ -124,6 +127,7 @@ bp_vis_pcm_handoff (GstElement *sink, GstBuffer *buffer, GstPad *pad, gpointer u
+ g_free (deinterlaced);
+ g_free (specbuf);
+
++ gst_adapter_unmap (player->vis_buffer);
+ gst_adapter_flush (player->vis_buffer, wanted_size);
+ }
+ }
+@@ -132,65 +136,28 @@ bp_vis_pcm_handoff (GstElement *sink, GstBuffer *buffer, GstPad *pad, gpointer u
+ // Internal Functions
+ // ---------------------------------------------------------------------------
+
+-static void
+-_bp_vis_pipeline_block_callback (GstPad *pad, gboolean blocked, gpointer data)
++static GstPadProbeReturn
++_bp_vis_pipeline_event_probe (GstPad *pad, GstPadProbeInfo *info, gpointer data)
+ {
+ BansheePlayer *player = (BansheePlayer *) data;
++ GstEvent *event;
+
+- if (!blocked) {
+- // Set thawing mode (discards buffers that are too old from the queue).
+- player->vis_thawing = TRUE;
+- }
+-}
+-
+-static void
+-_bp_vis_pipeline_set_blocked (BansheePlayer *player, gboolean blocked)
+-{
+- GstPad *queue_sink;
+-
+- if (player->vis_resampler == NULL)
+- return;
+-
+- queue_sink = gst_element_get_static_pad (player->vis_resampler, "src");
+-
+- gst_pad_set_blocked_async (queue_sink, blocked, _bp_vis_pipeline_block_callback, (gpointer) player);
+-
+- gst_object_unref (GST_OBJECT (queue_sink));
+-}
+-
+-static gboolean
+-_bp_vis_pipeline_event_probe (GstPad *pad, GstEvent *event, gpointer data)
+-{
+- BansheePlayer *player = (BansheePlayer *) data;
++ if ((info->type & GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM) == 0)
++ return GST_PAD_PROBE_PASS;
+
++ event = GST_EVENT (info->data);
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ case GST_EVENT_FLUSH_STOP:
+ case GST_EVENT_SEEK:
+- case GST_EVENT_NEWSEGMENT:
++ case GST_EVENT_SEGMENT:
+ case GST_EVENT_CUSTOM_DOWNSTREAM:
+ player->vis_thawing = TRUE;
+
+ default: break;
+ }
+
+- if (player->vis_enabled)
+- return TRUE;
+-
+- switch (GST_EVENT_TYPE (event)) {
+- case GST_EVENT_EOS:
+- case GST_EVENT_CUSTOM_DOWNSTREAM_OOB:
+- _bp_vis_pipeline_set_blocked (player, FALSE);
+- break;
+- case GST_EVENT_CUSTOM_DOWNSTREAM:
+- case GST_EVENT_NEWSEGMENT:
+- _bp_vis_pipeline_set_blocked (player, TRUE);
+- break;
+-
+- default: break;
+- }
+-
+- return TRUE;
++ return GST_PAD_PROBE_PASS;
+ }
+
+ void
+@@ -212,9 +179,8 @@ _bp_vis_pipeline_setup (BansheePlayer *player)
+ // Core elements, if something fails here, it's the end of the world
+ audiosinkqueue = gst_element_factory_make ("queue", "vis-queue");
+
+- pad = gst_element_get_static_pad (audiosinkqueue, "sink");
+- gst_pad_add_event_probe (pad, G_CALLBACK (_bp_vis_pipeline_event_probe), player);
+- gst_object_unref (GST_OBJECT (pad));
++ player->vis_event_probe_pad = gst_element_get_static_pad (audiosinkqueue, "sink");
++ player->vis_event_probe_id = gst_pad_add_probe (player->vis_event_probe_pad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, _bp_vis_pipeline_event_probe, player, NULL);
+
+ resampler = gst_element_factory_make ("audioresample", "vis-resample");
+ converter = gst_element_factory_make ("audioconvert", "vis-convert");
+@@ -255,7 +221,7 @@ _bp_vis_pipeline_setup (BansheePlayer *player)
+ converter, fakesink, NULL);
+
+ pad = gst_element_get_static_pad (audiosinkqueue, "sink");
+- teepad = gst_element_get_request_pad (player->audiotee, "src%d");
++ teepad = gst_element_get_request_pad (player->audiotee, "src_%u");
+ gst_pad_link (teepad, pad);
+ gst_object_unref (GST_OBJECT (teepad));
+ gst_object_unref (GST_OBJECT (pad));
+@@ -270,14 +236,17 @@ _bp_vis_pipeline_setup (BansheePlayer *player)
+ player->vis_resampler = resampler;
+ player->vis_thawing = FALSE;
+ player->vis_enabled = FALSE;
+-
+- // Disable the pipeline till we hear otherwise from managed land.
+- _bp_vis_pipeline_set_blocked (player, TRUE);
+ }
+
+ void
+ _bp_vis_pipeline_destroy (BansheePlayer *player)
+ {
++ if (player->vis_event_probe_pad) {
++ gst_pad_remove_probe (player->vis_event_probe_pad, player->vis_event_probe_id);
++ gst_object_unref (GST_OBJECT (player->vis_event_probe_pad));
++ player->vis_event_probe_pad = NULL;
++ }
++
+ if (player->vis_buffer != NULL) {
+ gst_object_unref (player->vis_buffer);
+ player->vis_buffer = NULL;
+@@ -315,6 +284,5 @@ bp_set_vis_data_callback (BansheePlayer *player, BansheePlayerVisDataCallback cb
+
+ player->vis_data_cb = cb;
+
+- _bp_vis_pipeline_set_blocked (player, cb == NULL);
+ player->vis_enabled = cb != NULL;
+ }
+diff --git a/libbanshee/banshee-player.c b/libbanshee/banshee-player.c
+index c655a72..b8f98b8 100644
+--- a/libbanshee/banshee-player.c
++++ b/libbanshee/banshee-player.c
+@@ -250,12 +250,11 @@ bp_set_position (BansheePlayer *player, guint64 time_ms)
+ P_INVOKE guint64
+ bp_get_position (BansheePlayer *player)
+ {
+- static GstFormat format = GST_FORMAT_TIME;
+ gint64 position;
+
+ g_return_val_if_fail (IS_BANSHEE_PLAYER (player), 0);
+
+- if (player->playbin != NULL && gst_element_query_position (player->playbin, &format, &position)) {
++ if (player->playbin != NULL && gst_element_query_position (player->playbin, GST_FORMAT_TIME, &position)) {
+ return position / GST_MSECOND;
+ }
+
+@@ -265,12 +264,11 @@ bp_get_position (BansheePlayer *player)
+ P_INVOKE guint64
+ bp_get_duration (BansheePlayer *player)
+ {
+- static GstFormat format = GST_FORMAT_TIME;
+ gint64 duration;
+
+ g_return_val_if_fail (IS_BANSHEE_PLAYER (player), 0);
+
+- if (player->playbin != NULL && gst_element_query_duration (player->playbin, &format, &duration)) {
++ if (player->playbin != NULL && gst_element_query_duration (player->playbin, GST_FORMAT_TIME, &duration)) {
+ return duration / GST_MSECOND;
+ }
+
+@@ -446,7 +444,6 @@ bp_set_subtitle_uri (BansheePlayer *player, const gchar *uri)
+ g_return_if_fail (IS_BANSHEE_PLAYER (player));
+ gint64 pos = -1;
+ GstState state;
+- GstFormat format = GST_FORMAT_BYTES;
+ gboolean paused = FALSE;
+
+ // Gstreamer playbin do not support to set suburi during playback
+@@ -454,7 +451,7 @@ bp_set_subtitle_uri (BansheePlayer *player, const gchar *uri)
+ gst_element_get_state (player->playbin, &state, NULL, 0);
+ paused = (state == GST_STATE_PAUSED);
+ if (state >= GST_STATE_PAUSED) {
+- gst_element_query_position (player->playbin, &format, &pos);
++ gst_element_query_position (player->playbin, GST_FORMAT_BYTES, &pos);
+ gst_element_set_state (player->playbin, GST_STATE_READY);
+ // Force to wait asynch operation
+ gst_element_get_state (player->playbin, &state, NULL, -1);
+@@ -467,7 +464,7 @@ bp_set_subtitle_uri (BansheePlayer *player, const gchar *uri)
+ gst_element_get_state (player->playbin, &state, NULL, -1);
+
+ if (pos != -1) {
+- gst_element_seek_simple (player->playbin, format, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT, pos);
++ gst_element_seek_simple (player->playbin, GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT, pos);
+ }
+ }
+
+diff --git a/libbanshee/banshee-ripper.c b/libbanshee/banshee-ripper.c
+index e0e8c85..b3f8fed 100644
+--- a/libbanshee/banshee-ripper.c
++++ b/libbanshee/banshee-ripper.c
+@@ -85,7 +85,6 @@ br_raise_error (BansheeRipper *ripper, const gchar *error, const gchar *debug)
+ static gboolean
+ br_iterate_timeout (BansheeRipper *ripper)
+ {
+- GstFormat format = GST_FORMAT_TIME;
+ GstState state;
+ gint64 position;
+
+@@ -96,7 +95,7 @@ br_iterate_timeout (BansheeRipper *ripper)
+ return TRUE;
+ }
+
+- if (!gst_element_query_position (ripper->cddasrc, &format, &position)) {
++ if (!gst_element_query_position (ripper->cddasrc, GST_FORMAT_TIME, &position)) {
+ return TRUE;
+ }
+
+@@ -142,8 +141,9 @@ br_encoder_probe_mime_type (GstBin *bin)
+ GstIterator *pad_iter = gst_element_iterate_src_pads (element);
+
+ BANSHEE_GST_ITERATOR_ITERATE (pad_iter, GstPad *, pad, TRUE, {
+- GstStructure *str = GST_PAD_CAPS (pad) != NULL
+- ? gst_caps_get_structure (GST_PAD_CAPS (pad), 0)
++ GstCaps *caps = gst_pad_get_current_caps (pad);
++ GstStructure *str = caps != NULL
++ ? gst_caps_get_structure (caps, 0)
+ : NULL;
+
+ if (str != NULL) {
+@@ -171,11 +171,8 @@ br_encoder_probe_mime_type (GstBin *bin)
+ preferred_mimetype = mimetype;
+ }
+ }
+-
+- gst_object_unref (pad);
++ gst_caps_unref (caps);
+ });
+-
+- gst_object_unref (element);
+ });
+
+ return preferred_mimetype;
+@@ -271,7 +268,7 @@ br_pipeline_construct (BansheeRipper *ripper)
+ return FALSE;
+ }
+
+- ripper->cddasrc = gst_element_make_from_uri (GST_URI_SRC, "cdda://1", "cddasrc");
++ ripper->cddasrc = gst_element_make_from_uri (GST_URI_SRC, "cdda://1", "cddasrc", NULL);
+ if (ripper->cddasrc == NULL) {
+ br_raise_error (ripper, _("Could not initialize element from cdda URI"), NULL);
+ return FALSE;
+@@ -405,7 +402,6 @@ br_rip_track (BansheeRipper *ripper, gint track_number, gchar *output_path,
+
+ // We'll warn the user in the UI if we can't tag the encoded audio files
+ *tagging_supported = TRUE;
+- gst_object_unref (element);
+ }
+ });
+
+diff --git a/libbanshee/banshee-tagger.c b/libbanshee/banshee-tagger.c
+index ca15e8f..762dfa9 100644
+--- a/libbanshee/banshee-tagger.c
++++ b/libbanshee/banshee-tagger.c
+@@ -69,7 +69,7 @@ bt_tag_list_foreach (const GstTagList *list, const gchar *tag, gpointer userdata
+ GstTagList *
+ bt_tag_list_new ()
+ {
+- return gst_tag_list_new ();
++ return gst_tag_list_new_empty ();
+ }
+
+ void
+diff --git a/libbanshee/banshee-transcoder.c b/libbanshee/banshee-transcoder.c
+index 10fc35c..0e241f0 100644
+--- a/libbanshee/banshee-transcoder.c
++++ b/libbanshee/banshee-transcoder.c
+@@ -64,14 +64,13 @@ gst_transcoder_raise_error(GstTranscoder *transcoder, const gchar *error, const
+ static gboolean
+ gst_transcoder_iterate_timeout(GstTranscoder *transcoder)
+ {
+- GstFormat format = GST_FORMAT_TIME;
+ gint64 position;
+ gint64 duration;
+
+ g_return_val_if_fail(transcoder != NULL, FALSE);
+
+- if(!gst_element_query_duration(transcoder->pipeline, &format, &duration) ||
+- !gst_element_query_position(transcoder->sink_bin, &format, &position)) {
++ if(!gst_element_query_duration(transcoder->pipeline, GST_FORMAT_TIME, &duration) ||
++ !gst_element_query_position(transcoder->sink_bin, GST_FORMAT_TIME, &position)) {
+ return TRUE;
+ }
+
+@@ -196,14 +195,14 @@ gst_transcoder_new_decoded_pad(GstElement *decodebin, GstPad *pad,
+
+ g_return_if_fail(transcoder != NULL);
+
+- audiopad = gst_element_get_pad(transcoder->sink_bin, "sink");
++ audiopad = gst_element_get_static_pad(transcoder->sink_bin, "sink");
+
+ if(GST_PAD_IS_LINKED(audiopad)) {
+ g_object_unref(audiopad);
+ return;
+ }
+
+- caps = gst_pad_get_caps(pad);
++ caps = gst_pad_query_caps(pad, NULL);
+ str = gst_caps_get_structure(caps, 0);
+
+ if(!g_strrstr(gst_structure_get_name(str), "audio")) {
+@@ -235,19 +234,19 @@ gst_transcoder_create_pipeline(GstTranscoder *transcoder,
+
+ transcoder->pipeline = gst_pipeline_new("pipeline");
+
+- source_elem = gst_element_make_from_uri(GST_URI_SRC, input_uri, "source");
++ source_elem = gst_element_make_from_uri(GST_URI_SRC, input_uri, "source", NULL);
+ if(source_elem == NULL) {
+ gst_transcoder_raise_error(transcoder, _("Could not create source element"), NULL);
+ return FALSE;
+ }
+
+- decoder_elem = gst_element_factory_make("decodebin2", "decodebin2");
++ decoder_elem = gst_element_factory_make("decodebin", "decodebin");
+ if(decoder_elem == NULL) {
+- gst_transcoder_raise_error(transcoder, _("Could not create decodebin2 plugin"), NULL);
++ gst_transcoder_raise_error(transcoder, _("Could not create decodebin plugin"), NULL);
+ return FALSE;
+ }
+
+- sink_elem = gst_element_make_from_uri(GST_URI_SINK, output_uri, "sink");
++ sink_elem = gst_element_make_from_uri(GST_URI_SINK, output_uri, "sink", NULL);
+ if(sink_elem == NULL) {
+ gst_transcoder_raise_error(transcoder, _("Could not create sink element"), NULL);
+ return FALSE;
+@@ -277,7 +276,7 @@ gst_transcoder_create_pipeline(GstTranscoder *transcoder,
+ return FALSE;
+ }
+
+- encoder_pad = gst_element_get_pad(conv_elem, "sink");
++ encoder_pad = gst_element_get_static_pad(conv_elem, "sink");
+ if(encoder_pad == NULL) {
+ gst_transcoder_raise_error(transcoder, _("Could not get sink pad from encoder"), NULL);
+ return FALSE;
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..f34dee143f27
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,74 @@
+
+# $Id: PKGBUILD 141668 2011-11-02 03:17:12Z eric $
+# Maintainer: Daniel Isenmann <daniel@archlinux.org>
+# Contributor: György Balló <ballogy@freestart.hu>
+
+pkgname=banshee
+pkgver=2.6.2
+pkgrel=9
+pkgdesc="Music management and playback for GNOME"
+arch=('i686' 'x86_64')
+url="http://banshee.fm/"
+license=('MIT')
+depends=(libxxf86vm gst-plugins-base-libs mono-addins dbus-sharp-glib webkitgtk2 libsoup-gnome gdata-sharp taglib-sharp-git gudev-sharp gkeyfile-sharp gconf-sharp libmtp libgpod mono-zeroconf hicolor-icon-theme media-player-info gst-plugins-bad mono-upnp gst-plugins-good gvfs)
+makedepends=('intltool' 'gnome-doc-utils' 'gtk-sharp-beans' 'gnome-common')
+optdepends=('gst-plugins-ugly: Extra media codecs'
+ 'gst-libav: Extra media codecs'
+ 'brasero: CD burning')
+source=(http://download.gnome.org/sources/$pkgname/2.6/$pkgname-$pkgver.tar.xz
+ Initial-port-to-GStreamer-1.0.patch
+ Remove-build-time-enable-gapless-playback-option.patch
+ Don-t-use-the-new-decoded-pad-signal-of-decodebin.patch
+ Use-new-style-GStreamer-1.0-raw-audio-caps-in-the-WA.patch
+ sqlite_fix.patch
+ Remove-IDBusExportable-inheritance-from-exported-int.patch
+ Use-dbus-2.patch)
+md5sums=('12dbb8a996783f7081d538062a8589b7'
+ '16cbe2ef60e6f9b22015585bb3209648'
+ '0bf7ee4241b12538779c9ecc401d142a'
+ 'f87534f54029794bd7be2a123ab01300'
+ 'd092827720e4a11549587eb3131123ae'
+ '2677e6edc2e0d2ce8994adc852dda362'
+ '3b28f10e167c0aae27157dcc3b828b67'
+ '2c4436f7aba58fdd0c5a38d709d73e5c')
+
+prepare() {
+ cd $pkgname-$pkgver
+ patch -p1 -i ../Initial-port-to-GStreamer-1.0.patch
+ patch -p1 -i ../Remove-build-time-enable-gapless-playback-option.patch
+ patch -p1 -i ../Don-t-use-the-new-decoded-pad-signal-of-decodebin.patch
+ patch -p1 -i ../Use-new-style-GStreamer-1.0-raw-audio-caps-in-the-WA.patch
+ patch -p1 -i ../sqlite_fix.patch
+ patch -p1 -i ../Remove-IDBusExportable-inheritance-from-exported-int.patch
+ patch -p1 -i ../Use-dbus-2.patch
+
+ NOCONFIGURE=1 ./autogen.sh
+# Fix build with mono 4.0 (Fedora)
+ sed -i "s#mono/2.0#mono/4.5#g" configure
+ sed -i "s#Mono 2.0#Mono 4.5#g" configure
+}
+
+build() {
+ export MONO_SHARED_DIR="$srcdir/.wabi"
+ mkdir -p "$MONO_SHARED_DIR"
+
+ cd $pkgname-$pkgver
+ MCS=/usr/bin/mcs ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \
+ --disable-docs \
+ --disable-static \
+ --disable-scrollkeeper \
+ --disable-schemas-install \
+ --disable-boo \
+ --with-vendor-build-id=ArchLinux
+ make
+}
+
+package() {
+ export MONO_SHARED_DIR="$srcdir/.wabi"
+ mkdir -p "$MONO_SHARED_DIR"
+
+ cd "$srcdir/$pkgname-$pkgver"
+ make DESTDIR="$pkgdir" install
+
+ install -D -m644 COPYING "$pkgdir/usr/share/licenses/$pkgname/COPYING"
+}
diff --git a/Remove-IDBusExportable-inheritance-from-exported-int.patch b/Remove-IDBusExportable-inheritance-from-exported-int.patch
new file mode 100644
index 000000000000..9f3809421575
--- /dev/null
+++ b/Remove-IDBusExportable-inheritance-from-exported-int.patch
@@ -0,0 +1,132 @@
+From: Chow Loong Jin <hyperair@debian.org>
+Date: Sat, 1 Mar 2014 15:52:39 +0800
+Subject: Remove IDBusExportable inheritance from exported interfaces
+
+This fixes the crashes when attempting to control an existing instance of
+Banshee using the command-line interface.
+
+Bug-Debian: #731978
+Bug: https://bugzilla.gnome.org/show_bug.cgi?id=725446
+---
+ src/Core/Banshee.Services/Banshee.MediaEngine/IPlayerEngineService.cs | 2 +-
+ src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs | 2 +-
+ .../Banshee.PlaybackController/IPlaybackControllerService.cs | 2 +-
+ .../Banshee.PlaybackController/PlaybackControllerService.cs | 4 ++--
+ src/Core/Banshee.Services/Banshee.Sources/ISourceManager.cs | 2 +-
+ src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs | 2 +-
+ src/Core/Banshee.ThickClient/Banshee.Gui/IClientWindow.cs | 2 +-
+ src/Core/Banshee.ThickClient/Banshee.Gui/IGlobalUIActions.cs | 4 ++--
+ 8 files changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/IPlayerEngineService.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/IPlayerEngineService.cs
+index fc935ac..f29cfa5 100644
+--- a/src/Core/Banshee.Services/Banshee.MediaEngine/IPlayerEngineService.cs
++++ b/src/Core/Banshee.Services/Banshee.MediaEngine/IPlayerEngineService.cs
+@@ -35,7 +35,7 @@ using Banshee.ServiceStack;
+ namespace Banshee.MediaEngine
+ {
+ [Interface("org.bansheeproject.Banshee.PlayerEngine")]
+- public interface IPlayerEngineService : IDBusExportable
++ public interface IPlayerEngineService
+ {
+ event DBusPlayerEventHandler EventChanged;
+ event DBusPlayerStateHandler StateChanged;
+diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
+index 793b9cd..83cbe67 100644
+--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
++++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
+@@ -51,7 +51,7 @@ namespace Banshee.MediaEngine
+ public delegate bool TrackInterceptHandler (TrackInfo track);
+
+ public class PlayerEngineService : IInitializeService, IDelayedInitializeService,
+- IRequiredService, IPlayerEngineService, IDisposable
++ IRequiredService, IPlayerEngineService, IDBusExportable, IDisposable
+ {
+ private List<PlayerEngine> engines = new List<PlayerEngine> ();
+ private PlayerEngine active_engine;
+diff --git a/src/Core/Banshee.Services/Banshee.PlaybackController/IPlaybackControllerService.cs b/src/Core/Banshee.Services/Banshee.PlaybackController/IPlaybackControllerService.cs
+index deb1feb..a764272 100644
+--- a/src/Core/Banshee.Services/Banshee.PlaybackController/IPlaybackControllerService.cs
++++ b/src/Core/Banshee.Services/Banshee.PlaybackController/IPlaybackControllerService.cs
+@@ -36,7 +36,7 @@ namespace Banshee.PlaybackController
+ public delegate void PlaybackControllerStoppedHandler ();
+
+ [Interface ("org.bansheeproject.Banshee.PlaybackController")]
+- public interface IPlaybackControllerService : IDBusExportable
++ public interface IPlaybackControllerService
+ {
+ // FIXME: IPlaybackControllerExportable : IPlaybackController
+ // but DBus-Sharp has a design flaw where it only exports
+diff --git a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
+index 1b8020f..af700a6 100644
+--- a/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
++++ b/src/Core/Banshee.Services/Banshee.PlaybackController/PlaybackControllerService.cs
+@@ -38,8 +38,8 @@ using Banshee.MediaEngine;
+
+ namespace Banshee.PlaybackController
+ {
+- public class PlaybackControllerService : IRequiredService, ICanonicalPlaybackController,
+- IPlaybackController, IPlaybackControllerService
++ public class PlaybackControllerService : IDBusExportable, IRequiredService,
++ ICanonicalPlaybackController, IPlaybackController, IPlaybackControllerService
+ {
+ private enum Direction
+ {
+diff --git a/src/Core/Banshee.Services/Banshee.Sources/ISourceManager.cs b/src/Core/Banshee.Services/Banshee.Sources/ISourceManager.cs
+index 18203c7..4cfc697 100644
+--- a/src/Core/Banshee.Services/Banshee.Sources/ISourceManager.cs
++++ b/src/Core/Banshee.Services/Banshee.Sources/ISourceManager.cs
+@@ -36,7 +36,7 @@ using Banshee.ServiceStack;
+ namespace Banshee.Sources
+ {
+ [Interface("org.bansheeproject.Banshee.SourceManager")]
+- public interface ISourceManager : IDBusExportable
++ public interface ISourceManager
+ {
+ //event SourceEventHandler SourceUpdated;
+ ISource ActiveSource { get; set; }
+diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs
+index 48d10bc..1a33a2b 100644
+--- a/src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs
++++ b/src/Core/Banshee.ThickClient/Banshee.Gui/GlobalActions.cs
+@@ -40,7 +40,7 @@ using Banshee.Playlist;
+
+ namespace Banshee.Gui
+ {
+- public class GlobalActions : BansheeActionGroup, IGlobalUIActions
++ public class GlobalActions : BansheeActionGroup, IGlobalUIActions, IDBusExportable
+ {
+ public GlobalActions () : base ("Global")
+ {
+diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/IClientWindow.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/IClientWindow.cs
+index 1d693b1..77604f7 100644
+--- a/src/Core/Banshee.ThickClient/Banshee.Gui/IClientWindow.cs
++++ b/src/Core/Banshee.ThickClient/Banshee.Gui/IClientWindow.cs
+@@ -34,7 +34,7 @@ using Banshee.ServiceStack;
+ namespace Banshee.Gui
+ {
+ [Interface ("org.bansheeproject.Banshee.ClientWindow")]
+- public interface IClientWindow : IDBusExportable
++ public interface IClientWindow
+ {
+ void Present ();
+ void Hide ();
+diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/IGlobalUIActions.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/IGlobalUIActions.cs
+index 34124c5..e9a53d0 100644
+--- a/src/Core/Banshee.ThickClient/Banshee.Gui/IGlobalUIActions.cs
++++ b/src/Core/Banshee.ThickClient/Banshee.Gui/IGlobalUIActions.cs
+@@ -32,11 +32,11 @@ using Banshee.ServiceStack;
+ namespace Banshee.Gui
+ {
+ [Interface ("org.bansheeproject.Banshee.GlobalUIActions")]
+- public interface IGlobalUIActions : IDBusExportable
++ public interface IGlobalUIActions
+ {
+ void ShowImportDialog ();
+ void ShowAboutDialog ();
+ void ShowOpenLocationDialog ();
+ void ShowPreferencesDialog ();
+ }
+-}
+\ No newline at end of file
++}
diff --git a/Remove-build-time-enable-gapless-playback-option.patch b/Remove-build-time-enable-gapless-playback-option.patch
new file mode 100644
index 000000000000..dec054b5a7e1
--- /dev/null
+++ b/Remove-build-time-enable-gapless-playback-option.patch
@@ -0,0 +1,202 @@
+From: Chow Loong Jin <hyperair@debian.org>
+Date: Mon, 26 Nov 2012 00:10:19 +0800
+Subject: Remove build-time --enable-gapless-playback option
+
+This was previously added to check for a new enough playbin, but since we're now
+using Gstreamer 1.0, the playbin version should be new enough, and we can drop
+the conditionals.
+---
+ configure.ac | 15 ---------
+ libbanshee/Makefile.am | 4 ---
+ libbanshee/banshee-player-pipeline.c | 4 ---
+ libbanshee/banshee-player.c | 10 ------
+ .../Banshee.GStreamer/PlayerEngine.cs | 32 ++++++--------------
+ src/Backends/Banshee.GStreamer/Makefile.am | 4 ---
+ src/Backends/Banshee.GStreamerSharp/Makefile.am | 4 ---
+ 7 files changed, 10 insertions(+), 63 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index ac949c7..5d66fb9 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -171,21 +171,6 @@ BANSHEE_CHECK_SOUNDMENU
+ dnl Ubuntu One Music Store (optional)
+ BANSHEE_CHECK_UBUNTUONE
+
+-dnl Gapless, if we have a new-enough playbin2
+-ENABLE_GAPLESS="no"
+-AC_ARG_ENABLE(gapless-playback,
+- AC_HELP_STRING([--enable-gapless-playback],
+- [Enable gapless playback engine (requires gst-plugins-base > 0.10.25.2)]),
+- enable_gapless=$enableval,
+- enable_gapless=auto)
+-if test "x$enable_gapless" != "xno" ; then
+- PKG_CHECK_MODULES([GST_PLUGINS_BASE], [gstreamer-plugins-base-0.10 > 0.10.25.2], ENABLE_GAPLESS=yes, ENABLE_GAPLESS=no)
+- if test "x$enable_gapless" == "xyes" -a "x$ENABLE_GAPLESS" == "xno" ; then
+- AC_MSG_ERROR([Gapless playback requires gstreamer-plugins-base > 0.10.25.2])
+- fi
+-fi
+-AM_CONDITIONAL(ENABLE_GAPLESS, test "x$ENABLE_GAPLESS" = "xyes")
+-
+ dnl i18n
+ SHAMROCK_CONFIGURE_I18N($PACKAGE)
+
+diff --git a/libbanshee/Makefile.am b/libbanshee/Makefile.am
+index 6ed369a..a05c492 100644
+--- a/libbanshee/Makefile.am
++++ b/libbanshee/Makefile.am
+@@ -6,10 +6,6 @@ INCLUDES = \
+ $(LIBBANSHEE_CFLAGS) \
+ $(GST_CFLAGS)
+
+-if ENABLE_GAPLESS
+-INCLUDES += -DENABLE_GAPLESS
+-endif
+-
+ bansheelibdir = $(pkglibdir)
+ bansheelib_LTLIBRARIES = libbanshee.la
+
+diff --git a/libbanshee/banshee-player-pipeline.c b/libbanshee/banshee-player-pipeline.c
+index 6c2af35..d4977e1 100644
+--- a/libbanshee/banshee-player-pipeline.c
++++ b/libbanshee/banshee-player-pipeline.c
+@@ -239,7 +239,6 @@ bp_pipeline_bus_callback (GstBus *bus, GstMessage *message, gpointer userdata)
+ return TRUE;
+ }
+
+-#ifdef ENABLE_GAPLESS
+ static void bp_about_to_finish_callback (GstElement *playbin, BansheePlayer *player)
+ {
+ g_return_if_fail (IS_BANSHEE_PLAYER (player));
+@@ -257,7 +256,6 @@ static void bp_about_to_finish_callback (GstElement *playbin, BansheePlayer *pla
+ player->about_to_finish_cb (player);
+ }
+ }
+-#endif //ENABLE_GAPLESS
+
+ static void bp_volume_changed_callback (GstElement *playbin, GParamSpec *spec, BansheePlayer *player)
+ {
+@@ -296,12 +294,10 @@ _bp_pipeline_construct (BansheePlayer *player)
+ // source and decoder elements) based on source URI and stream content
+ player->playbin = gst_element_factory_make ("playbin", "playbin");
+
+-#ifdef ENABLE_GAPLESS
+ // FIXME: Connect a proxy about-to-finish callback that will generate a next-track-starting callback.
+ // This can be removed once playbin generates its own next-track signal.
+ // bgo#584987 - this is included in >= 0.10.26
+ g_signal_connect (player->playbin, "about-to-finish", G_CALLBACK (bp_about_to_finish_callback), player);
+-#endif //ENABLE_GAPLESS
+
+ g_return_val_if_fail (player->playbin != NULL, FALSE);
+
+diff --git a/libbanshee/banshee-player.c b/libbanshee/banshee-player.c
+index b8f98b8..08c4f94 100644
+--- a/libbanshee/banshee-player.c
++++ b/libbanshee/banshee-player.c
+@@ -303,16 +303,6 @@ bp_can_seek (BansheePlayer *player)
+ }
+
+ P_INVOKE gboolean
+-bp_supports_gapless (BansheePlayer *player)
+-{
+-#ifdef ENABLE_GAPLESS
+- return TRUE;
+-#else
+- return FALSE;
+-#endif //ENABLE_GAPLESS
+-}
+-
+-P_INVOKE gboolean
+ bp_audiosink_has_volume (BansheePlayer *player)
+ {
+ g_return_val_if_fail (IS_BANSHEE_PLAYER (player), FALSE);
+diff --git a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
+index 278ff51..05b1905 100644
+--- a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
++++ b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
+@@ -747,16 +747,11 @@ namespace Banshee.GStreamer
+ get { return gapless_enabled; }
+ set
+ {
+- if (bp_supports_gapless (handle)) {
+- gapless_enabled = value;
+- if (value) {
+- bp_set_about_to_finish_callback (handle, about_to_finish_callback);
+- } else {
+- bp_set_about_to_finish_callback (handle, null);
+- }
++ gapless_enabled = value;
++ if (value) {
++ bp_set_about_to_finish_callback (handle, about_to_finish_callback);
+ } else {
+- gapless_enabled = false;
+- next_track_pending = false;
++ bp_set_about_to_finish_callback (handle, null);
+ }
+ }
+ }
+@@ -881,13 +876,11 @@ namespace Banshee.GStreamer
+ Catalog.GetString ("For tracks that have ReplayGain data, automatically scale (normalize) playback volume"),
+ delegate { ReplayGainEnabled = ReplayGainEnabledSchema.Get (); }
+ ));
+- if (bp_supports_gapless (handle)) {
+- gapless_preference = service["general"]["misc"].Add (new SchemaPreference<bool> (GaplessEnabledSchema,
+- Catalog.GetString ("Enable _gapless playback"),
+- Catalog.GetString ("Eliminate the small playback gap on track change. Useful for concept albums and classical music"),
+- delegate { GaplessEnabled = GaplessEnabledSchema.Get (); }
+- ));
+- }
++ gapless_preference = service["general"]["misc"].Add (new SchemaPreference<bool> (GaplessEnabledSchema,
++ Catalog.GetString ("Enable _gapless playback"),
++ Catalog.GetString ("Eliminate the small playback gap on track change. Useful for concept albums and classical music"),
++ delegate { GaplessEnabled = GaplessEnabledSchema.Get (); }
++ ));
+ }
+
+ private void UninstallPreferences ()
+@@ -898,9 +891,7 @@ namespace Banshee.GStreamer
+ }
+
+ service["general"]["misc"].Remove (replaygain_preference);
+- if (bp_supports_gapless (handle)) {
+- service["general"]["misc"].Remove (gapless_preference);
+- }
++ service["general"]["misc"].Remove (gapless_preference);
+ replaygain_preference = null;
+ gapless_preference = null;
+ }
+@@ -969,9 +960,6 @@ namespace Banshee.GStreamer
+ BansheePlayerAboutToFinishCallback cb);
+
+ [DllImport ("libbanshee.dll")]
+- private static extern bool bp_supports_gapless (HandleRef player);
+-
+- [DllImport ("libbanshee.dll")]
+ private static extern bool bp_open (HandleRef player, IntPtr uri, bool maybeVideo);
+
+ [DllImport ("libbanshee.dll")]
+diff --git a/src/Backends/Banshee.GStreamer/Makefile.am b/src/Backends/Banshee.GStreamer/Makefile.am
+index 118e525..321b270 100644
+--- a/src/Backends/Banshee.GStreamer/Makefile.am
++++ b/src/Backends/Banshee.GStreamer/Makefile.am
+@@ -16,7 +16,3 @@ include $(top_srcdir)/build/build.mk
+
+ EXTRA_DIST += Banshee.GStreamer.dll.config
+ module_SCRIPTS += Banshee.GStreamer.dll.config
+-
+-if ENABLE_GAPLESS
+-BUILD_DEFINES="-define:ENABLE_GAPLESS"
+-endif
+\ No newline at end of file
+diff --git a/src/Backends/Banshee.GStreamerSharp/Makefile.am b/src/Backends/Banshee.GStreamerSharp/Makefile.am
+index 69424d7..769b260 100644
+--- a/src/Backends/Banshee.GStreamerSharp/Makefile.am
++++ b/src/Backends/Banshee.GStreamerSharp/Makefile.am
+@@ -23,7 +23,3 @@ else
+ include $(top_srcdir)/build/build.dist.mk
+ EXTRA_DIST += Banshee.GStreamerSharp.dll.config
+ endif
+-
+-if ENABLE_GAPLESS
+-BUILD_DEFINES="-define:ENABLE_GAPLESS"
+-endif
diff --git a/Use-dbus-2.patch b/Use-dbus-2.patch
new file mode 100644
index 000000000000..9ce676446f88
--- /dev/null
+++ b/Use-dbus-2.patch
@@ -0,0 +1,66 @@
+From: Chow Loong Jin <hyperair@debian.org>
+Date: Mon, 25 Nov 2013 01:18:19 +0800
+Subject: Use dbus# 2
+
+---
+ build/m4/banshee/dbus.m4 | 4 ++--
+ build/pkg-config/banshee-collection-indexer.pc.in | 2 +-
+ build/pkg-config/banshee-core.pc.in | 2 +-
+ src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs | 5 +----
+ 4 files changed, 5 insertions(+), 8 deletions(-)
+
+diff --git a/build/m4/banshee/dbus.m4 b/build/m4/banshee/dbus.m4
+index 3b8579e..f76ff8c 100644
+--- a/build/m4/banshee/dbus.m4
++++ b/build/m4/banshee/dbus.m4
+@@ -1,9 +1,9 @@
+ AC_DEFUN([BANSHEE_CHECK_DBUS_SHARP],
+ [
+- PKG_CHECK_MODULES(DBUS_SHARP_GLIB, dbus-sharp-glib-1.0 >= 0.5)
++ PKG_CHECK_MODULES(DBUS_SHARP_GLIB, dbus-sharp-glib-2.0 >= 0.5)
+ AC_SUBST(DBUS_SHARP_GLIB_LIBS)
+
+- PKG_CHECK_MODULES(DBUS_SHARP, dbus-sharp-1.0 >= 0.7)
++ PKG_CHECK_MODULES(DBUS_SHARP, dbus-sharp-2.0 >= 0.7)
+ AC_SUBST(DBUS_SHARP_LIBS)
+ ])
+
+diff --git a/build/pkg-config/banshee-collection-indexer.pc.in b/build/pkg-config/banshee-collection-indexer.pc.in
+index 40636bb..a12b03c 100644
+--- a/build/pkg-config/banshee-collection-indexer.pc.in
++++ b/build/pkg-config/banshee-collection-indexer.pc.in
+@@ -7,6 +7,6 @@ Libraries=${bansheedir}/Banshee.CollectionIndexer.dll
+ Name: Banshee Collection Indexer Helper
+ Description: A library for applications to bundle to easily consume the Banshee Collection Indexer
+ Version: @VERSION@
+-Requires: dbus-sharp-1.0
++Requires: dbus-sharp-2.0
+ Libs: -r:${Libraries}
+
+diff --git a/build/pkg-config/banshee-core.pc.in b/build/pkg-config/banshee-core.pc.in
+index 9d4c3b9..c217dd8 100644
+--- a/build/pkg-config/banshee-core.pc.in
++++ b/build/pkg-config/banshee-core.pc.in
+@@ -6,5 +6,5 @@ bansheedir=${libdir}/@PACKAGE@
+ Name: Banshee Core
+ Description: Core APIs for the Banshee Media Framework
+ Version: @VERSION@
+-Requires: taglib-sharp dbus-sharp-1.0 dbus-sharp-glib-1.0 glib-sharp-2.0 mono-addins banshee-hyena banshee-hyena-data-sqlite banshee-musicbrainz
++Requires: taglib-sharp dbus-sharp-2.0 dbus-sharp-glib-2.0 glib-sharp-2.0 mono-addins banshee-hyena banshee-hyena-data-sqlite banshee-musicbrainz
+ Libs: -r:${bansheedir}/Banshee.Core.dll
+diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs
+index 698cf02..96e3996 100644
+--- a/src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs
++++ b/src/Core/Banshee.Services/Banshee.ServiceStack/DBusServiceManager.cs
+@@ -135,10 +135,7 @@ namespace Banshee.ServiceStack
+ string bus_name = DBusConnection.MakeBusName (serviceName);
+
+ Log.DebugFormat ("Registering remote object {0} ({1}) on {2}", path, o.GetType (), bus_name);
+-
+- #pragma warning disable 0618
+- Bus.Session.Register (bus_name, path, o);
+- #pragma warning restore 0618
++ Bus.Session.Register (path, o);
+ }
+
+ return path;
diff --git a/Use-new-style-GStreamer-1.0-raw-audio-caps-in-the-WA.patch b/Use-new-style-GStreamer-1.0-raw-audio-caps-in-the-WA.patch
new file mode 100644
index 000000000000..2d2cc33cdcde
--- /dev/null
+++ b/Use-new-style-GStreamer-1.0-raw-audio-caps-in-the-WA.patch
@@ -0,0 +1,21 @@
+From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <slomo@circular-chaos.org>
+Date: Tue, 28 May 2013 11:49:29 +0200
+Subject: Use new-style GStreamer 1.0 raw audio caps in the WAV audio profile
+
+---
+ data/audio-profiles/wav.xml.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/data/audio-profiles/wav.xml.in b/data/audio-profiles/wav.xml.in
+index 6dc1bab..1759f3c 100644
+--- a/data/audio-profiles/wav.xml.in
++++ b/data/audio-profiles/wav.xml.in
+@@ -13,7 +13,7 @@
+ (gst-construct-pipeline
+ "audioresample"
+ "audioconvert"
+- (+ "audio/x-raw-int, "
++ (+ "audio/x-raw, "
+ "format=(string)S16LE, "
+ "rate=(int)44100, "
+ "channels=(int)2" )
diff --git a/sqlite_fix.patch b/sqlite_fix.patch
new file mode 100644
index 000000000000..7dfa53817293
--- /dev/null
+++ b/sqlite_fix.patch
@@ -0,0 +1,147 @@
+From 700ad9b1686d0b46073b7b2e6cea8e01e30d5f52 Mon Sep 17 00:00:00 2001
+From: Samuel Gyger <gygersamuel@gmail.com>
+Date: Fri, 12 Dec 2014 17:07:45 +0100
+Subject: Database: fix performance for the new SQLite's query planner
+ (bgo#740879)
+
+Starting with sqlite version 3.8.6, a new query planner is used.
+To get back the performance on filling the CoreCache Table,
+this commit provides hints to sqlite (using the UNLIKELY statement).
+But the UNLIKELY statement is only supported in version 3.8.1 and
+above, so in order not to raise the version of the dependency on
+sqlite, we can use this new clause conditionally.
+
+diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumArtistListModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumArtistListModel.cs
+index dee9c81..e91018b 100644
+--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumArtistListModel.cs
++++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumArtistListModel.cs
+@@ -46,7 +46,7 @@ namespace Banshee.Collection.Database
+ ReloadFragmentFormat = @"
+ FROM CoreArtists WHERE CoreArtists.ArtistID IN
+ (SELECT CoreAlbums.ArtistID FROM CoreAlbums, CoreTracks, CoreCache{0}
+- WHERE CoreCache.ModelID = {1} AND
++ WHERE {4}(CoreCache.ModelID = {1}) AND
+ CoreTracks.AlbumID = CoreAlbums.AlbumID AND
+ EXISTS (SELECT 1 FROM CoreArtists WHERE ArtistID = CoreAlbums.ArtistID) AND
+ CoreCache.ItemID = {2} {3})
+diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs
+index 0705eab..213f137 100644
+--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs
++++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs
+@@ -56,7 +56,7 @@ namespace Banshee.Collection.Database
+ ReloadFragmentFormat = @"
+ FROM CoreAlbums WHERE CoreAlbums.AlbumID IN
+ (SELECT CoreTracks.AlbumID FROM CoreTracks, CoreCache{0}
+- WHERE CoreCache.ModelID = {1} AND
++ WHERE {4}(CoreCache.ModelID = {1}) AND
+ CoreCache.ItemId = {2} {3})
+ ORDER BY CoreAlbums.TitleSortKey, CoreAlbums.ArtistNameSortKey";
+ }
+diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs
+index f7a2b4b..171e9e2 100644
+--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs
++++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs
+@@ -49,7 +49,7 @@ namespace Banshee.Collection.Database
+ ReloadFragmentFormat = @"
+ FROM CoreArtists WHERE CoreArtists.ArtistID IN
+ (SELECT CoreTracks.ArtistID FROM CoreTracks, CoreCache{0}
+- WHERE CoreCache.ModelID = {1} AND
++ WHERE {4}(CoreCache.ModelID = {1}) AND
+ CoreCache.ItemID = {2} {3})
+ ORDER BY NameSortKey";
+ }
+diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseFilterListModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseFilterListModel.cs
+index 018a0f4..2a5d4fd 100644
+--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseFilterListModel.cs
++++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseFilterListModel.cs
+@@ -57,10 +57,10 @@ namespace Banshee.Collection.Database
+ }
+
+ protected readonly U select_all_item;
+- private HyenaSqliteConnection connection;
++ private BansheeDbConnection connection;
+
+ public DatabaseFilterListModel (string name, string label, Banshee.Sources.DatabaseSource source,
+- DatabaseTrackListModel trackModel, HyenaSqliteConnection connection, SqliteModelProvider<T> provider, U selectAllItem, string uuid)
++ DatabaseTrackListModel trackModel, BansheeDbConnection connection, SqliteModelProvider<T> provider, U selectAllItem, string uuid)
+ : base (trackModel)
+ {
+ this.source = source;
+@@ -124,7 +124,8 @@ namespace Banshee.Collection.Database
+ "{0}.{1} AND CoreTracks.TrackID = {0}.{2}",
+ FilteredModel.JoinTable, FilteredModel.JoinPrimaryKey, FilteredModel.JoinColumn)
+ : "CoreTracks.TrackID",
+- filtered ? GetFilterFragment () : ""
++ filtered ? GetFilterFragment () : "",
++ connection.LikelihoodSupport ? "UNLIKELY" : ""
+ );
+ }
+
+diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseQueryFilterModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseQueryFilterModel.cs
+index a4c00fb..339e351 100644
+--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseQueryFilterModel.cs
++++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseQueryFilterModel.cs
+@@ -37,6 +37,7 @@ using Hyena.Data.Sqlite;
+ using Mono.Unix;
+
+ using Banshee.ServiceStack;
++using Banshee.Database;
+
+ namespace Banshee.Collection.Database
+ {
+@@ -51,7 +52,7 @@ namespace Banshee.Collection.Database
+ private string select_all_fmt;
+
+ public DatabaseQueryFilterModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel,
+- HyenaSqliteConnection connection, string select_all_fmt, string uuid, QueryField field, string filter_column)
++ BansheeDbConnection connection, string select_all_fmt, string uuid, QueryField field, string filter_column)
+ : base (field.Name, field.Label, source, trackModel, connection, QueryFilterInfo<T>.CreateProvider (filter_column, field), new QueryFilterInfo<T> (), String.Format ("{0}-{1}", uuid, field.Name))
+ {
+ this.field = field;
+@@ -59,7 +60,7 @@ namespace Banshee.Collection.Database
+
+ ReloadFragmentFormat = @"
+ FROM CoreTracks, CoreCache{0}
+- WHERE CoreCache.ModelID = {1} AND CoreCache.ItemID = {2} {3}
++ WHERE {4}(CoreCache.ModelID = {1}) AND CoreCache.ItemID = {2} {3}
+ ORDER BY Value";
+
+ QueryFields = new QueryFieldSet (query_filter_field);
+diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseYearListModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseYearListModel.cs
+index b58d1df..5f96d2f 100644
+--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseYearListModel.cs
++++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseYearListModel.cs
+@@ -47,7 +47,7 @@ namespace Banshee.Collection.Database
+ FROM (SELECT MIN(CoreTracks.TrackID) AS TrackID, CoreTracks.Year FROM CoreTracks GROUP BY CoreTracks.Year) AS CoreTracks
+ WHERE CoreTracks.Year IN
+ (SELECT CoreTracks.Year FROM CoreTracks, CoreCache{0}
+- WHERE CoreCache.ModelID = {1} AND
++ WHERE {4}(CoreCache.ModelID = {1}) AND
+ CoreCache.ItemID = {2} {3})
+ ORDER BY Year";
+ }
+diff --git a/src/Core/Banshee.Services/Banshee.Database/BansheeDbConnection.cs b/src/Core/Banshee.Services/Banshee.Database/BansheeDbConnection.cs
+index e9bbbf5..3ae0728 100644
+--- a/src/Core/Banshee.Services/Banshee.Database/BansheeDbConnection.cs
++++ b/src/Core/Banshee.Services/Banshee.Database/BansheeDbConnection.cs
+@@ -52,6 +52,20 @@ namespace Banshee.Database
+ get { return configuration; }
+ }
+
++ private bool? likelihood_support = null;
++ public bool LikelihoodSupport {
++ get {
++ if (!likelihood_support.HasValue) {
++ // emulate the SQLITE_VERSION_NUMBER macro
++ string[] v = Query<string> ("SELECT sqlite_version ()").Split ('.');
++ likelihood_support = (Int32.Parse (v[0]) * 1000000 +
++ Int32.Parse (v[1]) * 1000 +
++ Int32.Parse (v[2])) >= 3008001;
++ }
++ return likelihood_support.Value;
++ }
++ }
++
+ public BansheeDbConnection () : this (DatabaseFile)
+ {
+