From 03b44b9e165711e76eac2c7597b1dcf446fb28ba Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Wed, 29 Jan 2014 22:45:01 -0500 Subject: [PATCH] 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 --- include/callback.h | 1 + include/library.h | 1 + include/playqueue.h | 1 + lib/audio.cpp | 5 +++++ lib/callback.cpp | 25 +++++++++++++------------ lib/deck.cpp | 6 ++++++ lib/library.cpp | 16 +++++++++++++++- lib/playqueue.cpp | 8 ++++++++ 8 files changed, 50 insertions(+), 13 deletions(-) diff --git a/include/callback.h b/include/callback.h index 8ebb7b5d..c88268cb 100644 --- a/include/callback.h +++ b/include/callback.h @@ -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); diff --git a/include/library.h b/include/library.h index f6132ff0..0cee9bc5 100644 --- a/include/library.h +++ b/include/library.h @@ -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(); diff --git a/include/playqueue.h b/include/playqueue.h index 0f5a3b39..00f65e79 100644 --- a/include/playqueue.h +++ b/include/playqueue.h @@ -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); diff --git a/lib/audio.cpp b/lib/audio.cpp index 143eb725..8e8b0623 100644 --- a/lib/audio.cpp +++ b/lib/audio.cpp @@ -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: diff --git a/lib/callback.cpp b/lib/callback.cpp index 0ce97be9..3ac0bd89 100644 --- a/lib/callback.cpp +++ b/lib/callback.cpp @@ -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, }; diff --git a/lib/deck.cpp b/lib/deck.cpp index 86d79a35..b0ef0fed 100644 --- a/lib/deck.cpp +++ b/lib/deck.cpp @@ -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; } diff --git a/lib/library.cpp b/lib/library.cpp index bea8bd5e..b6db725f 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -9,12 +9,12 @@ #include #include +#include static Database album_db("album.db"); static Database artist_db("artist.db"); static Database genre_db("genre.db"); static Database track_db("track.db"); - static Database 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) { diff --git a/lib/playqueue.cpp b/lib/playqueue.cpp index bcb7ab25..415e5ba5 100644 --- a/lib/playqueue.cpp +++ b/lib/playqueue.cpp @@ -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();