123 lines
3.2 KiB
C
123 lines
3.2 KiB
C
/*
|
|
* Copyright 2014 (c) Anna Schumaker.
|
|
*/
|
|
#include <core/audio.h>
|
|
#include <core/playlist.h>
|
|
#include <core/string.h>
|
|
#include <gui/audio.h>
|
|
#include <gui/builder.h>
|
|
|
|
|
|
static GtkScale *o_seek;
|
|
|
|
static GtkSpinButton *o_count;
|
|
static GtkToggleButton *o_enabled;
|
|
static GtkAdjustment *o_progress;
|
|
|
|
const gchar *TITLE_FMT = "<span size='xx-large'>%s</span>";
|
|
const gchar *ARTIST_FMT = "<span size='x-large'>By: %s</span>";
|
|
const gchar *ALBUM_FMT = "<span size='x-large'>From: %s</span>";
|
|
|
|
static inline void __audio_set_label(const gchar *label, const gchar *fmt,
|
|
const gchar *text)
|
|
{
|
|
gchar *markup = g_markup_printf_escaped(fmt, 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, "%s", str);
|
|
g_free(str);
|
|
}
|
|
|
|
static void on_load(struct track *track)
|
|
{
|
|
__audio_set_label("o_title", TITLE_FMT, track->tr_title);
|
|
__audio_set_label("o_artist", ARTIST_FMT, track->tr_artist->ar_name);
|
|
__audio_set_label("o_album", ALBUM_FMT, track->tr_album->al_name);
|
|
|
|
__audio_set_time_label("o_position", 0);
|
|
__audio_set_time_label("o_duration", track->tr_length);
|
|
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gui_builder_widget("o_ban")),
|
|
playlist_has(PL_HIDDEN, track));
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gui_builder_widget("o_favorite")),
|
|
playlist_has(PL_FAVORITED, track));
|
|
}
|
|
|
|
static void on_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 on_config_pause(int n)
|
|
{
|
|
if (n == -1)
|
|
gtk_toggle_button_set_active(o_enabled, false);
|
|
else {
|
|
gtk_spin_button_set_value(o_count, n);
|
|
gtk_toggle_button_set_active(o_enabled, true);
|
|
}
|
|
}
|
|
|
|
|
|
struct audio_ops audio_ops = {
|
|
on_load,
|
|
on_change_state,
|
|
on_config_pause,
|
|
};
|
|
|
|
|
|
static bool on_seek(GtkScrollType type, double value)
|
|
{
|
|
audio_seek(value);
|
|
return true;
|
|
}
|
|
|
|
static void on_pause_count()
|
|
{
|
|
gtk_toggle_button_set_active(o_enabled, true);
|
|
audio_pause_after(gtk_spin_button_get_value(o_count));
|
|
}
|
|
|
|
static void on_pause_enabled()
|
|
{
|
|
if (!gtk_toggle_button_get_active(o_enabled))
|
|
audio_pause_after(-1);
|
|
else
|
|
audio_pause_after(gtk_spin_button_get_value(o_count));
|
|
}
|
|
|
|
static int on_timeout(gpointer data)
|
|
{
|
|
gtk_adjustment_set_upper(o_progress, audio_duration());
|
|
gtk_adjustment_set_value(o_progress, audio_position());
|
|
__audio_set_time_label("o_position", audio_position() / GST_SECOND);
|
|
return true;
|
|
}
|
|
|
|
void gui_audio_init()
|
|
{
|
|
o_seek = GTK_SCALE(gui_builder_widget("o_seek"));
|
|
|
|
o_count = GTK_SPIN_BUTTON(gui_builder_widget("o_pause_count"));
|
|
o_enabled = GTK_TOGGLE_BUTTON(gui_builder_widget("o_pause_enabled"));
|
|
o_progress = GTK_ADJUSTMENT(gui_builder_object("o_progress"));
|
|
|
|
g_signal_connect(o_seek, "change-value", G_CALLBACK(on_seek), NULL);
|
|
|
|
g_signal_connect(o_count, "changed", G_CALLBACK(on_pause_count), NULL);
|
|
g_signal_connect(o_enabled, "toggled", G_CALLBACK(on_pause_enabled), NULL);
|
|
|
|
g_timeout_add(500, on_timeout, NULL);
|
|
}
|