diff options
-rw-r--r-- | cdumb.c | 1 | ||||
-rw-r--r-- | cflac.c | 1 | ||||
-rw-r--r-- | cgme.c | 26 | ||||
-rw-r--r-- | cmp3.c | 1 | ||||
-rw-r--r-- | cvorbis.c | 1 | ||||
-rw-r--r-- | playlist.c | 68 | ||||
-rw-r--r-- | playlist.h | 24 |
7 files changed, 104 insertions, 18 deletions
@@ -679,7 +679,6 @@ cdumb_add (const char *fname) { it->tracknum = 0; it->timestart = 0; it->timeend = 0; - it->displayname = strdup (fname); ps_append_item (it); return 0; @@ -215,7 +215,6 @@ cflac_add (const char *fname) { it->tracknum = 0; it->timestart = 0; it->timeend = 0; - it->displayname = strdup (fname); ps_append_item (it); return 0; } @@ -13,7 +13,9 @@ extern int sdl_player_freq; // hack! int cgme_init (const char *fname, int track, float start, float end) { - gme_open_file (fname, &emu, sdl_player_freq); + if (gme_open_file (fname, &emu, sdl_player_freq)) { + return -1; + } gme_start_track (emu, track); track_info_t inf; gme_track_info (emu, &inf, track); @@ -107,9 +109,27 @@ cgme_add (const char *fname) { snprintf (str, 1024, "%d %s - ?", i, inf.game); } it->tracknum = i; - it->displayname = strdup (str); + + // add metadata + ps_add_meta (it, "system", inf.system); + printf ("system: %s\n", inf.system); + ps_add_meta (it, "album", inf.game); + printf ("album: %s\n", inf.game); + ps_add_meta (it, "title", inf.song); + printf ("title: %s\n", inf.song); + ps_add_meta (it, "artist", inf.author); + printf ("artist: %s\n", inf.author); + ps_add_meta (it, "copyright", inf.copyright); + printf ("copyright: %s\n", inf.copyright); + ps_add_meta (it, "comment", inf.comment); + printf ("comment: %s\n", inf.comment); + ps_add_meta (it, "dumper", inf.dumper); + printf ("dumper: %s\n", inf.dumper); + char trk[10]; + snprintf (trk, 10, "%d", i+1); + ps_add_meta (it, "track", trk); + ps_append_item (it); -// printf ("added %s subtune\n", str); } else { printf ("gme error: %s\n", ret); @@ -488,7 +488,6 @@ cmp3_add (const char *fname) { it->tracknum = 0; it->timestart = 0; it->timeend = 0; - it->displayname = strdup (fname); ps_append_item (it); return 0; } @@ -120,7 +120,6 @@ cvorbis_add (const char *fname) { it->tracknum = 0; it->timestart = 0; it->timeend = 0; - it->displayname = strdup (fname); ps_append_item (it); return 0; } @@ -206,7 +206,6 @@ ps_add_cue (const char *cuename) { it->tracknum = atoi (track); it->timestart = tstart; it->timeend = -1; // will be filled by next read, or by codec - it->displayname = strdup (str); ps_append_item (it); // printf ("added item %x\n", it); prev = it; @@ -325,12 +324,6 @@ ps_remove (playItem_t *it) { if (!it) return -1; ps_count--; - if (it->fname) { - free (it->fname); - } - if (it->displayname) { - free (it->displayname); - } if (it->prev) { it->prev->next = it->next; } @@ -343,6 +336,7 @@ ps_remove (playItem_t *it) { else { playlist_tail = it->prev; } + ps_item_free (it); free (it); return 0; } @@ -379,6 +373,7 @@ ps_get_idx_of (playItem_t *it) { int ps_append_item (playItem_t *it) { + ps_format_item_display_name (it); if (!playlist_tail) { playlist_tail = playlist_head = it; } @@ -393,13 +388,29 @@ ps_append_item (playItem_t *it) { void ps_item_copy (playItem_t *out, playItem_t *it) { out->fname = strdup (it->fname); - out->displayname = strdup (it->displayname); + strcpy (out->displayname, it->displayname); out->codec = it->codec; out->tracknum = it->tracknum; out->timestart = it->timestart; out->timeend = it->timeend; out->next = it->next; out->prev = it->prev; + // copy metainfo + metaInfo_t *prev = NULL; + metaInfo_t *meta = it->meta; + while (meta) { + metaInfo_t *m = malloc (sizeof (metaInfo_t)); + memcpy (m, meta, sizeof (metaInfo_t)); + m->next = NULL; + if (prev) { + prev->next = m; + } + else { + out->meta = m; + } + prev = m; + meta = meta->next; + } } void @@ -408,8 +419,10 @@ ps_item_free (playItem_t *it) { if (it->fname) { free (it->fname); } - if (it->displayname) { - free (it->displayname); + while (it->meta) { + metaInfo_t *m = it->meta; + it->meta = m->next; + free (m); } memset (it, 0, sizeof (playItem_t)); } @@ -484,3 +497,38 @@ ps_start_current (void) { it->codec->init (it->fname, it->tracknum, it->timestart, it->timeend); } } + +void +ps_add_meta (playItem_t *it, const char *key, const char *value) { + if (!value || !*value) { + value = "?"; + } + metaInfo_t *m = malloc (sizeof (metaInfo_t)); + m->key = key; + strncpy (m->value, value, META_FIELD_SIZE-1); + m->value[META_FIELD_SIZE-1] = 0; + m->next = it->meta; + it->meta = m; +} + +void +ps_format_item_display_name (playItem_t *it) { + // artist - title + const char *track = ps_find_meta (it, "track"); + const char *artist = ps_find_meta (it, "artist"); + const char *album = ps_find_meta (it, "album"); + const char *title = ps_find_meta (it, "title"); + snprintf (it->displayname, MAX_DISPLAY_NAME, "%s. %s - %s - %s", track, artist, album, title); +} + +const char * +ps_find_meta (playItem_t *it, const char *key) { + metaInfo_t *m = it->meta; + while (m) { + if (!strcmp (key, m->key)) { + return m->value; + } + m = m->next; + } + return "?"; +} @@ -1,15 +1,25 @@ #ifndef __PLAYLIST_H #define __PLAYLIST_H +#define META_FIELD_SIZE 256 +#define MAX_DISPLAY_NAME 512 + +typedef struct metaInfo_s { + const char *key; + char value[META_FIELD_SIZE]; + struct metaInfo_s *next; +} metaInfo_t; + typedef struct playItem_s { char *fname; // full pathname - char *displayname; // all required metainfo columns packed in single string, separated with zeroes + char displayname[MAX_DISPLAY_NAME]; struct codec_s *codec; // codec to use with this file int tracknum; // used for stuff like sid, nsf, cue (will be ignored by most codecs) float timestart; // start time of cue track, or -1 float timeend; // end time of cue track, or -1 struct playItem_s *next; // next item in linked list struct playItem_s *prev; // prev item in linked list + struct metaInfo_s *meta; // linked list storing metainfo } playItem_t; extern playItem_t *playlist_head; // head of linked list @@ -30,6 +40,9 @@ int ps_remove (playItem_t *i); void +ps_item_free (playItem_t *it); + +void ps_free (void); int @@ -56,4 +69,13 @@ ps_nextsong (void); void ps_start_current (void); +void +ps_add_meta (playItem_t *it, const char *key, const char *value); + +void +ps_format_item_display_name (playItem_t *it); + +const char * +ps_find_meta (playItem_t *it, const char *key); + #endif // __PLAYLIST_H |