diff --git a/include/libsaria/audio.h b/include/libsaria/audio.h index a9c3c485..428aed62 100644 --- a/include/libsaria/audio.h +++ b/include/libsaria/audio.h @@ -9,6 +9,7 @@ namespace libsaria namespace audio { void init(int, char**); + string get_current_file(); /* Playback control functions */ void load(string); diff --git a/include/libsaria/library.h b/include/libsaria/library.h index 774493f0..88fb1027 100644 --- a/include/libsaria/library.h +++ b/include/libsaria/library.h @@ -25,6 +25,7 @@ namespace libsaria void add_path(string); void remove_path(string); void play_id(ino_t); + void get_info(ino_t &, void(*)(Track &)); void for_each(void (*)(Track &)); void for_each_path(void (*)(struct PathInfo &)); diff --git a/include/libsaria/libsaria.h b/include/libsaria/libsaria.h index f50b521d..36db8b47 100644 --- a/include/libsaria/libsaria.h +++ b/include/libsaria/libsaria.h @@ -1,10 +1,14 @@ #ifndef LIBSARIA_H #define LIBSARIA_H +#include + namespace libsaria { void init(int, char **); void quit(); + + void current_track(void (*)(Track &)); } #endif /* LIBSARIA_H */ diff --git a/include/libsaria/path.h b/include/libsaria/path.h index 6b7ea404..8f1be1d0 100644 --- a/include/libsaria/path.h +++ b/include/libsaria/path.h @@ -16,5 +16,6 @@ struct file void readdir(string, list &, list &); string get_saria_dir(); void make_saria_dir(); +bool get_inode(string, ino_t &); #endif /* LIBSARIA_PATH_H */ diff --git a/libsaria/audio/controls.cpp b/libsaria/audio/controls.cpp index 912247d7..3316fbd2 100644 --- a/libsaria/audio/controls.cpp +++ b/libsaria/audio/controls.cpp @@ -59,4 +59,9 @@ namespace libsaria play(); } + string audio::get_current_file() + { + return cur_file; + } + }; diff --git a/libsaria/current.cpp b/libsaria/current.cpp new file mode 100644 index 00000000..81b21438 --- /dev/null +++ b/libsaria/current.cpp @@ -0,0 +1,27 @@ + +#include +#include +#include +#include + +static int current_inode(ino_t &inode) +{ + string file = libsaria::audio::get_current_file(); + if (file == "") + return false; + return get_inode(file, inode); +} + +namespace libsaria +{ + + void current_track(void (*func)(Track &)) + { + ino_t inode; + /* TODO: Set to blank in error cases */ + if (current_inode(inode) < 0) + return; + library::get_info(inode, func); + } + +}; diff --git a/libsaria/library/library.cpp b/libsaria/library/library.cpp index c0319242..624bc0a5 100644 --- a/libsaria/library/library.cpp +++ b/libsaria/library/library.cpp @@ -42,7 +42,19 @@ void LibraryPath::get_info(void (*info_func)(struct libsaria::library::PathInfo info_func(info); } -bool LibraryPath::play_id(ino_t id) +bool LibraryPath::get_info_id(ino_t &id, void (*func)(Track &)) +{ + map::iterator it; + it = file_map.find(id); + if (it != file_map.end()) { + Track track = Track(it->first, &it->second); + func(track); + return true; + } + return false; +} + +bool LibraryPath::play_id(ino_t &id) { map::iterator it; it = file_map.find(id); @@ -85,6 +97,15 @@ namespace libsaria } } + void library::get_info(ino_t &id, void (*func)(Track &)) + { + map::iterator it; + for (it = path_map.begin(); it != path_map.end(); it++) { + if (it->second.get_info_id(id, func) == true) + break; + } + } + unsigned int library::size() { unsigned int size = 0; diff --git a/libsaria/library/library.h b/libsaria/library/library.h index 3242471b..084bb7a7 100644 --- a/libsaria/library/library.h +++ b/libsaria/library/library.h @@ -21,6 +21,7 @@ class LibraryPath void for_each(void (*)(Track &)); void get_info(void (*)(struct libsaria::library::PathInfo &)); + bool get_info_id(ino_t &, void (*)(Track &)); void insert_track(ino_t, TrackTag &); bool play_id(ino_t); void save(OutFile &); diff --git a/libsaria/path/dir.cpp b/libsaria/path/dir.cpp index 85db9c95..fb7af0eb 100644 --- a/libsaria/path/dir.cpp +++ b/libsaria/path/dir.cpp @@ -73,3 +73,15 @@ void make_saria_dir() mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; mkdir(saria.c_str(), mode); } + +bool get_inode(string filepath, ino_t &ino) +{ + int err; + struct stat stat; + + err = lstat(filepath.c_str(), &stat); + if (err != 0) + return false; + ino = stat.st_ino; + return true; +}