libsaria: Add sorted songs to the Set playlist

I sort the subset of tracks to be added, and then use insertion sort to
add them to the playlist object.

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-03-18 19:32:20 -04:00
parent cfc50cf745
commit 6d709e3a18
8 changed files with 61 additions and 14 deletions

View File

@ -39,12 +39,15 @@ namespace libsaria
bool pick_next(list<Track *>::iterator &);
void sequential_next();
void random_next();*/
void add_sorted(list<Track *> &);
public:
Playlist(unsigned int);
//Playlist(string, unsigned int);
~Playlist();
virtual void add_tracks(list<Track *> &) = 0;
/*void set_renderer(PlaylistRenderer *, bool);
void delete_renderer();
@ -72,6 +75,8 @@ namespace libsaria
public:
Set(unsigned int);
~Set();
void add_tracks(list<Track *> &);
};
}; /* Namespace: libsaria */

View File

@ -29,11 +29,10 @@ namespace libsaria
int bitrate;
int sample;
int channels;
/* sid_t songid;
string *artist_lc;
string *album_lc;
void make_lenstr();
/*void make_lenstr();
void do_bookkeeping();*/
void read_tags();
@ -59,9 +58,9 @@ namespace libsaria
int get_length();
int get_bitrate();
int get_channels();
sid_t get_songid();
sid_t get_songid();*/
bool operator<(Track &);*/
bool operator<(Track &);
};
} /* Namespace: libsaria */

View File

@ -1,9 +1,11 @@
#ifndef LIBSARIA_LIBRARY_SOURCE_H
#define LIBSARIA_LIBRARY_SOURCE_H
#include <libsaria/playlist.h>
#include <libsaria/library.h>
extern list<libsaria::library::Driver *>driver_list;
extern libsaria::Set lib_playlist;
void update_path(struct libsaria::library::Path *);
/*#include <string>
using namespace std;

View File

@ -54,10 +54,12 @@ void ScanTask::run_task()
{
list<string>::iterator it;
list<libsaria::library::Driver *>::iterator d_it;
list<libsaria::Track *> tracks;
for (it = file_list.begin(); it != file_list.end(); it++) {
try {
path->tracks.push_back(libsaria::Track(*it, path));
tracks.push_back(&path->tracks.back());
} catch (string message) {
println(message);
}
@ -65,6 +67,8 @@ void ScanTask::run_task()
for (d_it = driver_list.begin(); d_it != driver_list.end(); d_it++)
(*d_it)->path_updated(path);
lib_playlist.add_tracks(tracks);
}
ReaddirTask::ReaddirTask(struct libsaria::library::Path *p)

28
libsaria/playlist/add.cpp Normal file
View File

@ -0,0 +1,28 @@
// Copyright (c) 2012 Bryan Schumaker.
#include <libsaria/playlist.h>
#include <libsaria/print.h>
static bool compare_tracks(libsaria::Track *one, libsaria::Track *two)
{
/* I want to compare tracks and not pointers */
return *one < *two;
}
namespace libsaria
{
void Playlist::add_sorted(list<Track *> &tracks)
{
list<Track *>::iterator it, ins;
tracks.sort(compare_tracks);
ins = plist.begin();
for (it = tracks.begin(); it != tracks.end(); it++) {
while (((*it) < (*ins)) && (ins != plist.end()))
ins++;
plist.insert(ins, (*it));
}
}
}; /* namespace: libsaria */

View File

@ -12,4 +12,9 @@ namespace libsaria
{
}
void Set::add_tracks(list<Track *> &tracks)
{
add_sorted(tracks);
}
}; /* Namespace: libsaria */

View File

@ -20,26 +20,26 @@ namespace libsaria
{
/* Return true if this < cmp_track */
/*/ bool Track::operator<(Track &cmp_track)
bool Track::operator<(Track &cmp_track)
{
int cmp;*/
int cmp;
/* Compare artists */
/*cmp = compare_strings(artist_lc, cmp_track.artist_lc);
cmp = compare_strings(artist_lc, cmp_track.artist_lc);
if (cmp < 0)
return true;
else if (cmp > 0)
return false;*/
return false;
/* Compare albums */
/*cmp = compare_strings(album_lc, cmp_track.album_lc);
cmp = compare_strings(album_lc, cmp_track.album_lc);
if (cmp < 0)
return true;
else if (cmp > 0)
return false;*/
return false;
/* Compare tracks */
/* return track < cmp_track.track;
}*/
return track < cmp_track.track;
}
}

View File

@ -1,7 +1,7 @@
// Copyright (c) 2011 Bryan Schumaker.
#include <libsaria/track.h>
/*#include <libsaria/format.h>
#include <libsaria/library.h>
#include <libsaria/format.h>
/*#include <libsaria/library.h>
#include <libsaria/index.h>*/
#include <taglib/tag.h>
@ -46,7 +46,11 @@ namespace libsaria
last_day = 0;
last_month = 0;
last_year = 0;
read_tags();
artist_lc = lowercase(artist);
album_lc = lowercase(album);
}
Track::~Track()