|
- /*
- * cuebreakpoints.c -- print track break points
- *
- * Copyright (C) 2004 Svend Sorensen
- * For license terms, see the file COPYING in this distribution.
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <getopt.h>
- #include "cuefile.h"
- #include "time.h"
-
- char *progname;
-
- /* pregap correction modes
- * APPEND - append pregap to previous track (except for first track)
- * PREPEND - prefix pregap to current track
- * SPLIT - print breakpoints for beginning and end of pregap
- */
- enum GapMode {APPEND, PREPEND, SPLIT};
-
- void usage (int status)
- {
- if (0 == status) {
- fprintf(stdout, "%s: usage: cuebreakpoints [option...] [file...]\n", progname);
- fputs("\
- \n\
- OPTIONS\n\
- -h, --help print usage\n\
- -i, --input-format cue|toc set format of file(s)\n\
- --append-gaps append pregaps to previous track (default)\n\
- --prepend-gaps prefix pregaps to track\n\
- --split-gaps split at beginning and end of pregaps\n\
- ", stdout);
- } else {
- fprintf(stderr, "run `%s --help' for usage\n", progname);
- }
-
- exit (status);
- }
-
- void print_m_ss_ff (long frame)
- {
- int m, s, f;
-
- time_frame_to_msf(frame, &m, &s, &f);
- printf ("%d:%02d.%02d\n", m, s, f);
- }
-
- void print_breakpoint (long b)
- {
- /* do not print zero breakpoints */
- if (0 != b)
- print_m_ss_ff(b);
- }
-
- void print_breaks (Cd *cd, int gaps)
- {
- int i;
- long b;
- Track *track;
-
- for (i = 1; i <= cd_get_ntrack(cd); i++) {
- track = cd_get_track(cd, i);
- /* when breakpoint is at:
- * index 0: gap is prepended to track
- * index 1: gap is appended to previous track
- */
- b = track_get_start(track);
-
- if (gaps == PREPEND || gaps == SPLIT) {
- print_breakpoint(b);
- }
-
- if (gaps == APPEND || gaps == SPLIT) {
- /* there is no previous track to append the first tracks pregap to */
- /* TODO: should first track's pregap be split when appending?
- * this could be a suprising default
- */
- if (1 < i) {
- b += track_get_index(track, 1) - track_get_zero_pre(track);
- print_breakpoint(b);
- }
- }
- }
- }
-
- int breaks (char *name, int format, int gaps)
- {
- Cd *cd = NULL;
-
- if (NULL == (cd = cf_parse(name, &format))) {
- fprintf(stderr, "%s: input file error\n", name);
- return -1;
- }
-
- print_breaks(cd, gaps);
-
- return 0;
- }
-
- int main (int argc, char **argv)
- {
- int format = UNKNOWN;
- int gaps = APPEND;
-
- /* option variables */
- char c;
- /* getopt_long() variables */
- extern char *optarg;
- extern int optind;
-
- static struct option longopts[] = {
- {"help", no_argument, NULL, 'h'},
- {"input-format", required_argument, NULL, 'i'},
- {"append-gaps", no_argument, NULL, 'a'},
- {"prepend-gaps", no_argument, NULL, 'p'},
- {"split-gaps", no_argument, NULL, 's'},
- {NULL, 0, NULL, 0}
- };
-
- progname = *argv;
-
- while (-1 != (c = getopt_long(argc, argv, "hi:", longopts, NULL))) {
- switch (c) {
- case 'h':
- usage(0);
- break;
- case 'i':
- if (0 == strcmp("cue", optarg))
- format = CUE;
- else if (0 == strcmp("toc", optarg))
- format = TOC;
- else
- fprintf(stderr, "%s: illegal format `%s'\n", progname, optarg);
- usage(1);
- break;
- case 'a':
- gaps = APPEND;
- break;
- case 'p':
- gaps = PREPEND;
- break;
- case 's':
- gaps = SPLIT;
- break;
- default:
- usage(1);
- break;
- }
- }
-
- if (optind == argc) {
- breaks("-", format, gaps);
- } else {
- for (; optind < argc; optind++)
- breaks(argv[optind], format, gaps);
- }
-
- return 0;
- }
|