aboutsummaryrefslogtreecommitdiff
path: root/cue-bin-split.c
diff options
context:
space:
mode:
authorDavid Phillips <dbphillipsnz@gmail.com>2015-07-03 16:18:00 +1200
committerDavid Phillips <dbphillipsnz@gmail.com>2015-07-03 16:18:00 +1200
commit6cdcd740ff956813cb444f2096abc414b624fd37 (patch)
tree7d2b196cad3ee43608ecc40dc7b83a58548a6e91 /cue-bin-split.c
parent3ff9e40c50565f5224e30cf73a370636700fd043 (diff)
downloadcue-bin-split-6cdcd740ff956813cb444f2096abc414b624fd37.tar.xz
Added config.mk
Diffstat (limited to 'cue-bin-split.c')
-rw-r--r--cue-bin-split.c152
1 files changed, 152 insertions, 0 deletions
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 <dbphillipsnz@gmail.com>
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+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;
+ }
+}
+