Update play count

When a track finishes, I tell the library to update playcount.  Then,
the library triggers a callback to the playqueue deck telling it to
update.

This patch also finds and prints the track that causes a gstreamer
error.

Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
This commit is contained in:
Anna Schumaker 2014-01-29 22:45:01 -05:00 committed by Anna Schumaker
parent 30c0d97d56
commit 03b44b9e16
8 changed files with 50 additions and 13 deletions

View File

@ -20,6 +20,7 @@ struct Callbacks {
void (*on_library_update)(unsigned int, library :: Library *);
void (*on_library_track_add)(unsigned int);
void (*on_library_track_del)(unsigned int);
void (*on_library_track_updated)(unsigned int);
/* Playqueue callbacks */
void (*on_queue_track_add)(Playqueue *, unsigned int);

View File

@ -125,6 +125,7 @@ namespace library
void lookup(unsigned int, library :: Song *);
Library *lookup_path(unsigned int);
void import();
void track_played(unsigned int);
#ifdef CONFIG_TEST
void print_db(DB_Type);
void reset();

View File

@ -62,6 +62,7 @@ public:
unsigned int add_front(unsigned int);
void del(unsigned int);
void del_track(unsigned int);
void track_updated(unsigned int);
unsigned int size();
void add_sort(sort_t, bool ascending = true);

View File

@ -24,8 +24,11 @@ static void parse_error(GstMessage *error)
{
GError *err;
gchar *debug;
library :: Song song;
library :: lookup(cur_trackid, &song);
gst_message_parse_error(error, &err, &debug);
g_print("Error playing file: %s\n", song.track->primary_key.c_str());
g_print("Error: %s\n", err->message);
g_error_free(err);
g_free(debug);
@ -50,9 +53,11 @@ static gboolean on_message(GstBus *bus, GstMessage *message, gpointer data)
case GST_MESSAGE_ERROR:
parse_error(message);
audio :: next();
audio :: play();
break;
case GST_MESSAGE_EOS:
handle_pause_count();
library :: track_played(cur_trackid);
audio :: next();
audio :: seek_to(0);
default:

View File

@ -13,20 +13,21 @@ static void no_op(library :: Song &) {}
static struct Callbacks callbacks = {
.on_play = no_op,
.on_pause = no_op,
.on_track_loaded = no_op,
.on_pause_count_changed = no_op,
.on_play = no_op,
.on_pause = no_op,
.on_track_loaded = no_op,
.on_pause_count_changed = no_op,
.on_library_add = no_op,
.on_library_update = no_op,
.on_library_track_add = no_op,
.on_library_track_del = no_op,
.on_library_add = no_op,
.on_library_update = no_op,
.on_library_track_add = no_op,
.on_library_track_del = no_op,
.on_library_track_updated = no_op,
.on_queue_track_add = no_op,
.on_queue_track_del = no_op,
.on_queue_track_changed = no_op,
.on_queue_changed = no_op,
.on_queue_track_add = no_op,
.on_queue_track_del = no_op,
.on_queue_track_changed = no_op,
.on_queue_changed = no_op,
};

View File

@ -23,6 +23,11 @@ static void del_library_track(unsigned int id)
library_playqueue.del_track(id);
}
static void change_library_track(unsigned int id)
{
library_playqueue.track_updated(id);
}
void deck :: init()
{
library_playqueue.set_flag(PQ_REPEAT);
@ -34,6 +39,7 @@ void deck :: init()
get_callbacks()->on_library_track_add = add_library_track;
get_callbacks()->on_library_track_del = del_library_track;
get_callbacks()->on_library_track_updated = change_library_track;
get_callbacks()->on_queue_changed = write;
}

View File

@ -9,12 +9,12 @@
#include <glib.h>
#include <sstream>
#include <time.h>
static Database<library :: Album> album_db("album.db");
static Database<library :: AGInfo> artist_db("artist.db");
static Database<library :: AGInfo> genre_db("genre.db");
static Database<library :: Track> track_db("track.db");
static Database<library :: Library> library_db("library.db");
struct ImportData {
@ -589,6 +589,20 @@ void library :: import()
} while (true);
}
void library :: track_played(unsigned int id)
{
time_t the_time = time(NULL);
struct tm *now = localtime(&the_time);
track_db[id].play_count++;
track_db[id].last_day = now->tm_mday;
track_db[id].last_month = now->tm_mon + 1;
track_db[id].last_year = now->tm_year + 1900;
track_db.save();
get_callbacks()->on_library_track_updated(id);
}
#ifdef CONFIG_TEST
void library :: print_db(DB_Type type)
{

View File

@ -259,6 +259,14 @@ void Playqueue :: del_track(unsigned int track_id)
}
}
void Playqueue :: track_updated(unsigned int track_id)
{
for (unsigned int i = 0; i < tracks.size(); i++) {
if (tracks[i] == track_id)
get_callbacks()->on_queue_track_changed(this, i);
}
}
unsigned int Playqueue :: size()
{
return tracks.size();