From 6cdcd740ff956813cb444f2096abc414b624fd37 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Fri, 3 Jul 2015 16:18:00 +1200 Subject: Added config.mk --- Makefile | 26 ++++++++-- config.mk | 2 + cue-bin-split.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ split.c | 129 ----------------------------------------------- 4 files changed, 177 insertions(+), 132 deletions(-) create mode 100644 config.mk create mode 100644 cue-bin-split.c delete mode 100644 split.c diff --git a/Makefile b/Makefile index 4433bf4..66dab1d 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,25 @@ -CFLAGS += -Wall +# Makefile for cue-bin-split -all: split +.POSIX: +include config.mk -split: split.c +OBJECTS = cue-bin-split.o +CFLAGS += -Wall -Werror + + +all: cue-bin-split + +cue-bin-split: $(OBJECTS) + $(CC) -o $(EXEC_NAME) $< $(LDFLAGS) + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + + +clean: + rm -f cue-bin-split + +distclean: clean + rm -f *.o + +.PHONY: all clean diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..821eee9 --- /dev/null +++ b/config.mk @@ -0,0 +1,2 @@ +# Name of executable to be created +EXEC_NAME = cue-bin-split diff --git a/cue-bin-split.c b/cue-bin-split.c new file mode 100644 index 0000000..69423ae --- /dev/null +++ b/cue-bin-split.c @@ -0,0 +1,152 @@ +/* + * cue-bin-split - Split raw PCM files on time boundaries + * Copyright (c) 2015 David Phillips + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include + +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; + char buffer[10240]; + 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; + 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++; + sprintf(out_fname, "track_%04d", index); + + /* Open output file */ + if ((fout = fopen(out_fname, "w")) == NULL) + { + fprintf(stderr,"Failed to open '%s': ", out_fname); + perror("fopen"); + return EXIT_FAILURE; + } + + + /* 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 of track */ + fseek(fin, (start_sample * sample_size), SEEK_SET); + + if (finish >= 0) + { + 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 { + 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); + } + } + + } + fclose(fout); + start = finish; + + if (finish < 0) + break; + } +} + diff --git a/split.c b/split.c deleted file mode 100644 index c78b263..0000000 --- a/split.c +++ /dev/null @@ -1,129 +0,0 @@ -#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; - char buffer[10240]; - 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; - 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++; - sprintf(out_fname, "track_%04d", index); - - /* Open output file */ - if ((fout = fopen(out_fname, "w")) == NULL) - { - fprintf(stderr,"Failed to open '%s': ", out_fname); - perror("fopen"); - return EXIT_FAILURE; - } - - - /* 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 of track */ - fseek(fin, (start_sample * sample_size), SEEK_SET); - - if (finish >= 0) - { - 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); - } - } - - } - fclose(fout); - start = finish; - - if (finish < 0) - break; - } -} - -- cgit v1.1