/* * Copyright 2014 (c) Anna Schumaker. */ #include #include #include #include #include #include #include #include #include static guint audio_timeout = 0; static inline void __gui_audio_set_label_markup(GtkLabel *label, const gchar *size, const gchar *text) { const gchar *fmt = "%s"; gchar *markup = g_markup_printf_escaped(fmt, size, text); gtk_label_set_markup(label, markup); g_free(markup); } static void __audio_load(struct track *track) { gchar *duration = string_sec2str(track->tr_length); __gui_audio_set_label_markup(gui_title_tag(), "xx-large", track->tr_title); __gui_audio_set_label_markup(gui_album_tag(), "x-large", track->tr_album->al_name); __gui_audio_set_label_markup(gui_artist_tag(), "x-large", track->tr_album->al_artist->ar_name); __gui_audio_set_label_markup(gui_duration(), "large", duration); gui_pl_system_track_loaded(track); gui_treeview_scroll(); gui_artwork_set_cover(); gui_idle_enable(); g_free(duration); } static void __audio_change_state(GstState state) { bool playing = (state == GST_STATE_PLAYING); gtk_widget_set_visible(GTK_WIDGET(gui_play_button()), !playing); gtk_widget_set_visible(GTK_WIDGET(gui_pause_button()), playing); } static void __audio_config_pause(int n) { GtkComboBox *combo = GTK_COMBO_BOX(gui_builder_widget("o_pause_after")); gtk_combo_box_set_active(combo, n + 1); } void __audio_pause_changed(GtkComboBox *combo, gpointer data) { int val = gtk_combo_box_get_active(combo) - 1; audio_pause_after(val); } void __audio_seek(GtkRange *range, GtkScrollType type, double value, gpointer data) { audio_seek(value * GST_SECOND); } void __audio_volume_changed(GtkScaleButton *button, gdouble value, gpointer data) { audio_set_volume((unsigned int)value); } static int __audio_timeout(gpointer data) { gchar *position = string_sec2str(audio_position() / GST_SECOND); GtkAdjustment *progress = data; gtk_adjustment_set_upper(progress, audio_duration() / GST_SECOND); gtk_adjustment_set_value(progress, audio_position() / GST_SECOND); __gui_audio_set_label_markup(gui_position(), "large", position); g_free(position); return G_SOURCE_CONTINUE; } gboolean __gui_audio_can_accel(GtkWidget *widget, guint signal_id) { g_signal_stop_emission_by_name(widget, "can-activate-accel"); return !GTK_IS_ENTRY(gtk_window_get_focus(gui_window())) && gtk_widget_is_visible(widget) && gtk_widget_is_sensitive(widget); } struct audio_ops audio_ops = { __audio_load, __audio_change_state, __audio_config_pause, }; void gui_audio_init() { GtkScaleButton *volume = GTK_SCALE_BUTTON(gui_builder_widget("o_volume")); audio_timeout = g_timeout_add(500, __audio_timeout, gui_builder_object("o_progress")); gtk_scale_button_set_value(volume, audio_get_volume()); gtk_button_set_relief(GTK_BUTTON(volume), GTK_RELIEF_NORMAL); } void gui_audio_deinit() { g_source_remove(audio_timeout); } #ifdef CONFIG_TESTING void test_gui_audio_timeout() { __audio_timeout(gui_builder_object("o_progress")); } #endif /* CONFIG_TESTING */