diff options
author | waker <wakeroid@gmail.com> | 2009-08-04 17:49:03 +0200 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2009-08-04 17:49:03 +0200 |
commit | 7bccab7d4a27e554259637f4ed23356519433549 (patch) | |
tree | 02fc9b9b7349053be3935f9a1b19e4e9906dc4e7 /playlist.c | |
parent | b3826e69941ff69f9da91679d087e6964bbc41f6 (diff) |
playlist insertion WIP
Diffstat (limited to 'playlist.c')
-rw-r--r-- | playlist.c | 195 |
1 files changed, 164 insertions, 31 deletions
@@ -110,8 +110,131 @@ ps_cue_parse_time (const char *p) { return mins * 60 + sec; } +playItem_t * +ps_insert_cue (playItem_t *after, const char *cuename) { + FILE *fp = fopen (cuename, "rt"); + if (!fp) { + return NULL; + } + char performer[1024]; + char albumtitle[1024]; + char file[1024]; + char track[1024]; + char title[1024]; + char start[1024]; + playItem_t *prev = NULL; + for (;;) { + char str[1024]; + if (!fgets (str, 1024, fp)) { + break; // eof + } + char *p = ps_cue_skipspaces (str); + if (!strncmp (p, "PERFORMER ", 10)) { + ps_get_qvalue_from_cue (p + 10, performer); +// printf ("got performer: %s\n", performer); + } + else if (!strncmp (p, "TITLE ", 6)) { + if (str[0] > ' ') { + ps_get_qvalue_from_cue (p + 6, albumtitle); +// printf ("got albumtitle: %s\n", albumtitle); + } + else { + ps_get_qvalue_from_cue (p + 6, title); +// printf ("got title: %s\n", title); + } + } + else if (!strncmp (p, "FILE ", 5)) { + ps_get_qvalue_from_cue (p + 5, file); +// printf ("got filename: %s\n", file); + // copy directory name + char fname[1024]; + int len = strlen (cuename); + memcpy (fname, cuename, len+1); + char *p = fname + len; + while (*p != '/') { + p--; + len--; + } + p++; + len++; + // add file name + int flen = strlen (file); + // ensure fullname fills in buffer + if (flen + len >= 1024) { +// printf ("cue file name is too long"); + return NULL; + } + strcpy (p, file); + // copy full name in place of relative name + strcpy (file, fname); +// printf ("ended up as: %s\n", file); + } + else if (!strncmp (p, "TRACK ", 6)) { + ps_get_value_from_cue (p + 6, track); +// printf ("got track: %s\n", track); + } +// else if (!strncmp (p, "PERFORMER ", 10)) { +// ps_get_qvalue_from_cue (p + 10, performer); +// } + else if (!strncmp (p, "INDEX 00 ", 9) || !strncmp (p, "INDEX 01 ", 9)) { + if (!track[0]) { + continue; + } +#if SKIP_BLANK_CUE_TRACKS + if (!title[0]) + continue; +#endif + ps_get_value_from_cue (p + 9, start); +// printf ("got index0: %s\n", start); + char *p = track; + while (*p && isdigit (*p)) { + p++; + } + *p = 0; + // check that indexes have valid timestamps + float tstart = ps_cue_parse_time (start); + if (tstart < 0) { +// printf ("cue file %s has bad timestamp(s)\n", cuename); + continue; + } + if (prev) { + prev->timeend = tstart; +// printf ("end time for prev track (%x): %f\n", prev, tstart); + } + // add this track + char str[1024]; + snprintf (str, 1024, "%d. %s - %s", atoi (track), performer, title[0] ? title : "?", start, tstart); +// printf ("adding %s\n", str); + playItem_t *it = malloc (sizeof (playItem_t)); + memset (it, 0, sizeof (playItem_t)); + it->codec = &cflac; + it->fname = strdup (file); + it->tracknum = atoi (track); + it->timestart = tstart; + it->timeend = -1; // will be filled by next read, or by codec + after = ps_insert_item (after, it); +// ps_append_item (it); +// printf ("added item %x\n", it); + prev = it; + track[0] = 0; + } + else { +// printf ("got unknown line:\n%s\n", p); + } + } + fclose (fp); + return after; +} + int ps_add_cue (const char *cuename) { + playItem_t *it = ps_insert_cue (playlist_tail, cuename); + if (!it) { + return -1; + } + return 0; +// {{{ hide old cue code +#if 0 FILE *fp = fopen (cuename, "rt"); if (!fp) { return -1; @@ -223,6 +346,16 @@ ps_add_cue (const char *cuename) { } fclose (fp); return 0; +#endif +// }}} +} + +playItem_t * +ps_insert_file (playItem_t *after, const char *fname) { +} + +playItem_t * +ps_insert_dir (playItem_t *after, const char *dirname) { } int @@ -242,13 +375,15 @@ ps_add_file (const char *fname) { codec_t *codecs[] = { &cdumb, &cvorbis, &cflac, &cgme, &cmp3, &csid, NULL }; + playItem_t *after = playlist_tail; for (int i = 0; codecs[i]; i++) { - if (codecs[i]->getexts && codecs[i]->add) { + if (codecs[i]->getexts && codecs[i]->insert) { const char **exts = codecs[i]->getexts (); if (exts) { for (int e = 0; exts[e]; e++) { if (!strcasecmp (exts[e], eol)) { - if (!codecs[i]->add (fname)) { + playItem_t *inserted = NULL; + if ((inserted = codecs[i]->insert (after, fname)) != NULL) { return 0; } } @@ -258,35 +393,6 @@ ps_add_file (const char *fname) { } return -1; -#if 0 - // add by extension (temporary hack) -// else if (!strcasecmp (eol, "wav")) { -// codec = &cwav; -// } - if (!strcasecmp (eol, "mp3")) { - codec = &cmp3; - } - else { - return -1; - } - // copy string - playItem_t *it = malloc (sizeof (playItem_t)); - memset (it, 0, sizeof (playItem_t)); - it->codec = codec; - it->fname = strdup (fname); - // find 1st slash from end - while (eol > fname && *eol != '/') { - eol--; - } - if (*eol=='/') { - eol++; - } - - it->timestart = -1; - it->timeend = -1; - - ps_append_item (it); -#endif } int @@ -406,6 +512,33 @@ ps_append_item (playItem_t *it) { ps_count++; } +playItem_t * +ps_insert_item (playItem_t *after, playItem_t *it) { + if (!after) { + it->next = playlist_head; + it->prev = NULL; + if (playlist_head) { + playlist_head->prev = it; + } + else { + playlist_tail = it; + } + playlist_head = it; + } + else { + it->next = after; + it->prev = after->prev; + if (after->prev) { + after->prev->next = it; + } + after->prev = it; + if (after == playlist_tail) { + playlist_tail = it; + } + } + return it; +} + void ps_item_copy (playItem_t *out, playItem_t *it) { out->fname = strdup (it->fname); |