[banshee/gapless-ng: 828/836] [libbanshee] Make ReplayGain more error-resilient.



commit f7b83753cefea592d68041560501cea4f862369e
Author: Christopher James Halse Rogers <raof ubuntu com>
Date:   Thu Feb 25 10:10:38 2010 +1100

    [libbanshee] Make ReplayGain more error-resilient.
    
    Do this by calling _bp_replaygain_pipeline_rebuild from _bp_pipeline_construct,
    and only call the re-linking pad_block_cb when actually changing RG state.

 libbanshee/banshee-player-replaygain.c |   21 ++++++++++++++-------
 1 files changed, 14 insertions(+), 7 deletions(-)
---
diff --git a/libbanshee/banshee-player-replaygain.c b/libbanshee/banshee-player-replaygain.c
index 4105a20..cab4c94 100644
--- a/libbanshee/banshee-player-replaygain.c
+++ b/libbanshee/banshee-player-replaygain.c
@@ -51,22 +51,23 @@ pad_block_cb (GstPad *srcPad, gboolean blocked, gpointer user_data) {
     g_return_if_fail (IS_BANSHEE_PLAYER (player));
 
     if (player->rgvolume_in_pipeline == TRUE) {
-        g_return_if_fail (player->rgvolume != NULL);
         gst_element_unlink(player->before_rgvolume, player->rgvolume);
         gst_element_unlink(player->rgvolume, player->after_rgvolume);
     } else {
         gst_element_unlink(player->before_rgvolume, player->after_rgvolume);
     }
 
-    if (player->rgvolume == NULL && player->replaygain_enabled == TRUE) {
-        player->rgvolume = gst_element_factory_make ("rgvolume", NULL);
-        gst_bin_add (GST_BIN (player->audiobin), player->rgvolume);
+    if (player->replaygain_enabled) {
+        player->rgvolume = _bp_rgvolume_new (player);
+    } else {
+        gst_bin_remove (GST_BIN (player->audiobin), player->rgvolume);
     }
 
-    if (player->replaygain_enabled == TRUE) {
+    if (player->replaygain_enabled && GST_IS_ELEMENT (player->rgvolume)) {
+        gst_bin_add (GST_BIN (player->audiobin), player->rgvolume);
         gst_element_sync_state_with_parent(player->rgvolume);
 
-        // link in rgvolume and connect to the real audio sink.
+        // link in rgvolume and connect to the real audio sink
         gst_element_link (player->before_rgvolume, player->rgvolume);
         gst_element_link (player->rgvolume, player->after_rgvolume);
         player->rgvolume_in_pipeline = TRUE;
@@ -116,8 +117,14 @@ void _bp_rgvolume_print_volume(BansheePlayer *player)
 void _bp_replaygain_pipeline_rebuild (BansheePlayer* player)
 {
     g_return_if_fail (IS_BANSHEE_PLAYER (player));
-    g_return_if_fail (GST_IS_ELEMENT (player->before_rgvolume));
 
+    if ((player->replaygain_enabled && player->rgvolume_in_pipeline) ||
+        (!player->replaygain_enabled && !player->rgvolume_in_pipeline)) {
+        // The pipeline is already in the correct state.  Do nothing.
+        return;
+    }
+
+    g_return_if_fail (GST_IS_ELEMENT (player->before_rgvolume));
     GstPad* srcPad = gst_element_get_static_pad(player->before_rgvolume, "src");
 
     if (gst_pad_is_active(srcPad) == TRUE && gst_pad_is_blocked (srcPad) == FALSE) {



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