aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Phillips <dbphillipsnz@gmail.com>2015-07-03 15:32:55 +1200
committerDavid Phillips <dbphillipsnz@gmail.com>2015-07-03 15:32:55 +1200
commita47b9cb7571d486e1b89e1ac49dfac0144193332 (patch)
tree9830d070d093ac23a56ccdeb5247fc31354a438c
parentadf56c81c9899e9ce80c498116ab555ca05e6340 (diff)
downloadcue-bin-split-a47b9cb7571d486e1b89e1ac49dfac0144193332.tar.xz
Whoops, fixed mathematical reasoning error
-rw-r--r--split.c83
1 files changed, 55 insertions, 28 deletions
diff --git a/split.c b/split.c
index a6395c3..c78b263 100644
--- a/split.c
+++ b/split.c
@@ -1,4 +1,3 @@
-#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
@@ -21,6 +20,7 @@ int main(int argc, char **argv)
int rate = 0;
int sample_size = 0;
int i = 0;
+ char buffer[10240];
double start = 0;
double finish = 0;
unsigned long start_sample = 0;
@@ -52,25 +52,16 @@ int main(int argc, char **argv)
index = 0;
- finish = 0; /* FIXME we assume first track starts at beginning of file */
- while ( ( items = fscanf(stdin, "%d:%d:%d\n", &m, &s, &frame) ) != EOF )
+ items = fscanf(stdin, "%d:%d:%d\n", &m, &s, &frame); /* FIXME doesn't check return value */
+ start = (double)m*60 + (double)s + ((double)frame)/75;
+
+ /* FIXME duplication of code to get mm:ss:ff */
+ while ( ( items = fscanf(stdin, "%d:%d:%d\n", &m, &s, &frame) ) )
{
index++;
- /* Following track starts at end of last */
- if (items != 3)
- {
- fprintf(stderr, "Timestamp #%d malformed\n", index);
- break;
- }
- start = finish;
- finish = (double)m*60 + (double)s + ((double)frame)/75;
-
- fprintf(stderr, "Track %d starts %f s, finishes %f s\n", index, start, finish);
-
sprintf(out_fname, "track_%04d", index);
-
- /* Open it up */
+ /* Open output file */
if ((fout = fopen(out_fname, "w")) == NULL)
{
fprintf(stderr,"Failed to open '%s': ", out_fname);
@@ -78,25 +69,61 @@ int main(int argc, char **argv)
return EXIT_FAILURE;
}
- start_sample = start * (double)rate * channels;
- finish_sample = finish * (double)rate * channels;
+
+ /* EOF means this is the last track; run it to end of input file */
+ if (items == EOF)
+ {
+ finish = -1;
+ } else {
+ /* Following track starts at end of last */
+ if (items != 3)
+ {
+ fprintf(stderr, "Timestamp #%d malformed\n", index);
+ break;
+ }
+ finish = (double)m*60 + (double)s + ((double)frame)/75;
+ }
+ fprintf(stderr, "Track %d starts %f s, finishes %f s\n", index, start, finish);
+
+ start_sample = start * rate * channels;
+ finish_sample = finish * rate * channels;
- /* Seek to first sample and write until last sample */
- fseek(fin, start_sample*sample_size, SEEK_SET);
+ /* Seek to first sample of track */
+ fseek(fin, (start_sample * sample_size), SEEK_SET);
- /* FIXME put this declaration at top */
- char buffer[10240];
- for (i = (int)start_sample; i < (int)finish_sample; )
+ if (finish >= 0)
{
- /* FIXME unnecessary call to fwrite with items == 0 possible */
- if ((items = fread(buffer, sample_size, sizeof(buffer)/sample_size, fin)))
- fwrite(buffer, items, sample_size, fout);
+ for (i = (int)start_sample; i < (int)finish_sample; i += items)
+ {
+ /* FIXME unnecessary call to fwrite with items == 0 possible */
+ /* FIXME Handle EOF properly, silly! */
+ if ((items = fread(buffer, sample_size, sizeof(buffer)/sample_size, fin)))
+ {
+ if (feof(fin))
+ break;
+ fwrite(buffer, items, sample_size, fout);
+ }
+ }
+ } else {
+ printf("Running to EOF\n");
+ for (i = (int)start_sample; ; i += items)
+ {
+ /* FIXME unnecessary call to fwrite with items == 0 possible */
+ if ((items = fread(buffer, sample_size, sizeof(buffer)/sample_size, fin)))
+ {
+ if (feof(fin))
+ break;
+ fwrite(buffer, items, sample_size, fout);
+ }
+ }
- i += items;
}
-
fclose(fout);
+ start = finish;
+
+ if (finish < 0)
+ break;
}
}