ocarina: Show information on the currently playing track

I update it using the main timeout loop, but only if the current track
pointer has changed.

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-03-22 20:07:33 -04:00
parent f1bbbbcc5c
commit e3c44146ff
8 changed files with 78 additions and 41 deletions

View File

@ -7,8 +7,6 @@ namespace libsaria
{
void init(string, bool, int, char **);
void quit();
libsaria::Track *current_track();
}
#endif /* LIBSARIA_H */

View File

@ -64,5 +64,7 @@ namespace libsaria
bool operator<(Track &);
};
Track *current_track();
} /* Namespace: libsaria */
#endif /* LIBSARIA_TRACK_H */

View File

@ -21,6 +21,8 @@ namespace ocarina
void set_idle_progress(float);
void hide_idle_progress();
void set_now_playing();
GtkWidget *playlist_init();
GtkWidget *footer_init();
GtkWidget *now_playing_page();

View File

@ -5,7 +5,6 @@
#include <libsaria/path.h>
#include "audio.h"
static string cur_file;
static GstState cur_state = GST_STATE_NULL;
static bool change_state(GstState new_state)
@ -36,7 +35,6 @@ void load_file(GstElement *playbin, string file)
string uri = "file://" + file;
println("Loading uri: " + uri);
g_object_set(G_OBJECT(playbin), "uri", uri.c_str(), NULL);
cur_file = file;
}
namespace libsaria
@ -44,8 +42,6 @@ namespace libsaria
void audio::play()
{
if (cur_file == "")
return;
change_state(GST_STATE_PLAYING);
/*if (change_state(GST_STATE_PLAYING))
trigger_callback(PLAY);*/

View File

@ -1,32 +0,0 @@
// Copyright (c) 2011 Bryan Schumaker.
#include <libsaria/libsaria.h>
#include <libsaria/library.h>
#include <libsaria/audio.h>
#include <libsaria/path.h>
//static libsaria::Track tmp_track;
namespace libsaria
{
libsaria::Track *current_track()
{
// sid_t songid;
//libsaria::Track *current;
//string file = libsaria::audio::get_current_file();
//if (file == "")
// return NULL;
// songid = lookup_songid(file);
/*current = libsaria::library::lookup(songid);
if (current)
return current;*/
// tmp_track = libsaria::Track(file, songid);
// tmp_track.do_cleanup();
// return &tmp_track;
return NULL;
}
};

View File

@ -12,6 +12,8 @@
#include <sstream>
using namespace std;
static libsaria::Track *cur = NULL;
static void make_lenstr(unsigned int length, string &res)
{
int minutes;
@ -83,6 +85,12 @@ namespace libsaria
println("Playing: " + title + " by " + artist);
audio::load(filepath);
audio::play();
cur = this;
}
Track *current_track()
{
return cur;
}
/* Track::Track()

View File

@ -2,14 +2,76 @@
#include <ocarina/ocarina.h>
#include <ocarina/body.h>
#include <libsaria/track.h>
static libsaria::Track *current = NULL;
static GtkWidget *title;
static GtkWidget *artist;
static GtkWidget *album;
static void set_label(GtkWidget *label, string text, string size)
{
char *escaped = g_markup_escape_text(text.c_str(), -1);
string markup = "<span size='" + size + "'>" + escaped + "</span>";
gtk_label_set_markup(GTK_LABEL(label), markup.c_str());
g_free(escaped);
}
static void refresh_widgets()
{
string t = current->get_title();
string ar = current->get_artist();
string al = current->get_album();
set_label(title, t, "xx-large");
set_label(artist, ar, "x-large");
set_label(album, al, "x-large");
}
static GtkWidget *align(GtkWidget *w)
{
GtkWidget *alignment = gtk_alignment_new(0.0, 0.5, 0.0, 0.0);
gtk_container_add(GTK_CONTAINER(alignment), w);
return alignment;
}
namespace ocarina
{
GtkWidget *body::now_playing_page()
{
GtkWidget *label = gtk_label_new("Future now playing page");
gtk_widget_show(label);
return label;
GtkWidget *box = gtk_vbox_new(FALSE, 0);
GtkWidget *window = gtk_scrolled_window_new(NULL, NULL);
GtkWidget *viewport = gtk_viewport_new(NULL, NULL);
title = gtk_label_new("");
artist = gtk_label_new("");
album = gtk_label_new("");
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
gtk_container_add(GTK_CONTAINER(viewport), box);
gtk_container_add(GTK_CONTAINER(window), viewport);
gtk_box_pack_start(GTK_BOX(box), align(title), TRUE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(box), align(artist), TRUE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(box), align(album), TRUE, FALSE, 0);
gtk_widget_show_all(window);
return window;
}
void body::set_now_playing()
{
libsaria::Track *cur = libsaria::current_track();
if (cur == current)
return;
current = cur;
refresh_widgets();
println("Current track changed");
}
}; /* Namespace: ocarina */

View File

@ -86,6 +86,7 @@ namespace ocarina
static gboolean timeout_poll(gpointer data)
{
idle_add();
ocarina::body::set_now_playing();
return TRUE;
}