/* ** Copyright (C) 2008-2014 Erik de Castro Lopo ** Copyright (C) 2008-2010 George Blood Audio ** ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the author nor the names of any contributors may be used ** to endorse or promote products derived from this software without ** specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 #include #include #include #include #include "common.h" #define BUFFER_LEN (1 << 16) static void usage_exit (const char *progname, int exit_code) ; static void process_args (SNDFILE * file, const SF_BROADCAST_INFO_2K * binfo, int argc, char * argv []) ; int main (int argc, char *argv []) { SNDFILE *file ; SF_INFO sfinfo ; SF_BROADCAST_INFO_2K binfo ; const char *progname ; const char * filename = NULL ; int start ; /* Store the program name. */ progname = program_name (argv [0]) ; /* Check if we've been asked for help. */ if (argc < 2 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0) usage_exit (progname, 0) ; if (argv [argc - 1][0] != '-') { filename = argv [argc - 1] ; start = 1 ; } else if (argv [1][0] != '-') { filename = argv [1] ; start = 2 ; } else { printf ("Error : Either the first or the last command line parameter should be a filename.\n\n") ; exit (1) ; } ; memset (&sfinfo, 0, sizeof (sfinfo)) ; if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) { printf ("Error : Open of file '%s' failed : %s\n\n", filename, sf_strerror (file)) ; exit (1) ; } ; memset (&binfo, 0, sizeof (binfo)) ; if (sf_command (file, SFC_GET_BROADCAST_INFO, &binfo, sizeof (binfo)) == 0) memset (&binfo, 0, sizeof (binfo)) ; process_args (file, &binfo, argc - 2, argv + start) ; sf_close (file) ; return 0 ; } /* main */ /*============================================================================== ** Print version and usage. */ static void usage_exit (const char *progname, int exit_code) { printf ("\nUsage :\n %s [options] \n\nOptions:\n", progname) ; puts ( " --bext-description Print the 'bext' description.\n" " --bext-originator Print the 'bext' originator info.\n" " --bext-orig-ref Print the 'bext' origination reference.\n" " --bext-umid Print the 'bext' UMID.\n" " --bext-orig-date Print the 'bext' origination date.\n" " --bext-orig-time Print the 'bext' origination time.\n" " --bext-loudness-value Print the 'bext' loudness value.\n" " --bext-loudness-range Print the 'bext' loudness range.\n" " --bext-max-truepeak Print the 'bext' max. true peak level\n" " --bext-max-momentary Print the 'bext' max. momentary loudness\n" " --bext-max-shortterm Print the 'bext' max. short term loudness\n" " --bext-coding-hist Print the 'bext' coding history.\n" ) ; puts ( " --str-title Print the title metadata.\n" " --str-copyright Print the copyright metadata.\n" " --str-artist Print the artist metadata.\n" " --str-comment Print the comment metadata.\n" " --str-date Print the creation date metadata.\n" " --str-album Print the album metadata.\n" " --str-license Print the license metadata.\n" ) ; printf ("Using %s.\n\n", sf_version_string ()) ; exit (exit_code) ; } /* usage_exit */ static void process_args (SNDFILE * file, const SF_BROADCAST_INFO_2K * binfo, int argc, char * argv []) { const char * str ; int k, do_all = 0 ; #define HANDLE_BEXT_ARG(cmd, name, field) \ if (do_all || strcmp (argv [k], cmd) == 0) \ { printf ("%-22s : %.*s\n", name, (int) sizeof (binfo->field), binfo->field) ; \ if (! do_all) \ continue ; \ } ; #define HANDLE_BEXT_ARG_INT(cmd, name, field) \ if (do_all || strcmp (argv [k], cmd) == 0) \ { printf ("%-22s : %6.2f\n", name, binfo->field / 100.0) ; \ if (! do_all) \ continue ; \ } ; #define HANDLE_STR_ARG(cmd, name, id) \ if (do_all || strcmp (argv [k], cmd) == 0) \ { str = sf_get_string (file, id) ; \ printf ("%-22s : %s\n", name, str ? str : "") ; \ if (! do_all) continue ; \ } ; if (argc == 0) { do_all = 1 ; argc = 1 ; } ; for (k = 0 ; k < argc ; k++) { if (do_all || strcmp (argv [k], "--all") == 0) do_all = 1 ; HANDLE_BEXT_ARG ("--bext-description", "Description", description) ; HANDLE_BEXT_ARG ("--bext-originator", "Originator", originator) ; HANDLE_BEXT_ARG ("--bext-orig-ref", "Origination ref", originator_reference) ; HANDLE_BEXT_ARG ("--bext-umid", "UMID", umid) ; HANDLE_BEXT_ARG ("--bext-orig-date", "Origination date", origination_date) ; HANDLE_BEXT_ARG ("--bext-orig-time", "Origination time", origination_time) ; HANDLE_BEXT_ARG_INT ("--bext-loudness-value", "Loudness value", loudness_value) ; HANDLE_BEXT_ARG_INT ("--bext-loudness-range", "Loudness range", loudness_range) ; HANDLE_BEXT_ARG_INT ("--bext-max-truepeak", "Max. true peak level", max_true_peak_level) ; HANDLE_BEXT_ARG_INT ("--bext-max-momentary", "Max. momentary level", max_momentary_loudness) ; HANDLE_BEXT_ARG_INT ("--bext-max-shortterm", "Max. short term level", max_shortterm_loudness) ; HANDLE_BEXT_ARG ("--bext-coding-hist", "Coding history", coding_history) ; HANDLE_STR_ARG ("--str-title", "Name", SF_STR_TITLE) ; HANDLE_STR_ARG ("--str-copyright", "Copyright", SF_STR_COPYRIGHT) ; HANDLE_STR_ARG ("--str-artist", "Artist", SF_STR_ARTIST) ; HANDLE_STR_ARG ("--str-comment", "Comment", SF_STR_COMMENT) ; HANDLE_STR_ARG ("--str-date", "Create date", SF_STR_DATE) ; HANDLE_STR_ARG ("--str-album", "Album", SF_STR_ALBUM) ; HANDLE_STR_ARG ("--str-license", "License", SF_STR_LICENSE) ; if (! do_all) { printf ("Error : Don't know what to do with command line arg '%s'.\n\n", argv [k]) ; exit (1) ; } ; break ; } ; return ; } /* process_args */