song: converted typedef Song to struct song
Again, a data type which can be forward-declared.
This commit is contained in:
parent
25f67da58c
commit
d562ba5fbb
@ -66,7 +66,8 @@ printDirectoryInDirectory(struct directory *directory, void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int printSongInDirectory(Song * song, mpd_unused void *data)
|
static int
|
||||||
|
printSongInDirectory(struct song *song, mpd_unused void *data)
|
||||||
{
|
{
|
||||||
struct client *client = data;
|
struct client *client = data;
|
||||||
song_print_url(client, song);
|
song_print_url(client, song);
|
||||||
@ -78,7 +79,8 @@ struct search_data {
|
|||||||
LocateTagItemArray array;
|
LocateTagItemArray array;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int searchInDirectory(Song * song, void *_data)
|
static int
|
||||||
|
searchInDirectory(struct song *song, void *_data)
|
||||||
{
|
{
|
||||||
struct search_data *data = _data;
|
struct search_data *data = _data;
|
||||||
LocateTagItemArray *array = &data->array;
|
LocateTagItemArray *array = &data->array;
|
||||||
@ -119,7 +121,8 @@ int searchForSongsIn(struct client *client, const char *name,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int findInDirectory(Song * song, void *_data)
|
static int
|
||||||
|
findInDirectory(struct song *song, void *_data)
|
||||||
{
|
{
|
||||||
struct search_data *data = _data;
|
struct search_data *data = _data;
|
||||||
LocateTagItemArray *array = &data->array;
|
LocateTagItemArray *array = &data->array;
|
||||||
@ -148,7 +151,8 @@ static void printSearchStats(struct client *client, SearchStats *stats)
|
|||||||
client_printf(client, "playtime: %li\n", stats->playTime);
|
client_printf(client, "playtime: %li\n", stats->playTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int searchStatsInDirectory(Song * song, void *data)
|
static int
|
||||||
|
searchStatsInDirectory(struct song *song, void *data)
|
||||||
{
|
{
|
||||||
SearchStats *stats = data;
|
SearchStats *stats = data;
|
||||||
|
|
||||||
@ -186,7 +190,8 @@ int printAllIn(struct client *client, const char *name)
|
|||||||
printDirectoryInDirectory, client);
|
printDirectoryInDirectory, client);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int directoryAddSongToPlaylist(Song * song, mpd_unused void *data)
|
static int
|
||||||
|
directoryAddSongToPlaylist(struct song *song, mpd_unused void *data)
|
||||||
{
|
{
|
||||||
return addSongToPlaylist(song, NULL);
|
return addSongToPlaylist(song, NULL);
|
||||||
}
|
}
|
||||||
@ -195,7 +200,8 @@ struct add_data {
|
|||||||
const char *path;
|
const char *path;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int directoryAddSongToStoredPlaylist(Song *song, void *_data)
|
static int
|
||||||
|
directoryAddSongToStoredPlaylist(struct song *song, void *_data)
|
||||||
{
|
{
|
||||||
struct add_data *data = _data;
|
struct add_data *data = _data;
|
||||||
|
|
||||||
@ -219,14 +225,16 @@ int addAllInToStoredPlaylist(const char *name, const char *utf8file)
|
|||||||
&data);
|
&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int directoryPrintSongInfo(Song * song, void *data)
|
static int
|
||||||
|
directoryPrintSongInfo(struct song *song, void *data)
|
||||||
{
|
{
|
||||||
struct client *client = data;
|
struct client *client = data;
|
||||||
song_print_info(client, song);
|
song_print_info(client, song);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sumSongTime(Song * song, void *data)
|
static int
|
||||||
|
sumSongTime(struct song *song, void *data)
|
||||||
{
|
{
|
||||||
unsigned long *sum_time = (unsigned long *)data;
|
unsigned long *sum_time = (unsigned long *)data;
|
||||||
|
|
||||||
@ -279,8 +287,9 @@ static void freeListCommandItem(ListCommandItem * item)
|
|||||||
free(item);
|
free(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void visitTag(struct client *client, struct strset *set,
|
static void
|
||||||
Song * song, enum tag_type tagType)
|
visitTag(struct client *client, struct strset *set,
|
||||||
|
struct song *song, enum tag_type tagType)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct tag *tag = song->tag;
|
struct tag *tag = song->tag;
|
||||||
@ -308,7 +317,8 @@ struct list_tags_data {
|
|||||||
struct strset *set;
|
struct strset *set;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int listUniqueTagsInDirectory(Song * song, void *_data)
|
static int
|
||||||
|
listUniqueTagsInDirectory(struct song *song, void *_data)
|
||||||
{
|
{
|
||||||
struct list_tags_data *data = _data;
|
struct list_tags_data *data = _data;
|
||||||
ListCommandItem *item = data->item;
|
ListCommandItem *item = data->item;
|
||||||
@ -371,7 +381,8 @@ sumSavedFilenameMemoryInDirectory(struct directory *dir, void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sumSavedFilenameMemoryInSong(Song * song, void *data)
|
static int
|
||||||
|
sumSavedFilenameMemoryInSong(struct song *song, void *data)
|
||||||
{
|
{
|
||||||
int *sum = data;
|
int *sum = data;
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "decoder_control.h"
|
#include "decoder_control.h"
|
||||||
#include "player_control.h"
|
#include "player_control.h"
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
|
#include "song.h"
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "normalize.h"
|
#include "normalize.h"
|
||||||
|
@ -53,7 +53,8 @@ static void dc_command_async(enum decoder_command cmd)
|
|||||||
notify_signal(&dc.notify);
|
notify_signal(&dc.notify);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dc_start(Notify *notify, Song *song)
|
void
|
||||||
|
dc_start(Notify *notify, struct song *song)
|
||||||
{
|
{
|
||||||
assert(song != NULL);
|
assert(song != NULL);
|
||||||
|
|
||||||
@ -62,7 +63,8 @@ void dc_start(Notify *notify, Song *song)
|
|||||||
dc_command(notify, DECODE_COMMAND_START);
|
dc_command(notify, DECODE_COMMAND_START);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dc_start_async(Song *song)
|
void
|
||||||
|
dc_start_async(struct song *song)
|
||||||
{
|
{
|
||||||
assert(song != NULL);
|
assert(song != NULL);
|
||||||
|
|
||||||
|
@ -21,7 +21,6 @@
|
|||||||
#define DECODE_H
|
#define DECODE_H
|
||||||
|
|
||||||
#include "decoder_api.h"
|
#include "decoder_api.h"
|
||||||
#include "song.h"
|
|
||||||
|
|
||||||
#include "audio_format.h"
|
#include "audio_format.h"
|
||||||
#include "notify.h"
|
#include "notify.h"
|
||||||
@ -49,8 +48,8 @@ struct decoder_control {
|
|||||||
volatile int8_t seekable;
|
volatile int8_t seekable;
|
||||||
volatile double seekWhere;
|
volatile double seekWhere;
|
||||||
struct audio_format audioFormat;
|
struct audio_format audioFormat;
|
||||||
Song *current_song;
|
struct song *current_song;
|
||||||
Song *volatile next_song;
|
struct song *volatile next_song;
|
||||||
volatile float totalTime;
|
volatile float totalTime;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -72,7 +71,8 @@ static inline int decoder_is_starting(void)
|
|||||||
dc.state == DECODE_STATE_START;
|
dc.state == DECODE_STATE_START;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Song *decoder_current_song(void)
|
static inline struct song *
|
||||||
|
decoder_current_song(void)
|
||||||
{
|
{
|
||||||
if (dc.state == DECODE_STATE_STOP ||
|
if (dc.state == DECODE_STATE_STOP ||
|
||||||
dc.error != DECODE_ERROR_NOERROR)
|
dc.error != DECODE_ERROR_NOERROR)
|
||||||
@ -83,9 +83,11 @@ static inline Song *decoder_current_song(void)
|
|||||||
|
|
||||||
void dc_command_wait(Notify *notify);
|
void dc_command_wait(Notify *notify);
|
||||||
|
|
||||||
void dc_start(Notify *notify, Song *song);
|
void
|
||||||
|
dc_start(Notify *notify, struct song *song);
|
||||||
|
|
||||||
void dc_start_async(Song *song);
|
void
|
||||||
|
dc_start_async(struct song *song);
|
||||||
|
|
||||||
void dc_stop(Notify *notify);
|
void dc_stop(Notify *notify);
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "decoder_control.h"
|
#include "decoder_control.h"
|
||||||
#include "decoder_internal.h"
|
#include "decoder_internal.h"
|
||||||
#include "player_control.h"
|
#include "player_control.h"
|
||||||
|
#include "song.h"
|
||||||
|
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "directory.h"
|
#include "directory.h"
|
||||||
|
#include "song.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "ls.h"
|
#include "ls.h"
|
||||||
@ -448,7 +448,7 @@ int readDirectoryDB(void)
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
traverseAllInSubDirectory(struct directory * directory,
|
traverseAllInSubDirectory(struct directory * directory,
|
||||||
int (*forEachSong) (Song *, void *),
|
int (*forEachSong) (struct song *, void *),
|
||||||
int (*forEachDir) (struct directory *, void *),
|
int (*forEachDir) (struct directory *, void *),
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
@ -474,13 +474,13 @@ traverseAllInSubDirectory(struct directory * directory,
|
|||||||
|
|
||||||
int
|
int
|
||||||
traverseAllIn(const char *name,
|
traverseAllIn(const char *name,
|
||||||
int (*forEachSong) (Song *, void *),
|
int (*forEachSong) (struct song *, void *),
|
||||||
int (*forEachDir) (struct directory *, void *), void *data)
|
int (*forEachDir) (struct directory *, void *), void *data)
|
||||||
{
|
{
|
||||||
struct directory *directory;
|
struct directory *directory;
|
||||||
|
|
||||||
if ((directory = getDirectory(name)) == NULL) {
|
if ((directory = getDirectory(name)) == NULL) {
|
||||||
Song *song;
|
struct song *song;
|
||||||
if ((song = getSongFromDB(name)) && forEachSong) {
|
if ((song = getSongFromDB(name)) && forEachSong) {
|
||||||
return forEachSong(song, data);
|
return forEachSong(song, data);
|
||||||
}
|
}
|
||||||
@ -499,9 +499,10 @@ void directory_init(void)
|
|||||||
stats.dbPlayTime = sumSongTimesIn(NULL);
|
stats.dbPlayTime = sumSongTimesIn(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
Song *getSongFromDB(const char *file)
|
struct song *
|
||||||
|
getSongFromDB(const char *file)
|
||||||
{
|
{
|
||||||
Song *song = NULL;
|
struct song *song = NULL;
|
||||||
struct directory *directory;
|
struct directory *directory;
|
||||||
char *dir = NULL;
|
char *dir = NULL;
|
||||||
char *duplicated = xstrdup(file);
|
char *duplicated = xstrdup(file);
|
||||||
|
@ -19,12 +19,13 @@
|
|||||||
#ifndef DIRECTORY_H
|
#ifndef DIRECTORY_H
|
||||||
#define DIRECTORY_H
|
#define DIRECTORY_H
|
||||||
|
|
||||||
#include "song.h"
|
|
||||||
#include "songvec.h"
|
#include "songvec.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
struct client;
|
||||||
|
|
||||||
struct dirvec {
|
struct dirvec {
|
||||||
struct directory **base;
|
struct directory **base;
|
||||||
size_t nr;
|
size_t nr;
|
||||||
@ -75,12 +76,13 @@ int writeDirectoryDB(void);
|
|||||||
|
|
||||||
int readDirectoryDB(void);
|
int readDirectoryDB(void);
|
||||||
|
|
||||||
Song *getSongFromDB(const char *file);
|
struct song *
|
||||||
|
getSongFromDB(const char *file);
|
||||||
|
|
||||||
time_t getDbModTime(void);
|
time_t getDbModTime(void);
|
||||||
|
|
||||||
int traverseAllIn(const char *name,
|
int traverseAllIn(const char *name,
|
||||||
int (*forEachSong) (Song *, void *),
|
int (*forEachSong) (struct song *, void *),
|
||||||
int (*forEachDir) (struct directory *, void *), void *data);
|
int (*forEachDir) (struct directory *, void *), void *data);
|
||||||
|
|
||||||
#define getDirectoryPath(dir) ((dir && dir->path) ? dir->path : "")
|
#define getDirectoryPath(dir) ((dir && dir->path) ? dir->path : "")
|
||||||
|
14
src/locate.c
14
src/locate.c
@ -20,6 +20,7 @@
|
|||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
|
#include "song.h"
|
||||||
|
|
||||||
#define LOCATE_TAG_FILE_KEY "file"
|
#define LOCATE_TAG_FILE_KEY "file"
|
||||||
#define LOCATE_TAG_FILE_KEY_OLD "filename"
|
#define LOCATE_TAG_FILE_KEY_OLD "filename"
|
||||||
@ -122,7 +123,8 @@ void freeLocateTagItem(LocateTagItem * item)
|
|||||||
free(item);
|
free(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int strstrSearchTag(Song * song, enum tag_type type, char *str)
|
static int
|
||||||
|
strstrSearchTag(struct song *song, enum tag_type type, char *str)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *duplicate;
|
char *duplicate;
|
||||||
@ -167,7 +169,8 @@ static int strstrSearchTag(Song * song, enum tag_type type, char *str)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int strstrSearchTags(Song * song, int numItems, LocateTagItem * items)
|
int
|
||||||
|
strstrSearchTags(struct song *song, int numItems, LocateTagItem *items)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -181,7 +184,8 @@ int strstrSearchTags(Song * song, int numItems, LocateTagItem * items)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tagItemFoundAndMatches(Song * song, enum tag_type type, char *str)
|
static int
|
||||||
|
tagItemFoundAndMatches(struct song *song, enum tag_type type, char *str)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int8_t visitedTypes[TAG_NUM_OF_ITEM_TYPES] = { 0 };
|
int8_t visitedTypes[TAG_NUM_OF_ITEM_TYPES] = { 0 };
|
||||||
@ -221,7 +225,9 @@ static int tagItemFoundAndMatches(Song * song, enum tag_type type, char *str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int tagItemsFoundAndMatches(Song * song, int numItems, LocateTagItem * items)
|
int
|
||||||
|
tagItemsFoundAndMatches(struct song *song, int numItems,
|
||||||
|
LocateTagItem * items)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
11
src/locate.h
11
src/locate.h
@ -19,11 +19,13 @@
|
|||||||
#ifndef LOCATE_H
|
#ifndef LOCATE_H
|
||||||
#define LOCATE_H
|
#define LOCATE_H
|
||||||
|
|
||||||
#include "song.h"
|
#include <stdint.h>
|
||||||
|
|
||||||
#define LOCATE_TAG_FILE_TYPE TAG_NUM_OF_ITEM_TYPES+10
|
#define LOCATE_TAG_FILE_TYPE TAG_NUM_OF_ITEM_TYPES+10
|
||||||
#define LOCATE_TAG_ANY_TYPE TAG_NUM_OF_ITEM_TYPES+20
|
#define LOCATE_TAG_ANY_TYPE TAG_NUM_OF_ITEM_TYPES+20
|
||||||
|
|
||||||
|
struct song;
|
||||||
|
|
||||||
/* struct used for search, find, list queries */
|
/* struct used for search, find, list queries */
|
||||||
typedef struct _LocateTagItem {
|
typedef struct _LocateTagItem {
|
||||||
int8_t tagType;
|
int8_t tagType;
|
||||||
@ -44,8 +46,11 @@ void freeLocateTagItemArray(int count, LocateTagItem * array);
|
|||||||
|
|
||||||
void freeLocateTagItem(LocateTagItem * item);
|
void freeLocateTagItem(LocateTagItem * item);
|
||||||
|
|
||||||
int strstrSearchTags(Song * song, int numItems, LocateTagItem * items);
|
int
|
||||||
|
strstrSearchTags(struct song *song, int numItems, LocateTagItem * items);
|
||||||
|
|
||||||
int tagItemsFoundAndMatches(Song * song, int numItems, LocateTagItem * items);
|
int
|
||||||
|
tagItemsFoundAndMatches(struct song *song, int numItems,
|
||||||
|
LocateTagItem * items);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
|
#include "song.h"
|
||||||
#include "os_compat.h"
|
#include "os_compat.h"
|
||||||
#include "main_notify.h"
|
#include "main_notify.h"
|
||||||
|
|
||||||
@ -43,7 +44,8 @@ void pc_deinit(void)
|
|||||||
notify_deinit(&pc.notify);
|
notify_deinit(&pc.notify);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_current_song(Song *song)
|
static void
|
||||||
|
set_current_song(struct song *song)
|
||||||
{
|
{
|
||||||
assert(song != NULL);
|
assert(song != NULL);
|
||||||
assert(song->url != NULL);
|
assert(song->url != NULL);
|
||||||
@ -61,7 +63,8 @@ static void player_command(enum player_command cmd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void playerPlay(Song * song)
|
void
|
||||||
|
playerPlay(struct song *song)
|
||||||
{
|
{
|
||||||
assert(pc.queueLockState == PLAYER_QUEUE_UNLOCKED);
|
assert(pc.queueLockState == PLAYER_QUEUE_UNLOCKED);
|
||||||
|
|
||||||
@ -174,7 +177,8 @@ char *getPlayerErrorStr(void)
|
|||||||
return *error ? error : NULL;
|
return *error ? error : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void queueSong(Song * song)
|
void
|
||||||
|
queueSong(struct song *song)
|
||||||
{
|
{
|
||||||
assert(pc.queueState == PLAYER_QUEUE_BLANK);
|
assert(pc.queueState == PLAYER_QUEUE_BLANK);
|
||||||
|
|
||||||
@ -208,7 +212,8 @@ void playerQueueUnlock(void)
|
|||||||
assert(pc.queueLockState == PLAYER_QUEUE_UNLOCKED);
|
assert(pc.queueLockState == PLAYER_QUEUE_UNLOCKED);
|
||||||
}
|
}
|
||||||
|
|
||||||
int playerSeek(Song * song, float seek_time)
|
int
|
||||||
|
playerSeek(struct song *song, float seek_time)
|
||||||
{
|
{
|
||||||
assert(song != NULL);
|
assert(song != NULL);
|
||||||
|
|
||||||
@ -265,7 +270,8 @@ int getPlayerChannels(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* this actually creates a dupe of the current metadata */
|
/* this actually creates a dupe of the current metadata */
|
||||||
Song *playerCurrentDecodeSong(void)
|
struct song *
|
||||||
|
playerCurrentDecodeSong(void)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
#define PLAYER_H
|
#define PLAYER_H
|
||||||
|
|
||||||
#include "notify.h"
|
#include "notify.h"
|
||||||
#include "song.h"
|
|
||||||
#include "os_compat.h"
|
#include "os_compat.h"
|
||||||
|
|
||||||
enum player_state {
|
enum player_state {
|
||||||
@ -92,8 +91,8 @@ struct player_control {
|
|||||||
volatile float totalTime;
|
volatile float totalTime;
|
||||||
volatile float elapsedTime;
|
volatile float elapsedTime;
|
||||||
volatile float fileTime;
|
volatile float fileTime;
|
||||||
Song *volatile next_song;
|
struct song *volatile next_song;
|
||||||
Song *errored_song;
|
struct song *errored_song;
|
||||||
volatile enum player_queue_state queueState;
|
volatile enum player_queue_state queueState;
|
||||||
volatile int8_t queueLockState;
|
volatile int8_t queueLockState;
|
||||||
volatile double seekWhere;
|
volatile double seekWhere;
|
||||||
@ -108,7 +107,8 @@ void pc_init(unsigned int buffered_before_play);
|
|||||||
|
|
||||||
void pc_deinit(void);
|
void pc_deinit(void);
|
||||||
|
|
||||||
void playerPlay(Song * song);
|
void
|
||||||
|
playerPlay(struct song *song);
|
||||||
|
|
||||||
void playerSetPause(int pause_flag);
|
void playerSetPause(int pause_flag);
|
||||||
|
|
||||||
@ -132,7 +132,8 @@ int getPlayerError(void);
|
|||||||
|
|
||||||
void playerWait(void);
|
void playerWait(void);
|
||||||
|
|
||||||
void queueSong(Song * song);
|
void
|
||||||
|
queueSong(struct song *song);
|
||||||
|
|
||||||
enum player_queue_state getPlayerQueueState(void);
|
enum player_queue_state getPlayerQueueState(void);
|
||||||
|
|
||||||
@ -142,7 +143,8 @@ void playerQueueLock(void);
|
|||||||
|
|
||||||
void playerQueueUnlock(void);
|
void playerQueueUnlock(void);
|
||||||
|
|
||||||
int playerSeek(Song * song, float seek_time);
|
int
|
||||||
|
playerSeek(struct song *song, float seek_time);
|
||||||
|
|
||||||
void setPlayerCrossFade(float crossFadeInSeconds);
|
void setPlayerCrossFade(float crossFadeInSeconds);
|
||||||
|
|
||||||
@ -158,7 +160,8 @@ int getPlayerBits(void);
|
|||||||
|
|
||||||
int getPlayerChannels(void);
|
int getPlayerChannels(void);
|
||||||
|
|
||||||
Song *playerCurrentDecodeSong(void);
|
struct song *
|
||||||
|
playerCurrentDecodeSong(void);
|
||||||
|
|
||||||
void playerInit(void);
|
void playerInit(void);
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "main_notify.h"
|
#include "main_notify.h"
|
||||||
#include "crossfade.h"
|
#include "crossfade.h"
|
||||||
|
#include "song.h"
|
||||||
|
|
||||||
enum xfade_state {
|
enum xfade_state {
|
||||||
XFADE_DISABLED = -1,
|
XFADE_DISABLED = -1,
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include "ls.h"
|
#include "ls.h"
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
|
#include "song.h"
|
||||||
#include "song_print.h"
|
#include "song_print.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
@ -140,7 +141,7 @@ void initPlaylist(void)
|
|||||||
playlist_saveAbsolutePaths =
|
playlist_saveAbsolutePaths =
|
||||||
DEFAULT_PLAYLIST_SAVE_ABSOLUTE_PATHS;
|
DEFAULT_PLAYLIST_SAVE_ABSOLUTE_PATHS;
|
||||||
|
|
||||||
playlist.songs = xmalloc(sizeof(Song *) * playlist_max_length);
|
playlist.songs = xmalloc(sizeof(struct song *) * playlist_max_length);
|
||||||
playlist.songMod = xmalloc(sizeof(uint32_t) * playlist_max_length);
|
playlist.songMod = xmalloc(sizeof(uint32_t) * playlist_max_length);
|
||||||
playlist.order = xmalloc(sizeof(int) * playlist_max_length);
|
playlist.order = xmalloc(sizeof(int) * playlist_max_length);
|
||||||
playlist.idToPosition = xmalloc(sizeof(int) * playlist_max_length *
|
playlist.idToPosition = xmalloc(sizeof(int) * playlist_max_length *
|
||||||
@ -452,7 +453,7 @@ enum playlist_result playlistId(struct client *client, int id)
|
|||||||
|
|
||||||
static void swapSongs(int song1, int song2)
|
static void swapSongs(int song1, int song2)
|
||||||
{
|
{
|
||||||
Song *sTemp;
|
struct song *sTemp;
|
||||||
int iTemp;
|
int iTemp;
|
||||||
|
|
||||||
sTemp = playlist.songs[song1];
|
sTemp = playlist.songs[song1];
|
||||||
@ -554,7 +555,7 @@ static void clearPlayerQueue(void)
|
|||||||
|
|
||||||
enum playlist_result addToPlaylist(const char *url, int *added_id)
|
enum playlist_result addToPlaylist(const char *url, int *added_id)
|
||||||
{
|
{
|
||||||
Song *song;
|
struct song *song;
|
||||||
|
|
||||||
DEBUG("add to playlist: %s\n", url);
|
DEBUG("add to playlist: %s\n", url);
|
||||||
|
|
||||||
@ -569,7 +570,7 @@ enum playlist_result addToPlaylist(const char *url, int *added_id)
|
|||||||
|
|
||||||
int addToStoredPlaylist(const char *url, const char *utf8file)
|
int addToStoredPlaylist(const char *url, const char *utf8file)
|
||||||
{
|
{
|
||||||
Song *song;
|
struct song *song;
|
||||||
|
|
||||||
DEBUG("add to stored playlist: %s\n", url);
|
DEBUG("add to stored playlist: %s\n", url);
|
||||||
|
|
||||||
@ -590,7 +591,8 @@ int addToStoredPlaylist(const char *url, const char *utf8file)
|
|||||||
return ACK_ERROR_NO_EXIST;
|
return ACK_ERROR_NO_EXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum playlist_result addSongToPlaylist(Song * song, int *added_id)
|
enum playlist_result
|
||||||
|
addSongToPlaylist(struct song *song, int *added_id)
|
||||||
{
|
{
|
||||||
int id;
|
int id;
|
||||||
|
|
||||||
@ -775,7 +777,8 @@ enum playlist_result deleteFromPlaylistById(int id)
|
|||||||
return deleteFromPlaylist(song);
|
return deleteFromPlaylist(song);
|
||||||
}
|
}
|
||||||
|
|
||||||
void deleteASongFromPlaylist(const Song * song)
|
void
|
||||||
|
deleteASongFromPlaylist(const struct song *song)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -877,8 +880,8 @@ enum playlist_result playPlaylistById(int id, int stopOnError)
|
|||||||
|
|
||||||
static void syncCurrentPlayerDecodeMetadata(void)
|
static void syncCurrentPlayerDecodeMetadata(void)
|
||||||
{
|
{
|
||||||
Song *songPlayer = playerCurrentDecodeSong();
|
struct song *songPlayer = playerCurrentDecodeSong();
|
||||||
Song *song;
|
struct song *song;
|
||||||
int songNum;
|
int songNum;
|
||||||
char path_max_tmp[MPD_PATH_MAX];
|
char path_max_tmp[MPD_PATH_MAX];
|
||||||
|
|
||||||
@ -1000,7 +1003,7 @@ void setPlaylistRepeatStatus(int status)
|
|||||||
enum playlist_result moveSongInPlaylist(int from, int to)
|
enum playlist_result moveSongInPlaylist(int from, int to)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
Song *tmpSong;
|
struct song *tmpSong;
|
||||||
int tmpId;
|
int tmpId;
|
||||||
int currentSong;
|
int currentSong;
|
||||||
|
|
||||||
@ -1358,7 +1361,7 @@ int PlaylistInfo(struct client *client, const char *utf8file, int detail)
|
|||||||
int wrote = 0;
|
int wrote = 0;
|
||||||
|
|
||||||
if (detail) {
|
if (detail) {
|
||||||
Song *song = getSongFromDB(temp);
|
struct song *song = getSongFromDB(temp);
|
||||||
if (song) {
|
if (song) {
|
||||||
song_print_info(client, song);
|
song_print_info(client, song);
|
||||||
wrote = 1;
|
wrote = 1;
|
||||||
|
@ -21,9 +21,13 @@
|
|||||||
|
|
||||||
#include "locate.h"
|
#include "locate.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#define PLAYLIST_FILE_SUFFIX "m3u"
|
#define PLAYLIST_FILE_SUFFIX "m3u"
|
||||||
#define PLAYLIST_COMMENT '#'
|
#define PLAYLIST_COMMENT '#'
|
||||||
|
|
||||||
|
struct client;
|
||||||
|
|
||||||
enum playlist_result {
|
enum playlist_result {
|
||||||
PLAYLIST_RESULT_SUCCESS,
|
PLAYLIST_RESULT_SUCCESS,
|
||||||
PLAYLIST_RESULT_ERRNO,
|
PLAYLIST_RESULT_ERRNO,
|
||||||
@ -37,7 +41,7 @@ enum playlist_result {
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _Playlist {
|
typedef struct _Playlist {
|
||||||
Song **songs;
|
struct song **songs;
|
||||||
/* holds version a song was modified on */
|
/* holds version a song was modified on */
|
||||||
uint32_t *songMod;
|
uint32_t *songMod;
|
||||||
int *order;
|
int *order;
|
||||||
@ -71,7 +75,8 @@ enum playlist_result addToPlaylist(const char *file, int *added_id);
|
|||||||
|
|
||||||
int addToStoredPlaylist(const char *file, const char *utf8file);
|
int addToStoredPlaylist(const char *file, const char *utf8file);
|
||||||
|
|
||||||
enum playlist_result addSongToPlaylist(Song * song, int *added_id);
|
enum playlist_result
|
||||||
|
addSongToPlaylist(struct song *song, int *added_id);
|
||||||
|
|
||||||
void showPlaylist(struct client *client);
|
void showPlaylist(struct client *client);
|
||||||
|
|
||||||
@ -101,7 +106,8 @@ enum playlist_result savePlaylist(const char *utf8file);
|
|||||||
|
|
||||||
enum playlist_result deletePlaylist(const char *utf8file);
|
enum playlist_result deletePlaylist(const char *utf8file);
|
||||||
|
|
||||||
void deleteASongFromPlaylist(const Song * song);
|
void
|
||||||
|
deleteASongFromPlaylist(const struct song *song);
|
||||||
|
|
||||||
enum playlist_result moveSongInPlaylist(int from, int to);
|
enum playlist_result moveSongInPlaylist(int from, int to);
|
||||||
|
|
||||||
|
18
src/song.c
18
src/song.c
@ -28,11 +28,11 @@
|
|||||||
|
|
||||||
#include "os_compat.h"
|
#include "os_compat.h"
|
||||||
|
|
||||||
Song *
|
struct song *
|
||||||
song_alloc(const char *url, struct directory *parent)
|
song_alloc(const char *url, struct directory *parent)
|
||||||
{
|
{
|
||||||
size_t urllen;
|
size_t urllen;
|
||||||
Song *song;
|
struct song *song;
|
||||||
|
|
||||||
assert(url);
|
assert(url);
|
||||||
urllen = strlen(url);
|
urllen = strlen(url);
|
||||||
@ -46,9 +46,10 @@ song_alloc(const char *url, struct directory *parent)
|
|||||||
return song;
|
return song;
|
||||||
}
|
}
|
||||||
|
|
||||||
Song *newSong(const char *url, struct directory *parentDir)
|
struct song *
|
||||||
|
newSong(const char *url, struct directory *parentDir)
|
||||||
{
|
{
|
||||||
Song *song;
|
struct song *song;
|
||||||
assert(*url);
|
assert(*url);
|
||||||
|
|
||||||
if (strchr(url, '\n')) {
|
if (strchr(url, '\n')) {
|
||||||
@ -79,14 +80,16 @@ Song *newSong(const char *url, struct directory *parentDir)
|
|||||||
return song;
|
return song;
|
||||||
}
|
}
|
||||||
|
|
||||||
void freeJustSong(Song * song)
|
void
|
||||||
|
freeJustSong(struct song *song)
|
||||||
{
|
{
|
||||||
if (song->tag)
|
if (song->tag)
|
||||||
tag_free(song->tag);
|
tag_free(song->tag);
|
||||||
free(song);
|
free(song);
|
||||||
}
|
}
|
||||||
|
|
||||||
int updateSongInfo(Song * song)
|
int
|
||||||
|
updateSongInfo(struct song *song)
|
||||||
{
|
{
|
||||||
if (song_is_file(song)) {
|
if (song_is_file(song)) {
|
||||||
struct decoder_plugin *plugin;
|
struct decoder_plugin *plugin;
|
||||||
@ -114,7 +117,8 @@ int updateSongInfo(Song * song)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *get_song_url(char *path_max_tmp, Song *song)
|
char *
|
||||||
|
get_song_url(char *path_max_tmp, struct song *song)
|
||||||
{
|
{
|
||||||
if (!song)
|
if (!song)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
21
src/song.h
21
src/song.h
@ -30,21 +30,24 @@
|
|||||||
|
|
||||||
struct client;
|
struct client;
|
||||||
|
|
||||||
typedef struct _Song {
|
struct song {
|
||||||
struct tag *tag;
|
struct tag *tag;
|
||||||
struct directory *parentDir;
|
struct directory *parentDir;
|
||||||
time_t mtime;
|
time_t mtime;
|
||||||
char url[sizeof(size_t)];
|
char url[sizeof(size_t)];
|
||||||
} Song;
|
};
|
||||||
|
|
||||||
Song *
|
struct song *
|
||||||
song_alloc(const char *url, struct directory *parent);
|
song_alloc(const char *url, struct directory *parent);
|
||||||
|
|
||||||
Song *newSong(const char *url, struct directory *parentDir);
|
struct song *
|
||||||
|
newSong(const char *url, struct directory *parentDir);
|
||||||
|
|
||||||
void freeJustSong(Song *);
|
void
|
||||||
|
freeJustSong(struct song *);
|
||||||
|
|
||||||
int updateSongInfo(Song * song);
|
int
|
||||||
|
updateSongInfo(struct song *song);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* get_song_url - Returns a path of a song in UTF8-encoded form
|
* get_song_url - Returns a path of a song in UTF8-encoded form
|
||||||
@ -52,9 +55,11 @@ int updateSongInfo(Song * song);
|
|||||||
* buffer is assumed to be MPD_PATH_MAX or greater (including
|
* buffer is assumed to be MPD_PATH_MAX or greater (including
|
||||||
* terminating '\0').
|
* terminating '\0').
|
||||||
*/
|
*/
|
||||||
char *get_song_url(char *path_max_tmp, Song * song);
|
char *
|
||||||
|
get_song_url(char *path_max_tmp, struct song *song);
|
||||||
|
|
||||||
static inline int song_is_file(const Song *song)
|
static inline int
|
||||||
|
song_is_file(const struct song *song)
|
||||||
{
|
{
|
||||||
return !!song->parentDir;
|
return !!song->parentDir;
|
||||||
}
|
}
|
||||||
|
@ -17,12 +17,14 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "song_print.h"
|
#include "song_print.h"
|
||||||
|
#include "song.h"
|
||||||
#include "songvec.h"
|
#include "songvec.h"
|
||||||
#include "directory.h"
|
#include "directory.h"
|
||||||
#include "tag_print.h"
|
#include "tag_print.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
|
||||||
void song_print_url(struct client *client, Song * song)
|
void
|
||||||
|
song_print_url(struct client *client, struct song *song)
|
||||||
{
|
{
|
||||||
if (song->parentDir && song->parentDir->path) {
|
if (song->parentDir && song->parentDir->path) {
|
||||||
client_printf(client, "%s%s/%s\n", SONG_FILE,
|
client_printf(client, "%s%s/%s\n", SONG_FILE,
|
||||||
@ -32,7 +34,8 @@ void song_print_url(struct client *client, Song * song)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int song_print_info(struct client *client, Song * song)
|
int
|
||||||
|
song_print_info(struct client *client, struct song *song)
|
||||||
{
|
{
|
||||||
song_print_url(client, song);
|
song_print_url(client, song);
|
||||||
|
|
||||||
@ -43,7 +46,7 @@ int song_print_info(struct client *client, Song * song)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
song_print_info_x(Song *song, void *data)
|
song_print_info_x(struct song *song, void *data)
|
||||||
{
|
{
|
||||||
struct client *client = data;
|
struct client *client = data;
|
||||||
return song_print_info(client, song);
|
return song_print_info(client, song);
|
||||||
|
@ -19,14 +19,16 @@
|
|||||||
#ifndef SONG_PRINT_H
|
#ifndef SONG_PRINT_H
|
||||||
#define SONG_PRINT_H
|
#define SONG_PRINT_H
|
||||||
|
|
||||||
#include "song.h"
|
struct client;
|
||||||
|
struct song;
|
||||||
struct songvec;
|
struct songvec;
|
||||||
|
|
||||||
int song_print_info(struct client *client, Song * song);
|
int
|
||||||
|
song_print_info(struct client *client, struct song *song);
|
||||||
|
|
||||||
int songvec_print(struct client *client, const struct songvec *sv);
|
int songvec_print(struct client *client, const struct songvec *sv);
|
||||||
|
|
||||||
void song_print_url(struct client *client, Song * song);
|
void
|
||||||
|
song_print_url(struct client *client, struct song *song);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "song_save.h"
|
#include "song_save.h"
|
||||||
|
#include "song.h"
|
||||||
#include "tag_save.h"
|
#include "tag_save.h"
|
||||||
#include "directory.h"
|
#include "directory.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
@ -27,7 +28,8 @@
|
|||||||
#define SONG_KEY "key: "
|
#define SONG_KEY "key: "
|
||||||
#define SONG_MTIME "mtime: "
|
#define SONG_MTIME "mtime: "
|
||||||
|
|
||||||
static void song_save_url(FILE *fp, Song * song)
|
static void
|
||||||
|
song_save_url(FILE *fp, struct song *song)
|
||||||
{
|
{
|
||||||
if (song->parentDir != NULL && song->parentDir->path != NULL)
|
if (song->parentDir != NULL && song->parentDir->path != NULL)
|
||||||
fprintf(fp, SONG_FILE "%s/%s\n",
|
fprintf(fp, SONG_FILE "%s/%s\n",
|
||||||
@ -38,7 +40,7 @@ static void song_save_url(FILE *fp, Song * song)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
song_save(Song *song, void *data)
|
song_save(struct song *song, void *data)
|
||||||
{
|
{
|
||||||
FILE *fp = data;
|
FILE *fp = data;
|
||||||
|
|
||||||
@ -61,9 +63,10 @@ void songvec_save(FILE *fp, struct songvec *sv)
|
|||||||
fprintf(fp, "%s\n", SONG_END);
|
fprintf(fp, "%s\n", SONG_END);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void insertSongIntoList(struct songvec *sv, Song *newsong)
|
static void
|
||||||
|
insertSongIntoList(struct songvec *sv, struct song *newsong)
|
||||||
{
|
{
|
||||||
Song *existing = songvec_find(sv, newsong->url);
|
struct song *existing = songvec_find(sv, newsong->url);
|
||||||
|
|
||||||
if (!existing) {
|
if (!existing) {
|
||||||
songvec_add(sv, newsong);
|
songvec_add(sv, newsong);
|
||||||
@ -102,7 +105,7 @@ void readSongInfoIntoList(FILE *fp, struct songvec *sv,
|
|||||||
{
|
{
|
||||||
char buffer[MPD_PATH_MAX + 1024];
|
char buffer[MPD_PATH_MAX + 1024];
|
||||||
int bufferSize = MPD_PATH_MAX + 1024;
|
int bufferSize = MPD_PATH_MAX + 1024;
|
||||||
Song *song = NULL;
|
struct song *song = NULL;
|
||||||
int itemType;
|
int itemType;
|
||||||
|
|
||||||
while (myFgets(buffer, bufferSize, fp) && 0 != strcmp(SONG_END, buffer)) {
|
while (myFgets(buffer, bufferSize, fp) && 0 != strcmp(SONG_END, buffer)) {
|
||||||
|
@ -19,9 +19,10 @@
|
|||||||
#ifndef SONG_SAVE_H
|
#ifndef SONG_SAVE_H
|
||||||
#define SONG_SAVE_H
|
#define SONG_SAVE_H
|
||||||
|
|
||||||
#include "song.h"
|
#include <stdio.h>
|
||||||
|
|
||||||
struct songvec;
|
struct songvec;
|
||||||
|
struct directory;
|
||||||
|
|
||||||
void songvec_save(FILE *fp, struct songvec *sv);
|
void songvec_save(FILE *fp, struct songvec *sv);
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "songvec.h"
|
#include "songvec.h"
|
||||||
|
#include "song.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
static pthread_mutex_t nr_lock = PTHREAD_MUTEX_INITIALIZER;
|
static pthread_mutex_t nr_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
@ -6,28 +7,28 @@ static pthread_mutex_t nr_lock = PTHREAD_MUTEX_INITIALIZER;
|
|||||||
/* Only used for sorting/searchin a songvec, not general purpose compares */
|
/* Only used for sorting/searchin a songvec, not general purpose compares */
|
||||||
static int songvec_cmp(const void *s1, const void *s2)
|
static int songvec_cmp(const void *s1, const void *s2)
|
||||||
{
|
{
|
||||||
const Song *a = ((const Song * const *)s1)[0];
|
const struct song *a = ((const struct song * const *)s1)[0];
|
||||||
const Song *b = ((const Song * const *)s2)[0];
|
const struct song *b = ((const struct song * const *)s2)[0];
|
||||||
return strcmp(a->url, b->url);
|
return strcmp(a->url, b->url);
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t sv_size(struct songvec *sv)
|
static size_t sv_size(struct songvec *sv)
|
||||||
{
|
{
|
||||||
return sv->nr * sizeof(Song *);
|
return sv->nr * sizeof(struct song *);
|
||||||
}
|
}
|
||||||
|
|
||||||
void songvec_sort(struct songvec *sv)
|
void songvec_sort(struct songvec *sv)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&nr_lock);
|
pthread_mutex_lock(&nr_lock);
|
||||||
qsort(sv->base, sv->nr, sizeof(Song *), songvec_cmp);
|
qsort(sv->base, sv->nr, sizeof(struct song *), songvec_cmp);
|
||||||
pthread_mutex_unlock(&nr_lock);
|
pthread_mutex_unlock(&nr_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
Song *
|
struct song *
|
||||||
songvec_find(const struct songvec *sv, const char *url)
|
songvec_find(const struct songvec *sv, const char *url)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
Song *ret = NULL;
|
struct song *ret = NULL;
|
||||||
|
|
||||||
pthread_mutex_lock(&nr_lock);
|
pthread_mutex_lock(&nr_lock);
|
||||||
for (i = sv->nr; --i >= 0; ) {
|
for (i = sv->nr; --i >= 0; ) {
|
||||||
@ -40,7 +41,8 @@ songvec_find(const struct songvec *sv, const char *url)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int songvec_delete(struct songvec *sv, const Song *del)
|
int
|
||||||
|
songvec_delete(struct songvec *sv, const struct song *del)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -54,7 +56,7 @@ int songvec_delete(struct songvec *sv, const Song *del)
|
|||||||
sv->base = NULL;
|
sv->base = NULL;
|
||||||
} else {
|
} else {
|
||||||
memmove(&sv->base[i], &sv->base[i + 1],
|
memmove(&sv->base[i], &sv->base[i + 1],
|
||||||
(sv->nr - i + 1) * sizeof(Song *));
|
(sv->nr - i + 1) * sizeof(struct song *));
|
||||||
sv->base = xrealloc(sv->base, sv_size(sv));
|
sv->base = xrealloc(sv->base, sv_size(sv));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -64,7 +66,8 @@ int songvec_delete(struct songvec *sv, const Song *del)
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void songvec_add(struct songvec *sv, Song *add)
|
void
|
||||||
|
songvec_add(struct songvec *sv, struct song *add)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&nr_lock);
|
pthread_mutex_lock(&nr_lock);
|
||||||
++sv->nr;
|
++sv->nr;
|
||||||
@ -86,13 +89,13 @@ void songvec_destroy(struct songvec *sv)
|
|||||||
|
|
||||||
int
|
int
|
||||||
songvec_for_each(const struct songvec *sv,
|
songvec_for_each(const struct songvec *sv,
|
||||||
int (*fn)(Song *, void *), void *arg)
|
int (*fn)(struct song *, void *), void *arg)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
pthread_mutex_lock(&nr_lock);
|
pthread_mutex_lock(&nr_lock);
|
||||||
for (i = 0; i < sv->nr; ++i) {
|
for (i = 0; i < sv->nr; ++i) {
|
||||||
Song *song = sv->base[i];
|
struct song *song = sv->base[i];
|
||||||
|
|
||||||
assert(song);
|
assert(song);
|
||||||
assert(*song->url);
|
assert(*song->url);
|
||||||
|
@ -1,27 +1,28 @@
|
|||||||
#ifndef SONGVEC_H
|
#ifndef SONGVEC_H
|
||||||
#define SONGVEC_H
|
#define SONGVEC_H
|
||||||
|
|
||||||
#include "song.h"
|
|
||||||
#include "os_compat.h"
|
#include "os_compat.h"
|
||||||
|
|
||||||
struct songvec {
|
struct songvec {
|
||||||
Song **base;
|
struct song **base;
|
||||||
size_t nr;
|
size_t nr;
|
||||||
};
|
};
|
||||||
|
|
||||||
void songvec_sort(struct songvec *sv);
|
void songvec_sort(struct songvec *sv);
|
||||||
|
|
||||||
Song *
|
struct song *
|
||||||
songvec_find(const struct songvec *sv, const char *url);
|
songvec_find(const struct songvec *sv, const char *url);
|
||||||
|
|
||||||
int songvec_delete(struct songvec *sv, const Song *del);
|
int
|
||||||
|
songvec_delete(struct songvec *sv, const struct song *del);
|
||||||
|
|
||||||
void songvec_add(struct songvec *sv, Song *add);
|
void
|
||||||
|
songvec_add(struct songvec *sv, struct song *add);
|
||||||
|
|
||||||
void songvec_destroy(struct songvec *sv);
|
void songvec_destroy(struct songvec *sv);
|
||||||
|
|
||||||
int
|
int
|
||||||
songvec_for_each(const struct songvec *sv,
|
songvec_for_each(const struct songvec *sv,
|
||||||
int (*fn)(Song *, void *), void *arg);
|
int (*fn)(struct song *, void *), void *arg);
|
||||||
|
|
||||||
#endif /* SONGVEC_H */
|
#endif /* SONGVEC_H */
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include "directory.h"
|
#include "directory.h"
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
|
#include "song.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "player_control.h"
|
#include "player_control.h"
|
||||||
#include "strset.h"
|
#include "strset.h"
|
||||||
@ -39,7 +40,8 @@ struct visit_data {
|
|||||||
struct strset *set;
|
struct strset *set;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int visit_tag_items(Song *song, void *_data)
|
static int
|
||||||
|
visit_tag_items(struct song *song, void *_data)
|
||||||
{
|
{
|
||||||
const struct visit_data *data = _data;
|
const struct visit_data *data = _data;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "storedPlaylist.h"
|
#include "storedPlaylist.h"
|
||||||
|
#include "song.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "ls.h"
|
#include "ls.h"
|
||||||
@ -107,7 +108,7 @@ List *loadStoredPlaylist(const char *utf8path)
|
|||||||
|
|
||||||
while (myFgets(buffer, sizeof(buffer), file)) {
|
while (myFgets(buffer, sizeof(buffer), file)) {
|
||||||
char *s = buffer;
|
char *s = buffer;
|
||||||
Song *song;
|
struct song *song;
|
||||||
|
|
||||||
if (*s == PLAYLIST_COMMENT)
|
if (*s == PLAYLIST_COMMENT)
|
||||||
continue;
|
continue;
|
||||||
@ -260,7 +261,7 @@ removeOneSongFromStoredPlaylistByPath(const char *utf8path, int pos)
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum playlist_result
|
enum playlist_result
|
||||||
appendSongToStoredPlaylistByPath(const char *utf8path, Song *song)
|
appendSongToStoredPlaylistByPath(const char *utf8path, struct song *song)
|
||||||
{
|
{
|
||||||
FILE *file;
|
FILE *file;
|
||||||
char *s;
|
char *s;
|
||||||
|
@ -19,10 +19,11 @@
|
|||||||
#ifndef STORED_PLAYLIST_H
|
#ifndef STORED_PLAYLIST_H
|
||||||
#define STORED_PLAYLIST_H
|
#define STORED_PLAYLIST_H
|
||||||
|
|
||||||
#include "song.h"
|
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "playlist.h"
|
#include "playlist.h"
|
||||||
|
|
||||||
|
struct song;
|
||||||
|
|
||||||
List *loadStoredPlaylist(const char *utf8path);
|
List *loadStoredPlaylist(const char *utf8path);
|
||||||
|
|
||||||
enum playlist_result
|
enum playlist_result
|
||||||
@ -35,7 +36,7 @@ enum playlist_result
|
|||||||
removeOneSongFromStoredPlaylistByPath(const char *utf8path, int pos);
|
removeOneSongFromStoredPlaylistByPath(const char *utf8path, int pos);
|
||||||
|
|
||||||
enum playlist_result
|
enum playlist_result
|
||||||
appendSongToStoredPlaylistByPath(const char *utf8path, Song *song);
|
appendSongToStoredPlaylistByPath(const char *utf8path, struct song *song);
|
||||||
|
|
||||||
enum playlist_result
|
enum playlist_result
|
||||||
renameStoredPlaylist(const char *utf8from, const char *utf8to);
|
renameStoredPlaylist(const char *utf8from, const char *utf8to);
|
||||||
|
16
src/update.c
16
src/update.c
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include "update.h"
|
#include "update.h"
|
||||||
#include "directory.h"
|
#include "directory.h"
|
||||||
|
#include "song.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "ls.h"
|
#include "ls.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
@ -45,7 +46,7 @@ static const int update_task_id_max = 1 << 15;
|
|||||||
|
|
||||||
static int update_task_id;
|
static int update_task_id;
|
||||||
|
|
||||||
static Song *delete;
|
static struct song *delete;
|
||||||
|
|
||||||
static struct condition delete_cond;
|
static struct condition delete_cond;
|
||||||
|
|
||||||
@ -63,7 +64,7 @@ directory_set_stat(struct directory *dir, const struct stat *st)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
delete_song(struct directory *dir, Song *del)
|
delete_song(struct directory *dir, struct song *del)
|
||||||
{
|
{
|
||||||
/* first, prevent traversers in main task from getting this */
|
/* first, prevent traversers in main task from getting this */
|
||||||
songvec_delete(&dir->songs, del);
|
songvec_delete(&dir->songs, del);
|
||||||
@ -87,7 +88,8 @@ struct delete_data {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* passed to songvec_for_each */
|
/* passed to songvec_for_each */
|
||||||
static int delete_song_if_removed(Song *song, void *_data)
|
static int
|
||||||
|
delete_song_if_removed(struct song *song, void *_data)
|
||||||
{
|
{
|
||||||
struct delete_data *data = _data;
|
struct delete_data *data = _data;
|
||||||
|
|
||||||
@ -196,7 +198,7 @@ addToDirectory(struct directory *directory, const char *name)
|
|||||||
|
|
||||||
if (S_ISREG(st.st_mode) &&
|
if (S_ISREG(st.st_mode) &&
|
||||||
hasMusicSuffix(name, 0) && isMusic(name, NULL, 0)) {
|
hasMusicSuffix(name, 0) && isMusic(name, NULL, 0)) {
|
||||||
Song *song;
|
struct song *song;
|
||||||
const char *shortname = mpd_basename(name);
|
const char *shortname = mpd_basename(name);
|
||||||
|
|
||||||
if (!(song = newSong(shortname, directory)))
|
if (!(song = newSong(shortname, directory)))
|
||||||
@ -216,7 +218,7 @@ addToDirectory(struct directory *directory, const char *name)
|
|||||||
static enum update_return
|
static enum update_return
|
||||||
updateInDirectory(struct directory *directory, const char *name)
|
updateInDirectory(struct directory *directory, const char *name)
|
||||||
{
|
{
|
||||||
Song *song;
|
struct song *song;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
if (myStat(name, &st))
|
if (myStat(name, &st))
|
||||||
@ -313,7 +315,7 @@ addDirectoryPathToDB(const char *utf8path)
|
|||||||
char *parent;
|
char *parent;
|
||||||
struct directory *parentDirectory;
|
struct directory *parentDirectory;
|
||||||
struct directory *directory;
|
struct directory *directory;
|
||||||
Song *conflicting;
|
struct song *conflicting;
|
||||||
|
|
||||||
parent = parent_path(path_max_tmp, utf8path);
|
parent = parent_path(path_max_tmp, utf8path);
|
||||||
|
|
||||||
@ -372,7 +374,7 @@ static enum update_return updatePath(const char *utf8path)
|
|||||||
{
|
{
|
||||||
struct directory *directory;
|
struct directory *directory;
|
||||||
struct directory *parentDirectory;
|
struct directory *parentDirectory;
|
||||||
Song *song;
|
struct song *song;
|
||||||
char *path = sanitizePathDup(utf8path);
|
char *path = sanitizePathDup(utf8path);
|
||||||
time_t mtime;
|
time_t mtime;
|
||||||
enum update_return ret = UPDATE_RETURN_NOUPDATE;
|
enum update_return ret = UPDATE_RETURN_NOUPDATE;
|
||||||
|
Loading…
Reference in New Issue
Block a user