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:
parent
30c0d97d56
commit
03b44b9e16
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user