/* * Copyright 2014 (c) Anna Schumaker. * * The gst_init() function parses command line options passed to Ocarina * through argv. Use the command `gst-inspect-1.0 --help-gst` to find * what options are supported. */ extern "C" { #include #include } #include #include static Gtk::Button *o_next; static Gtk::Button *o_pause; static Gtk::Button *o_play; static Gtk::Button *o_prev; static Gtk::Scale *o_seek; static Gtk::Button *o_stop; static Gtk::SpinButton *o_count; static Gtk::CheckButton *o_enabled; static Gtk::Label *o_album; static Gtk::Label *o_artist; static Gtk::Label *o_duration; static Gtk::Label *o_position; static Gtk::Label *o_title; static Glib::RefPtr o_progress; static void set_markup(Gtk::Label *label, const std::string &size, const std::string &text) { label->set_markup("" + Glib::Markup::escape_text(text) + ""); } static void on_load(struct track *track) { gchar *str = g_strdup_printf("From: %s", track->tr_album->al_name); set_markup(o_album, "x-large", str); g_free(str); str = g_strdup_printf("By: %s", track->tr_artist->ar_name); set_markup(o_artist, "x-large", str); g_free(str); set_markup(o_title, "xx-large", track->tr_title); str = string_sec2str(track->tr_length); o_duration->set_text(str); g_free(str); plist :: track_loaded(track); } static void on_change_state(GstState state) { if (state == GST_STATE_PLAYING) { o_play->hide(); o_pause->show(); } else { o_play->show(); o_pause->hide(); } } static void on_config_pause(int n) { if (n == -1) o_enabled->set_active(false); else { o_count->set_value(n); o_enabled->set_active(true); } } struct audio_ops audio_ops = { on_load, on_change_state, on_config_pause, }; static bool on_seek(Gtk::ScrollType type, double value) { audio_seek(value); return true; } static void on_pause_count() { o_enabled->set_active(true); audio_pause_after(o_count->get_value()); } static void on_pause_enabled() { if (!o_enabled->get_active()) audio_pause_after(-1); else audio_pause_after(o_count->get_value()); } static bool on_timeout() { gchar *pos = string_sec2str(audio_position() / GST_SECOND); o_progress->set_upper(audio_duration()); o_progress->set_value(audio_position()); o_position->set_text(pos); g_free(pos); return true; } void gst :: play() { audio_play(); } void gst :: pause() { audio_pause(); } void gst :: stop() { audio_stop(); } void gst :: next() { audio_next(); gst :: play(); } void gst :: prev() { audio_prev(); } void gst :: toggle() { if (audio_cur_state() == GST_STATE_PLAYING) gst :: pause(); else gst :: play(); } void gst :: init_pre() { o_next = gui :: get_widget("o_next"); o_pause = gui :: get_widget("o_pause"); o_play = gui :: get_widget("o_play"); o_prev = gui :: get_widget("o_prev"); o_seek = gui :: get_widget("o_seek"); o_stop = gui :: get_widget("o_stop"); o_count = gui :: get_widget("o_pause_count"); o_enabled = gui :: get_widget("o_pause_enabled"); o_album = gui :: get_widget("o_album"); o_artist = gui :: get_widget("o_artist"); o_duration = gui :: get_widget("o_duration"); o_position = gui :: get_widget("o_position"); o_title = gui :: get_widget("o_title"); o_progress = gui :: get_object("o_progress"); o_next->signal_clicked().connect(sigc::ptr_fun(next)); o_pause->signal_clicked().connect(sigc::ptr_fun(gst :: pause)); o_play->signal_clicked().connect(sigc::ptr_fun(gst :: play)); o_prev->signal_clicked().connect(sigc::ptr_fun(gst :: prev)); o_seek->signal_change_value().connect(sigc::ptr_fun(on_seek)); o_stop->signal_clicked().connect(sigc::ptr_fun(gst :: stop)); o_count->signal_changed().connect(sigc::ptr_fun(on_pause_count)); o_enabled->signal_toggled().connect(sigc::ptr_fun(on_pause_enabled)); } void gst :: init() { Glib :: signal_timeout().connect(sigc::ptr_fun(on_timeout), 500); }