diff options
author | David Phillips <dbphillipsnz@gmail.com> | 2015-07-03 15:32:55 +1200 |
---|---|---|
committer | David Phillips <dbphillipsnz@gmail.com> | 2015-07-03 15:32:55 +1200 |
commit | a47b9cb7571d486e1b89e1ac49dfac0144193332 (patch) | |
tree | 9830d070d093ac23a56ccdeb5247fc31354a438c /split.c | |
parent | adf56c81c9899e9ce80c498116ab555ca05e6340 (diff) | |
download | cue-bin-split-a47b9cb7571d486e1b89e1ac49dfac0144193332.tar.xz |
Whoops, fixed mathematical reasoning error
Diffstat (limited to 'split.c')
-rw-r--r-- | split.c | 83 |
1 files changed, 55 insertions, 28 deletions
@@ -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; } } |