Anna Schumaker
7dff5412bc
Since MusicBrainz limits us to one request each second, it doesn't really make sense to poll for new artwork every half second. Instead, let's just put this into a new timeout function that gets called every two seconds. This should also let us stop polling once artwork has been found. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
129 lines
3.4 KiB
C
129 lines
3.4 KiB
C
/*
|
|
* Copyright 2014 (c) Anna Schumaker.
|
|
*/
|
|
#include <core/audio.h>
|
|
#include <core/collection.h>
|
|
#include <core/playlist.h>
|
|
#include <core/string.h>
|
|
#include <gui/artwork.h>
|
|
#include <gui/audio.h>
|
|
#include <gui/builder.h>
|
|
#include <gui/idle.h>
|
|
#include <gui/view.h>
|
|
|
|
static inline void __audio_set_label(const gchar *label, const gchar *size,
|
|
const gchar *text)
|
|
{
|
|
gchar *markup = g_markup_printf_escaped("<span size='%s'>%s</span>",
|
|
size, text);
|
|
gtk_label_set_markup(GTK_LABEL(gui_builder_widget(label)), markup);
|
|
g_free(markup);
|
|
}
|
|
|
|
static inline void __audio_set_time_label(const gchar *label, unsigned int time)
|
|
{
|
|
gchar *str = string_sec2str(time);
|
|
__audio_set_label(label, "large", str);
|
|
g_free(str);
|
|
}
|
|
|
|
static void __audio_load(struct track *track)
|
|
{
|
|
__audio_set_label("o_title", "xx-large", track->tr_title);
|
|
__audio_set_label("o_artist", "x-large", track->tr_artist->ar_name);
|
|
__audio_set_label("o_album", "x-large", track->tr_album->al_name);
|
|
__audio_set_time_label("o_duration", track->tr_length);
|
|
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gui_builder_widget("o_hide")),
|
|
playlist_has("Hidden", track));
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gui_builder_widget("o_favorite")),
|
|
playlist_has("Favorites", track));
|
|
|
|
gui_view_scroll();
|
|
gui_artwork_set_cover();
|
|
}
|
|
|
|
static void __audio_change_state(GstState state)
|
|
{
|
|
if (state == GST_STATE_PLAYING) {
|
|
gtk_widget_hide(gui_builder_widget("o_play"));
|
|
gtk_widget_show(gui_builder_widget("o_pause"));
|
|
} else {
|
|
gtk_widget_show(gui_builder_widget("o_play"));
|
|
gtk_widget_hide(gui_builder_widget("o_pause"));
|
|
}
|
|
}
|
|
|
|
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_favorite(GtkToggleButton *toggle, gpointer data)
|
|
{
|
|
if (gtk_toggle_button_get_active(toggle))
|
|
playlist_add("Favorites", audio_cur_track());
|
|
else
|
|
playlist_remove("Favorites", audio_cur_track());
|
|
}
|
|
|
|
void __audio_hide(GtkToggleButton *toggle, gpointer data)
|
|
{
|
|
if (gtk_toggle_button_get_active(toggle)) {
|
|
if (collection_ban(audio_cur_track()))
|
|
audio_next();
|
|
} else
|
|
collection_unban(audio_cur_track());
|
|
}
|
|
|
|
static int __audio_timeout(gpointer data)
|
|
{
|
|
GtkAdjustment *progress = data;
|
|
|
|
gtk_adjustment_set_upper(progress, audio_duration() / GST_SECOND);
|
|
gtk_adjustment_set_value(progress, audio_position() / GST_SECOND);
|
|
__audio_set_time_label("o_position", audio_position() / GST_SECOND);
|
|
return G_SOURCE_CONTINUE;
|
|
}
|
|
|
|
gboolean __audio_can_accel(GtkWidget *widget, guint signal_id)
|
|
{
|
|
GtkWindow *window = GTK_WINDOW(gui_builder_widget("o_window"));
|
|
g_signal_stop_emission_by_name(widget, "can-activate-accel");
|
|
return !GTK_IS_ENTRY(gtk_window_get_focus(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()
|
|
{
|
|
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 */
|