song: converted typedef Song to struct song

Again, a data type which can be forward-declared.
This commit is contained in:
Max Kellermann 2008-10-08 10:49:11 +02:00
parent 25f67da58c
commit d562ba5fbb
26 changed files with 196 additions and 118 deletions

View File

@ -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;

View File

@ -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"

View File

@ -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);

View File

@ -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);

View File

@ -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"

View File

@ -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);

View 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 : "")

View File

@ -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;

View File

@ -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

View File

@ -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;
} }

View File

@ -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);

View File

@ -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,

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;
} }

View File

@ -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);

View File

@ -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

View File

@ -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)) {

View File

@ -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);

View File

@ -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);

View File

@ -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 */

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;