From 8bc146d759aedcb3e102840df978b296b667ced0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 15 Feb 2005 11:05:35 +0000 Subject: Add query function to GstSpeed, so that the stream length and current position get adjusted when queried (note that c... Original commit message from CVS: Add query function to GstSpeed, so that the stream length and current position get adjusted when queried (note that current position queries may still be wrong if the audio sink returns values based on buffer timestamps instead of passing on the query --- gst/speed/demo-mp3.c | 58 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 12 deletions(-) (limited to 'gst/speed/demo-mp3.c') diff --git a/gst/speed/demo-mp3.c b/gst/speed/demo-mp3.c index c61f15ef..d2144cf3 100644 --- a/gst/speed/demo-mp3.c +++ b/gst/speed/demo-mp3.c @@ -25,6 +25,8 @@ #include #include +static GtkWidget *poslabel; /* NULL */ + void set_speed (GtkAdjustment * adj, gpointer data) { @@ -33,10 +35,34 @@ set_speed (GtkAdjustment * adj, gpointer data) g_object_set (speed, "speed", adj->value, NULL); } +static gboolean +time_tick_cb (GstElement * audiosink) +{ + GstFormat format = GST_FORMAT_TIME; + guint64 total, pos; + + if (gst_element_query (audiosink, GST_QUERY_TOTAL, &format, &total) + && gst_element_query (audiosink, GST_QUERY_POSITION, &format, &pos)) { + guint t_min, t_sec, p_min, p_sec; + gchar *s; + + t_min = (guint) (total / (GST_SECOND * 60)); + t_sec = (guint) ((total % (GST_SECOND * 60)) / GST_SECOND); + p_min = (guint) (pos / (GST_SECOND * 60)); + p_sec = (guint) ((pos % (GST_SECOND * 60)) / GST_SECOND); + + s = g_strdup_printf ("%u:%02u / %u:%02u", p_min, p_sec, t_min, t_sec); + gtk_label_set_text (GTK_LABEL (poslabel), s); + g_free (s); + } + + return TRUE; /* call again */ +} + int main (int argc, char **argv) { - GtkWidget *window, *vbox, *hscale, *button; + GtkWidget *window, *vbox, *hscale, *button, *hbbox; GstElement *filesrc, *mad, *audioconvert, *speed, *audiosink, *pipeline; gst_init (&argc, &argv); @@ -48,20 +74,23 @@ main (int argc, char **argv) } window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (window, "delete-event", G_CALLBACK (gtk_main_quit), NULL); gtk_window_set_default_size (GTK_WINDOW (window), 400, 80); vbox = gtk_vbox_new (FALSE, 0); - gtk_widget_show (vbox); - hscale = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 0.01, 4.0, + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + hscale = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 0.1, 4.0, 0.1, 0.0, 0.0))); gtk_scale_set_digits (GTK_SCALE (hscale), 2); gtk_range_set_update_policy (GTK_RANGE (hscale), GTK_UPDATE_CONTINUOUS); - button = gtk_button_new_with_label ("quit"); + hbbox = gtk_hbutton_box_new (); + button = gtk_button_new_from_stock (GTK_STOCK_QUIT); gtk_container_add (GTK_CONTAINER (window), vbox); + gtk_container_add (GTK_CONTAINER (hbbox), button); + poslabel = gtk_label_new (NULL); + gtk_box_pack_start (GTK_BOX (vbox), poslabel, FALSE, FALSE, 2); gtk_box_pack_start (GTK_BOX (vbox), hscale, TRUE, TRUE, 2); - gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 2); - gtk_widget_show (hscale); - gtk_signal_connect (GTK_OBJECT (button), "clicked", gtk_main_quit, NULL); - gtk_widget_show (button); + gtk_box_pack_start (GTK_BOX (vbox), hbbox, FALSE, FALSE, 6); + g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); filesrc = gst_element_factory_make ("filesrc", "filesrc"); mad = gst_element_factory_make ("mad", "mad"); @@ -69,8 +98,8 @@ main (int argc, char **argv) speed = gst_element_factory_make ("speed", "speed"); audiosink = gst_element_factory_make (DEFAULT_AUDIOSINK, "audiosink"); - gtk_signal_connect (GTK_OBJECT (gtk_range_get_adjustment (GTK_RANGE - (hscale))), "value_changed", G_CALLBACK (set_speed), speed); + g_signal_connect (gtk_range_get_adjustment (GTK_RANGE (hscale)), + "value_changed", G_CALLBACK (set_speed), speed); pipeline = gst_pipeline_new ("app"); gst_bin_add_many (GST_BIN (pipeline), filesrc, mad, audioconvert, speed, @@ -80,10 +109,15 @@ main (int argc, char **argv) gst_element_set_state (pipeline, GST_STATE_PLAYING); - gtk_widget_show (window); - gtk_idle_add ((GtkFunction) gst_bin_iterate, pipeline); + gtk_widget_show_all (window); + + g_idle_add ((GSourceFunc) gst_bin_iterate, pipeline); + g_timeout_add (200, (GSourceFunc) time_tick_cb, audiosink); gtk_main (); + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (GST_OBJECT (pipeline)); + return 0; } -- cgit v1.2.1