summaryrefslogtreecommitdiff
path: root/libbanshee/banshee-player-replaygain.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbanshee/banshee-player-replaygain.c')
-rw-r--r--libbanshee/banshee-player-replaygain.c29
1 files changed, 11 insertions, 18 deletions
diff --git a/libbanshee/banshee-player-replaygain.c b/libbanshee/banshee-player-replaygain.c
index a479d4a00..e42b19704 100644
--- a/libbanshee/banshee-player-replaygain.c
+++ b/libbanshee/banshee-player-replaygain.c
@@ -79,17 +79,13 @@ static void on_target_gain_changed (GstElement *rgvolume, GParamSpec *pspec, Ban
_bp_rgvolume_print_volume (player);
}
-static void
-pad_block_cb (GstPad *srcPad, gboolean blocked, gpointer user_data)
+static GstPadProbeReturn
+pad_block_cb (GstPad *srcPad, GstPadProbeInfo *info, gpointer user_data)
{
BansheePlayer* player;
- if (!blocked) {
- return;
- }
-
player = (BansheePlayer*) user_data;
- g_return_if_fail (IS_BANSHEE_PLAYER (player));
+ g_return_val_if_fail (IS_BANSHEE_PLAYER (player), GST_PAD_PROBE_OK);
// The pad_block_cb can get triggered multiple times, on different threads.
// Lock around the link/unlink code, so we don't end up going through here
@@ -99,11 +95,9 @@ pad_block_cb (GstPad *srcPad, gboolean blocked, gpointer user_data)
if ((player->replaygain_enabled && player->rgvolume_in_pipeline) ||
(!player->replaygain_enabled && !player->rgvolume_in_pipeline)) {
// The pipeline is already in the correct state. Unblock the pad, and return.
+ player->rg_pad_block_id = 0;
g_mutex_unlock (player->replaygain_mutex);
- if (gst_pad_is_blocked (srcPad)) {
- gst_pad_set_blocked_async (srcPad, FALSE, &pad_block_cb, player);
- }
- return;
+ return GST_PAD_PROBE_REMOVE;
}
if (player->rgvolume_in_pipeline) {
@@ -139,13 +133,12 @@ pad_block_cb (GstPad *srcPad, gboolean blocked, gpointer user_data)
}
// Our state is now consistent
+ player->rg_pad_block_id = 0;
g_mutex_unlock (player->replaygain_mutex);
- if (gst_pad_is_blocked (srcPad)) {
- gst_pad_set_blocked_async (srcPad, FALSE, &pad_block_cb, player);
- }
-
_bp_rgvolume_print_volume (player);
+
+ return GST_PAD_PROBE_REMOVE;
}
// ---------------------------------------------------------------------------
@@ -187,9 +180,9 @@ void _bp_replaygain_pipeline_rebuild (BansheePlayer* player)
srcPad = gst_element_get_static_pad (player->before_rgvolume, "src");
if (gst_pad_is_active (srcPad) && !gst_pad_is_blocked (srcPad)) {
- gst_pad_set_blocked_async (srcPad, TRUE, &pad_block_cb, player);
- } else if (srcPad->block_callback == NULL) {
- pad_block_cb (srcPad, TRUE, player);
+ player->rg_pad_block_id = gst_pad_add_probe (srcPad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM, &pad_block_cb, player, NULL);
+ } else if (!player->rg_pad_block_id) {
+ pad_block_cb (srcPad, NULL, player);
}
}