diff options
Diffstat (limited to 'gst/speed/demo-mp3.c')
-rw-r--r-- | gst/speed/demo-mp3.c | 58 |
1 files changed, 46 insertions, 12 deletions
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 <gtk/gtk.h> #include <gst/gst.h> +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; } |