diff --git a/gui/audio.c b/gui/audio.c
index 8ce5befd..b7e81f99 100644
--- a/gui/audio.c
+++ b/gui/audio.c
@@ -71,7 +71,7 @@ void __audio_pause_enabled(GtkToggleButton *enabled, GtkSpinButton *count)
audio_pause_after(val);
}
-void __audio_seek(GtkScrollType type, double value)
+void __audio_seek(GtkRange *range, GtkScrollType type, double value, gpointer data)
{
audio_seek(value);
}
@@ -80,7 +80,7 @@ static int __audio_timeout(gpointer data)
{
GtkAdjustment *progress = data;
- gtk_adjustment_set_upper(progress, audio_duration());
+ gtk_adjustment_set_upper(progress, audio_duration() - GST_SECOND);
gtk_adjustment_set_value(progress, audio_position());
__audio_set_time_label("o_position", audio_position() / GST_SECOND);
@@ -99,3 +99,10 @@ void gui_audio_init()
{
g_timeout_add(500, __audio_timeout, gui_builder_object("o_progress"));
}
+
+#ifdef CONFIG_TESTING
+void test_gui_audio_timeout()
+{
+ __audio_timeout(gui_builder_object("o_progress"));
+}
+#endif /* CONFIG_TESTING */
diff --git a/include/gui/audio.h b/include/gui/audio.h
index 44e3f2d4..4a62fbfb 100644
--- a/include/gui/audio.h
+++ b/include/gui/audio.h
@@ -10,4 +10,7 @@ extern struct audio_ops audio_ops;
/* Called to initialize the GUI audio controls. */
void gui_audio_init();
+#ifdef CONFIG_TESTING
+void test_gui_audio_timeout();
+#endif /* CONFIG_TESTING */
#endif /* OCARINA_GUI_AUDIO_H */
diff --git a/share/ocarina/ocarina6.glade b/share/ocarina/ocarina6.glade
index 3e6a882f..d84d5085 100644
--- a/share/ocarina/ocarina6.glade
+++ b/share/ocarina/ocarina6.glade
@@ -258,8 +258,8 @@
3
-
+
False
@@ -286,8 +286,8 @@
6
-
+
False
@@ -312,8 +312,8 @@
6
-
+
False
@@ -339,8 +339,8 @@
3
-
+
False
@@ -367,8 +367,8 @@
3
-
+
False
@@ -808,7 +808,7 @@ Manager
False
center
o_progress
- 1
+ 0
False
left
diff --git a/tests/gui/audio.c b/tests/gui/audio.c
index 61f97b79..bd44e2ff 100644
--- a/tests/gui/audio.c
+++ b/tests/gui/audio.c
@@ -30,6 +30,22 @@ static inline int test_spin_button_value(const gchar *name)
return gtk_spin_button_get_value(GTK_SPIN_BUTTON(gui_builder_widget(name)));
}
+static inline void test_click_button(const gchar *name)
+{
+ gtk_button_clicked(GTK_BUTTON(gui_builder_widget(name)));
+}
+
+static void test_audio_seek(gint64 pos)
+{
+ GstState state;
+
+ audio_seek(pos);
+ state = audio_cur_state();
+
+ while (state != GST_STATE_PAUSED && state != GST_STATE_PLAYING)
+ state = audio_cur_state();
+}
+
static void test_audio()
{
gchar *album, *artist, *duration;
@@ -61,6 +77,7 @@ static void test_audio()
test_equal(test_get_label_text("o_title"), track->tr_title);
test_equal(test_get_label_text("o_album"), album);
test_equal(test_get_label_text("o_artist"), artist);
+ test_equal(test_get_label_text("o_position"), "0:00");
test_equal(test_get_label_text("o_duration"), duration);
test_equal(test_get_toggle_state("o_favorite"), (bool)true);
test_equal(test_get_toggle_state("o_hide"), (bool)true);
@@ -68,25 +85,44 @@ static void test_audio()
g_free(artist);
g_free(duration);
- audio_play();
+ test_click_button("o_play");
test_equal(gtk_widget_is_visible(gui_builder_widget("o_play")), false);
test_equal(gtk_widget_is_visible(gui_builder_widget("o_pause")), true);
- audio_pause();
+ test_click_button("o_pause");
test_equal(gtk_widget_is_visible(gui_builder_widget("o_play")), true);
test_equal(gtk_widget_is_visible(gui_builder_widget("o_pause")), false);
- audio_pause_after(1);
+ test_click_button("o_pause_enabled");
+ test_equal(test_get_toggle_state("o_pause_enabled"), (bool)true);
+ audio_eos();
+ test_equal(audio_cur_track()->tr_track, 1);
+ test_equal(test_get_toggle_state("o_pause_enabled"), (bool)false);
+
+ test_click_button("o_next");
+ test_equal(audio_cur_track()->tr_track, 2);
+
+ gtk_spin_button_set_value(
+ GTK_SPIN_BUTTON(gui_builder_widget("o_pause_count")), 1);
test_equal(test_get_toggle_state("o_pause_enabled"), (bool)true);
test_equal(test_spin_button_value("o_pause_count"), 1);
audio_eos();
+ test_equal(audio_cur_track()->tr_track, 3);
test_equal(test_get_toggle_state("o_pause_enabled"), (bool)true);
test_equal(test_spin_button_value("o_pause_count"), 0);
audio_eos();
+ test_equal(audio_cur_track()->tr_track, 4);
test_equal(test_get_toggle_state("o_pause_enabled"), (bool)false);
- test_equal(test_spin_button_value("o_pause_count"), 0);
+
+ test_click_button("o_prev");
+ test_equal(audio_cur_track()->tr_track, 3);
+
+ test_click_button("o_pause");
+ test_audio_seek(71 * GST_SECOND);
+ test_gui_audio_timeout();
+ test_equal(test_get_label_text("o_position"), "1:11");
gui_builder_deinit();
}