ref: 11b150a2bb01fbf09ae7cfee553dda0e8af5334d
parent: adb84ba1604eca9fbacc16b1eede182a107562ca
author: Tevo <estevan.cps@gmail.com>
date: Sat Dec 26 13:51:28 EST 2020
Clean things up, accidentaly fixed crash on unmount
--- a/BUGS
+++ b/BUGS
@@ -1,4 +1,5 @@
• unsure if seeking on a file works correctly
-• crashes on unmount (buffer overflow caught by free())
• current treatment of lossy sources is less than ideal
• can only serve .wav and raw pcm files (no flac encoder)
+• everything will get resampled to 44100kHz/16bit/2channel
+• the codebase is a mess
--- a/cue.c
+++ b/cue.c
@@ -4,13 +4,15 @@
#include "cuefs.h"
#include "y.tab.h"
+/*
+ * minute:second:frames → Timestamp
+ * 1 frame = 1/75 second
+ */
Timestamp
parsetime(int min, int sec, int frames)
{
- debug("parsing %d:%d:%d into ", min, sec, frames);
sec += min*60;
frames += sec*75;
- debug("%d frames\n", frames);
return (Timestamp){frames};
}
@@ -17,16 +19,19 @@
double
t2sec(Timestamp t)
{
- debug("returning %fs for %ud frames\n", t.frames/75.0, t.frames);
return t.frames/75.0;
}
+/*
+ * offset (in bytes) → sec, with
+ * rate = sample rate, size = sample size (bits), chans = channels
+ */
double
of2sec(uint rate, uint size, uint chans, vlong offset)
{
int bs;
bs = (size/8)*chans;
- return (double)offset/(double)bs/(double)rate;
+ return (double)offset/bs/rate;
}
Cuesheet*
@@ -36,44 +41,46 @@
}
void
-maybefree(void *s, void *p)
+freesheet(Cuesheet *s)
{
- if(p != nil && p != s)
- free(p);
-}
+ Entry *e;
+ AFile *f;
-void
-recfreeentries(Cuesheet *s, Entry *cur)
-{
- if(cur == nil)
- return;
- recfreeentries(s, cur->next);
- for(Start *s = cur->starts; s != nil; s = cur->starts)
+ /* free entries */
+ while((e = s->entries) != nil)
{
- cur->starts = s->next;
- free(s);
+ s->entries = e->next;
+
+ /* free starts */
+ for(Start *st = e->starts; st != nil; st = e->starts)
+ {
+ e->starts = st->next;
+ free(st);
+ }
+ free(e->title);
+ /*
+ * TODO maybe we should keep track of every performer in
+ * the Cuesheet, even if they're "song only" performers?
+ */
+ if(e->performer != s->performer)
+ free(e->title);
+
+ free(e);
}
- /* file should get freed by the cuesheet */
- maybefree(nil, cur->title);
- maybefree(s->performer, cur->performer);
-}
-void
-recfreefiles(Cuesheet *s, AFile *cur)
-{
- if(cur == nil)
- return;
- recfreefiles(s, cur->next);
- maybefree(nil, cur->name);
-}
+ /* free files */
+ while((f = s->files) != nil)
+ {
+ s->files = f->next;
-void
-freesheet(Cuesheet *s)
-{
- recfreeentries(s, s->entries);
- recfreefiles(s, s->files);
- maybefree(nil, s->title);
- maybefree(nil, s->performer);
+ free(f->name);
+ free(f);
+ }
+
+ free(s->title);
+ free(s->performer);
+
+ free(s);
}
AFile*
@@ -111,9 +118,16 @@
{
artist = strdup(artist);
if(c->curentry == nil)
- setstr(nil, &c->performer, artist);
+ {
+ free(c->performer);
+ c->performer = artist;
+ }
else
- setstr(c->performer, &c->curentry->performer, artist);
+ {
+ if(c->curentry->performer != c->performer)
+ free(c->curentry->performer);
+ c->curentry->performer = artist;
+ }
}
void
@@ -121,9 +135,15 @@
{
title = strdup(title);
if(c->curentry == nil)
- setstr(nil, &c->title, title);
+ {
+ free(c->title);
+ c->title = title;
+ }
else
- setstr(nil, &c->curentry->title, title);
+ {
+ free(c->curentry->title);
+ c->curentry->title = title;
+ }
}
void
@@ -131,8 +151,6 @@
{
AFile *new;
- lastfile(c);
-
new = emalloc(sizeof(*new));
new->name = strdup(name);
new->type = format;
@@ -142,7 +160,7 @@
if(c->files == nil)
c->files = new;
else
- c->curfile->next = new;
+ lastfile(c)->next = new;
c->curfile = new;
}
@@ -152,8 +170,6 @@
{
Entry *new;
- lastentry(c);
-
new = emallocz(sizeof(*new), 1);
new->file = c->curfile;
new->performer = c->performer;
@@ -162,7 +178,7 @@
if(c->entries == nil)
c->entries = new;
else
- c->curentry->next = new;
+ lastentry(c)->next = new;
c->curentry = new;
}
@@ -197,11 +213,11 @@
char*
extension(char *f)
{
- char *ext = "";
+ char *ext;
- for(char *c = f; *c != 0; c++)
- if(*c == '.')
- ext = c+1;
+ for(; *f != 0; f++)
+ if(*f == '.')
+ ext = f+1;
return ext;
}