summaryrefslogtreecommitdiff
path: root/csid.cpp
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-07-25 22:33:54 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-07-25 22:33:54 +0200
commitbec33cc7e4cfd0fa095daa63476e62d1975fde76 (patch)
tree3acea6853c85ef7e4f5cb9640a8592801142d7f2 /csid.cpp
parent243a04851027dca3cc4a66de309637a522293253 (diff)
initial sid subsong and metadata support
Diffstat (limited to 'csid.cpp')
-rw-r--r--csid.cpp71
1 files changed, 62 insertions, 9 deletions
diff --git a/csid.cpp b/csid.cpp
index 97bb9844..17503b75 100644
--- a/csid.cpp
+++ b/csid.cpp
@@ -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;
}