diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2009-07-25 22:33:54 +0200 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2009-07-25 22:33:54 +0200 |
commit | bec33cc7e4cfd0fa095daa63476e62d1975fde76 (patch) | |
tree | 3acea6853c85ef7e4f5cb9640a8592801142d7f2 /csid.cpp | |
parent | 243a04851027dca3cc4a66de309637a522293253 (diff) |
initial sid subsong and metadata support
Diffstat (limited to 'csid.cpp')
-rw-r--r-- | csid.cpp | 71 |
1 files changed, 62 insertions, 9 deletions
@@ -1,6 +1,7 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> +#include <iconv.h> #include "sidplay/sidplay2.h" #include "sidplay/builders/resid.h" extern "C" { @@ -22,7 +23,7 @@ csid_init (const char *fname, int track, float start, float end) { resid->filter (true); resid->sampling (sdl_player_freq); tune = new SidTune (fname); - tune->selectSong (0); + tune->selectSong (track+1); csid.info.channels = tune->isStereo () ? 2 : 1; sid2_config_t conf; conf = sidplay->config (); @@ -62,16 +63,68 @@ csid_seek (float time) { return 0; } +static const char * +convstr (const char* str) { + int sz = strlen (str); + static char out[2048]; + const char *enc = "iso8859-1"; + iconv_t cd = iconv_open ("utf8", enc); + if (!cd) { + printf ("unknown encoding: %s\n", enc); + return NULL; + } + else { + size_t inbytesleft = sz; + size_t outbytesleft = 2047; + char *pin = (char*)str; + char *pout = out; + memset (out, 0, sizeof (out)); + size_t res = iconv (cd, &pin, &inbytesleft, &pout, &outbytesleft); + iconv_close (cd); + } + return out; +} + extern "C" int csid_add (const char *fname) { - playItem_t *it = (playItem_t*)malloc (sizeof (playItem_t)); - memset (it, 0, sizeof (playItem_t)); - it->codec = &csid; - it->fname = strdup (fname); - it->tracknum = 0; - it->timestart = 0; - it->timeend = 0; - ps_append_item (it); + SidTune *tune; + tune = new SidTune (fname); + int tunes = tune->getInfo ().songs; + for (int s = 0; s < tunes; s++) { + if (tune->selectSong (s+1)) { + playItem_t *it = (playItem_t*)malloc (sizeof (playItem_t)); + memset (it, 0, sizeof (playItem_t)); + it->codec = &csid; + it->fname = strdup (fname); + it->tracknum = s; + it->timestart = 0; + it->timeend = 0; + SidTuneInfo sidinfo; + tune->getInfo (sidinfo); + int i = sidinfo.numberOfCommentStrings; + if (i >= 1 && sidinfo.infoString[0] && sidinfo.infoString[0][0]) { + ps_add_meta (it, sidinfo.songs > 1 ? "album" : "title", convstr (sidinfo.infoString[0])); + } + if (i >= 2 && sidinfo.infoString[1] && sidinfo.infoString[1][0]) { + ps_add_meta (it, "artist", convstr (sidinfo.infoString[1])); + } + if (i >= 3 && sidinfo.infoString[2] && sidinfo.infoString[2][0]) { + ps_add_meta (it, "copyright", convstr (sidinfo.infoString[2])); + } + + for (int j = 3; j < i; j++) + { + if (sidinfo.infoString[j] && sidinfo.infoString[j][0]) { + ps_add_meta (it, "info", convstr (sidinfo.infoString[j])); + } + } + char trk[10]; + snprintf (trk, 10, "%d", s+1); + ps_add_meta (it, "track", trk); + ps_append_item (it); + } + } + delete tune; return 0; } |