libsaria: Change playlists to a list of Track pointers

This allows more direct access to each item in the list.  It also speeds
up sorting, since I don't need to keep looking up the same tracks over
and over again in the library.

Siged-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-02-19 17:58:23 -05:00
parent 7b6ecfdd99
commit 8af182fac9
5 changed files with 22 additions and 21 deletions

View File

@ -14,8 +14,8 @@ namespace libsaria
class Playlist {
private:
string filename;
list<sid_t> plist;
list<sid_t>::iterator it;
list<Track *> plist;
list<Track *>::iterator it;
public:
Playlist();
@ -34,7 +34,7 @@ namespace libsaria
void sort();
unsigned int size();
sid_t next();
Track *next();
/* Iterator functions */
void iter_reset();

View File

@ -1,5 +1,6 @@
// Copyright (c) 2012 Bryan Schumaker.
#include <libsaria/files.h>
#include <libsaria/library.h>
#include <libsaria/playlist.h>
static void load_playlist(void *plist)
@ -29,7 +30,7 @@ namespace libsaria
for (unsigned int i = 0; i < size; i++) {
in >> songid;
plist.push_back(songid);
plist.push_back(library::get_info(songid));
}
}
@ -45,11 +46,11 @@ namespace libsaria
void Playlist::do_save()
{
OutFile out("queue.q");
list<sid_t>::iterator it;
list<Track *>::iterator it;
out << plist.size() << "\n";
for (it = plist.begin(); it != plist.end(); it++)
out << (*it) << "\n";
out << (*it)->get_songid() << "\n";
}
void Playlist::save()

View File

@ -1,6 +1,5 @@
// Copyright (c) 2012 Bryan Schumaker.
#include <libsaria/library.h>
#include <libsaria/playlist.h>
namespace libsaria
@ -13,7 +12,7 @@ namespace libsaria
Track *Playlist::iter_next()
{
Track *track = library::get_info(*it);
Track *track = *it;
it++;
return track;
}

View File

@ -3,12 +3,10 @@
#include <libsaria/library.h>
#include <libsaria/playlist.h>
static bool compare_tracks(sid_t one, sid_t two)
static bool compare_tracks(libsaria::Track *one, libsaria::Track *two)
{
libsaria::Track *t_1 = libsaria::library::get_info(one);
libsaria::Track *t_2 = libsaria::library::get_info(two);
/* I want to compare tracks and not pointers */
return *t_1 < *t_2;
return *one < *two;
}
namespace libsaria
@ -30,26 +28,29 @@ namespace libsaria
void Playlist::add_ids(list<sid_t> &ids)
{
plist.insert(plist.end(), ids.begin(), ids.end());
list<sid_t>::iterator it;
for (it = ids.begin(); it != ids.end(); it++)
plist.push_back(library::get_info(*it));
save();
}
void Playlist::add_track(libsaria::Track *track)
{
plist.push_back(track->get_songid());
plist.push_back(track);
save();
}
void Playlist::rm_ids(list<sid_t> &ids)
{
list<sid_t>::iterator it;
for (it = ids.begin(); it != ids.end(); it++)
plist.remove(*it);
plist.remove(library::get_info(*it));
save();
}
void Playlist::rm_track(Track *track)
{
plist.remove(track->get_songid());
plist.remove(track);
}
void Playlist::sort()
@ -62,12 +63,12 @@ namespace libsaria
return plist.size();
}
sid_t Playlist::next()
Track *Playlist::next()
{
sid_t id = plist.front();
Track *track = plist.front();
plist.pop_front();
save();
return id;
return track;
}
}

View File

@ -36,9 +36,9 @@ namespace libsaria
string queue::next_file()
{
sid_t inode = q_queue.next();
Track *track = q_queue.next();
refresh();
return library::find_filepath(inode);
return track->get_filepath();
}
void queue::load()