banshee r3610 - in trunk/banshee: . libbanshee src/Backends/Banshee.GStreamer/Banshee.GStreamer



Author: abock
Date: Mon Mar 31 06:09:31 2008
New Revision: 3610
URL: http://svn.gnome.org/viewvc/banshee?rev=3610&view=rev

Log:
2008-03-31  Aaron Bockover  <abock gnome org>
    
    * libbanshee/banshee-player-cdda.h: Split out all of the special code
    for handling CDDA nicely into a separate easy to maintain file; fixes
    some CDDA bugs and is documented so I don't forget why I wrote half
    this crap again

    * libbanshee/banshee-player.c: Renamed a lot of stuff to be less confusing
    with actual GStreamer API, uses bp_ function prefix and BansheePlayer
    prefix for structs and callbacks

    * libbanshee/banshee-player.h: Split out some stuff to a proper header
    file even though it should never be used outside of p/invoke from managed

    * libbanshee/gst-tagger.c:
    * libbanshee/gst-tagger.h: Nuked, this code has never actually been used
    since we use a fully managed tagging solution (TagLibg#) - it's just been
    library bloat for a couple of years - awesome

    * src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs:
    Updated to call into the new bp_ functions



Added:
   trunk/banshee/libbanshee/banshee-player-cdda.h
   trunk/banshee/libbanshee/banshee-player.h
Removed:
   trunk/banshee/libbanshee/gst-tagger.c
   trunk/banshee/libbanshee/gst-tagger.h
Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/libbanshee/Makefile.am
   trunk/banshee/libbanshee/banshee-player.c
   trunk/banshee/libbanshee/libbanshee.mdp
   trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs

Modified: trunk/banshee/libbanshee/Makefile.am
==============================================================================
--- trunk/banshee/libbanshee/Makefile.am	(original)
+++ trunk/banshee/libbanshee/Makefile.am	Mon Mar 31 06:09:31 2008
@@ -13,10 +13,10 @@
 libbanshee_la_LDFLAGS = -avoid-version -module
 libbanshee_la_SOURCES =  \
 	banshee-player.c \
+	banshee-player-cdda.h \
 	gst-cd-rip-0.10.c \
 	gst-misc-0.10.c \
 	gst-playback.h \
-	gst-tagger.c \
 	gst-transcode-0.10.c
 
 OLD_CODE = \

Added: trunk/banshee/libbanshee/banshee-player-cdda.h
==============================================================================
--- (empty file)
+++ trunk/banshee/libbanshee/banshee-player-cdda.h	Mon Mar 31 06:09:31 2008
@@ -0,0 +1,182 @@
+//
+// banshee-player-cdda.h
+//
+// Author:
+//   Aaron Bockover <abockover novell com>
+//
+// Copyright (C) 2005-2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#include <gst/cdda/gstcddabasesrc.h>
+
+static GstElement *
+bp_cdda_get_cdda_source (GstElement *playbin)
+{
+    GstElement *source = NULL;
+    
+    if (playbin == NULL) {
+        return NULL;
+    }
+    
+    g_object_get (playbin, "source", &source, NULL);
+    
+    if (source == NULL || !GST_IS_CDDA_BASE_SRC (source)) {
+        if (source != NULL) {
+            g_object_unref (source);
+        }
+        
+        return NULL;
+    }
+    
+    return source;
+}
+
+static void
+bp_cdda_on_notify_source (GstElement *playbin, gpointer unknown, BansheePlayer *player)
+{
+    GstElement *cdda_src = NULL;
+    
+    g_return_if_fail (IS_BANSHEE_PLAYER (player));
+    
+    if (player->cdda_device == NULL) {
+        return;
+    }
+    
+    cdda_src = bp_cdda_get_cdda_source (playbin);
+    if (cdda_src == NULL) {
+        return;
+    }
+    
+    // Technically don't need to check the class, since GstCddaBaseSrc elements will always have this
+    if (G_LIKELY (g_object_class_find_property (G_OBJECT_GET_CLASS (cdda_src), "device"))) {
+        bp_debug ("bp_cdda: setting device property on source (%s)", player->cdda_device);
+        g_object_set (cdda_src, "device", player->cdda_device, NULL);
+    }
+    
+    // If the GstCddaBaseSrc is cdparanoia, it will have this property, so set it
+    if (g_object_class_find_property (G_OBJECT_GET_CLASS (cdda_src), "paranoia-mode")) {
+        g_object_set (cdda_src, "paranoia-mode", 0, NULL);
+    }
+    
+    g_object_unref (cdda_src);
+}
+
+static gboolean
+bp_cdda_source_seek_to_track (GstElement *playbin, guint track)
+{
+    static GstFormat format = GST_FORMAT_UNDEFINED;
+    GstElement *cdda_src = NULL;
+    GstState state;
+    
+    format = gst_format_get_by_nick ("track");
+    if (G_UNLIKELY (format == GST_FORMAT_UNDEFINED)) {
+        return FALSE;
+    }
+    
+    gst_element_get_state (playbin, &state, NULL, 0);
+    if (state < GST_STATE_PAUSED) {
+        // We can only seek if the pipeline is playing or paused, otherwise
+        // we just allow playbin to do its thing, which will re-start the
+        // device and start at the desired track
+        return FALSE;
+    }
+
+    cdda_src = bp_cdda_get_cdda_source (playbin);
+    if (G_UNLIKELY (cdda_src == NULL)) {
+        return FALSE;
+    }
+    
+    if (gst_element_seek (playbin, 1.0, format, GST_SEEK_FLAG_FLUSH, 
+        GST_SEEK_TYPE_SET, track - 1, GST_SEEK_TYPE_NONE, -1)) {
+        bp_debug ("bp_cdda: seeking to track %d, avoiding playbin", track);
+        g_object_unref (cdda_src);
+        return TRUE;
+    }
+    
+    g_object_unref (cdda_src);
+    return FALSE;
+}
+
+static gboolean
+bp_cdda_handle_uri (BansheePlayer *player, const gchar *uri)
+{
+    // Processes URIs like cdda://<track-number>#<device-node> and overrides
+    // track transitioning through playbin if playback was already happening
+    // from the device node by seeking directly to the track since the disc
+    // is already spinning; playbin doesn't handle CDDA URIs with device nodes
+    // so we have to handle setting the device property on GstCddaBaseSrc 
+    // through the notify::source signal on playbin
+
+    const gchar *new_cdda_device;
+    const gchar *p;
+    
+    if (player == NULL || uri == NULL || !g_str_has_prefix (uri, "cdda://")) {
+        // Something is hosed or the URI isn't actually CDDA
+        if (player->cdda_device != NULL) {
+            bp_debug ("bp_cdda: finished using device (%s)", player->cdda_device);
+            g_free (player->cdda_device);
+            player->cdda_device = NULL;
+        }
+        
+        return FALSE;
+    }
+
+    p = g_utf8_strchr (uri, -1, '#');
+    if (p == NULL || strlen (p) < 2) {
+        // Unset the cached device node if the URI doesn't
+        // have its own valid device node
+        g_free (player->cdda_device);
+        player->cdda_device = NULL;
+        bp_debug ("bp_cdda: invalid device node in URI (%s)", uri);
+        return FALSE;
+    }
+    
+    new_cdda_device = p + 1;
+            
+    if (player->cdda_device == NULL) {
+        // If we weren't already playing from a CD, cache the
+        // device and allow playbin to begin playing it
+        player->cdda_device = g_strdup (new_cdda_device);
+        bp_debug ("bp_cdda: storing device node for fast seeks (%s)", player->cdda_device);
+        return FALSE;
+    }
+    
+    if (strcmp (new_cdda_device, player->cdda_device) == 0) {
+        // Parse the track number from the URI and seek directly to it
+        // since we are already playing from the device; prevent playbin
+        // from stopping/starting the CD, which can take many many seconds
+        gchar *track_str = g_strndup (uri + 7, strlen (uri) - strlen (new_cdda_device) - 8);
+        gint track_num = atoi (track_str);
+        g_free (track_str);
+        bp_debug ("bp_cdda: fast seeking to track on already playing device (%s)", player->cdda_device);
+        
+        return bp_cdda_source_seek_to_track (player->playbin, track_num);
+    }
+    
+    // We were already playing some CD, but switched to a different device node, 
+    // so unset and re-cache the new device node and allow playbin to do its thing
+    bp_debug ("bp_cdda: switching devices for CDDA playback (from %s, to %s)", player->cdda_device, new_cdda_device);
+    g_free (player->cdda_device);
+    player->cdda_device = g_strdup(new_cdda_device);
+    
+    return FALSE;
+}

Modified: trunk/banshee/libbanshee/banshee-player.c
==============================================================================
--- trunk/banshee/libbanshee/banshee-player.c	(original)
+++ trunk/banshee/libbanshee/banshee-player.c	Mon Mar 31 06:09:31 2008
@@ -26,89 +26,38 @@
  *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
  *  DEALINGS IN THE SOFTWARE.
  */
- 
-#ifdef HAVE_CONFIG_H
-#  include "config.h"
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <glib.h>
-#include <glib/gstdio.h>
 
-#include <gst/gst.h>
-
-#ifdef HAVE_GST_PBUTILS
-#  include <gst/pbutils/pbutils.h>
-#endif
+#define _BANSHEE_PLAYER_C
+ 
+#include "banshee-player.h"
+#include "banshee-player-cdda.h"
 
-#include <gdk/gdk.h>
 #ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>
-#include <gst/interfaces/xoverlay.h>
+static gboolean bp_find_xoverlay (BansheePlayer *player);
 #endif
 
-#include "gst-tagger.h"
-
-#define IS_GST_PLAYBACK(e) (e != NULL)
-#define SET_CALLBACK(cb_name) { if(engine != NULL) { engine->cb_name = cb; } }
-
-typedef struct GstPlayback GstPlayback;
-
-typedef void (* GstPlaybackEosCallback) (GstPlayback *engine);
-typedef void (* GstPlaybackErrorCallback) (GstPlayback *engine, 
-    GQuark domain, gint code, const gchar *error, const gchar *debug);
-typedef void (* GstPlaybackStateChangedCallback) (
-    GstPlayback *engine, GstState old_state, 
-    GstState new_state, GstState pending_state);
-typedef void (* GstPlaybackIterateCallback) (GstPlayback *engine);
-typedef void (* GstPlaybackBufferingCallback) (GstPlayback *engine, gint buffering_progress);
-
-struct GstPlayback {
-    GstElement *playbin;
-    GstElement *audiotee;
-    GstElement *audiobin;
-    GstElement *equalizer;
-    GstElement *preamp;
-    
-    GMutex *mutex;
-
-    #ifdef GDK_WINDOWING_X11
-    GstXOverlay *xoverlay;
-    GdkWindow *video_window;
-    #endif
+static void
+bp_process_tag(const GstTagList *tag_list, const gchar *tag_name, BansheePlayer *player)
+{
+    const GValue *value;
+    gint value_count;
 
-    guint iterate_timeout_id;
-    gchar *cdda_device;
-    
-    GstState target_state;
-    gboolean buffering;
-    
-    GstPlaybackEosCallback eos_cb;
-    GstPlaybackErrorCallback error_cb;
-    GstPlaybackStateChangedCallback state_changed_cb;
-    GstPlaybackIterateCallback iterate_cb;
-    GstPlaybackBufferingCallback buffering_cb;
-    GstTaggerTagFoundCallback tag_found_cb;
-    
-    GdkWindow *window;
-    GSList *missing_element_details;
-    gboolean install_plugins_noprompt;
+    value_count = gst_tag_list_get_tag_size(tag_list, tag_name);
+    if(value_count < 1) {
+        return;
+    }
     
-    #ifdef HAVE_GST_PBUTILS
-    GstInstallPluginsContext *install_plugins_context;
-    #endif
-};
+    value = gst_tag_list_get_value_index(tag_list, tag_name, 0);
 
-#ifdef GDK_WINDOWING_X11
-static gboolean gst_playback_find_xoverlay (GstPlayback *engine);
-#endif
+    if(player != NULL && player->tag_found_cb != NULL) {
+        player->tag_found_cb(player, tag_name, value);
+    }
+}
 
 // private methods
 
 static void
-gst_playback_nuke_slist(GSList *list)
+bp_nuke_slist(GSList *list)
 {   
     GSList *node = list;
     
@@ -120,26 +69,26 @@
 }
 
 static void
-gst_playback_destroy_pipeline(GstPlayback *engine)
+bp_destroy_pipeline(BansheePlayer *player)
 {
-    g_return_if_fail(IS_GST_PLAYBACK(engine));
+    g_return_if_fail(IS_BANSHEE_PLAYER(player));
     
-    if(engine->playbin == NULL) {
+    if(player->playbin == NULL) {
         return;
     }
     
-    if(GST_IS_ELEMENT(engine->playbin)) {
-        engine->target_state = GST_STATE_NULL;
-        gst_element_set_state(engine->playbin, GST_STATE_NULL);
-        gst_object_unref(GST_OBJECT(engine->playbin));
+    if(GST_IS_ELEMENT(player->playbin)) {
+        player->target_state = GST_STATE_NULL;
+        gst_element_set_state(player->playbin, GST_STATE_NULL);
+        gst_object_unref(GST_OBJECT(player->playbin));
     }
     
-    engine->playbin = NULL;
+    player->playbin = NULL;
 }
 
 #ifdef HAVE_GST_PBUTILS
 static gchar **
-gst_playback_missing_element_details_vectorize(const GSList *elements)
+bp_missing_element_details_vectorize(const GSList *elements)
 {
     GPtrArray *vector = g_ptr_array_new();
     
@@ -153,67 +102,67 @@
 }
 
 static void
-gst_playback_handle_missing_elements_failed(GstPlayback *engine)
+bp_handle_missing_elements_failed(BansheePlayer *player)
 {
-    gst_playback_nuke_slist(engine->missing_element_details);
-    engine->missing_element_details = NULL;
-    gst_element_set_state(engine->playbin, GST_STATE_READY);
+    bp_nuke_slist(player->missing_element_details);
+    player->missing_element_details = NULL;
+    gst_element_set_state(player->playbin, GST_STATE_READY);
     
-    if(engine->error_cb != NULL) {
-       engine->error_cb(engine, GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN, NULL, NULL);
+    if(player->error_cb != NULL) {
+       player->error_cb(player, GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN, NULL, NULL);
     }
 }
 
 static void
-gst_playback_handle_missing_elements_installer_result(GstInstallPluginsReturn result, gpointer data)
+bp_handle_missing_elements_installer_result(GstInstallPluginsReturn result, gpointer data)
 {
-    GstPlayback *engine = (GstPlayback *)data;
+    BansheePlayer *player = (BansheePlayer *)data;
     
-    g_return_if_fail(IS_GST_PLAYBACK(engine));
+    g_return_if_fail(IS_BANSHEE_PLAYER(player));
     
     // TODO: Actually handle a successful plugin installation
     // if(result == GST_INSTALL_PLUGINS_SUCCESS) {
     // }
     
-    engine->install_plugins_noprompt = TRUE;
+    player->install_plugins_noprompt = TRUE;
     
-    gst_playback_handle_missing_elements_failed(engine);
+    bp_handle_missing_elements_failed(player);
     
-    gst_install_plugins_context_free(engine->install_plugins_context);
-    engine->install_plugins_context = NULL;
+    gst_install_plugins_context_free(player->install_plugins_context);
+    player->install_plugins_context = NULL;
 }
 
 static void
-gst_playback_handle_missing_elements(GstPlayback *engine)
+bp_handle_missing_elements(BansheePlayer *player)
 {
     GstInstallPluginsReturn install_return;
     gchar **details;
     
-    if(engine->install_plugins_context != NULL) {
+    if(player->install_plugins_context != NULL) {
         return;
-    } else if(engine->install_plugins_noprompt) {
-        gst_playback_handle_missing_elements_failed(engine);
+    } else if(player->install_plugins_noprompt) {
+        bp_handle_missing_elements_failed(player);
         return;
     }
     
-    details = gst_playback_missing_element_details_vectorize(engine->missing_element_details);
-    engine->install_plugins_context = gst_install_plugins_context_new();
+    details = bp_missing_element_details_vectorize(player->missing_element_details);
+    player->install_plugins_context = gst_install_plugins_context_new();
     
     #ifdef GDK_WINDOWING_X11
-    if(engine->window != NULL) {
-        gst_install_plugins_context_set_xid(engine->install_plugins_context, 
-        GDK_WINDOW_XWINDOW(engine->window));
+    if(player->window != NULL) {
+        gst_install_plugins_context_set_xid(player->install_plugins_context, 
+        GDK_WINDOW_XWINDOW(player->window));
     }
     #endif
     
-    install_return = gst_install_plugins_async(details, engine->install_plugins_context, 
-        gst_playback_handle_missing_elements_installer_result, engine);
+    install_return = gst_install_plugins_async(details, player->install_plugins_context, 
+        bp_handle_missing_elements_installer_result, player);
     
     if(install_return != GST_INSTALL_PLUGINS_STARTED_OK) {
-        gst_playback_handle_missing_elements_failed(engine);
+        bp_handle_missing_elements_failed(player);
         
-        gst_install_plugins_context_free(engine->install_plugins_context);
-        engine->install_plugins_context = NULL;
+        gst_install_plugins_context_free(player->install_plugins_context);
+        player->install_plugins_context = NULL;
     } 
     
     g_strfreev(details);
@@ -221,11 +170,11 @@
 #endif
 
 static gboolean
-gst_playback_bus_callback(GstBus *bus, GstMessage *message, gpointer data)
+bp_bus_callback(GstBus *bus, GstMessage *message, gpointer data)
 {
-    GstPlayback *engine = (GstPlayback *)data;
+    BansheePlayer *player = (BansheePlayer *)data;
 
-    g_return_val_if_fail(IS_GST_PLAYBACK(engine), FALSE);
+    g_return_val_if_fail(IS_BANSHEE_PLAYER(player), FALSE);
 
     switch(GST_MESSAGE_TYPE(message)) {
         case GST_MESSAGE_ERROR: {
@@ -239,11 +188,11 @@
                 break;
             }
             
-            gst_playback_destroy_pipeline(engine);
+            bp_destroy_pipeline(player);
             
-            if(engine->error_cb != NULL) {
+            if(player->error_cb != NULL) {
                 gst_message_parse_error(message, &error, &debug);
-                engine->error_cb(engine, error->domain, error->code, error->message, debug);
+                player->error_cb(player, error->domain, error->code, error->message, debug);
                 g_error_free(error);
                 g_free(debug);
             }
@@ -254,7 +203,7 @@
         #ifdef HAVE_GST_PBUTILS
         case GST_MESSAGE_ELEMENT: {
             if(gst_is_missing_plugin_message(message)) {
-                engine->missing_element_details = g_slist_append(engine->missing_element_details, 
+                player->missing_element_details = g_slist_append(player->missing_element_details, 
                     gst_missing_plugin_message_get_installer_detail(message));
             }
             
@@ -263,8 +212,8 @@
         #endif
         
         case GST_MESSAGE_EOS:
-            if(engine->eos_cb != NULL) {
-                engine->eos_cb(engine);
+            if(player->eos_cb != NULL) {
+                player->eos_cb(player);
             }
             break;
         case GST_MESSAGE_STATE_CHANGED: {
@@ -273,14 +222,14 @@
             
             #ifdef HAVE_GST_PBUTILS
             if(old == GST_STATE_READY && new == GST_STATE_PAUSED) {
-                if(engine->missing_element_details != NULL) {
-                    gst_playback_handle_missing_elements(engine);
+                if(player->missing_element_details != NULL) {
+                    bp_handle_missing_elements(player);
                 }
             }
             #endif
             
-            if(engine->state_changed_cb != NULL) {
-                engine->state_changed_cb(engine, old, new, pending);
+            if(player->state_changed_cb != NULL) {
+                player->state_changed_cb(player, old, new, pending);
             }
             break;
         }
@@ -295,38 +244,34 @@
             }
             
             if(buffering_progress >= 100) {
-                engine->buffering = FALSE;
-                if(engine->target_state == GST_STATE_PLAYING) {
-                    gst_element_set_state(engine->playbin, GST_STATE_PLAYING);
+                player->buffering = FALSE;
+                if(player->target_state == GST_STATE_PLAYING) {
+                    gst_element_set_state(player->playbin, GST_STATE_PLAYING);
                 }
-            } else if(!engine->buffering && engine->target_state == GST_STATE_PLAYING) {
+            } else if(!player->buffering && player->target_state == GST_STATE_PLAYING) {
                 GstState current_state;
-                gst_element_get_state(engine->playbin, &current_state, NULL, 0);
+                gst_element_get_state(player->playbin, &current_state, NULL, 0);
                 if(current_state == GST_STATE_PLAYING) {
-                    gst_element_set_state(engine->playbin, GST_STATE_PAUSED);
+                    gst_element_set_state(player->playbin, GST_STATE_PAUSED);
                 }
-                engine->buffering = TRUE;
+                player->buffering = TRUE;
             } 
 
-            if(engine->buffering_cb != NULL) {
-                engine->buffering_cb(engine, buffering_progress);
+            if(player->buffering_cb != NULL) {
+                player->buffering_cb(player, buffering_progress);
             }
         }
         case GST_MESSAGE_TAG: {
             GstTagList *tags;
-            GstTaggerInvoke invoke;
             
             if(GST_MESSAGE_TYPE(message) != GST_MESSAGE_TAG) {
                 break;
             }
             
-            invoke.callback = engine->tag_found_cb;
-            invoke.user_data = engine;
-            
             gst_message_parse_tag(message, &tags);
             
             if(GST_IS_TAG_LIST(tags)) {
-                gst_tag_list_foreach(tags, (GstTagForeachFunc)gst_tagger_process_tag, &invoke);
+                gst_tag_list_foreach(tags, (GstTagForeachFunc)bp_process_tag, player);
                 gst_tag_list_free(tags);
             }
             break;
@@ -339,81 +284,23 @@
 }
 
 static void
-gst_playback_on_notify_source_cb(GstElement *playbin, gpointer unknown, GstPlayback *engine)
+bp_video_sink_element_added (GstBin *videosink, GstElement *element, BansheePlayer *player)
 {
-    GstElement *source_element = NULL;
-    
-    g_return_if_fail(IS_GST_PLAYBACK(engine));
-    
-    if(engine->cdda_device == NULL) {
-        return;
-    }
-    
-    g_object_get(playbin, "source", &source_element, NULL);
-    if(source_element == NULL) {
-        return;
-    }
-    
-    if(g_object_class_find_property(G_OBJECT_GET_CLASS(source_element), "paranoia-mode") &&
-        g_object_class_find_property(G_OBJECT_GET_CLASS(source_element), "device")) {
-        g_object_set(source_element, "paranoia-mode", 0, NULL);
-        g_object_set(source_element, "device", engine->cdda_device, NULL);
-    }
-    
-    g_object_unref(source_element);
-}
-
-static gboolean
-gst_playback_cdda_source_set_track(GstElement *playbin, guint track)
-{
-    static GstFormat format = 0;
-    GstElement *source_element = NULL;
-    GstState state;
-    
-    gst_element_get_state(playbin, &state, NULL, 0);
-    if(state < GST_STATE_PAUSED) {
-        return FALSE;
-    }
-
-    g_object_get(playbin, "source", &source_element, NULL);
-    if(source_element == NULL) {
-        return FALSE;
-    }
-    
-    if(strcmp(G_OBJECT_TYPE_NAME(source_element), "GstCdParanoiaSrc") == 0) {
-        if(format == 0) {
-            format = gst_format_get_by_nick("track");
-        }
-        
-        if(gst_element_seek(playbin, 1.0, format, GST_SEEK_FLAG_FLUSH,
-            GST_SEEK_TYPE_SET, track - 1, GST_SEEK_TYPE_NONE, -1)) {
-            g_object_unref(source_element);
-            return TRUE;
-        }
-    }
-    
-    g_object_unref(source_element);
-    return FALSE;
-}
-
-static void
-gst_playback_video_sink_element_added (GstBin *videosink, GstElement *element, GstPlayback *engine)
-{
-    g_return_if_fail (IS_GST_PLAYBACK (engine));
+    g_return_if_fail (IS_BANSHEE_PLAYER (player));
 
     #ifdef GDK_WINDOWING_X11
-    g_mutex_lock (engine->mutex);
-    gst_playback_find_xoverlay (engine);
-    g_mutex_unlock (engine->mutex);    
+    g_mutex_lock (player->mutex);
+    bp_find_xoverlay (player);
+    g_mutex_unlock (player->mutex);    
     #endif
 }
 
 static void
-gst_playback_bus_element_sync_message (GstBus *bus, GstMessage *message, GstPlayback *engine)
+bp_bus_element_sync_message (GstBus *bus, GstMessage *message, BansheePlayer *player)
 {
     gboolean found_xoverlay;
     
-    g_return_if_fail (IS_GST_PLAYBACK (engine));
+    g_return_if_fail (IS_BANSHEE_PLAYER (player));
 
     #ifdef GDK_WINDOWING_X11
 
@@ -421,19 +308,19 @@
         return;
     }
 
-    g_mutex_lock (engine->mutex);
-    found_xoverlay = gst_playback_find_xoverlay (engine);
-    g_mutex_unlock (engine->mutex);
+    g_mutex_lock (player->mutex);
+    found_xoverlay = bp_find_xoverlay (player);
+    g_mutex_unlock (player->mutex);
 
     if (found_xoverlay) {
-        gst_x_overlay_set_xwindow_id (engine->xoverlay, GDK_WINDOW_XWINDOW (engine->video_window));
+        gst_x_overlay_set_xwindow_id (player->xoverlay, GDK_WINDOW_XWINDOW (player->video_window));
     }
 
     #endif
 }
 
 static gboolean 
-gst_playback_construct(GstPlayback *engine)
+bp_construct(BansheePlayer *player)
 {
     GstBus *bus;
     GstElement *videosink;
@@ -442,11 +329,11 @@
     //GstElement *audioconvert;
     GstPad *teepad;
     
-    g_return_val_if_fail(IS_GST_PLAYBACK(engine), FALSE);
+    g_return_val_if_fail(IS_BANSHEE_PLAYER(player), FALSE);
     
     // create necessary elements
-    engine->playbin = gst_element_factory_make("playbin", "playbin");
-    g_return_val_if_fail(engine->playbin != NULL, FALSE);
+    player->playbin = gst_element_factory_make("playbin", "playbin");
+    g_return_val_if_fail(player->playbin != NULL, FALSE);
 
     audiosink = gst_element_factory_make("gconfaudiosink", "audiosink");
     g_return_val_if_fail(audiosink != NULL, FALSE);
@@ -456,51 +343,51 @@
         g_object_set(G_OBJECT(audiosink), "profile", 1, NULL);
     }
     
-    engine->audiobin = gst_bin_new("audiobin");
-    g_return_val_if_fail(engine->audiobin != NULL, FALSE);
+    player->audiobin = gst_bin_new("audiobin");
+    g_return_val_if_fail(player->audiobin != NULL, FALSE);
     
-    engine->audiotee = gst_element_factory_make("tee", "audiotee");
-    g_return_val_if_fail(engine->audiotee != NULL, FALSE);
+    player->audiotee = gst_element_factory_make("tee", "audiotee");
+    g_return_val_if_fail(player->audiotee != NULL, FALSE);
     
     audiosinkqueue = gst_element_factory_make("queue", "audiosinkqueue");
     g_return_val_if_fail(audiosinkqueue != NULL, FALSE);
     
     //audioconvert = gst_element_factory_make("audioconvert", "audioconvert");
-    //engine->equalizer = gst_element_factory_make("equalizer-10bands", "equalizer-10bands");
-    //engine->preamp = gst_element_factory_make("volume", "preamp");
+    //player->equalizer = gst_element_factory_make("equalizer-10bands", "equalizer-10bands");
+    //player->preamp = gst_element_factory_make("volume", "preamp");
     
     // add elements to custom audio sink
-    gst_bin_add(GST_BIN(engine->audiobin), engine->audiotee);
-    //if(engine->equalizer != NULL) {
-    //    gst_bin_add(GST_BIN(engine->audiobin), audioconvert);
-    //    gst_bin_add(GST_BIN(engine->audiobin), engine->equalizer);
-    //    gst_bin_add(GST_BIN(engine->audiobin), engine->preamp);
+    gst_bin_add(GST_BIN(player->audiobin), player->audiotee);
+    //if(player->equalizer != NULL) {
+    //    gst_bin_add(GST_BIN(player->audiobin), audioconvert);
+    //    gst_bin_add(GST_BIN(player->audiobin), player->equalizer);
+    //    gst_bin_add(GST_BIN(player->audiobin), player->preamp);
     //}
-    gst_bin_add(GST_BIN(engine->audiobin), audiosinkqueue);
-    gst_bin_add(GST_BIN(engine->audiobin), audiosink);
+    gst_bin_add(GST_BIN(player->audiobin), audiosinkqueue);
+    gst_bin_add(GST_BIN(player->audiobin), audiosink);
    
     // ghost pad the audio bin
-    teepad = gst_element_get_pad(engine->audiotee, "sink");
-    gst_element_add_pad(engine->audiobin, gst_ghost_pad_new("sink", teepad));
+    teepad = gst_element_get_pad(player->audiotee, "sink");
+    gst_element_add_pad(player->audiobin, gst_ghost_pad_new("sink", teepad));
     gst_object_unref(teepad);
 
     // link the tee/queue pads for the default
-    gst_pad_link(gst_element_get_request_pad(engine->audiotee, "src0"), 
+    gst_pad_link(gst_element_get_request_pad(player->audiotee, "src0"), 
         gst_element_get_pad(audiosinkqueue, "sink"));
 
-    //if (engine->equalizer != NULL)
+    //if (player->equalizer != NULL)
     //{
     //    //link in equalizer, preamp and audioconvert.
-    //    gst_element_link(audiosinkqueue, engine->preamp);
-    //    gst_element_link(engine->preamp, engine->equalizer);
-    //    gst_element_link(engine->equalizer, audioconvert);
+    //    gst_element_link(audiosinkqueue, player->preamp);
+    //    gst_element_link(player->preamp, player->equalizer);
+    //    gst_element_link(player->equalizer, audioconvert);
     //    gst_element_link(audioconvert, audiosink);
     //} else {
     //    // link the queue with the real audio sink
         gst_element_link(audiosinkqueue, audiosink);
     //}
     
-    g_object_set (G_OBJECT (engine->playbin), "audio-sink", engine->audiobin, NULL);
+    g_object_set (G_OBJECT (player->playbin), "audio-sink", player->audiobin, NULL);
     
     videosink = gst_element_factory_make ("gconfvideosink", "videosink");
     if (videosink == NULL) {
@@ -513,261 +400,233 @@
         }
     }
     
-    g_object_set (G_OBJECT (engine->playbin), "video-sink", videosink, NULL);
+    g_object_set (G_OBJECT (player->playbin), "video-sink", videosink, NULL);
 
-    bus = gst_pipeline_get_bus (GST_PIPELINE (engine->playbin));
+    bus = gst_pipeline_get_bus (GST_PIPELINE (player->playbin));
     
-    gst_bus_add_watch (bus, gst_playback_bus_callback, engine);
-    gst_bus_set_sync_handler (bus, gst_bus_sync_signal_handler, engine);
+    gst_bus_add_watch (bus, bp_bus_callback, player);
+    gst_bus_set_sync_handler (bus, gst_bus_sync_signal_handler, player);
 
     g_signal_connect (bus, "sync-message::element", 
-        G_CALLBACK (gst_playback_bus_element_sync_message), engine);
+        G_CALLBACK (bp_bus_element_sync_message), player);
 
-    g_signal_connect (engine->playbin, "notify::source", 
-        G_CALLBACK (gst_playback_on_notify_source_cb), engine);
+    g_signal_connect (player->playbin, "notify::source", G_CALLBACK (bp_cdda_on_notify_source), player);
     
     if (GST_IS_BIN (videosink)) {
         g_signal_connect (videosink, "element-added",
-            G_CALLBACK (gst_playback_video_sink_element_added), engine);
+            G_CALLBACK (bp_video_sink_element_added), player);
     }
 
     return TRUE;
 }
 
 static gboolean
-gst_playback_iterate_timeout(GstPlayback *engine)
+bp_iterate_timeout(BansheePlayer *player)
 {
-    g_return_val_if_fail(IS_GST_PLAYBACK(engine), FALSE);
+    g_return_val_if_fail(IS_BANSHEE_PLAYER(player), FALSE);
     
-    if(engine->iterate_cb != NULL) {
-        engine->iterate_cb(engine);
+    if(player->iterate_cb != NULL) {
+        player->iterate_cb(player);
     }
     
     return TRUE;
 }
 
 static void
-gst_playback_start_iterate_timeout(GstPlayback *engine)
+bp_start_iterate_timeout(BansheePlayer *player)
 {
-    g_return_if_fail(IS_GST_PLAYBACK(engine));
+    g_return_if_fail(IS_BANSHEE_PLAYER(player));
 
-    if(engine->iterate_timeout_id != 0) {
+    if(player->iterate_timeout_id != 0) {
         return;
     }
     
-    engine->iterate_timeout_id = g_timeout_add(200, 
-        (GSourceFunc)gst_playback_iterate_timeout, engine);
+    player->iterate_timeout_id = g_timeout_add(200, 
+        (GSourceFunc)bp_iterate_timeout, player);
 }
 
 static void
-gst_playback_stop_iterate_timeout(GstPlayback *engine)
+bp_stop_iterate_timeout(BansheePlayer *player)
 {
-    g_return_if_fail(IS_GST_PLAYBACK(engine));
+    g_return_if_fail(IS_BANSHEE_PLAYER(player));
     
-    if(engine->iterate_timeout_id == 0) {
+    if(player->iterate_timeout_id == 0) {
         return;
     }
     
-    g_source_remove(engine->iterate_timeout_id);
-    engine->iterate_timeout_id = 0;
+    g_source_remove(player->iterate_timeout_id);
+    player->iterate_timeout_id = 0;
 }
 
 // public methods
 
-GstPlayback *
-gst_playback_new()
+BansheePlayer *
+bp_new()
 {
-    GstPlayback *engine = g_new0(GstPlayback, 1);
+    BansheePlayer *player = g_new0(BansheePlayer, 1);
     
-    engine->mutex = g_mutex_new ();
+    player->mutex = g_mutex_new ();
     
-    if(!gst_playback_construct(engine)) {
-        g_free(engine);
+    if(!bp_construct(player)) {
+        g_free(player);
         return NULL;
     }
     
-    return engine;
+    return player;
 }
 
 void
-gst_playback_free(GstPlayback *engine)
+bp_free(BansheePlayer *player)
 {
-    g_return_if_fail(IS_GST_PLAYBACK(engine));
+    g_return_if_fail(IS_BANSHEE_PLAYER(player));
     
-    g_mutex_free (engine->mutex);
+    g_mutex_free (player->mutex);
     
-    if(GST_IS_OBJECT(engine->playbin)) {
-        engine->target_state = GST_STATE_NULL;
-        gst_element_set_state(engine->playbin, GST_STATE_NULL);
-        gst_object_unref(GST_OBJECT(engine->playbin));
+    if(GST_IS_OBJECT(player->playbin)) {
+        player->target_state = GST_STATE_NULL;
+        gst_element_set_state(player->playbin, GST_STATE_NULL);
+        gst_object_unref(GST_OBJECT(player->playbin));
     }
     
-    if(engine->cdda_device != NULL) {
-        g_free(engine->cdda_device);
-        engine->cdda_device = NULL;
+    if(player->cdda_device != NULL) {
+        g_free(player->cdda_device);
+        player->cdda_device = NULL;
     }
     
-    gst_playback_nuke_slist(engine->missing_element_details);
-    engine->missing_element_details = NULL;
+    bp_nuke_slist(player->missing_element_details);
+    player->missing_element_details = NULL;
     
     #ifdef HAVE_GST_PBUTILS
-    if(engine->install_plugins_context != NULL) {
-        gst_install_plugins_context_free(engine->install_plugins_context);
-        engine->install_plugins_context = NULL;
+    if(player->install_plugins_context != NULL) {
+        gst_install_plugins_context_free(player->install_plugins_context);
+        player->install_plugins_context = NULL;
     }
     #endif
     
-    g_free(engine);
-    engine = NULL;
+    g_free(player);
+    player = NULL;
 }
 
 void
-gst_playback_set_eos_callback(GstPlayback *engine, 
-    GstPlaybackEosCallback cb)
+bp_set_eos_callback(BansheePlayer *player, 
+    BansheePlayerEosCallback cb)
 {
     SET_CALLBACK(eos_cb);
 }
 
 void
-gst_playback_set_error_callback(GstPlayback *engine, 
-    GstPlaybackErrorCallback cb)
+bp_set_error_callback(BansheePlayer *player, 
+    BansheePlayerErrorCallback cb)
 {
     SET_CALLBACK(error_cb);
 }
 
 void
-gst_playback_set_state_changed_callback(GstPlayback *engine, 
-    GstPlaybackStateChangedCallback cb)
+bp_set_state_changed_callback(BansheePlayer *player, 
+    BansheePlayerStateChangedCallback cb)
 {
     SET_CALLBACK(state_changed_cb);
 }
 
 void
-gst_playback_set_iterate_callback(GstPlayback *engine, 
-    GstPlaybackIterateCallback cb)
+bp_set_iterate_callback(BansheePlayer *player, 
+    BansheePlayerIterateCallback cb)
 {
     SET_CALLBACK(iterate_cb);
 }
 
 void
-gst_playback_set_buffering_callback(GstPlayback *engine, 
-    GstPlaybackBufferingCallback cb)
+bp_set_buffering_callback(BansheePlayer *player, 
+    BansheePlayerBufferingCallback cb)
 {
     SET_CALLBACK(buffering_cb);
 }
 
 void
-gst_playback_set_tag_found_callback(GstPlayback *engine, 
-    GstTaggerTagFoundCallback cb)
+bp_set_tag_found_callback(BansheePlayer *player, 
+    BansheePlayerTagFoundCallback cb)
 {
     SET_CALLBACK(tag_found_cb);
 }
 
 void
-gst_playback_open(GstPlayback *engine, const gchar *uri)
+bp_open(BansheePlayer *player, const gchar *uri)
 {
     GstState state;
     
-    g_return_if_fail(IS_GST_PLAYBACK(engine));
+    g_return_if_fail(IS_BANSHEE_PLAYER(player));
     
-    if(engine->playbin == NULL && !gst_playback_construct(engine)) {
+    if(player->playbin == NULL && !bp_construct(player)) {
         return;
     }
 
-    if(uri != NULL && g_str_has_prefix(uri, "cdda://")) {
-        const gchar *p = g_utf8_strchr(uri, -1, '#');
-        const gchar *new_cdda_device;
-        
-        if(p != NULL) {
-            new_cdda_device = p + 1;
-            
-            if(engine->cdda_device == NULL) {
-                engine->cdda_device = g_strdup(new_cdda_device);
-            } else if(strcmp(new_cdda_device, engine->cdda_device) == 0) {
-                guint track_num;
-                gchar *track_str = g_strndup(uri + 7, strlen(uri) - strlen(new_cdda_device) - 8);
-                track_num = atoi(track_str);
-                g_free(track_str);
-                
-                if(gst_playback_cdda_source_set_track(engine->playbin, track_num)) {
-                    return;
-                }
-            } else {
-                if(engine->cdda_device != NULL) {
-                    g_free(engine->cdda_device);
-                    engine->cdda_device = NULL;
-                }
-            
-                engine->cdda_device = g_strdup(new_cdda_device);
-            }
-        }
-    } else if(engine->cdda_device != NULL) {
-        g_free(engine->cdda_device);
-        engine->cdda_device = NULL;
+    if (bp_cdda_handle_uri (player, uri)) {
+        return;
     }
     
-    gst_element_get_state(engine->playbin, &state, NULL, 0);
+    gst_element_get_state(player->playbin, &state, NULL, 0);
     if(state >= GST_STATE_PAUSED) {
-        engine->target_state = GST_STATE_READY;
-        gst_element_set_state(engine->playbin, GST_STATE_READY);
+        player->target_state = GST_STATE_READY;
+        gst_element_set_state(player->playbin, GST_STATE_READY);
     }
     
-    g_object_set(G_OBJECT(engine->playbin), "uri", uri, NULL);
+    g_object_set(G_OBJECT(player->playbin), "uri", uri, NULL);
 }
 
 void
-gst_playback_stop(GstPlayback *engine)
+bp_stop(BansheePlayer *player, gboolean nullstate)
 {
-    g_return_if_fail(IS_GST_PLAYBACK(engine));
-    gst_playback_stop_iterate_timeout(engine);
-    if(GST_IS_ELEMENT(engine->playbin)) {
-        engine->target_state = GST_STATE_NULL;
-        gst_element_set_state(engine->playbin, GST_STATE_NULL);
+    GstState state = nullstate ? GST_STATE_NULL : GST_STATE_PAUSED;
+    g_return_if_fail(IS_BANSHEE_PLAYER(player));
+    bp_stop_iterate_timeout(player);
+    if(GST_IS_ELEMENT(player->playbin)) {
+        player->target_state = state;
+        gst_element_set_state(player->playbin, state);
     }
 }
 
 void
-gst_playback_pause(GstPlayback *engine)
+bp_pause(BansheePlayer *player)
 {
-    g_return_if_fail(IS_GST_PLAYBACK(engine));
-    gst_playback_stop_iterate_timeout(engine);
-    engine->target_state = GST_STATE_PAUSED;
-    gst_element_set_state(engine->playbin, GST_STATE_PAUSED);
+    g_return_if_fail(IS_BANSHEE_PLAYER(player));
+    bp_stop_iterate_timeout(player);
+    player->target_state = GST_STATE_PAUSED;
+    gst_element_set_state(player->playbin, GST_STATE_PAUSED);
 }
 
 void
-gst_playback_play(GstPlayback *engine)
+bp_play(BansheePlayer *player)
 {
-    g_return_if_fail(IS_GST_PLAYBACK(engine));
-    engine->target_state = GST_STATE_PLAYING;
-    gst_element_set_state(engine->playbin, GST_STATE_PLAYING);
-    gst_playback_start_iterate_timeout(engine);
+    g_return_if_fail(IS_BANSHEE_PLAYER(player));
+    player->target_state = GST_STATE_PLAYING;
+    gst_element_set_state(player->playbin, GST_STATE_PLAYING);
+    bp_start_iterate_timeout(player);
 }
 
 void
-gst_playback_set_volume(GstPlayback *engine, gint volume)
+bp_set_volume(BansheePlayer *player, gint volume)
 {
     gdouble act_volume;
-    g_return_if_fail(IS_GST_PLAYBACK(engine));
+    g_return_if_fail(IS_BANSHEE_PLAYER(player));
     act_volume = CLAMP(volume, 0, 100) / 100.0;
-    g_object_set(G_OBJECT(engine->playbin), "volume", act_volume, NULL);
+    g_object_set(G_OBJECT(player->playbin), "volume", act_volume, NULL);
 }
 
 gint
-gst_playback_get_volume(GstPlayback *engine)
+bp_get_volume(BansheePlayer *player)
 {
     gdouble volume = 0.0;
-    g_return_val_if_fail(IS_GST_PLAYBACK(engine), 0);
-    g_object_get(engine->playbin, "volume", &volume, NULL);
+    g_return_val_if_fail(IS_BANSHEE_PLAYER(player), 0);
+    g_object_get(player->playbin, "volume", &volume, NULL);
     return (gint)(volume * 100.0);
 }
 
 void
-gst_playback_set_position(GstPlayback *engine, guint64 time_ms)
+bp_set_position(BansheePlayer *player, guint64 time_ms)
 {
-    g_return_if_fail(IS_GST_PLAYBACK(engine));
+    g_return_if_fail(IS_BANSHEE_PLAYER(player));
     
-    if(!gst_element_seek(engine->playbin, 1.0, 
+    if(!gst_element_seek(player->playbin, 1.0, 
         GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
         GST_SEEK_TYPE_SET, time_ms * GST_MSECOND, 
         GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) {
@@ -776,14 +635,14 @@
 }
 
 guint64
-gst_playback_get_position(GstPlayback *engine)
+bp_get_position(BansheePlayer *player)
 {
     GstFormat format = GST_FORMAT_TIME;
     gint64 position;
 
-    g_return_val_if_fail(IS_GST_PLAYBACK(engine), 0);
+    g_return_val_if_fail(IS_BANSHEE_PLAYER(player), 0);
 
-    if(gst_element_query_position(engine->playbin, &format, &position)) {
+    if(gst_element_query_position(player->playbin, &format, &position)) {
         return position / 1000000;
     }
     
@@ -791,14 +650,14 @@
 }
 
 guint64
-gst_playback_get_duration(GstPlayback *engine)
+bp_get_duration(BansheePlayer *player)
 {
     GstFormat format = GST_FORMAT_TIME;
     gint64 duration;
 
-    g_return_val_if_fail(IS_GST_PLAYBACK(engine), 0);
+    g_return_val_if_fail(IS_BANSHEE_PLAYER(player), 0);
 
-    if(gst_element_query_duration(engine->playbin, &format, &duration)) {
+    if(gst_element_query_duration(player->playbin, &format, &duration)) {
         return duration / 1000000;
     }
     
@@ -806,21 +665,21 @@
 }
 
 gboolean
-gst_playback_can_seek(GstPlayback *engine)
+bp_can_seek(BansheePlayer *player)
 {
     GstQuery *query;
     gboolean can_seek = TRUE;
     
-    g_return_val_if_fail(IS_GST_PLAYBACK(engine), FALSE);
-    g_return_val_if_fail(engine->playbin != NULL, FALSE);
+    g_return_val_if_fail(IS_BANSHEE_PLAYER(player), FALSE);
+    g_return_val_if_fail(player->playbin != NULL, FALSE);
     
     query = gst_query_new_seeking(GST_FORMAT_TIME);
-    if(!gst_element_query(engine->playbin, query)) {
+    if(!gst_element_query(player->playbin, query)) {
         // This will probably fail, 100% of the time, because it's apparently 
         // very unimplemented in GStreamer... when it's fixed
         // we will return FALSE here, and show the warning
         // g_warning("Could not query pipeline for seek ability");
-        return gst_playback_get_duration(engine) > 0;
+        return bp_get_duration(player) > 0;
     }
     
     gst_query_parse_seeking(query, NULL, &can_seek, NULL, NULL);
@@ -830,26 +689,26 @@
 }
 
 gboolean
-gst_playback_get_pipeline_elements(GstPlayback *engine, GstElement **playbin, GstElement **audiobin, 
+bp_get_pipeline_elements(BansheePlayer *player, GstElement **playbin, GstElement **audiobin, 
     GstElement **audiotee)
 {
-    g_return_val_if_fail(IS_GST_PLAYBACK(engine), FALSE);
+    g_return_val_if_fail(IS_BANSHEE_PLAYER(player), FALSE);
     
-    *playbin = engine->playbin;
-    *audiobin = engine->audiobin;
-    *audiotee = engine->audiotee;
+    *playbin = player->playbin;
+    *audiobin = player->audiobin;
+    *audiotee = player->audiotee;
     
     return TRUE;
 }
 
 void
-gst_playback_set_application_gdk_window(GstPlayback *engine, GdkWindow *window)
+bp_set_application_gdk_window(BansheePlayer *player, GdkWindow *window)
 {
-    engine->window = window;
+    player->window = window;
 }
 
 void
-gst_playback_get_error_quarks(GQuark *core, GQuark *library, GQuark *resource, GQuark *stream)
+bp_get_error_quarks(GQuark *core, GQuark *library, GQuark *resource, GQuark *stream)
 {
     *core = GST_CORE_ERROR;
     *library = GST_LIBRARY_ERROR;
@@ -862,24 +721,24 @@
 #ifdef GDK_WINDOWING_X11
 
 gboolean
-gst_playback_video_is_supported (GstPlayback *engine)
+bp_video_is_supported (BansheePlayer *player)
 {
-    return TRUE; // gst_playback_find_xoverlay (engine);
+    return TRUE; // bp_find_xoverlay (player);
 }
 
 static gboolean
-gst_playback_find_xoverlay (GstPlayback *engine)
+bp_find_xoverlay (BansheePlayer *player)
 {
     GstElement *video_sink = NULL;
     GstElement *xoverlay;
     GstXOverlay *previous_xoverlay;
 
-    previous_xoverlay = engine->xoverlay;
+    previous_xoverlay = player->xoverlay;
     
-    g_object_get (engine->playbin, "video-sink", &video_sink, NULL);
+    g_object_get (player->playbin, "video-sink", &video_sink, NULL);
     
     if (video_sink == NULL) {
-        engine->xoverlay = NULL;
+        player->xoverlay = NULL;
         if (previous_xoverlay != NULL) {
             gst_object_unref (previous_xoverlay);
         }
@@ -891,71 +750,71 @@
         ? gst_bin_get_by_interface (GST_BIN (video_sink), GST_TYPE_X_OVERLAY)
         : video_sink;
     
-    engine->xoverlay = GST_IS_X_OVERLAY (xoverlay) ? GST_X_OVERLAY (xoverlay) : NULL;
+    player->xoverlay = GST_IS_X_OVERLAY (xoverlay) ? GST_X_OVERLAY (xoverlay) : NULL;
     
     if (previous_xoverlay != NULL) {
         gst_object_unref (previous_xoverlay);
     }
         
-    if (engine->xoverlay != NULL && g_object_class_find_property (
-        G_OBJECT_GET_CLASS (engine->xoverlay), "force-aspect-ratio")) {
-        g_object_set (G_OBJECT (engine->xoverlay), "force-aspect-ratio", TRUE, NULL);
+    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);
     }
 
     gst_object_unref (video_sink);
 
-    return engine->xoverlay != NULL;
+    return player->xoverlay != NULL;
 }
 
 void
-gst_playback_set_video_window (GstPlayback *engine, GdkWindow *window)
+bp_set_video_window (BansheePlayer *player, GdkWindow *window)
 {
-    engine->video_window = window;
+    player->video_window = window;
 }
 
 void
-gst_playback_expose_video_window (GstPlayback *engine, GdkWindow *window, gboolean direct)
+bp_expose_video_window (BansheePlayer *player, GdkWindow *window, gboolean direct)
 {
     XID window_id;
     
-    if (direct && engine->xoverlay != NULL && GST_IS_X_OVERLAY (engine->xoverlay)) {
-        gst_x_overlay_expose (engine->xoverlay);
+    if (direct && player->xoverlay != NULL && GST_IS_X_OVERLAY (player->xoverlay)) {
+        gst_x_overlay_expose (player->xoverlay);
         return;
     }
    
-    g_mutex_lock (engine->mutex);
+    g_mutex_lock (player->mutex);
    
-    if (engine->xoverlay == NULL && !gst_playback_find_xoverlay (engine)) {
-        g_mutex_unlock (engine->mutex);
+    if (player->xoverlay == NULL && !bp_find_xoverlay (player)) {
+        g_mutex_unlock (player->mutex);
         return;
     }
     
-    gst_object_ref (engine->xoverlay);
-    g_mutex_unlock (engine->mutex);
+    gst_object_ref (player->xoverlay);
+    g_mutex_unlock (player->mutex);
 
     window_id = GDK_WINDOW_XWINDOW (window);
 
-    gst_x_overlay_set_xwindow_id (engine->xoverlay, window_id);
-    gst_x_overlay_expose (engine->xoverlay);
+    gst_x_overlay_set_xwindow_id (player->xoverlay, window_id);
+    gst_x_overlay_expose (player->xoverlay);
 
-    gst_object_unref (engine->xoverlay);
+    gst_object_unref (player->xoverlay);
 }
 
 #else
 
 gboolean
-gst_playback_video_is_supported (GstPlayback *engine)
+bp_video_is_supported (BansheePlayer *player)
 {
     return FALSE;
 }
 
 void
-gst_playback_set_video_window (GstPlayback *engine, GdkWindow *window)
+bp_set_video_window (BansheePlayer *player, GdkWindow *window)
 {
 }
 
 void
-gst_playback_expose_video_window (GstPlayback *engine, GdkWindow *window, gboolean direct)
+bp_expose_video_window (BansheePlayer *player, GdkWindow *window, gboolean direct)
 {
 }
 
@@ -964,31 +823,31 @@
 /* Region Equalizer */
 
 gboolean
-gst_equalizer_is_supported(GstPlayback *engine)
+gst_equalizer_is_supported(BansheePlayer *player)
 {
-    return engine != NULL && engine->equalizer != NULL && engine->preamp != NULL;
+    return player != NULL && player->equalizer != NULL && player->preamp != NULL;
 }
 
 void
-gst_equalizer_set_preamp_level(GstPlayback *engine, gdouble level)
+gst_equalizer_set_preamp_level(BansheePlayer *player, gdouble level)
 {
-    if (engine->equalizer != NULL && engine->preamp != NULL)
-        g_object_set (engine->preamp, "volume", level, NULL);
+    if (player->equalizer != NULL && player->preamp != NULL)
+        g_object_set (player->preamp, "volume", level, NULL);
 }
 
 void
-gst_equalizer_set_gain(GstPlayback *engine, guint bandnum, gdouble gain)
+gst_equalizer_set_gain(BansheePlayer *player, guint bandnum, gdouble gain)
 {
-    if (engine->equalizer != NULL) {
+    if (player->equalizer != NULL) {
         GstObject *band;   
-        band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (engine->equalizer), bandnum);
+        band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (player->equalizer), bandnum);
         g_object_set (band, "gain", gain, NULL);
         g_object_unref (band);
     }
 }
 
 void
-gst_equalizer_get_bandrange(GstPlayback *engine, gint *min, gint *max)
+gst_equalizer_get_bandrange(BansheePlayer *player, gint *min, gint *max)
 {    
     /*
      * NOTE: This only refers to the newer version of the equalizer element.
@@ -1002,18 +861,18 @@
      * If that didn't make any sense, yay for late-night coding. :)
      */
     
-    if (engine->equalizer != NULL) {
+    if (player->equalizer != NULL) {
         GParamSpecDouble *pspec;
         
         // Fetch gain range of first band (since it should be the same for the rest)
-        pspec = (GParamSpecDouble*) g_object_class_find_property (G_OBJECT_GET_CLASS (engine->equalizer), "band0");
+        pspec = (GParamSpecDouble*) g_object_class_find_property (G_OBJECT_GET_CLASS (player->equalizer), "band0");
         if (pspec) {
             // Assume old equalizer.
             *min = pspec->minimum;
             *max = pspec->maximum;
         }
         else {
-            pspec = (GParamSpecDouble*) g_object_class_find_property (G_OBJECT_GET_CLASS (engine->equalizer), "band0::gain");
+            pspec = (GParamSpecDouble*) g_object_class_find_property (G_OBJECT_GET_CLASS (player->equalizer), "band0::gain");
             if (pspec && pspec->maximum == 12) {
                 // New equalizer - return even scale.
                 *min = -12;
@@ -1032,7 +891,7 @@
 }
 
 void
-gst_equalizer_get_frequencies(GstPlayback *engine, gdouble *freq[])
+gst_equalizer_get_frequencies(BansheePlayer *player, gdouble *freq[])
 {
     gint i;
     gdouble bandfreq[10];
@@ -1040,7 +899,7 @@
     for(i = 0; i < 10; i++) {
         GstObject *band;
         
-        band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (engine->equalizer), i);
+        band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (player->equalizer), i);
         g_object_get (G_OBJECT (band), "freq", &bandfreq[i], NULL);
         g_object_unref (band);
     }

Added: trunk/banshee/libbanshee/banshee-player.h
==============================================================================
--- (empty file)
+++ trunk/banshee/libbanshee/banshee-player.h	Mon Mar 31 06:09:31 2008
@@ -0,0 +1,81 @@
+#ifndef _BANSHEE_PLAYER_H
+#define _BANSHEE_PLAYER_H
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+#include <glib/gstdio.h>
+
+#include <gst/gst.h>
+
+#ifdef HAVE_GST_PBUTILS
+#  include <gst/pbutils/pbutils.h>
+#endif
+
+#include <gdk/gdk.h>
+#ifdef GDK_WINDOWING_X11
+#include <gdk/gdkx.h>
+#include <gst/interfaces/xoverlay.h>
+#endif
+
+#define IS_BANSHEE_PLAYER(e) (e != NULL)
+#define SET_CALLBACK(cb_name) { if(player != NULL) { player->cb_name = cb; } }
+
+#define bp_debug g_debug
+
+typedef struct BansheePlayer BansheePlayer;
+
+typedef void (* BansheePlayerEosCallback)          (BansheePlayer *player);
+typedef void (* BansheePlayerErrorCallback)        (BansheePlayer *player, GQuark domain, gint code, 
+                                                    const gchar *error, const gchar *debug);
+typedef void (* BansheePlayerStateChangedCallback) (BansheePlayer *player, GstState old_state, 
+                                                    GstState new_state, GstState pending_state);
+typedef void (* BansheePlayerIterateCallback)      (BansheePlayer *player);
+typedef void (* BansheePlayerBufferingCallback)    (BansheePlayer *player, gint buffering_progress);
+typedef void (* BansheePlayerTagFoundCallback)     (BansheePlayer *player, const gchar *tag, const GValue *value);
+
+struct BansheePlayer {
+
+    // Player Callbacks
+    BansheePlayerEosCallback eos_cb;
+    BansheePlayerErrorCallback error_cb;
+    BansheePlayerStateChangedCallback state_changed_cb;
+    BansheePlayerIterateCallback iterate_cb;
+    BansheePlayerBufferingCallback buffering_cb;
+    BansheePlayerTagFoundCallback tag_found_cb;
+
+    // Pipeline Elements
+    GstElement *playbin;
+    GstElement *audiotee;
+    GstElement *audiobin;
+    GstElement *equalizer;
+    GstElement *preamp;
+    
+    // Pipeline/Playback State
+    GMutex *mutex;
+    GstState target_state;
+    guint iterate_timeout_id;
+    gboolean buffering;
+    gchar *cdda_device;
+    
+    // Video State
+    #ifdef GDK_WINDOWING_X11
+    GstXOverlay *xoverlay;
+    GdkWindow *video_window;
+    #endif
+    
+    // Plugin Installer State
+    GdkWindow *window;
+    GSList *missing_element_details;
+    gboolean install_plugins_noprompt;
+    #ifdef HAVE_GST_PBUTILS
+    GstInstallPluginsContext *install_plugins_context;
+    #endif
+};
+
+#endif /* _BANSHEE_PLAYER_H */

Modified: trunk/banshee/libbanshee/libbanshee.mdp
==============================================================================
--- trunk/banshee/libbanshee/libbanshee.mdp	(original)
+++ trunk/banshee/libbanshee/libbanshee.mdp	Mon Mar 31 06:09:31 2008
@@ -15,10 +15,10 @@
     <File name="gst-misc.h" subtype="Code" buildaction="Nothing" />
     <File name="gst-misc-0.10.c" subtype="Code" buildaction="Compile" />
     <File name="banshee-player.c" subtype="Code" buildaction="Compile" />
-    <File name="gst-tagger.c" subtype="Code" buildaction="Compile" />
-    <File name="gst-tagger.h" subtype="Code" buildaction="Nothing" />
     <File name="gst-transcode.h" subtype="Code" buildaction="Nothing" />
     <File name="gst-transcode-0.10.c" subtype="Code" buildaction="Compile" />
+    <File name="banshee-player.h" subtype="Code" buildaction="Nothing" />
+    <File name="banshee-player-cdda.h" subtype="Code" buildaction="Compile" />
   </Contents>
   <compiler ctype="GccCompiler" />
   <MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="True" RelativeMakefileName="Makefile.am">

Modified: trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
==============================================================================
--- trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs	(original)
+++ trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs	Mon Mar 31 06:09:31 2008
@@ -40,13 +40,13 @@
 
 namespace Banshee.GStreamer
 {
-    internal delegate void GstPlaybackEosCallback (IntPtr engine);
-    internal delegate void GstPlaybackErrorCallback (IntPtr engine, uint domain, int code, IntPtr error, IntPtr debug);
-    internal delegate void GstPlaybackStateChangedCallback (IntPtr engine, int old_state, int new_state, int pending_state);
-    internal delegate void GstPlaybackIterateCallback (IntPtr engine);
-    internal delegate void GstPlaybackBufferingCallback (IntPtr engine, int buffering_progress);
+    internal delegate void BansheePlayerEosCallback (IntPtr player);
+    internal delegate void BansheePlayerErrorCallback (IntPtr player, uint domain, int code, IntPtr error, IntPtr debug);
+    internal delegate void BansheePlayerStateChangedCallback (IntPtr player, int old_state, int new_state, int pending_state);
+    internal delegate void BansheePlayerIterateCallback (IntPtr player);
+    internal delegate void BansheePlayerBufferingCallback (IntPtr player, int buffering_progress);
 
-    internal delegate void GstTaggerTagFoundCallback (string tagName, ref GLib.Value value, IntPtr userData);        
+    internal delegate void GstTaggerTagFoundCallback (IntPtr player, string tagName, ref GLib.Value value);
     
     public class PlayerEngine : Banshee.MediaEngine.PlayerEngine, Banshee.MediaEngine.IEqualizer
     {
@@ -57,11 +57,11 @@
     
         private HandleRef handle;
         
-        private GstPlaybackEosCallback eos_callback;
-        private GstPlaybackErrorCallback error_callback;
-        private GstPlaybackStateChangedCallback state_changed_callback;
-        private GstPlaybackIterateCallback iterate_callback;
-        private GstPlaybackBufferingCallback buffering_callback;
+        private BansheePlayerEosCallback eos_callback;
+        private BansheePlayerErrorCallback error_callback;
+        private BansheePlayerStateChangedCallback state_changed_callback;
+        private BansheePlayerIterateCallback iterate_callback;
+        private BansheePlayerBufferingCallback buffering_callback;
         private GstTaggerTagFoundCallback tag_found_callback;
         
         private bool buffering_finished;
@@ -86,7 +86,7 @@
         
         private void Initialize ()
         {
-            IntPtr ptr = gst_playback_new ();
+            IntPtr ptr = bp_new ();
             
             if (ptr == IntPtr.Zero) {
                 throw new ApplicationException (Catalog.GetString ("Could not initialize GStreamer library"));
@@ -94,21 +94,21 @@
             
             handle = new HandleRef (this, ptr);
             
-            gst_playback_get_error_quarks (out GST_CORE_ERROR, out GST_LIBRARY_ERROR, 
+            bp_get_error_quarks (out GST_CORE_ERROR, out GST_LIBRARY_ERROR, 
                 out GST_RESOURCE_ERROR, out GST_STREAM_ERROR);
             
-            eos_callback = new GstPlaybackEosCallback (OnEos);
-            error_callback = new GstPlaybackErrorCallback (OnError);
-            iterate_callback = new GstPlaybackIterateCallback (OnIterate);
-            buffering_callback = new GstPlaybackBufferingCallback (OnBuffering);
+            eos_callback = new BansheePlayerEosCallback (OnEos);
+            error_callback = new BansheePlayerErrorCallback (OnError);
+            iterate_callback = new BansheePlayerIterateCallback (OnIterate);
+            buffering_callback = new BansheePlayerBufferingCallback (OnBuffering);
             tag_found_callback = new GstTaggerTagFoundCallback (OnTagFound);
             
-            gst_playback_set_eos_callback (handle, eos_callback);
-            gst_playback_set_iterate_callback (handle, iterate_callback);
-            gst_playback_set_error_callback (handle, error_callback);
-            gst_playback_set_state_changed_callback (handle, state_changed_callback);
-            gst_playback_set_buffering_callback (handle, buffering_callback);
-            gst_playback_set_tag_found_callback (handle, tag_found_callback);
+            bp_set_eos_callback (handle, eos_callback);
+            bp_set_iterate_callback (handle, iterate_callback);
+            bp_set_error_callback (handle, error_callback);
+            bp_set_state_changed_callback (handle, state_changed_callback);
+            bp_set_buffering_callback (handle, buffering_callback);
+            bp_set_tag_found_callback (handle, tag_found_callback);
             
             OnStateChanged (PlayerEngineState.Ready);
             
@@ -120,12 +120,12 @@
         public override void Dispose ()
         {
             base.Dispose ();
-            gst_playback_free (handle);
+            bp_free (handle);
         }
         
         public override void Close ()
         {
-            gst_playback_stop (handle);
+            bp_stop (handle, false);
             base.Close ();
         }
         
@@ -137,54 +137,54 @@
 
             IPropertyStoreExpose service = ServiceManager.Get<IService> ("GtkElementsService") as IPropertyStoreExpose;
             if (service != null) {
-                gst_playback_set_application_gdk_window (handle, service.PropertyStore.Get<IntPtr> ("PrimaryWindow.RawHandle"));
+                bp_set_application_gdk_window (handle, service.PropertyStore.Get<IntPtr> ("PrimaryWindow.RawHandle"));
             }
                 
             IntPtr uri_ptr = GLib.Marshaller.StringToPtrGStrdup (uri.AbsoluteUri);
-            gst_playback_open (handle, uri_ptr);
+            bp_open (handle, uri_ptr);
             GLib.Marshaller.Free (uri_ptr);
         }
         
         public override void Play ()
         {
-            gst_playback_play (handle);
+            bp_play (handle);
             OnStateChanged (PlayerEngineState.Playing);
         }
         
         public override void Pause ()
         {
-            gst_playback_pause (handle);
+            bp_pause (handle);
             OnStateChanged (PlayerEngineState.Paused);
         }
         
         public override void VideoExpose (IntPtr window, bool direct)
         {
-            gst_playback_expose_video_window (handle, window, direct);
+            bp_expose_video_window (handle, window, direct);
         }
 
         public override IntPtr [] GetBaseElements ()
         {
             IntPtr [] elements = new IntPtr[3];
             
-            if (gst_playback_get_pipeline_elements (handle, out elements[0], out elements[1], out elements[2])) {
+            if (bp_get_pipeline_elements (handle, out elements[0], out elements[1], out elements[2])) {
                 return elements;
             }
             
             return null;
         }
 
-        private void OnEos (IntPtr engine)
+        private void OnEos (IntPtr player)
         {
             Close ();
             OnEventChanged (PlayerEngineEvent.EndOfStream);
         }
         
-        private void OnIterate (IntPtr engine)
+        private void OnIterate (IntPtr player)
         {
             OnEventChanged (PlayerEngineEvent.Iterate);
         }
         
-        private void OnError (IntPtr engine, uint domain, int code, IntPtr error, IntPtr debug)
+        private void OnError (IntPtr player, uint domain, int code, IntPtr error, IntPtr debug)
         {
             Close ();
             
@@ -240,7 +240,7 @@
             OnEventChanged (PlayerEngineEvent.Error, error_message);
         }
         
-        private void OnBuffering (IntPtr engine, int progress)
+        private void OnBuffering (IntPtr player, int progress)
         {
             if (buffering_finished && progress >= 100) {
                 return;
@@ -250,7 +250,7 @@
             OnEventChanged (PlayerEngineEvent.Buffering, Catalog.GetString ("Buffering"), (double) progress / 100.0);
         }
         
-        private void OnTagFound (string tagName, ref GLib.Value value, IntPtr userData)
+        private void OnTagFound (IntPtr player, string tagName, ref GLib.Value value)
         {
             OnTagFound(ProcessNativeTagResult (tagName, ref value));
         }
@@ -281,32 +281,32 @@
         }
         
         public override ushort Volume {
-            get { return (ushort)gst_playback_get_volume (handle); }
+            get { return (ushort)bp_get_volume (handle); }
             set { 
                 if ((IntPtr)handle == IntPtr.Zero) {
                     pending_volume = (short)value;
                     return;
                 }
                 
-                gst_playback_set_volume (handle, (int)value);
+                bp_set_volume (handle, (int)value);
                 OnEventChanged (PlayerEngineEvent.Volume);
             }
         }
         
         public override uint Position {
-            get { return (uint)gst_playback_get_position(handle); }
+            get { return (uint)bp_get_position(handle); }
             set { 
-                gst_playback_set_position(handle, (ulong)value);
+                bp_set_position(handle, (ulong)value);
                 OnEventChanged (PlayerEngineEvent.Seek);
             }
         }
         
         public override bool CanSeek {
-            get { return gst_playback_can_seek (handle); }
+            get { return bp_can_seek (handle); }
         }
         
         public override uint Length {
-            get { return (uint)gst_playback_get_duration (handle); }
+            get { return (uint)bp_get_duration (handle); }
         }
         
         public override string Id {
@@ -332,7 +332,7 @@
         public override bool SupportsVideo {
             get { 
                 if (supports_video == null) {
-                    supports_video = gst_playback_video_is_supported (handle); 
+                    supports_video = bp_video_is_supported (handle); 
                 }
                 
                 return supports_video.Value;
@@ -340,7 +340,7 @@
         }
         
         public override IntPtr VideoWindow {
-            set { gst_playback_set_video_window (handle, value); }
+            set { bp_set_video_window (handle, value); }
         }
         
         public double AmplifierLevel {
@@ -391,97 +391,97 @@
         }
         
         [DllImport ("libbanshee")]
-        private static extern IntPtr gst_playback_new ();
+        private static extern IntPtr bp_new ();
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_free (HandleRef engine);
+        private static extern void bp_free (HandleRef player);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_set_eos_callback (HandleRef engine, GstPlaybackEosCallback cb);
+        private static extern void bp_set_eos_callback (HandleRef player, BansheePlayerEosCallback cb);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_set_error_callback (HandleRef engine, GstPlaybackErrorCallback cb);
+        private static extern void bp_set_error_callback (HandleRef player, BansheePlayerErrorCallback cb);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_set_state_changed_callback (HandleRef engine, 
-            GstPlaybackStateChangedCallback cb);
+        private static extern void bp_set_state_changed_callback (HandleRef player, 
+            BansheePlayerStateChangedCallback cb);
             
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_set_iterate_callback (HandleRef engine,
-            GstPlaybackIterateCallback cb);
+        private static extern void bp_set_iterate_callback (HandleRef player,
+            BansheePlayerIterateCallback cb);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_set_buffering_callback (HandleRef engine,
-            GstPlaybackBufferingCallback cb);
+        private static extern void bp_set_buffering_callback (HandleRef player,
+            BansheePlayerBufferingCallback cb);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_set_tag_found_callback (HandleRef engine,
+        private static extern void bp_set_tag_found_callback (HandleRef player,
             GstTaggerTagFoundCallback cb);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_open (HandleRef engine, IntPtr uri);
+        private static extern void bp_open (HandleRef player, IntPtr uri);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_stop (HandleRef engine);
+        private static extern void bp_stop (HandleRef player, bool nullstate);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_pause (HandleRef engine);
+        private static extern void bp_pause (HandleRef player);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_play (HandleRef engine);
+        private static extern void bp_play (HandleRef player);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_set_volume (HandleRef engine, int volume);
+        private static extern void bp_set_volume (HandleRef player, int volume);
         
         [DllImport("libbanshee")]
-        private static extern int gst_playback_get_volume (HandleRef engine);
+        private static extern int bp_get_volume (HandleRef player);
         
         [DllImport ("libbanshee")]
-        private static extern bool gst_playback_can_seek (HandleRef engine);
+        private static extern bool bp_can_seek (HandleRef player);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_set_position (HandleRef engine, ulong time_ms);
+        private static extern void bp_set_position (HandleRef player, ulong time_ms);
         
         [DllImport ("libbanshee")]
-        private static extern ulong gst_playback_get_position (HandleRef engine);
+        private static extern ulong bp_get_position (HandleRef player);
         
         [DllImport ("libbanshee")]
-        private static extern ulong gst_playback_get_duration (HandleRef engine);
+        private static extern ulong bp_get_duration (HandleRef player);
         
         [DllImport ("libbanshee")]
-        private static extern bool gst_playback_get_pipeline_elements (HandleRef engine, out IntPtr playbin,
+        private static extern bool bp_get_pipeline_elements (HandleRef player, out IntPtr playbin,
             out IntPtr audiobin, out IntPtr audiotee);
             
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_set_application_gdk_window (HandleRef engine, IntPtr window);
+        private static extern void bp_set_application_gdk_window (HandleRef player, IntPtr window);
         
         [DllImport ("libbanshee")]
-        private static extern bool gst_playback_video_is_supported (HandleRef engine);
+        private static extern bool bp_video_is_supported (HandleRef player);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_set_video_window (HandleRef engine, IntPtr window);
+        private static extern void bp_set_video_window (HandleRef player, IntPtr window);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_expose_video_window (HandleRef engine, IntPtr window, bool direct);
+        private static extern void bp_expose_video_window (HandleRef player, IntPtr window, bool direct);
                                                                    
         [DllImport ("libbanshee")]
-        private static extern void gst_playback_get_error_quarks (out uint core, out uint library, 
+        private static extern void bp_get_error_quarks (out uint core, out uint library, 
             out uint resource, out uint stream);
         
         [DllImport ("libbanshee")]
-        private static extern bool gst_equalizer_is_supported (HandleRef engine);
+        private static extern bool gst_equalizer_is_supported (HandleRef player);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_equalizer_set_preamp_level (HandleRef engine, double level);
+        private static extern void gst_equalizer_set_preamp_level (HandleRef player, double level);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_equalizer_set_gain (HandleRef engine, uint bandnum, double gain);
+        private static extern void gst_equalizer_set_gain (HandleRef player, uint bandnum, double gain);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_equalizer_get_bandrange (HandleRef engine, out int min, out int max);
+        private static extern void gst_equalizer_get_bandrange (HandleRef player, out int min, out int max);
         
         [DllImport ("libbanshee")]
-        private static extern void gst_equalizer_get_frequencies (HandleRef engine,
+        private static extern void gst_equalizer_get_frequencies (HandleRef player,
             [MarshalAs (UnmanagedType.LPArray)] out double [] freq);
     }
 }



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