123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- /****************************************************************************
- *
- * Programs for processing sound files in raw- or WAV-format.
- * -- Useful functions for parsing command line options and
- * issuing errors, warnings, and chit chat.
- *
- * Name: frame.h
- * Version: see frame.c
- * Author: Mark Roberts <mark@manumark.de>
- *
- ****************************************************************************/
- /****************************************************************************
- * These are useful functions that all DSP programs might find handy
- ****************************************************************************/
- /* fileswitch for parseargs:
- The following are masks for several different ways of opening files.
- --------------------------------------------------------------------
- Bit 0: Open infile?
- Bit 1: Open infile as binary (as opposed to text)
- Bit 2: Open outfile?
- Bit 3: Open outfile as binary (as opposed to text)
- Bit 4: Do not complain about too many file arguments
- Bit 5: Open one file for input AND output, binary.
- */
- #define INTEXT (1+0)
- #define INBIN (1+2)
- #define OUTTEXT (4)
- #define OUTBIN (4+8)
- #define NOFILES (0)
- #define NOCOMPLAIN (16)
- #define IOBIN (32)
- #ifndef FALSE
- #define FALSE (0==1)
- #define TRUE (0==0)
- #endif
- extern int samplefrequency;
- extern unsigned short samplewidth;
- extern unsigned short channels;
- extern int wavout; /* TRUE iff out file is .WAV file */
- extern int iswav; /* TRUE iff in file was found to be a .WAV file */
- extern FILE *in, *out;
- extern char *infilename, *outfilename;
- extern int verboselevel;
- extern char *version; /* String to be issued as version string. Should
- be set by application. */
- extern char *usage; /* String to be issued as usage string. Should be
- set by application. */
- #define DEFAULTFREQ 44100
- #define BUFFSIZE 50000 /* How many samples to read in one go (preferred) */
- #define MINBUFFSIZE 5000 /* How many samples to read in one go (minimum) */
- /*************************************************
- * Types of errors handled by argerrornum() *
- *************************************************/
- typedef enum
- {
- ME_NOINT,
- ME_NODOUBLE,
- ME_NOTIME,
- ME_NOVOL,
- ME_NOSWITCH,
- ME_TOOMANYFILES,
- ME_HEADERONTEXTFILE,
- ME_NOINFILE,
- ME_NOOUTFILE,
- ME_NOIOFILE,
- ME_NOSTDIN,
- ME_NOSTDOUT,
- ME_NOSTDIO,
- ME_NOTENOUGHFILES,
- ME_THISCANTHAPPEN
- } Errornum;
- /* -----------------------------------------------------------------------
- Create memory and copy 'string', returning a pointer to the copy.
- NULL is returned if malloc fails.
- -----------------------------------------------------------------------*/
- extern char *malloccopy( char *string);
- /* -----------------------------------------------------------------------
- Start the stopwatch and make sure the user is informed at end of program.
- -----------------------------------------------------------------------*/
- extern void startstopwatch(void);
- /* -----------------------------------------------------------------------
- Writes the number of samples to result that are yet to be read from anyin.
- I.e. the number of remaining bytes is divided by the number of bytes per
- sample value, but not by the number of channels.
- Return values are TRUE on success, FALSE on failure.
- -----------------------------------------------------------------------*/
- extern int getremainingfilelength( FILE *anyin, long *result);
- /* -----------------------------------------------------------------------
- Read a .pk-header from 'anyin' and printf the entries.
- -----------------------------------------------------------------------*/
- void readpkheader( FILE *anyin);
- /* -----------------------------------------------------------------------
- Read a .WAV header from 'anyin'.
- If it is recognised, the data is used.
- Otherwise, we assume it's PCM-data and ignore the header.
- The global variable 'iswav' is set on success, otherwise cleared.
- -----------------------------------------------------------------------*/
- extern void readwavheader( FILE *anyin);
- /* -----------------------------------------------------------------------
- Write a .WAV header to 'out'.
- The filepointer is placed at the end of 'out' before operation.
- This should be called before any data is
- written, and again, when ALL the data has been written.
- First time, this positions the file pointer correctly; second time, the
- missing data can be inserted that wasn't known the first time round.
- -----------------------------------------------------------------------*/
- extern void makewavheader( void);
- /* --------------------------------------------------------------------
- Tests the character 'coal' for being a command line option character,
- momentarrily '/' or '-'.
- -------------------------------------------------------------------- */
- extern int isoptionchar (char coal);
- /* -----------------------------------------------------------------------
- Reads through the arguments on the lookout for an option starting
- with 'string'. The rest of the option is read as a time and passed
- to *result, where the result is meant to mean 'number of samples' in
- that time.
- On failure, *result is unchanged.
- return value is TRUE on success, FALSE otherwise.
- -----------------------------------------------------------------------*/
- extern int parsetimearg( int argcount, char *args[], char *string,
- int *result);
- /* -----------------------------------------------------------------------
- The string argument is read as a time and passed to *result, where
- the result is meant to mean 'number of samples' in that time. On
- failure, *result is unchanged.
- return value is TRUE on success, FALSE otherwise.
- -----------------------------------------------------------------------*/
- int parsetime(char *string, int *result);
- /* -----------------------------------------------------------------------
- The string argument is read as a frequency and passed
- to *result, where the result is meant to mean 'number of samples' in
- one cycle of that frequency.
- On failure, *result is unchanged.
- return value is TRUE on success, FALSE otherwise.
- -----------------------------------------------------------------------*/
- int parsefreq(char *string, double *result);
- /* --------------------------------------------------------------------
- Reads through the arguments on the lookout for a switch -'string'.
- return value is TRUE if one exists, FALSE otherwise.
- If characters remain after the switch, a fatal error is issued.
- -------------------------------------------------------------------- */
- extern int parseswitcharg( int argcount, char *args[], char *string);
- /* --------------------------------------------------------------------
- Reads through the arguments on the lookout for an option starting
- with 'string'. The rest of the option is read as an integer and
- passed to &result.
- On failure, &result is unchanged.
- return value is TRUE on success, FALSE otherwise.
- -------------------------------------------------------------------- */
- extern int parseintarg( int argcount, char *args[], char *string,
- int *result);
- /* --------------------------------------------------------------------
- Reads through the arguments on the lookout for a filename, i.e. anything
- that does not start with the optionchar. The filename is copied to
- newly allocated memory, a pointer to which is returned.
- The argument is marked as used. Therefore repeated use of this function
- will yield a complete list of filenames on the commandline.
- If malloc() fails, the function does not return.
- -------------------------------------------------------------------- */
- extern char *parsefilearg( int argcount, char *args[]);
- /* --------------------------------------------------------------------
- Reads through the arguments on the lookout for an option starting
- with 'string'. The rest of the option is read as a double and
- passed to *result.
- On failure, *result is unchanged.
- return value is TRUE on success, FALSE otherwise.
- -------------------------------------------------------------------- */
- extern int parsedoublearg( int argcount, char *args[], char *string,
- double *result);
- /* --------------------------------------------------------------------
- Reads through the arguments on the lookout for an option starting
- with 'string'. The rest of the option is read as a volume, i.e.
- absolute, percent or db. The result is passed to *result.
- On failure, *result is unchanged.
- -------------------------------------------------------------------- */
- extern int parsevolarg( int argcount, char *args[], char *string,
- double *result);
- /* --------------------------------------------------------------------
- Reads the specified string and interprets it as a volume. The string
- would be of the form 1.8 or 180% or 5db.
- On success, the return value is the relative volume, i.e. 1.8
- On failure, -1 is returned.
- -------------------------------------------------------------------- */
- extern int parsevolume(char *s, double *result);
- /* --------------------------------------------------------------------
- Reads through the arguments on the lookout for a switch -'string'.
- return value is TRUE if one exists, FALSE otherwise.
- If characters remain after the switch, a fatal error is issued.
- -------------------------------------------------------------------- */
- extern int parseswitch( char *found, char *wanted);
- /* --------------------------------------------------------------------
- Reports an error due to parsing the string 's' encountered on the
- command line.
- -------------------------------------------------------------------- */
- extern void argerror(char *s);
- /* --------------------------------------------------------------------
- Reports an error due to parsing the string 's' encountered on the
- command line. 'code' indicates the type of error.
- -------------------------------------------------------------------- */
- extern void argerrornum(char *s, Errornum code);
- /* --------------------------------------------------------------------
- Reports an error due to parsing the string 's' encountered on the
- command line. 'message' explains the type of error.
- -------------------------------------------------------------------- */
- extern void argerrortxt(char *s, char *message);
- /* --------------------------------------------------------------------
- Check for any remaining arguments and complain about their existence.
- If arguments are found, this function does not return.
- -------------------------------------------------------------------- */
- extern void checknoargs( int argcount, char *args[]);
- /* --------------------------------------------------------------------
- Parses the command line arguments as represented by the function
- arguments. Sets the global variables 'in', 'out', 'samplefrequency'
- and 'samplewidth' accordingly.
- According to 'fileswitch', in and out files are opened or not. See
- above for an explanation of 'fileswitch'.
- -------------------------------------------------------------------- */
- extern void parseargs( int argcount, char *args[], int fileswitch);
- /* --------------------------------------------------------------------
- Returns the index 'i' of the first argument that IS an option, and
- which begins with the label 's'. If there is none, -1.
- We also mark that option as done with, i.e. we cross it out.
- -------------------------------------------------------------------- */
- extern int findoption( int argcount, char *args[], char *s);
- /* --------------------------------------------------------------------
- Finishes off the .WAV header (if any) and exits correctly and formerly.
- -------------------------------------------------------------------- */
- extern int myexit (int value);
- /* --------------------------------------------------------------------
- Reads the stated input file bufferwise, calls the function 'work'
- with the proper values, and writes the result to the stated output file.
- Return value: TRUE on success, FALSE otherwise.
- -------------------------------------------------------------------- */
- extern int workloop( FILE *theinfile, FILE *theoutfile,
- int (*work)( short *buffer, int length) );
- /* --------------------------------------------------------------------
- Five functions for printing to stderr. Depending on the level of verbose,
- output may be supressed. fatalerror() is like error() but does not return.
- fatalperror() is like the standard function perror() but does not return.
- -------------------------------------------------------------------- */
- extern int chat( const char *format, ...);
- extern int inform( const char *format, ...);
- extern int error( const char *format, ...);
- extern void fatalerror( const char *format, ...);
- extern void fatalperror( const char *string);
- /* --------------------------------------------------------------------
- And one functions for printing to stdout.
- -------------------------------------------------------------------- */
- extern int say( const char *format, ...);
- /* --------------------------------------------------------------------
- Allocate memory for it and return a pointer to a string made up of
- the two argument strings.
- -------------------------------------------------------------------- */
- extern char *mallocconcat( char *one, char *two);
- /* --------------------------------------------------------------------
- Convert a sample value to decibel.
- -------------------------------------------------------------------- */
- extern double double2db( double value);
- /* --------------------------------------------------------------------
- Read 'size' samples from file 'in' and lose them.
- -------------------------------------------------------------------- */
- extern void readawaysamples( FILE *in, size_t size);
|