Merged revisions 115884 via svnmerge from
[asterisk-bristuff.git] / utils / frame.h
bloba07c605ecb005febf2d45fa43ec18d0d8e621668
1 /****************************************************************************
3 * Programs for processing sound files in raw- or WAV-format.
4 * -- Useful functions for parsing command line options and
5 * issuing errors, warnings, and chit chat.
7 * Name: frame.h
8 * Version: see frame.c
9 * Author: Mark Roberts <mark@manumark.de>
11 ****************************************************************************/
12 /****************************************************************************
13 * These are useful functions that all DSP programs might find handy
14 ****************************************************************************/
16 /* fileswitch for parseargs:
18 The following are masks for several different ways of opening files.
19 --------------------------------------------------------------------
20 Bit 0: Open infile?
21 Bit 1: Open infile as binary (as opposed to text)
22 Bit 2: Open outfile?
23 Bit 3: Open outfile as binary (as opposed to text)
24 Bit 4: Do not complain about too many file arguments
25 Bit 5: Open one file for input AND output, binary.
27 #define INTEXT (1+0)
28 #define INBIN (1+2)
29 #define OUTTEXT (4)
30 #define OUTBIN (4+8)
31 #define NOFILES (0)
32 #define NOCOMPLAIN (16)
33 #define IOBIN (32)
35 #ifndef FALSE
36 #define FALSE (0==1)
37 #define TRUE (0==0)
38 #endif
40 extern int samplefrequency;
41 extern unsigned short samplewidth;
42 extern unsigned short channels;
43 extern int wavout; /* TRUE iff out file is .WAV file */
44 extern int iswav; /* TRUE iff in file was found to be a .WAV file */
45 extern FILE *in, *out;
46 extern char *infilename, *outfilename;
47 extern int verboselevel;
48 extern char *version; /* String to be issued as version string. Should
49 be set by application. */
50 extern char *usage; /* String to be issued as usage string. Should be
51 set by application. */
53 #define DEFAULTFREQ 44100
54 #define BUFFSIZE 50000 /* How many samples to read in one go (preferred) */
55 #define MINBUFFSIZE 5000 /* How many samples to read in one go (minimum) */
57 /*************************************************
58 * Types of errors handled by argerrornum() *
59 *************************************************/
60 typedef enum
62 ME_NOINT,
63 ME_NODOUBLE,
64 ME_NOTIME,
65 ME_NOVOL,
66 ME_NOSWITCH,
67 ME_TOOMANYFILES,
68 ME_HEADERONTEXTFILE,
69 ME_NOINFILE,
70 ME_NOOUTFILE,
71 ME_NOIOFILE,
72 ME_NOSTDIN,
73 ME_NOSTDOUT,
74 ME_NOSTDIO,
75 ME_NOTENOUGHFILES,
76 ME_THISCANTHAPPEN
77 } Errornum;
80 /* -----------------------------------------------------------------------
81 Create memory and copy 'string', returning a pointer to the copy.
82 NULL is returned if malloc fails.
83 -----------------------------------------------------------------------*/
84 extern char *malloccopy( char *string);
86 /* -----------------------------------------------------------------------
87 Start the stopwatch and make sure the user is informed at end of program.
88 -----------------------------------------------------------------------*/
89 extern void startstopwatch(void);
91 /* -----------------------------------------------------------------------
92 Writes the number of samples to result that are yet to be read from anyin.
93 I.e. the number of remaining bytes is divided by the number of bytes per
94 sample value, but not by the number of channels.
95 Return values are TRUE on success, FALSE on failure.
96 -----------------------------------------------------------------------*/
97 extern int getremainingfilelength( FILE *anyin, long *result);
99 /* -----------------------------------------------------------------------
100 Read a .pk-header from 'anyin' and printf the entries.
101 -----------------------------------------------------------------------*/
102 void readpkheader( FILE *anyin);
104 /* -----------------------------------------------------------------------
105 Read a .WAV header from 'anyin'.
106 If it is recognised, the data is used.
107 Otherwise, we assume it's PCM-data and ignore the header.
108 The global variable 'iswav' is set on success, otherwise cleared.
109 -----------------------------------------------------------------------*/
110 extern void readwavheader( FILE *anyin);
112 /* -----------------------------------------------------------------------
113 Write a .WAV header to 'out'.
114 The filepointer is placed at the end of 'out' before operation.
115 This should be called before any data is
116 written, and again, when ALL the data has been written.
117 First time, this positions the file pointer correctly; second time, the
118 missing data can be inserted that wasn't known the first time round.
119 -----------------------------------------------------------------------*/
120 extern void makewavheader( void);
122 /* --------------------------------------------------------------------
123 Tests the character 'coal' for being a command line option character,
124 momentarrily '/' or '-'.
125 -------------------------------------------------------------------- */
126 extern int isoptionchar (char coal);
128 /* -----------------------------------------------------------------------
129 Reads through the arguments on the lookout for an option starting
130 with 'string'. The rest of the option is read as a time and passed
131 to *result, where the result is meant to mean 'number of samples' in
132 that time.
133 On failure, *result is unchanged.
134 return value is TRUE on success, FALSE otherwise.
135 -----------------------------------------------------------------------*/
136 extern int parsetimearg( int argcount, char *args[], char *string,
137 int *result);
139 /* -----------------------------------------------------------------------
140 The string argument is read as a time and passed to *result, where
141 the result is meant to mean 'number of samples' in that time. On
142 failure, *result is unchanged.
143 return value is TRUE on success, FALSE otherwise.
144 -----------------------------------------------------------------------*/
145 int parsetime(char *string, int *result);
147 /* -----------------------------------------------------------------------
148 The string argument is read as a frequency and passed
149 to *result, where the result is meant to mean 'number of samples' in
150 one cycle of that frequency.
151 On failure, *result is unchanged.
152 return value is TRUE on success, FALSE otherwise.
153 -----------------------------------------------------------------------*/
154 int parsefreq(char *string, double *result);
156 /* --------------------------------------------------------------------
157 Reads through the arguments on the lookout for a switch -'string'.
158 return value is TRUE if one exists, FALSE otherwise.
159 If characters remain after the switch, a fatal error is issued.
160 -------------------------------------------------------------------- */
161 extern int parseswitcharg( int argcount, char *args[], char *string);
163 /* --------------------------------------------------------------------
164 Reads through the arguments on the lookout for an option starting
165 with 'string'. The rest of the option is read as an integer and
166 passed to &result.
167 On failure, &result is unchanged.
168 return value is TRUE on success, FALSE otherwise.
169 -------------------------------------------------------------------- */
170 extern int parseintarg( int argcount, char *args[], char *string,
171 int *result);
173 /* --------------------------------------------------------------------
174 Reads through the arguments on the lookout for a filename, i.e. anything
175 that does not start with the optionchar. The filename is copied to
176 newly allocated memory, a pointer to which is returned.
177 The argument is marked as used. Therefore repeated use of this function
178 will yield a complete list of filenames on the commandline.
179 If malloc() fails, the function does not return.
180 -------------------------------------------------------------------- */
181 extern char *parsefilearg( int argcount, char *args[]);
183 /* --------------------------------------------------------------------
184 Reads through the arguments on the lookout for an option starting
185 with 'string'. The rest of the option is read as a double and
186 passed to *result.
187 On failure, *result is unchanged.
188 return value is TRUE on success, FALSE otherwise.
189 -------------------------------------------------------------------- */
190 extern int parsedoublearg( int argcount, char *args[], char *string,
191 double *result);
193 /* --------------------------------------------------------------------
194 Reads through the arguments on the lookout for an option starting
195 with 'string'. The rest of the option is read as a volume, i.e.
196 absolute, percent or db. The result is passed to *result.
197 On failure, *result is unchanged.
198 -------------------------------------------------------------------- */
199 extern int parsevolarg( int argcount, char *args[], char *string,
200 double *result);
202 /* --------------------------------------------------------------------
203 Reads the specified string and interprets it as a volume. The string
204 would be of the form 1.8 or 180% or 5db.
205 On success, the return value is the relative volume, i.e. 1.8
206 On failure, -1 is returned.
207 -------------------------------------------------------------------- */
208 extern int parsevolume(char *s, double *result);
210 /* --------------------------------------------------------------------
211 Reads through the arguments on the lookout for a switch -'string'.
212 return value is TRUE if one exists, FALSE otherwise.
213 If characters remain after the switch, a fatal error is issued.
214 -------------------------------------------------------------------- */
215 extern int parseswitch( char *found, char *wanted);
217 /* --------------------------------------------------------------------
218 Reports an error due to parsing the string 's' encountered on the
219 command line.
220 -------------------------------------------------------------------- */
221 extern void argerror(char *s);
223 /* --------------------------------------------------------------------
224 Reports an error due to parsing the string 's' encountered on the
225 command line. 'code' indicates the type of error.
226 -------------------------------------------------------------------- */
227 extern void argerrornum(char *s, Errornum code);
229 /* --------------------------------------------------------------------
230 Reports an error due to parsing the string 's' encountered on the
231 command line. 'message' explains the type of error.
232 -------------------------------------------------------------------- */
233 extern void argerrortxt(char *s, char *message);
235 /* --------------------------------------------------------------------
236 Check for any remaining arguments and complain about their existence.
237 If arguments are found, this function does not return.
238 -------------------------------------------------------------------- */
239 extern void checknoargs( int argcount, char *args[]);
241 /* --------------------------------------------------------------------
242 Parses the command line arguments as represented by the function
243 arguments. Sets the global variables 'in', 'out', 'samplefrequency'
244 and 'samplewidth' accordingly.
245 According to 'fileswitch', in and out files are opened or not. See
246 above for an explanation of 'fileswitch'.
247 -------------------------------------------------------------------- */
248 extern void parseargs( int argcount, char *args[], int fileswitch);
250 /* --------------------------------------------------------------------
251 Returns the index 'i' of the first argument that IS an option, and
252 which begins with the label 's'. If there is none, -1.
253 We also mark that option as done with, i.e. we cross it out.
254 -------------------------------------------------------------------- */
255 extern int findoption( int argcount, char *args[], char *s);
257 /* --------------------------------------------------------------------
258 Finishes off the .WAV header (if any) and exits correctly and formerly.
259 -------------------------------------------------------------------- */
260 extern int myexit (int value);
262 /* --------------------------------------------------------------------
263 Reads the stated input file bufferwise, calls the function 'work'
264 with the proper values, and writes the result to the stated output file.
265 Return value: TRUE on success, FALSE otherwise.
266 -------------------------------------------------------------------- */
267 extern int workloop( FILE *theinfile, FILE *theoutfile,
268 int (*work)( short *buffer, int length) );
270 /* --------------------------------------------------------------------
271 Five functions for printing to stderr. Depending on the level of verbose,
272 output may be supressed. fatalerror() is like error() but does not return.
273 fatalperror() is like the standard function perror() but does not return.
274 -------------------------------------------------------------------- */
275 extern int chat( const char *format, ...);
276 extern int inform( const char *format, ...);
277 extern int error( const char *format, ...);
278 extern void fatalerror( const char *format, ...);
279 extern void fatalperror( const char *string);
281 /* --------------------------------------------------------------------
282 And one functions for printing to stdout.
283 -------------------------------------------------------------------- */
284 extern int say( const char *format, ...);
286 /* --------------------------------------------------------------------
287 Allocate memory for it and return a pointer to a string made up of
288 the two argument strings.
289 -------------------------------------------------------------------- */
290 extern char *mallocconcat( char *one, char *two);
292 /* --------------------------------------------------------------------
293 Convert a sample value to decibel.
294 -------------------------------------------------------------------- */
295 extern double double2db( double value);
297 /* --------------------------------------------------------------------
298 Read 'size' samples from file 'in' and lose them.
299 -------------------------------------------------------------------- */
300 extern void readawaysamples( FILE *in, size_t size);