From 5f69ffea56cb6af9e95af7855a13f2fa06586961 Mon Sep 17 00:00:00 2001 From: Stefan Kost Date: Wed, 27 May 2009 17:37:38 +0300 Subject: [PATCH] seek: add volume label and sync with sink volume Look at the volume and have the pulsemixer open at same time. Unfortunately playbin2 does not emit notify on volume right, so this polls for now. --- tests/examples/seek/seek.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/tests/examples/seek/seek.c b/tests/examples/seek/seek.c index 861236b4af..9ec4da66a4 100644 --- a/tests/examples/seek/seek.c +++ b/tests/examples/seek/seek.c @@ -26,6 +26,7 @@ #endif #include +#include #include #include #include @@ -121,6 +122,8 @@ typedef struct static GArray *vis_entries; static void clear_streams (GstElement * pipeline); +static void volume_notify_cb (GstElement * pipeline, GParamSpec * arg, + gpointer user_dat); /* pipeline construction */ @@ -924,7 +927,12 @@ make_playerbin_pipeline (const gchar * location) static GstElement * make_playerbin2_pipeline (const gchar * location) { - return construct_playerbin ("playbin2", location); + GstElement *pipeline = construct_playerbin ("playbin2", location); + + /* FIXME: this is not triggered, playbin2 is not forwarding it from the sink */ + g_signal_connect (pipeline, "notify::volume", G_CALLBACK (volume_notify_cb), + NULL); + return pipeline; } #ifndef GST_DISABLE_PARSE @@ -1216,6 +1224,11 @@ update_scale (gpointer data) set_scale (position * 100.0 / duration); } + /* FIXME: see make_playerbin2_pipeline() and volume_notify_cb() */ + if (pipeline_type == 16) { + g_object_notify (G_OBJECT (pipeline), "volume"); + } + return TRUE; } @@ -1915,6 +1928,22 @@ volume_spinbutton_changed_cb (GtkSpinButton * button, GstPipeline * pipeline) g_object_set (pipeline, "volume", volume, NULL); } +static void +volume_notify_cb (GstElement * pipeline, GParamSpec * arg, gpointer user_dat) +{ + gdouble cur_volume, new_volume; + + g_object_get (pipeline, "volume", &new_volume, NULL); + cur_volume = gtk_spin_button_get_value (GTK_SPIN_BUTTON (volume_spinbutton)); + if (fabs (cur_volume - new_volume) > 0.001) { + g_signal_handlers_block_by_func (volume_spinbutton, + volume_spinbutton_changed_cb, pipeline); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (volume_spinbutton), new_volume); + g_signal_handlers_unblock_by_func (volume_spinbutton, + volume_spinbutton_changed_cb, pipeline); + } +} + static void shot_cb (GtkButton * button, gpointer data) { @@ -2314,7 +2343,7 @@ main (int argc, char **argv) GtkWidget *play_button, *pause_button, *stop_button, *shot_button; GtkWidget *accurate_checkbox, *key_checkbox, *loop_checkbox, *flush_checkbox; GtkWidget *scrub_checkbox, *play_scrub_checkbox, *rate_spinbutton; - GtkWidget *rate_label; + GtkWidget *rate_label, *volume_label; GtkTooltips *tips; GOptionEntry options[] = { {"stats", 's', 0, G_OPTION_ARG_NONE, &stats, @@ -2473,6 +2502,7 @@ main (int argc, char **argv) audio_checkbox = gtk_check_button_new_with_label ("Audio"); text_checkbox = gtk_check_button_new_with_label ("Text"); mute_checkbox = gtk_check_button_new_with_label ("Mute"); + volume_label = gtk_label_new ("Volume"); volume_spinbutton = gtk_spin_button_new_with_range (0, 10.0, 0.1); gtk_spin_button_set_value (GTK_SPIN_BUTTON (volume_spinbutton), 1.0); gtk_box_pack_start (GTK_BOX (boxes), video_checkbox, TRUE, TRUE, 2); @@ -2480,6 +2510,7 @@ main (int argc, char **argv) gtk_box_pack_start (GTK_BOX (boxes), text_checkbox, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (boxes), vis_checkbox, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (boxes), mute_checkbox, TRUE, TRUE, 2); + gtk_box_pack_start (GTK_BOX (boxes), volume_label, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (boxes), volume_spinbutton, TRUE, TRUE, 2); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vis_checkbox), FALSE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (audio_checkbox), TRUE);