summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cdumb.c1
-rw-r--r--cflac.c1
-rw-r--r--cgme.c26
-rw-r--r--cmp3.c1
-rw-r--r--cvorbis.c1
-rw-r--r--playlist.c68
-rw-r--r--playlist.h24
7 files changed, 104 insertions, 18 deletions
diff --git a/cdumb.c b/cdumb.c
index aff0fea8..dc4062e9 100644
--- a/cdumb.c
+++ b/cdumb.c
@@ -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;
diff --git a/cflac.c b/cflac.c
index e7b69b61..492797e7 100644
--- a/cflac.c
+++ b/cflac.c
@@ -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;
}
diff --git a/cgme.c b/cgme.c
index 9ad7cd56..c507975c 100644
--- a/cgme.c
+++ b/cgme.c
@@ -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);
diff --git a/cmp3.c b/cmp3.c
index 6e512e51..3af4b9a7 100644
--- a/cmp3.c
+++ b/cmp3.c
@@ -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;
}
diff --git a/cvorbis.c b/cvorbis.c
index 4ab49dca..f8c8a41a 100644
--- a/cvorbis.c
+++ b/cvorbis.c
@@ -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;
}
diff --git a/playlist.c b/playlist.c
index 75af730e..d6edbcc6 100644
--- a/playlist.c
+++ b/playlist.c
@@ -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 "?";
+}
diff --git a/playlist.h b/playlist.h
index cd67d191..52572835 100644
--- a/playlist.h
+++ b/playlist.h
@@ -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