From 25ee2e945c16e513e36974e70e03af56facd7b34 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Thu, 16 Jan 2014 22:23:36 -0500 Subject: [PATCH] library: Add callbacks for adding and removing tracks Useful for keeping a library playqueue up to date. Signed-off-by: Anna Schumaker --- design/callback.txt | 2 ++ include/callback.h | 2 ++ lib/callback.cpp | 3 +++ lib/library.cpp | 25 ++++++++++++++++++++----- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/design/callback.txt b/design/callback.txt index 321b6ae5..a5f4cc89 100644 --- a/design/callback.txt +++ b/design/callback.txt @@ -13,10 +13,12 @@ Callbacks: (lib/callback.cpp) with no-op default values and filled in by the user through the get_callbacks() function. + - Callback functions: struct Callbacks { void (*on_library_add)(unsigned int, library :: Library *); void (*on_library_update)(unsigned int, library :: Library *); + void (*on_library_track_add)(); }; static struct Callbacks callbacks; diff --git a/include/callback.h b/include/callback.h index e9edc864..502f2f7d 100644 --- a/include/callback.h +++ b/include/callback.h @@ -10,6 +10,8 @@ struct Callbacks { void (*on_library_add)(unsigned int, library :: Library *); void (*on_library_update)(unsigned int, library :: Library *); + void (*on_library_track_add)(unsigned int); + void (*on_library_track_del)(unsigned int); }; diff --git a/lib/callback.cpp b/lib/callback.cpp index 4e0f7047..1d0eb13a 100644 --- a/lib/callback.cpp +++ b/lib/callback.cpp @@ -4,12 +4,15 @@ #include +static void no_op(unsigned int) {} static void no_op(unsigned int id, library :: Library *path) {} static struct Callbacks callbacks = { .on_library_add = no_op, .on_library_update = no_op, + .on_library_track_add = no_op, + .on_library_track_del = no_op, }; diff --git a/lib/library.cpp b/lib/library.cpp index 36c8e8e4..682213c5 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -279,7 +279,7 @@ static void read_tags(unsigned int lib_id, const std :: string &path) TagLib :: Tag *tag; TagLib :: AudioProperties *audio; TagLib :: FileRef ref(path.c_str(), true, TagLib :: AudioProperties :: Fast); - unsigned int artist_id, album_id, genre_id; + unsigned int artist_id, album_id, genre_id, track_id; if (ref.isNull()) { print("ERROR: Could not read tags for file %s", path.c_str()); @@ -293,9 +293,11 @@ static void read_tags(unsigned int lib_id, const std :: string &path) artist_id = artist_db.insert(library :: AGInfo(library :: DB_ARTIST, tag)); album_id = album_db.insert(library :: Album(tag, artist_id)); genre_id = genre_db.insert(library :: AGInfo(library :: DB_GENRE, tag)); - track_db.insert(library :: Track(tag, audio, lib_id, artist_id, - album_id, genre_id, path)); + track_id = track_db.insert(library :: Track(tag, audio, lib_id, + artist_id, album_id, genre_id, path)); library_db[lib_id].size++; + get_callbacks()->on_library_track_add(track_id); + } static bool process_path(unsigned int lib_id, const std :: string &dir, @@ -387,7 +389,7 @@ static void do_import_track(File &f, unsigned int lib_id) { struct ImportData data; std::string artist, album, genre; - unsigned int artist_id, album_id, genre_id, year, tmp; + unsigned int artist_id, album_id, genre_id, track_id, year, tmp; data.filepath = f.getline(); data.title = f.getline(); @@ -405,8 +407,10 @@ static void do_import_track(File &f, unsigned int lib_id) artist_id = artist_db.insert(library :: AGInfo(library :: DB_ARTIST, artist)); album_id = album_db.insert(library :: Album(album, year, artist_id)); genre_id = genre_db.insert(library :: AGInfo(library :: DB_GENRE, genre)); - track_db.insert(library :: Track(&data, lib_id, artist_id, album_id, genre_id)); + track_id = track_db.insert(library :: Track(&data, lib_id, artist_id, + album_id, genre_id)); library_db[lib_id].size++; + get_callbacks()->on_library_track_add(track_id); } static void do_import_library(std::string &s) @@ -475,7 +479,18 @@ void library :: add_path(const std::string &dir) void library :: del_path(unsigned int id) { + unsigned int t; + + for (t = track_db.first(); t < track_db.num_rows(); t = track_db.next(t)) { + if (track_db[t].library_id == id) { + get_callbacks()->on_library_track_del(t); + track_db.remove(t); + } + } + library_db.remove(id); + + track_db.save(); library_db.save(); }