Blame programs/sndfile-info.c

Packit 4aff17
/*
Packit 4aff17
** Copyright (C) 1999-2014 Erik de Castro Lopo <erikd@mega-nerd.com>
Packit 4aff17
**
Packit 4aff17
** All rights reserved.
Packit 4aff17
**
Packit 4aff17
** Redistribution and use in source and binary forms, with or without
Packit 4aff17
** modification, are permitted provided that the following conditions are
Packit 4aff17
** met:
Packit 4aff17
**
Packit 4aff17
**     * Redistributions of source code must retain the above copyright
Packit 4aff17
**       notice, this list of conditions and the following disclaimer.
Packit 4aff17
**     * Redistributions in binary form must reproduce the above copyright
Packit 4aff17
**       notice, this list of conditions and the following disclaimer in
Packit 4aff17
**       the documentation and/or other materials provided with the
Packit 4aff17
**       distribution.
Packit 4aff17
**     * Neither the author nor the names of any contributors may be used
Packit 4aff17
**       to endorse or promote products derived from this software without
Packit 4aff17
**       specific prior written permission.
Packit 4aff17
**
Packit 4aff17
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 4aff17
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
Packit 4aff17
** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
Packit 4aff17
** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
Packit 4aff17
** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
Packit 4aff17
** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
Packit 4aff17
** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
Packit 4aff17
** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
Packit 4aff17
** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
Packit 4aff17
** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
Packit 4aff17
** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 4aff17
*/
Packit 4aff17
Packit 4aff17
#include	<stdio.h>
Packit 4aff17
#include	<stdlib.h>
Packit 4aff17
#include	<string.h>
Packit 4aff17
#include	<inttypes.h>
Packit 4aff17
#include	<ctype.h>
Packit 4aff17
#include	<math.h>
Packit 4aff17
Packit 4aff17
#include	<sndfile.h>
Packit 4aff17
Packit 4aff17
#include "common.h"
Packit 4aff17
Packit 4aff17
#define	BUFFER_LEN		(1 << 16)
Packit 4aff17
Packit 4aff17
#if (defined (WIN32) || defined (_WIN32))
Packit 4aff17
#include <windows.h>
Packit 4aff17
#endif
Packit 4aff17
Packit 4aff17
static void usage_exit (const char *progname) ;
Packit 4aff17
Packit 4aff17
static void info_dump (const char *filename) ;
Packit 4aff17
static int	instrument_dump (const char *filename) ;
Packit 4aff17
static int	broadcast_dump (const char *filename) ;
Packit 4aff17
static int	chanmap_dump (const char *filename) ;
Packit 4aff17
static int	cart_dump (const char *filename) ;
Packit 4aff17
static void total_dump (void) ;
Packit 4aff17
Packit 4aff17
static double total_seconds = 0.0 ;
Packit 4aff17
Packit 4aff17
int
Packit 4aff17
main (int argc, char *argv [])
Packit 4aff17
{	int	k ;
Packit 4aff17
Packit 4aff17
	if (argc < 2 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0)
Packit 4aff17
		usage_exit (program_name (argv [0])) ;
Packit 4aff17
Packit 4aff17
	if (strcmp (argv [1], "--instrument") == 0)
Packit 4aff17
	{	int error = 0 ;
Packit 4aff17
Packit 4aff17
		for (k = 2 ; k < argc ; k++)
Packit 4aff17
			error += instrument_dump (argv [k]) ;
Packit 4aff17
		return error ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	if (strcmp (argv [1], "--broadcast") == 0)
Packit 4aff17
	{	int error = 0 ;
Packit 4aff17
Packit 4aff17
		for (k = 2 ; k < argc ; k++)
Packit 4aff17
			error += broadcast_dump (argv [k]) ;
Packit 4aff17
		return error ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	if (strcmp (argv [1], "--channel-map") == 0)
Packit 4aff17
	{	int error = 0 ;
Packit 4aff17
Packit 4aff17
		for (k = 2 ; k < argc ; k++)
Packit 4aff17
			error += chanmap_dump (argv [k]) ;
Packit 4aff17
		return error ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	if (strcmp (argv [1], "--cart") == 0)
Packit 4aff17
	{	int error = 0 ;
Packit 4aff17
Packit 4aff17
		for (k = 2 ; k < argc ; k++)
Packit 4aff17
			error += cart_dump (argv [k]) ;
Packit 4aff17
		return error ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	for (k = 1 ; k < argc ; k++)
Packit 4aff17
		info_dump (argv [k]) ;
Packit 4aff17
Packit 4aff17
	if (argc > 2)
Packit 4aff17
		total_dump () ;
Packit 4aff17
Packit 4aff17
	return 0 ;
Packit 4aff17
} /* main */
Packit 4aff17
Packit 4aff17
/*==============================================================================
Packit 4aff17
**	Print version and usage.
Packit 4aff17
*/
Packit 4aff17
Packit 4aff17
static double	data [BUFFER_LEN] ;
Packit 4aff17
Packit 4aff17
static void
Packit 4aff17
usage_exit (const char *progname)
Packit 4aff17
{	printf ("Usage :\n  %s <file> ...\n", progname) ;
Packit 4aff17
	printf ("    Prints out information about one or more sound files.\n\n") ;
Packit 4aff17
	printf ("  %s --instrument <file>\n", progname) ;
Packit 4aff17
	printf ("    Prints out the instrument data for the given file.\n\n") ;
Packit 4aff17
	printf ("  %s --broadcast <file>\n", progname) ;
Packit 4aff17
	printf ("    Prints out the broadcast WAV info for the given file.\n\n") ;
Packit 4aff17
	printf ("  %s --channel-map <file>\n", progname) ;
Packit 4aff17
	printf ("    Prints out the channel map for the given file.\n\n") ;
Packit 4aff17
	printf ("  %s --cart <file>\n", progname) ;
Packit 4aff17
	printf ("    Prints out the cart chunk WAV info for the given file.\n\n") ;
Packit 4aff17
Packit 4aff17
	printf ("Using %s.\n\n", sf_version_string ()) ;
Packit 4aff17
#if (defined (_WIN32) || defined (WIN32))
Packit 4aff17
		printf ("This is a Unix style command line application which\n"
Packit 4aff17
				"should be run in a MSDOS box or Command Shell window.\n\n") ;
Packit 4aff17
		printf ("Sleeping for 5 seconds before exiting.\n\n") ;
Packit 4aff17
		fflush (stdout) ;
Packit 4aff17
Packit 4aff17
		Sleep (5 * 1000) ;
Packit 4aff17
#endif
Packit 4aff17
	exit (1) ;
Packit 4aff17
} /* usage_exit */
Packit 4aff17
Packit 4aff17
/*==============================================================================
Packit 4aff17
**	Dumping of sndfile info.
Packit 4aff17
*/
Packit 4aff17
Packit 4aff17
static double	data [BUFFER_LEN] ;
Packit 4aff17
Packit 4aff17
static double
Packit 4aff17
calc_decibels (SF_INFO * sfinfo, double max)
Packit 4aff17
{	double decibels ;
Packit 4aff17
Packit 4aff17
	switch (sfinfo->format & SF_FORMAT_SUBMASK)
Packit 4aff17
	{	case SF_FORMAT_PCM_U8 :
Packit 4aff17
		case SF_FORMAT_PCM_S8 :
Packit 4aff17
			decibels = max / 0x80 ;
Packit 4aff17
			break ;
Packit 4aff17
Packit 4aff17
		case SF_FORMAT_PCM_16 :
Packit 4aff17
			decibels = max / 0x8000 ;
Packit 4aff17
			break ;
Packit 4aff17
Packit 4aff17
		case SF_FORMAT_PCM_24 :
Packit 4aff17
			decibels = max / 0x800000 ;
Packit 4aff17
			break ;
Packit 4aff17
Packit 4aff17
		case SF_FORMAT_PCM_32 :
Packit 4aff17
			decibels = max / 0x80000000 ;
Packit 4aff17
			break ;
Packit 4aff17
Packit 4aff17
		case SF_FORMAT_FLOAT :
Packit 4aff17
		case SF_FORMAT_DOUBLE :
Packit 4aff17
			decibels = max / 1.0 ;
Packit 4aff17
			break ;
Packit 4aff17
Packit 4aff17
		default :
Packit 4aff17
			decibels = max / 0x8000 ;
Packit 4aff17
			break ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	return 20.0 * log10 (decibels) ;
Packit 4aff17
} /* calc_decibels */
Packit 4aff17
Packit 4aff17
static const char *
Packit 4aff17
format_duration_str (double seconds)
Packit 4aff17
{	static char str [128] ;
Packit 4aff17
	int hrs, min ;
Packit 4aff17
	double sec ;
Packit 4aff17
Packit 4aff17
	memset (str, 0, sizeof (str)) ;
Packit 4aff17
Packit 4aff17
	hrs = (int) (seconds / 3600.0) ;
Packit 4aff17
	min = (int) ((seconds - (hrs * 3600.0)) / 60.0) ;
Packit 4aff17
	sec = seconds - (hrs * 3600.0) - (min * 60.0) ;
Packit 4aff17
Packit 4aff17
	snprintf (str, sizeof (str) - 1, "%02d:%02d:%06.3f", hrs, min, sec) ;
Packit 4aff17
Packit 4aff17
	return str ;
Packit 4aff17
} /* format_duration_str */
Packit 4aff17
Packit 4aff17
static const char *
Packit 4aff17
generate_duration_str (SF_INFO *sfinfo)
Packit 4aff17
{
Packit 4aff17
	double seconds ;
Packit 4aff17
Packit 4aff17
	if (sfinfo->samplerate < 1)
Packit 4aff17
		return NULL ;
Packit 4aff17
Packit 4aff17
	if (sfinfo->frames / sfinfo->samplerate > 0x7FFFFFFF)
Packit 4aff17
		return "unknown" ;
Packit 4aff17
Packit 4aff17
	seconds = (1.0 * sfinfo->frames) / sfinfo->samplerate ;
Packit 4aff17
Packit 4aff17
	/* Accumulate the total of all known file durations */
Packit 4aff17
	total_seconds += seconds ;
Packit 4aff17
Packit 4aff17
	return format_duration_str (seconds) ;
Packit 4aff17
} /* generate_duration_str */
Packit 4aff17
Packit 4aff17
static void
Packit 4aff17
info_dump (const char *filename)
Packit 4aff17
{	static	char	strbuffer [BUFFER_LEN] ;
Packit 4aff17
	SNDFILE		*file ;
Packit 4aff17
	SF_INFO		sfinfo ;
Packit 4aff17
	double		signal_max, decibels ;
Packit 4aff17
Packit 4aff17
	memset (&sfinfo, 0, sizeof (sfinfo)) ;
Packit 4aff17
Packit 4aff17
	if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL)
Packit 4aff17
	{	printf ("Error : Not able to open input file %s.\n", filename) ;
Packit 4aff17
		fflush (stdout) ;
Packit 4aff17
		memset (data, 0, sizeof (data)) ;
Packit 4aff17
		sf_command (file, SFC_GET_LOG_INFO, strbuffer, BUFFER_LEN) ;
Packit 4aff17
		puts (strbuffer) ;
Packit 4aff17
		puts (sf_strerror (NULL)) ;
Packit 4aff17
		return ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	printf ("========================================\n") ;
Packit 4aff17
	sf_command (file, SFC_GET_LOG_INFO, strbuffer, BUFFER_LEN) ;
Packit 4aff17
	puts (strbuffer) ;
Packit 4aff17
	printf ("----------------------------------------\n") ;
Packit 4aff17
Packit 4aff17
	printf ("Sample Rate : %d\n", sfinfo.samplerate) ;
Packit 4aff17
Packit 4aff17
	if (sfinfo.frames == SF_COUNT_MAX)
Packit 4aff17
		printf ("Frames      : unknown\n") ;
Packit 4aff17
	else
Packit 4aff17
		printf ("Frames      : %" PRId64 "\n", sfinfo.frames) ;
Packit 4aff17
Packit 4aff17
	printf ("Channels    : %d\n", sfinfo.channels) ;
Packit 4aff17
	printf ("Format      : 0x%08X\n", sfinfo.format) ;
Packit 4aff17
	printf ("Sections    : %d\n", sfinfo.sections) ;
Packit 4aff17
	printf ("Seekable    : %s\n", (sfinfo.seekable ? "TRUE" : "FALSE")) ;
Packit 4aff17
	printf ("Duration    : %s\n", generate_duration_str (&sfinfo)) ;
Packit 4aff17
Packit 4aff17
	if (sfinfo.frames < 100 * 1024 * 1024)
Packit 4aff17
	{	/* Do not use sf_signal_max because it doesn't work for non-seekable files . */
Packit 4aff17
		sf_command (file, SFC_CALC_SIGNAL_MAX, &signal_max, sizeof (signal_max)) ;
Packit 4aff17
		decibels = calc_decibels (&sfinfo, signal_max) ;
Packit 4aff17
		printf ("Signal Max  : %g (%4.2f dB)\n", signal_max, decibels) ;
Packit 4aff17
		} ;
Packit 4aff17
	putchar ('\n') ;
Packit 4aff17
Packit 4aff17
	sf_close (file) ;
Packit 4aff17
Packit 4aff17
} /* info_dump */
Packit 4aff17
Packit 4aff17
/*==============================================================================
Packit 4aff17
**	Dumping of SF_INSTRUMENT data.
Packit 4aff17
*/
Packit 4aff17
Packit 4aff17
static const char *
Packit 4aff17
str_of_type (int mode)
Packit 4aff17
{	switch (mode)
Packit 4aff17
	{	case SF_LOOP_NONE : return "none" ;
Packit 4aff17
		case SF_LOOP_FORWARD : return "fwd " ;
Packit 4aff17
		case SF_LOOP_BACKWARD : return "back" ;
Packit 4aff17
		case SF_LOOP_ALTERNATING : return "alt " ;
Packit 4aff17
		default : break ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	return "????" ;
Packit 4aff17
} /* str_of_mode */
Packit 4aff17
Packit 4aff17
static int
Packit 4aff17
instrument_dump (const char *filename)
Packit 4aff17
{	SNDFILE	*file ;
Packit 4aff17
	SF_INFO	sfinfo ;
Packit 4aff17
	SF_INSTRUMENT inst ;
Packit 4aff17
	int got_inst, k ;
Packit 4aff17
Packit 4aff17
	memset (&sfinfo, 0, sizeof (sfinfo)) ;
Packit 4aff17
Packit 4aff17
	if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL)
Packit 4aff17
	{	printf ("Error : Not able to open input file %s.\n", filename) ;
Packit 4aff17
		fflush (stdout) ;
Packit 4aff17
		memset (data, 0, sizeof (data)) ;
Packit 4aff17
		puts (sf_strerror (NULL)) ;
Packit 4aff17
		return 1 ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	got_inst = sf_command (file, SFC_GET_INSTRUMENT, &inst, sizeof (inst)) ;
Packit 4aff17
	sf_close (file) ;
Packit 4aff17
Packit 4aff17
	if (got_inst == SF_FALSE)
Packit 4aff17
	{	printf ("Error : File '%s' does not contain instrument data.\n\n", filename) ;
Packit 4aff17
		return 1 ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	printf ("Instrument : %s\n\n", filename) ;
Packit 4aff17
	printf ("  Gain        : %d\n", inst.gain) ;
Packit 4aff17
	printf ("  Base note   : %d\n", inst.basenote) ;
Packit 4aff17
	printf ("  Velocity    : %d - %d\n", (int) inst.velocity_lo, (int) inst.velocity_hi) ;
Packit 4aff17
	printf ("  Key         : %d - %d\n", (int) inst.key_lo, (int) inst.key_hi) ;
Packit 4aff17
	printf ("  Loop points : %d\n", inst.loop_count) ;
Packit 4aff17
Packit 4aff17
	for (k = 0 ; k < inst.loop_count ; k++)
Packit 4aff17
		printf ("  %-2d    Mode : %s    Start : %6d   End : %6d   Count : %6d\n", k, str_of_type (inst.loops [k].mode), inst.loops [k].start, inst.loops [k].end, inst.loops [k].count) ;
Packit 4aff17
Packit 4aff17
	putchar ('\n') ;
Packit 4aff17
	return 0 ;
Packit 4aff17
} /* instrument_dump */
Packit 4aff17
Packit 4aff17
static int
Packit 4aff17
broadcast_dump (const char *filename)
Packit 4aff17
{	SNDFILE	*file ;
Packit 4aff17
	SF_INFO	sfinfo ;
Packit 4aff17
	SF_BROADCAST_INFO_2K bext ;
Packit 4aff17
	double time_ref_sec ;
Packit 4aff17
	int got_bext ;
Packit 4aff17
Packit 4aff17
	memset (&sfinfo, 0, sizeof (sfinfo)) ;
Packit 4aff17
Packit 4aff17
	if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL)
Packit 4aff17
	{	printf ("Error : Not able to open input file %s.\n", filename) ;
Packit 4aff17
		fflush (stdout) ;
Packit 4aff17
		memset (data, 0, sizeof (data)) ;
Packit 4aff17
		puts (sf_strerror (NULL)) ;
Packit 4aff17
		return 1 ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	memset (&bext, 0, sizeof (SF_BROADCAST_INFO_2K)) ;
Packit 4aff17
Packit 4aff17
	got_bext = sf_command (file, SFC_GET_BROADCAST_INFO, &bext, sizeof (bext)) ;
Packit 4aff17
	sf_close (file) ;
Packit 4aff17
Packit 4aff17
	if (got_bext == SF_FALSE)
Packit 4aff17
	{	printf ("Error : File '%s' does not contain broadcast information.\n\n", filename) ;
Packit 4aff17
		return 1 ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	/*
Packit 4aff17
	**	From : http://www.ebu.ch/en/technical/publications/userguides/bwf_user_guide.php
Packit 4aff17
	**
Packit 4aff17
	**	Time Reference:
Packit 4aff17
	**		This field is a count from midnight in samples to the first sample
Packit 4aff17
	**		of the audio sequence.
Packit 4aff17
	*/
Packit 4aff17
Packit 4aff17
	time_ref_sec = ((pow (2.0, 32) * bext.time_reference_high) + (1.0 * bext.time_reference_low)) / sfinfo.samplerate ;
Packit 4aff17
Packit 4aff17
	printf ("Description      : %.*s\n", (int) sizeof (bext.description), bext.description) ;
Packit 4aff17
	printf ("Originator       : %.*s\n", (int) sizeof (bext.originator), bext.originator) ;
Packit 4aff17
	printf ("Origination ref  : %.*s\n", (int) sizeof (bext.originator_reference), bext.originator_reference) ;
Packit 4aff17
	printf ("Origination date : %.*s\n", (int) sizeof (bext.origination_date), bext.origination_date) ;
Packit 4aff17
	printf ("Origination time : %.*s\n", (int) sizeof (bext.origination_time), bext.origination_time) ;
Packit 4aff17
Packit 4aff17
	if (bext.time_reference_high == 0 && bext.time_reference_low == 0)
Packit 4aff17
		printf ("Time ref         : 0\n") ;
Packit 4aff17
	else
Packit 4aff17
		printf ("Time ref         : 0x%x%08x (%.6f seconds)\n", bext.time_reference_high, bext.time_reference_low, time_ref_sec) ;
Packit 4aff17
Packit 4aff17
	printf ("BWF version      : %d\n", bext.version) ;
Packit 4aff17
	printf ("UMID             : %.*s\n", (int) sizeof (bext.umid), bext.umid) ;
Packit 4aff17
	printf ("Coding history   : %.*s\n", bext.coding_history_size, bext.coding_history) ;
Packit 4aff17
Packit 4aff17
	return 0 ;
Packit 4aff17
} /* broadcast_dump */
Packit 4aff17
Packit 4aff17
static int
Packit 4aff17
chanmap_dump (const char *filename)
Packit 4aff17
{	SNDFILE	*file ;
Packit 4aff17
	SF_INFO	sfinfo ;
Packit 4aff17
	int * channel_map ;
Packit 4aff17
	int got_chanmap, k ;
Packit 4aff17
Packit 4aff17
	memset (&sfinfo, 0, sizeof (sfinfo)) ;
Packit 4aff17
Packit 4aff17
	if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL)
Packit 4aff17
	{	printf ("Error : Not able to open input file %s.\n", filename) ;
Packit 4aff17
		fflush (stdout) ;
Packit 4aff17
		memset (data, 0, sizeof (data)) ;
Packit 4aff17
		puts (sf_strerror (NULL)) ;
Packit 4aff17
		return 1 ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	if ((channel_map = calloc (sfinfo.channels, sizeof (int))) == NULL)
Packit 4aff17
	{	printf ("Error : malloc failed.\n\n") ;
Packit 4aff17
		return 1 ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	got_chanmap = sf_command (file, SFC_GET_CHANNEL_MAP_INFO, channel_map, sfinfo.channels * sizeof (int)) ;
Packit 4aff17
	sf_close (file) ;
Packit 4aff17
Packit 4aff17
	if (got_chanmap == SF_FALSE)
Packit 4aff17
	{	printf ("Error : File '%s' does not contain channel map information.\n\n", filename) ;
Packit 4aff17
		free (channel_map) ;
Packit 4aff17
		return 1 ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	printf ("File : %s\n\n", filename) ;
Packit 4aff17
Packit 4aff17
	puts ("    Chan    Position") ;
Packit 4aff17
	for (k = 0 ; k < sfinfo.channels ; k ++)
Packit 4aff17
	{	const char * name ;
Packit 4aff17
Packit 4aff17
#define CASE_NAME(x)	case x : name = #x ; break ;
Packit 4aff17
		switch (channel_map [k])
Packit 4aff17
		{	CASE_NAME (SF_CHANNEL_MAP_INVALID) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_MONO) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_LEFT) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_RIGHT) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_CENTER) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_FRONT_LEFT) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_FRONT_RIGHT) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_FRONT_CENTER) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_REAR_CENTER) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_REAR_LEFT) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_REAR_RIGHT) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_LFE) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_SIDE_LEFT) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_SIDE_RIGHT) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_TOP_CENTER) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_TOP_FRONT_LEFT) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_TOP_FRONT_RIGHT) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_TOP_FRONT_CENTER) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_TOP_REAR_LEFT) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_TOP_REAR_RIGHT) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_TOP_REAR_CENTER) ;
Packit 4aff17
			CASE_NAME (SF_CHANNEL_MAP_MAX) ;
Packit 4aff17
			default : name = "default" ;
Packit 4aff17
				break ;
Packit 4aff17
			} ;
Packit 4aff17
Packit 4aff17
		printf ("    %3d     %s\n", k, name) ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	putchar ('\n') ;
Packit 4aff17
	free (channel_map) ;
Packit 4aff17
Packit 4aff17
	return 0 ;
Packit 4aff17
} /* chanmap_dump */
Packit 4aff17
Packit 4aff17
static int
Packit 4aff17
cart_dump (const char *filename)
Packit 4aff17
{	SNDFILE	*file ;
Packit 4aff17
	SF_INFO	sfinfo ;
Packit 4aff17
	SF_CART_INFO_VAR (1024) cart ;
Packit 4aff17
	int got_cart, k ;
Packit 4aff17
Packit 4aff17
	memset (&sfinfo, 0, sizeof (sfinfo)) ;
Packit 4aff17
	memset (&cart, 0, sizeof (cart)) ;
Packit 4aff17
Packit 4aff17
	if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL)
Packit 4aff17
	{	printf ("Error : Not able to open input file %s.\n", filename) ;
Packit 4aff17
		fflush (stdout) ;
Packit 4aff17
		memset (data, 0, sizeof (data)) ;
Packit 4aff17
		puts (sf_strerror (NULL)) ;
Packit 4aff17
		return 1 ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	got_cart = sf_command (file, SFC_GET_CART_INFO, &cart, sizeof (cart)) ;
Packit 4aff17
	sf_close (file) ;
Packit 4aff17
Packit 4aff17
	if (got_cart == SF_FALSE)
Packit 4aff17
	{	printf ("Error : File '%s' does not contain cart information.\n\n", filename) ;
Packit 4aff17
		return 1 ;
Packit 4aff17
		} ;
Packit 4aff17
Packit 4aff17
	printf ("Version        : %.*s\n", (int) sizeof (cart.version), cart.version) ;
Packit 4aff17
	printf ("Title          : %.*s\n", (int) sizeof (cart.title), cart.title) ;
Packit 4aff17
	printf ("Artist         : %.*s\n", (int) sizeof (cart.artist), cart.artist) ;
Packit 4aff17
	printf ("Cut id         : %.*s\n", (int) sizeof (cart.cut_id), cart.cut_id) ;
Packit 4aff17
	printf ("Category       : %.*s\n", (int) sizeof (cart.category), cart.category) ;
Packit 4aff17
	printf ("Classification : %.*s\n", (int) sizeof (cart.classification), cart.classification) ;
Packit 4aff17
	printf ("Out cue        : %.*s\n", (int) sizeof (cart.out_cue), cart.out_cue) ;
Packit 4aff17
	printf ("Start date     : %.*s\n", (int) sizeof (cart.start_date), cart.start_date) ;
Packit 4aff17
	printf ("Start time     : %.*s\n", (int) sizeof (cart.start_time), cart.start_time) ;
Packit 4aff17
	printf ("End date       : %.*s\n", (int) sizeof (cart.end_date), cart.end_date) ;
Packit 4aff17
	printf ("End time       : %.*s\n", (int) sizeof (cart.end_time), cart.end_time) ;
Packit 4aff17
	printf ("App id         : %.*s\n", (int) sizeof (cart.producer_app_id), cart.producer_app_id) ;
Packit 4aff17
	printf ("App version    : %.*s\n", (int) sizeof (cart.producer_app_version), cart.producer_app_version) ;
Packit 4aff17
	printf ("User defined   : %.*s\n", (int) sizeof (cart.user_def), cart.user_def) ;
Packit 4aff17
	printf ("Level ref.     : %d\n", cart.level_reference) ;
Packit 4aff17
	printf ("Post timers    :\n") ;
Packit 4aff17
Packit 4aff17
	for (k = 0 ; k < ARRAY_LEN (cart.post_timers) ; k++)
Packit 4aff17
		if (cart.post_timers [k].usage [0])
Packit 4aff17
			printf ("  %d   %.*s    %d\n", k, (int) sizeof (cart.post_timers [k].usage), cart.post_timers [k].usage, cart.post_timers [k].value) ;
Packit 4aff17
Packit 4aff17
	printf ("Reserved       : %.*s\n", (int) sizeof (cart.reserved), cart.reserved) ;
Packit 4aff17
	printf ("Url            : %.*s\n", (int) sizeof (cart.url), cart.url) ;
Packit 4aff17
	printf ("Tag text       : %.*s\n", cart.tag_text_size, cart.tag_text) ;
Packit 4aff17
Packit 4aff17
	return 0 ;
Packit 4aff17
} /* cart_dump */
Packit 4aff17
Packit 4aff17
static void
Packit 4aff17
total_dump (void)
Packit 4aff17
{	printf ("========================================\n") ;
Packit 4aff17
	printf ("Total Duration : %s\n", format_duration_str (total_seconds)) ;
Packit 4aff17
} /* total_dump */