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_update)(unsigned int, library :: Library *);
void (*on_library_track_add)(unsigned int); void (*on_library_track_add)(unsigned int);
void (*on_library_track_del)(unsigned int); void (*on_library_track_del)(unsigned int);
void (*on_library_track_updated)(unsigned int);
/* Playqueue callbacks */ /* Playqueue callbacks */
void (*on_queue_track_add)(Playqueue *, unsigned int); void (*on_queue_track_add)(Playqueue *, unsigned int);

View File

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

View File

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

View File

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

View File

@ -13,20 +13,21 @@ static void no_op(library :: Song &) {}
static struct Callbacks callbacks = { static struct Callbacks callbacks = {
.on_play = no_op, .on_play = no_op,
.on_pause = no_op, .on_pause = no_op,
.on_track_loaded = no_op, .on_track_loaded = no_op,
.on_pause_count_changed = no_op, .on_pause_count_changed = no_op,
.on_library_add = no_op, .on_library_add = no_op,
.on_library_update = no_op, .on_library_update = no_op,
.on_library_track_add = no_op, .on_library_track_add = no_op,
.on_library_track_del = no_op, .on_library_track_del = no_op,
.on_library_track_updated = no_op,
.on_queue_track_add = no_op, .on_queue_track_add = no_op,
.on_queue_track_del = no_op, .on_queue_track_del = no_op,
.on_queue_track_changed = no_op, .on_queue_track_changed = no_op,
.on_queue_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); library_playqueue.del_track(id);
} }
static void change_library_track(unsigned int id)
{
library_playqueue.track_updated(id);
}
void deck :: init() void deck :: init()
{ {
library_playqueue.set_flag(PQ_REPEAT); 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_add = add_library_track;
get_callbacks()->on_library_track_del = del_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; get_callbacks()->on_queue_changed = write;
} }

View File

@ -9,12 +9,12 @@
#include <glib.h> #include <glib.h>
#include <sstream> #include <sstream>
#include <time.h>
static Database<library :: Album> album_db("album.db"); static Database<library :: Album> album_db("album.db");
static Database<library :: AGInfo> artist_db("artist.db"); static Database<library :: AGInfo> artist_db("artist.db");
static Database<library :: AGInfo> genre_db("genre.db"); static Database<library :: AGInfo> genre_db("genre.db");
static Database<library :: Track> track_db("track.db"); static Database<library :: Track> track_db("track.db");
static Database<library :: Library> library_db("library.db"); static Database<library :: Library> library_db("library.db");
struct ImportData { struct ImportData {
@ -589,6 +589,20 @@ void library :: import()
} while (true); } 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 #ifdef CONFIG_TEST
void library :: print_db(DB_Type type) 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() unsigned int Playqueue :: size()
{ {
return tracks.size(); return tracks.size();