From 6b51d25d3e37904695c74df4fbe50ca5afb13be8 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Fri, 3 Jul 2015 14:00:19 +1200 Subject: Initial buggy commit --- .gitignore | 5 +++ Makefile | 5 +++ split.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 split.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5491f94 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +split +*.o +track_* +*.bin +*.cue diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4433bf4 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +CFLAGS += -Wall + +all: split + +split: split.c diff --git a/split.c b/split.c new file mode 100644 index 0000000..a6395c3 --- /dev/null +++ b/split.c @@ -0,0 +1,102 @@ +#define _GNU_SOURCE +#include +#include +#include + +/* Split.c + * Splits a raw audio file into segments bounded by the time specified on stdin */ + +int main(int argc, char **argv) +{ + FILE *fin = NULL; + FILE *fout = NULL; + char *in_fname = NULL; + char out_fname[] = "track-0000"; + int m = 0; + int s = 0; + int frame = 0; + int index = 0; + int items = 0; + int channels = 0; + int rate = 0; + int sample_size = 0; + int i = 0; + double start = 0; + double finish = 0; + unsigned long start_sample = 0; + unsigned long finish_sample = 0; + + + /* FIXME Use getopt */ + /* FIXME Replace assertions with useful checks+messages */ + assert(argc == 5); + + in_fname = argv[1]; + channels = atoi(argv[2]); + rate = atoi(argv[3]); + sample_size = atoi(argv[4]); + + assert(channels > 0); + assert(rate > 0); + assert(sample_size > 0); + assert(in_fname != NULL); + + /* Open it up */ + if ((fin = fopen(in_fname, "r")) == NULL) + { + fprintf(stderr,"Failed to open '%s': ", in_fname); + perror("fopen"); + return EXIT_FAILURE; + } + printf("Opened input file '%s'\n", in_fname); + + + 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 ) + { + 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 */ + if ((fout = fopen(out_fname, "w")) == NULL) + { + fprintf(stderr,"Failed to open '%s': ", out_fname); + perror("fopen"); + return EXIT_FAILURE; + } + + start_sample = start * (double)rate * channels; + finish_sample = finish * (double)rate * channels; + + + /* Seek to first sample and write until last sample */ + 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; ) + { + /* 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); + + i += items; + } + + fclose(fout); + } +} + -- cgit v1.1