ref: 92165d87a17ffe2a918a5e2c85f4523b9c2aaa53
dir: /src/sox.h/
/*
* libSoX Library Public Interface
*
* Copyright 1999-2007 Chris Bagwell and SoX Contributors.
*
* This source code is freely redistributable and may be used for
* any purpose. This copyright notice must be maintained.
* Chris Bagwell And SoX Contributors are not responsible for
* the consequences of using this software.
*/
#ifndef SOX_H
#define SOX_H
#include <limits.h>
#include <stdarg.h>
#include <stddef.h> /* Ensure NULL etc. are available throughout SoX */
#include <stdio.h>
#include <stdlib.h>
#include "soxstdint.h"
/* Avoid warnings about unused parameters. */
#ifdef __GNUC__
#define UNUSED __attribute__ ((unused))
#define PRINTF __attribute__ ((format (printf, 1, 2)))
#else
#define UNUSED
#define PRINTF
#endif
/* The following is the API version of libSoX. It is not meant
* to follow the version number of SoX but it has historically.
* Please do not count on these numbers being in sync.
*/
#define SOX_LIB_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
#define SOX_LIB_VERSION_CODE SOX_LIB_VERSION(14, 1, 0)
const char *sox_version(void); /* Returns version number */
#define SOX_SUCCESS 0
#define SOX_EOF (-1) /* End Of File or other error */
/* libSoX specific error codes. The rest directly map from errno. */
#define SOX_EHDR 2000 /* Invalid Audio Header */
#define SOX_EFMT 2001 /* Unsupported data format */
#define SOX_ERATE 2002 /* Unsupported rate for format */
#define SOX_ENOMEM 2003 /* Can't alloc memory */
#define SOX_EPERM 2004 /* Operation not permitted */
#define SOX_ENOTSUP 2005 /* Operation not supported */
#define SOX_EINVAL 2006 /* Invalid argument */
#define SOX_EFFMT 2007 /* Unsupported file format */
/* Boolean type, assignment (but not necessarily binary) compatible with
* C++ bool */
typedef enum {sox_false, sox_true} sox_bool;
typedef int32_t int24_t; /* But beware of the extra byte. */
typedef uint32_t uint24_t; /* ditto */
#define SOX_INT_MIN(bits) (1 <<((bits)-1))
#define SOX_INT_MAX(bits) (-1U>>(33-(bits)))
#define SOX_UINT_MAX(bits) (SOX_INT_MIN(bits)|SOX_INT_MAX(bits))
#define SOX_INT8_MAX SOX_INT_MAX(8)
#define SOX_INT16_MAX SOX_INT_MAX(16)
#define SOX_INT24_MAX SOX_INT_MAX(24)
#define SOX_INT32_MAX SOX_INT_MAX(32)
typedef int32_t sox_sample_t;
/* Minimum and maximum values a sample can hold. */
#define SOX_SAMPLE_PRECISION 32
#define SOX_SAMPLE_MAX (sox_sample_t)SOX_INT_MAX(32)
#define SOX_SAMPLE_MIN (sox_sample_t)SOX_INT_MIN(32)
/* Conversions: Linear PCM <--> sox_sample_t
*
* I/O I/O sox_sample_t Clips? I/O sox_sample_t Clips?
* Format Minimum Minimum I O Maximum Maximum I O
* ------ --------- ------------ -- -- -------- ------------ -- --
* Float -1 -1.00000000047 y y 1 1 y n
* Int8 -128 -128 n n 127 127.9999999 n y
* Int16 -32768 -32768 n n 32767 32767.99998 n y
* Int24 -8388608 -8388608 n n 8388607 8388607.996 n y
* Int32 -2147483648 -2147483648 n n 2147483647 2147483647 n n
*
* Conversions are as accurate as possible (with rounding).
*
* Rounding: halves toward +inf, all others to nearest integer.
*
* Clips? shows whether on not there is the possibility of a conversion
* clipping to the minimum or maximum value when inputing from or outputing
* to a given type.
*
* Unsigned integers are converted to and from signed integers by flipping
* the upper-most bit then treating them as signed integers.
*/
/* Temporary variables to prevent multiple evaluation of macro arguments: */
static sox_sample_t sox_macro_temp_sample UNUSED;
static double sox_macro_temp_double UNUSED;
#define SOX_SAMPLE_NEG SOX_INT_MIN(32)
#define SOX_SAMPLE_TO_UNSIGNED(bits,d,clips) \
(uint##bits##_t)( \
sox_macro_temp_sample=(d), \
sox_macro_temp_sample>(sox_sample_t)(SOX_SAMPLE_MAX-(1U<<(31-bits)))? \
++(clips),SOX_UINT_MAX(bits): \
((uint32_t)(sox_macro_temp_sample^SOX_SAMPLE_NEG)+(1U<<(31-bits)))>>(32-bits))
#define SOX_SAMPLE_TO_SIGNED(bits,d,clips) \
(int##bits##_t)(SOX_SAMPLE_TO_UNSIGNED(bits,d,clips)^SOX_INT_MIN(bits))
#define SOX_SIGNED_TO_SAMPLE(bits,d)((sox_sample_t)(d)<<(32-bits))
#define SOX_UNSIGNED_TO_SAMPLE(bits,d)(SOX_SIGNED_TO_SAMPLE(bits,d)^SOX_SAMPLE_NEG)
#define SOX_UNSIGNED_8BIT_TO_SAMPLE(d,clips) SOX_UNSIGNED_TO_SAMPLE(8,d)
#define SOX_SIGNED_8BIT_TO_SAMPLE(d,clips) SOX_SIGNED_TO_SAMPLE(8,d)
#define SOX_UNSIGNED_16BIT_TO_SAMPLE(d,clips) SOX_UNSIGNED_TO_SAMPLE(16,d)
#define SOX_SIGNED_16BIT_TO_SAMPLE(d,clips) SOX_SIGNED_TO_SAMPLE(16,d)
#define SOX_UNSIGNED_24BIT_TO_SAMPLE(d,clips) SOX_UNSIGNED_TO_SAMPLE(24,d)
#define SOX_SIGNED_24BIT_TO_SAMPLE(d,clips) SOX_SIGNED_TO_SAMPLE(24,d)
#define SOX_UNSIGNED_32BIT_TO_SAMPLE(d,clips) ((sox_sample_t)(d)^SOX_SAMPLE_NEG)
#define SOX_SIGNED_32BIT_TO_SAMPLE(d,clips) (sox_sample_t)(d)
#define SOX_FLOAT_32BIT_TO_SAMPLE SOX_FLOAT_64BIT_TO_SAMPLE
#define SOX_FLOAT_64BIT_TO_SAMPLE(d,clips) (sox_macro_temp_double=(d),sox_macro_temp_double<-1?++(clips),(-SOX_SAMPLE_MAX):sox_macro_temp_double>1?++(clips),SOX_SAMPLE_MAX:(sox_sample_t)((uint32_t)((double)(sox_macro_temp_double)*SOX_SAMPLE_MAX+(SOX_SAMPLE_MAX+.5))-SOX_SAMPLE_MAX))
#define SOX_SAMPLE_TO_UNSIGNED_8BIT(d,clips) SOX_SAMPLE_TO_UNSIGNED(8,d,clips)
#define SOX_SAMPLE_TO_SIGNED_8BIT(d,clips) SOX_SAMPLE_TO_SIGNED(8,d,clips)
#define SOX_SAMPLE_TO_UNSIGNED_16BIT(d,clips) SOX_SAMPLE_TO_UNSIGNED(16,d,clips)
#define SOX_SAMPLE_TO_SIGNED_16BIT(d,clips) SOX_SAMPLE_TO_SIGNED(16,d,clips)
#define SOX_SAMPLE_TO_UNSIGNED_24BIT(d,clips) SOX_SAMPLE_TO_UNSIGNED(24,d,clips)
#define SOX_SAMPLE_TO_SIGNED_24BIT(d,clips) SOX_SAMPLE_TO_SIGNED(24,d,clips)
#define SOX_SAMPLE_TO_UNSIGNED_32BIT(d,clips) (uint32_t)((d)^SOX_SAMPLE_NEG)
#define SOX_SAMPLE_TO_SIGNED_32BIT(d,clips) (int32_t)(d)
#define SOX_SAMPLE_TO_FLOAT_32BIT SOX_SAMPLE_TO_FLOAT_64BIT
#define SOX_SAMPLE_TO_FLOAT_64BIT(d,clips) (sox_macro_temp_sample=(d),sox_macro_temp_sample==SOX_SAMPLE_MIN?++(clips),-1.0:((double)(sox_macro_temp_sample)*(1.0/SOX_SAMPLE_MAX)))
/* MACRO to clip a data type that is greater then sox_sample_t to
* sox_sample_t's limits and increment a counter if clipping occurs..
*/
#define SOX_SAMPLE_CLIP_COUNT(samp, clips) \
do { \
if (samp > SOX_SAMPLE_MAX) \
{ samp = SOX_SAMPLE_MAX; clips++; } \
else if (samp < SOX_SAMPLE_MIN) \
{ samp = SOX_SAMPLE_MIN; clips++; } \
} while (0)
/* Rvalue MACRO to round and clip a double to a sox_sample_t,
* and increment a counter if clipping occurs.
*/
#define SOX_ROUND_CLIP_COUNT(d, clips) \
((d) < 0? (d) <= SOX_SAMPLE_MIN - 0.5? ++(clips), SOX_SAMPLE_MIN: (d) - 0.5 \
: (d) >= SOX_SAMPLE_MAX + 0.5? ++(clips), SOX_SAMPLE_MAX: (d) + 0.5)
/* Rvalue MACRO to clip an integer to a given number of bits
* and increment a counter if clipping occurs.
*/
#define SOX_INTEGER_CLIP_COUNT(bits,i,clips) ( \
(i) >(1 << ((bits)-1))- 1? ++(clips),(1 << ((bits)-1))- 1 : \
(i) <-1 << ((bits)-1) ? ++(clips),-1 << ((bits)-1) : (i))
#define SOX_16BIT_CLIP_COUNT(i,clips) SOX_INTEGER_CLIP_COUNT(16,i,clips)
#define SOX_24BIT_CLIP_COUNT(i,clips) SOX_INTEGER_CLIP_COUNT(24,i,clips)
#include <stddef.h>
typedef size_t sox_size_t;
#define SOX_SIZE_MAX (sox_size_t)(-1)
typedef ptrdiff_t sox_ssize_t;
typedef void (*sox_output_message_handler_t)(unsigned level, const char *filename, const char *fmt, va_list ap);
typedef struct /* Global parameters (for effects & formats) */
{
/* public: */
unsigned verbosity;
sox_output_message_handler_t output_message_handler;
sox_bool repeatable;
/* The following is used at times in libSoX when alloc()ing buffers
* to perform file I/O. It can be useful to pass in similar sized
* data to get max performance.
*/
sox_size_t bufsiz;
/* private: */
char const * stdin_in_use_by;
char const * stdout_in_use_by;
char const * subsystem;
} sox_globals_t;
extern sox_globals_t sox_globals;
typedef double sox_rate_t;
typedef struct { /* Signal parameters; 0 if unknown */
sox_rate_t rate; /* sampling rate */
unsigned channels; /* number of sound channels */
unsigned precision; /* in bits */
} sox_signalinfo_t;
typedef enum {
SOX_ENCODING_UNKNOWN ,
SOX_ENCODING_SIGN2 , /* signed linear 2's comp: Mac */
SOX_ENCODING_UNSIGNED , /* unsigned linear: Sound Blaster */
SOX_ENCODING_FLOAT , /* floating point (binary format) */
SOX_ENCODING_FLOAT_TEXT, /* floating point (text format) */
SOX_ENCODING_FLAC , /* FLAC compression */
SOX_ENCODING_HCOM , /* */
SOX_ENCODING_WAVPACK , /* */
SOX_ENCODING_WAVPACKF , /* */
SOX_ENCODING_LOSSLESS , /* Lossless above, lossy below */
SOX_ENCODING_ULAW , /* u-law signed logs: US telephony, SPARC */
SOX_ENCODING_ALAW , /* A-law signed logs: non-US telephony */
SOX_ENCODING_G721 , /* G.721 4-bit ADPCM */
SOX_ENCODING_G723 , /* G.723 3 or 5 bit ADPCM */
SOX_ENCODING_CL_ADPCM , /* Creative Labs 8 --> 2,3,4 bit Compressed PCM */
SOX_ENCODING_CL_ADPCM16, /* Creative Labs 16 --> 4 bit Compressed PCM */
SOX_ENCODING_MS_ADPCM , /* Microsoft Compressed PCM */
SOX_ENCODING_IMA_ADPCM , /* IMA Compressed PCM */
SOX_ENCODING_OKI_ADPCM , /* Dialogic/OKI Compressed PCM */
SOX_ENCODING_GSM , /* GSM 6.10 33byte frame lossy compression */
SOX_ENCODING_MP3 , /* MP3 compression */
SOX_ENCODING_VORBIS , /* Vorbis compression */
SOX_ENCODING_AMR_WB , /* AMR-WB compression */
SOX_ENCODING_AMR_NB , /* AMR-NB compression */
SOX_ENCODING_CVSD , /* */
SOX_ENCODING_LPC10 , /* */
SOX_ENCODINGS /* End of list marker */
} sox_encoding_t;
extern const char * const sox_encodings_str[];
extern const char * const sox_encodings_short_str[];
typedef enum {SOX_OPTION_NO, SOX_OPTION_YES, SOX_OPTION_DEFAULT} sox_option_t;
typedef struct { /* Encoding parameters */
sox_encoding_t encoding; /* format of sample numbers */
unsigned bits_per_sample; /* 0 if unknown or variable; uncompressed value if lossless; compressed value if lossy */
double compression; /* compression factor (where applicable) */
/* If these 3 variables are set to DEFAULT, then, during
* sox_open_read or sox_open_write, libSoX will set them to either
* NO or YES according to the machine or format default. */
sox_option_t reverse_bytes; /* endiannesses... */
sox_option_t reverse_nibbles;
sox_option_t reverse_bits;
sox_bool opposite_endian;
} sox_encodinginfo_t;
void sox_init_encodinginfo(sox_encodinginfo_t * e);
unsigned sox_precision(sox_encoding_t encoding, unsigned pcm_size);
/* Defaults for common hardware */
#define SOX_DEFAULT_CHANNELS 2
#define SOX_DEFAULT_RATE 48000
#define SOX_DEFAULT_PRECISION 16
#define SOX_DEFAULT_ENCODING SOX_ENCODING_SIGN2
/* Loop parameters */
typedef struct {
sox_size_t start; /* first sample */
sox_size_t length; /* length */
unsigned int count; /* number of repeats, 0=forever */
unsigned char type; /* 0=no, 1=forward, 2=forward/back */
} sox_loopinfo_t;
/* Instrument parameters */
/* vague attempt at generic information for sampler-specific info */
typedef struct {
char MIDInote; /* for unity pitch playback */
char MIDIlow, MIDIhi;/* MIDI pitch-bend range */
char loopmode; /* semantics of loop data */
unsigned nloops; /* number of active loops (max SOX_MAX_NLOOPS) */
} sox_instrinfo_t;
/* Loop modes, upper 4 bits mask the loop blass, lower 4 bits describe */
/* the loop behaviour, ie. single shot, bidirectional etc. */
#define SOX_LOOP_NONE 0
#define SOX_LOOP_8 32 /* 8 loops: don't know ?? */
#define SOX_LOOP_SUSTAIN_DECAY 64 /* AIFF style: one sustain & one decay loop */
/*
* File buffer info. Holds info so that data can be read in blocks.
*/
typedef struct {
char *buf; /* Pointer to data buffer */
size_t size; /* Size of buffer */
size_t count; /* Count read in to buffer */
size_t pos; /* Position in buffer */
} sox_fileinfo_t;
/*
* Handler structure for each format.
*/
typedef struct sox_format sox_format_t;
typedef struct {
unsigned sox_lib_version_code; /* Checked on load; must be 1st in struct*/
char const * description;
char const * const * names;
unsigned int flags;
int (*startread)(sox_format_t * ft);
sox_size_t (*read)(sox_format_t * ft, sox_sample_t *buf, sox_size_t len);
int (*stopread)(sox_format_t * ft);
int (*startwrite)(sox_format_t * ft);
sox_size_t (*write)(sox_format_t * ft, const sox_sample_t *buf, sox_size_t len);
int (*stopwrite)(sox_format_t * ft);
int (*seek)(sox_format_t * ft, sox_size_t offset);
unsigned const * write_formats;
sox_rate_t const * write_rates;
} sox_format_handler_t;
/*
* Format information for input and output files.
*/
#define SOX_MAX_FILE_PRIVSIZE 1000
#define SOX_MAX_NLOOPS 8
typedef char * * sox_comments_t;
size_t sox_num_comments(sox_comments_t comments);
void sox_append_comment(sox_comments_t * comments, char const * comment);
void sox_append_comments(sox_comments_t * comments, char const * comment);
sox_comments_t sox_copy_comments(sox_comments_t comments);
void sox_delete_comments(sox_comments_t * comments);
char * sox_cat_comments(sox_comments_t comments);
char const * sox_find_comment(sox_comments_t comments, char const * id);
struct sox_format {
/* Placing priv at the start of this structure ensures that it gets aligned
* in memory in the optimal way for any structure to be cast over it. */
char priv[SOX_MAX_FILE_PRIVSIZE]; /* format's private data area */
sox_signalinfo_t signal; /* signal specifications */
sox_encodinginfo_t encoding; /* encoding specifications */
sox_instrinfo_t instr; /* instrument specification */
sox_loopinfo_t loops[SOX_MAX_NLOOPS];/* Looping specification */
sox_bool seekable; /* can seek on this file */
char mode; /* read or write mode */
sox_size_t length; /* samples * chans in file; 0 if unknown */
sox_size_t olength; /* samples * chans in file; 0 if unknown */
sox_size_t clips; /* increment if clipping occurs */
char *filename; /* file name */
char *filetype; /* type of file */
sox_comments_t comments; /* comment strings */
FILE *fp; /* File stream pointer */
int sox_errno; /* Failure error codes */
char sox_errstr[256]; /* Extend Failure text */
long tell;
long data_start;
sox_format_handler_t handler; /* format struct for this file */
};
/* File flags field */
#define SOX_FILE_NOSTDIO 0x0001 /* Does not use stdio routines */
#define SOX_FILE_DEVICE 0x0002 /* File is an audio device */
#define SOX_FILE_PHONY 0x0004 /* Phony file/device */
#define SOX_FILE_REWIND 0x0008 /* File should be rewound to write header */
#define SOX_FILE_BIT_REV 0x0010 /* Is file bit-reversed? */
#define SOX_FILE_NIB_REV 0x0020 /* Is file nibble-reversed? */
#define SOX_FILE_ENDIAN 0x0040 /* Is file format endian? */
#define SOX_FILE_ENDBIG 0x0080 /* If so, is it big endian? */
#define SOX_FILE_MONO 0x0100 /* Do channel restrictions allow mono? */
#define SOX_FILE_STEREO 0x0200 /* Do channel restrictions allow stereo? */
#define SOX_FILE_QUAD 0x0400 /* Do channel restrictions allow quad? */
#define SOX_FILE_CHANS (SOX_FILE_MONO | SOX_FILE_STEREO | SOX_FILE_QUAD)
#define SOX_FILE_LIT_END (SOX_FILE_ENDIAN | 0)
#define SOX_FILE_BIG_END (SOX_FILE_ENDIAN | SOX_FILE_ENDBIG)
int sox_format_init(void);
sox_format_t * sox_open_read(
char const * path,
sox_signalinfo_t const * signal,
sox_encodinginfo_t const * encoding,
char const * filetype);
sox_bool sox_format_supports_encoding(
char const * path,
char const * filetype,
sox_encodinginfo_t const * encoding);
sox_format_t * sox_open_write(
sox_bool (*overwrite_permitted)(const char *filename),
char const * path,
sox_signalinfo_t const * signal,
sox_encodinginfo_t const * encoding,
char const * filetype,
sox_comments_t comments,
sox_size_t length,
sox_instrinfo_t const * instr,
sox_loopinfo_t const * loops);
sox_size_t sox_read(sox_format_t * ft, sox_sample_t *buf, sox_size_t len);
sox_size_t sox_write(sox_format_t * ft, const sox_sample_t *buf, sox_size_t len);
int sox_close(sox_format_t * ft);
#define SOX_SEEK_SET 0
int sox_seek(sox_format_t * ft, sox_size_t offset, int whence);
sox_format_handler_t const * sox_find_format(char const * name, sox_bool no_dev);
int sox_gettype(sox_format_t *, sox_bool);
void sox_format_quit(void);
/*
* Structures for effects.
*/
#define SOX_MAX_EFFECTS 20
#define SOX_MAX_EFFECT_PRIVSIZE (2 * SOX_MAX_FILE_PRIVSIZE)
#define SOX_EFF_CHAN 1 /* Effect can alter # of channels */
#define SOX_EFF_RATE 2 /* Effect can alter sample rate */
#define SOX_EFF_PREC 4 /* Effect can alter sample precision */
#define SOX_EFF_LENGTH 8 /* Effect can alter audio length */
#define SOX_EFF_MCHAN 16 /* Effect can handle multi-channel */
#define SOX_EFF_NULL 32 /* Effect does nothing */
#define SOX_EFF_DEPRECATED 64 /* Effect is living on borrowed time */
typedef enum {sox_plot_off, sox_plot_octave, sox_plot_gnuplot} sox_plot_t;
typedef struct sox_effect sox_effect_t;
struct sox_effects_globals { /* Global parameters (for effects) */
sox_plot_t plot; /* To help the user choose effect & options */
double speed; /* Gather up all speed changes here, then resample */
sox_globals_t * global_info;
};
typedef struct sox_effects_globals sox_effects_globals_t;
extern sox_effects_globals_t sox_effects_globals;
typedef struct {
char const * name;
char const * usage;
unsigned int flags;
int (*getopts)(sox_effect_t * effp, int argc, char *argv[]);
int (*start)(sox_effect_t * effp);
int (*flow)(sox_effect_t * effp, const sox_sample_t *ibuf,
sox_sample_t *obuf, sox_size_t *isamp, sox_size_t *osamp);
int (*drain)(sox_effect_t * effp, sox_sample_t *obuf, sox_size_t *osamp);
int (*stop)(sox_effect_t * effp);
int (*kill)(sox_effect_t * effp);
} sox_effect_handler_t;
struct sox_effect {
/* Placing priv at the start of this structure ensures that it gets aligned
* in memory in the optimal way for any structure to be cast over it. */
char priv[SOX_MAX_EFFECT_PRIVSIZE]; /* private area for effect */
sox_effects_globals_t * global_info; /* global parameters */
sox_signalinfo_t in_signal;
sox_signalinfo_t out_signal;
sox_encodinginfo_t const * in_encoding;
sox_encodinginfo_t const * out_encoding;
sox_effect_handler_t handler;
sox_sample_t * obuf; /* output buffer */
sox_size_t obeg, oend; /* consumed, total length */
sox_size_t imin; /* minimum input buffer size */
sox_size_t clips; /* increment if clipping occurs */
sox_size_t flows; /* 1 if MCHAN, # chans otherwise */
sox_size_t flow; /* flow # */
};
sox_effect_handler_t const *sox_find_effect(char const * name);
void sox_create_effect(sox_effect_t * effp, sox_effect_handler_t const *e);
/* Effects chain */
typedef const sox_effect_handler_t *(*sox_effect_fn_t)(void);
extern sox_effect_fn_t sox_effect_fns[];
int sox_effect_set_imin(sox_effect_t * effp, sox_size_t imin);
struct sox_effects_chain {
sox_effect_t * effects[SOX_MAX_EFFECTS];
unsigned length;
sox_sample_t **ibufc, **obufc; /* Channel interleave buffers */
sox_effects_globals_t global_info;
sox_encodinginfo_t const * in_enc;
sox_encodinginfo_t const * out_enc;
};
typedef struct sox_effects_chain sox_effects_chain_t;
sox_effects_chain_t * sox_create_effects_chain(
sox_encodinginfo_t const * in_enc,
sox_encodinginfo_t const * out_enc);
int sox_add_effect( sox_effects_chain_t * chain, sox_effect_t * effp, sox_signalinfo_t * in, sox_signalinfo_t const * out);
int sox_flow_effects(sox_effects_chain_t *, int (* callback)(sox_bool all_done));
sox_size_t sox_effects_clips(sox_effects_chain_t *);
sox_size_t sox_stop_effect(sox_effects_chain_t *, sox_size_t e);
void sox_delete_effects(sox_effects_chain_t *);
/* The following routines are unique to the trim effect.
* sox_trim_get_start can be used to find what is the start
* of the trim operation as specified by the user.
* sox_trim_clear_start will reset what ever the user specified
* back to 0.
* These two can be used together to find out what the user
* wants to trim and use a sox_seek() operation instead. After
* sox_seek()'ing, you should set the trim option to 0.
*/
sox_size_t sox_trim_get_start(sox_effect_t * effp);
void sox_trim_clear_start(sox_effect_t * effp);
typedef int (* sox_playlist_callback_t)(void *, char *);
sox_bool sox_is_playlist(char const * filename);
int sox_parse_playlist(sox_playlist_callback_t callback, void * p, char const * const listname);
void sox_fail(const char *, ...) PRINTF;
void sox_warn(const char *, ...) PRINTF;
void sox_report(const char *, ...) PRINTF;
void sox_debug(const char *, ...) PRINTF;
void sox_debug_more(char const * fmt, ...) PRINTF;
void sox_debug_most(char const * fmt, ...) PRINTF;
#define sox_fail sox_globals.subsystem=__FILE__,sox_fail
#define sox_warn sox_globals.subsystem=__FILE__,sox_warn
#define sox_report sox_globals.subsystem=__FILE__,sox_report
#define sox_debug sox_globals.subsystem=__FILE__,sox_debug
#define sox_debug_more sox_globals.subsystem=__FILE__,sox_debug_more
#define sox_debug_most sox_globals.subsystem=__FILE__,sox_debug_most
void sox_output_message(FILE *file, const char *filename, const char *fmt, va_list ap);
typedef const sox_format_handler_t *(*sox_format_fn_t)(void);
typedef struct {
char *name;
sox_format_fn_t fn;
} sox_format_tab_t;
extern sox_format_tab_t sox_format_fns[];
#endif