libsaria: Reload playlists on startup

I do this in another idle task, I also had to give the library a
function to find tracks based on (libid, trackid).

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-04-07 09:28:53 -04:00
parent 60d2e4fcd8
commit 0d05e14724
5 changed files with 65 additions and 54 deletions

View File

@ -28,6 +28,7 @@ namespace libsaria
void set_pause_type(AutoPauseType, unsigned int);
AutoPauseType get_pause_type();
unsigned short get_pause_count();
void load_all();
};

View File

@ -38,6 +38,7 @@ namespace libsaria
void add_path(string);
void delete_path(Path *);
void update_path(Path *);
Track *lookup(unsigned int, unsigned int);
Playlist *get_playlist();
}

View File

@ -95,6 +95,27 @@ namespace libsaria
do_update_path(&(*it));
}
Track *library::lookup(unsigned int libid, unsigned int trackid)
{
list<Path>::iterator p_it;
list<Track>::iterator t_it;
for (p_it = path_list.begin(); p_it != path_list.end(); p_it++) {
if (p_it->id == libid)
break;
}
if (p_it == path_list.end())
return NULL;
for (t_it = p_it->tracks.begin(); t_it != p_it->tracks.end(); t_it++) {
if (t_it->get_id() == trackid)
break;
}
if (t_it == p_it->tracks.end())
return NULL;
return &(*t_it);
}
Playlist *library::get_playlist()
{
return &lib_playlist;

View File

@ -45,6 +45,7 @@ namespace libsaria
libsaria::deck::init();
libsaria::library::init();
libsaria::deck::load_all();
/*libsaria::stack_init();*/
}

View File

@ -1,8 +1,11 @@
// Copyright (c) 2012 Bryan Schumaker.
#include <libsaria/playlist.h>
#include <libsaria/track.h>
#include <libsaria/print.h>
#include <libsaria/deck.h>
#include <libsaria/idle.h>
#include <stdlib.h>
#include <fstream>
#include <sstream>
using namespace std;
@ -16,19 +19,40 @@ static string number_to_filename(unsigned int id)
return s.str();
}
/*static void load_playlist(void *plist)
{
libsaria::Playlist *playlist = (libsaria::Playlist *)plist;
playlist->do_load();
}*/
static void save_playlist(ofstream &stream, void *plist)
{
libsaria::Playlist *playlist = (libsaria::Playlist *)plist;
playlist->save(stream);
}
void read_plist(ifstream &stream)
{
unsigned int version, type, size;
unsigned int libid, trackid;
list<libsaria::Track *> tracks;
libsaria::Track *track;
stream >> version >> type >> size;
println("playlist type: %u size: %u", type, size);
for (unsigned int i = 0; i < size; i++) {
stream >> libid >> trackid;
track = libsaria::library::lookup(libid, trackid);
if (track)
tracks.push_back(track);
}
if (tracks.size() > 0)
libsaria::create_new_playlist(tracks, (PlaylistType)type);
}
static bool compare_plists(string one, string two)
{
unsigned int a = atoi(one.c_str());
unsigned int b = atoi(two.c_str());
return a < b;
}
namespace libsaria
{
@ -66,57 +90,20 @@ namespace libsaria
app::rm(filepath);
}
/*void Playlist::do_load()
void deck::load_all()
{
unsigned int size;
//sid_t songid;
InFile in(filename);
list<string> plists;
list<string>::iterator it;
if (!in.good())
libsaria::app::list_dir(plistdir, plists);
if (plists.size() == 0)
return;
in >> size;*/
plists.sort(compare_plists);
/*for (unsigned int i = 0; i < size; i++) {
in >> songid;
//plist.push_back(library::lookup(songid));
}*/
/*}
void Playlist::load()
{
IOTask *task;
if (filename == "")
return;
task = new IOTask(load_playlist, this);
task->queue();
for (it = plists.begin(); it != plists.end(); it++) {
println("Reading plist path: " + plistdir + "/" + (*it));
libsaria::app::read(plistdir + "/" + (*it), read_plist);
}
}
void Playlist::do_save()
{
OutFile out(filename);
list<Track *>::iterator it;
out << plist.size() << "\n";*/
/*for (it = plist.begin(); it != plist.end(); it++)
out << (*it)->get_songid() << "\n";*/
/* }
void Playlist::save()
{
IOTask *task;
if (filename == "")
return;
if (size() == 0) {
remove_file(filename);
return;
}
task = new IOTask(save_playlist, this);
task->queue();
}*/
}; /* Namespace: libsaria */