ref: d1bda5ce44a56d51052fb51735b0824b7250564f
parent: dd1bcfaa29cc7a2a00b44af00fc9cc8516196f49
author: Tevo <[email protected]>
date: Sat Jan 16 17:41:50 EST 2021
Sand out some rough corners
--- a/cue.c
+++ b/cue.c
@@ -228,7 +228,8 @@
if(f->type != WAVE)
return f->type;
- ext = extension(f->name);
+ if((ext = extension(f->name)) == nil)
+ return UNKNOWN;
if(strcmp(ext, "wav") == 0)
return WAVE;
@@ -241,7 +242,7 @@
char*
formatext(int f)
{
- char *tab[] =
+ static char *tab[] =
{
[WAVE] = "wav",
[MP3] = "mp3",
@@ -264,4 +265,16 @@
return formatext(f->actual);
return extension(f->name);
+}
+
+int
+prefoutfmt(int fmt)
+{
+ static int self[] = { FLAC };
+
+ for(int c = 0; c < sizeof(self); c++)
+ if(fmt == self[c])
+ return fmt;
+
+ return WAVE;
}
--- a/cuefs.h
+++ b/cuefs.h
@@ -96,7 +96,9 @@
char* fileext(AFile*);
int actualformat(AFile*);
+int prefoutfmt(int);
+
static char *Estub = "not yet";
static char *Eunsupported = "unsupported format";
-void cuefsinit(Cuesheet*, char*);
+void cuefsinit(Cuesheet*, char*, int, int);
--- a/fs.c
+++ b/fs.c
@@ -14,7 +14,7 @@
typedef struct
{
Cuesheet* sheet;
- int outfmt;
+ int outfmt, prefidx;
} Fsprops;
typedef struct
@@ -94,6 +94,21 @@
free(path);
}
+Timestamp*
+prefindex(Entry *e)
+{
+ extern Srv fs;
+ Fsprops *p;
+
+ p = fs.aux;
+
+ for(Start *s = e->starts; s != nil; s = s->next)
+ if(s->index == p->prefidx)
+ return s;
+
+ return e->starts;
+}
+
void
closedec(Decoder *dec)
{
@@ -113,7 +128,7 @@
pipedec(AFile *f, double sec, vlong off, vlong end)
{
Decoder *ret;
- int fd[2], afd;
+ int fd[2], afd, devnull = -1;
char *dec;
dec = decoder[f->actual];
@@ -132,12 +147,15 @@
switch(ret->pid = rfork(RFPROC|RFFDG|RFREND|RFNOTEG))
{
case 0:
- if((afd = open(f->name, OREAD)) < 0)
+ if((afd = open(f->name, OREAD)) < 0 || (devnull = open("/dev/null", OWRITE)) < 0)
sysfatal("pipedec: can't decode: open: %r");
dup(afd, 0);
dup(fd[1], 1);
+ if(verbosity < 1)
+ dup(devnull, 2);
close(afd);
close(fd[1]);
+ close(devnull);
seek(0, 0, 0);
{
char *argv[] = { dec, "-s", smprint("%f", sec), nil };
@@ -194,7 +212,7 @@
if(e->next != nil)
{
/* amount of samples between songs... */
- end = (e->next->starts->frames - e->starts->frames) * (44100/75);
+ end = (prefindex(e->next)->frames - prefindex(e)->frames) * (44100/75);
/* ...*2 channels, 2 bytes per sample */
end *= 2*2;
}
@@ -210,7 +228,7 @@
Decoder *dec;
double sec;
- sec = t2sec(e->starts[0]) + of2sec(44100, 16, 2, offset);
+ sec = t2sec(*prefindex(e)) + of2sec(44100, 16, 2, offset);
/*
* wouldn't be that bad to just read and throw away a little of the
@@ -386,7 +404,7 @@
enc = emalloc(sizeof(*enc));
enc->cleanup = (void(*)(void*))closeflac;
enc->fd = encfd[0];
- enc->dec = pipedec(e->file, t2sec(e->starts[0]), 0, entrylen(e));
+ enc->dec = pipedec(e->file, t2sec(*prefindex(e)), 0, entrylen(e));
enc->pollpid = polldec(enc->dec, decfd[1]);
enc->encpid = _flacenc(e, decfd[0], encfd[1]);
@@ -495,23 +513,35 @@
};
void
-cuefsinit(Cuesheet *sheet, char *mtpt)
+cuefsinit(Cuesheet *sheet, char *mtpt, int outfmt, int prefidx)
{
Fsprops *p;
char *s;
p = emalloc(sizeof(*p));
- p->sheet = sheet;
- p->outfmt = FLAC; /* STUB */
+ p->sheet = sheet;
+ p->outfmt = (outfmt == -1) ? prefoutfmt(sheet->files->actual) : outfmt;
+ p->prefidx = prefidx;
fs.aux = p;
fs.tree = alloctree(nil, nil, DMDIR | 0444, nil);
- /* TODO check if decoder, encoder, files exist */
+ for(AFile *file = sheet->files; file != nil; file = file->next)
+ {
+ if(access(file->name, AREAD) < 0)
+ sysfatal("cannot access: %r");
+ if(access(s = decoder[file->actual], AEXEC) < 0)
+ {
+ if(access(s = smprint("/bin/%s", s), AEXEC) < 0)
+ sysfatal("cannot find decoder: %r");
+ free(s);
+ }
+ }
+
for(Entry *e = sheet->entries; e != nil; e = e->next)
{
- debug("%d: %d\n", e->index, e->starts[0].frames);
+ debug("%d: %d\n", e->index, prefindex(e)->frames);
/* TODO make the format customizable */
s = smprint("%02d - %s.%s", e->index, e->title, formatext(p->outfmt));
strreplace(s, '/', '-');
--- a/main.c
+++ b/main.c
@@ -8,15 +8,33 @@
void
usage(void)
{
- fprint(2, "usage: %s [-D] [-m mtpt] file\n", argv0);
+ fprint(2, "usage: %s [-Dv] [-m mtpt] [-f outfmt] [-i index] file\n", argv0);
exits("usage");
}
+int
+fmtarg(char *fmt)
+{
+ static char *fmts[] =
+ {
+ [WAVE] = "wave",
+ [FLAC] = "flac",
+ [BINARY] = "pcm",
+ };
+
+ for(int c = 0; c < sizeof(fmts); c++)
+ if(cistrcmp(fmt, fmts[c]) == 0)
+ return c;
+
+ return UNKNOWN;
+}
+
void
main(int argc, char **argv)
{
extern int chatty9p;
- char *mtpt = "/n/cue";
+ char *mtpt = "/mnt/cue";
+ int outfmt = -1, prefidx = 0;
ARGBEGIN {
case 'D':
@@ -28,6 +46,13 @@
case 'v':
verbosity++;
break;
+ case 'f':
+ if((outfmt = fmtarg(EARGF(usage()))) == UNKNOWN)
+ usage();
+ break;
+ case 'i':
+ prefidx = atoi(EARGF(usage()));
+ break;
default:
usage();
} ARGEND;
@@ -48,7 +73,7 @@
if(infd != 0)
close(infd);
- cuefsinit(cursheet, mtpt);
+ cuefsinit(cursheet, mtpt, outfmt, prefidx);
exits(0);
}
--- a/mkfile
+++ b/mkfile
@@ -1,5 +1,8 @@
</$objtype/mkfile
+TARG=cuefs
+BIN=/$objtype/bin
+
LFILES=\
cue.l