banshee r3610 - in trunk/banshee: . libbanshee src/Backends/Banshee.GStreamer/Banshee.GStreamer
- From: abock svn gnome org
- To: svn-commits-list gnome org
- Subject: banshee r3610 - in trunk/banshee: . libbanshee src/Backends/Banshee.GStreamer/Banshee.GStreamer
- Date: Mon, 31 Mar 2008 06:09:32 +0100 (BST)
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, ¤t_state, NULL, 0);
+ gst_element_get_state(player->playbin, ¤t_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]