wav: drop redundant zero initialisations
[sox.git] / libsox.3
blob4cd550d9afa762b44c899a0a09da8cf8f4c16b2a
1 '\" t
2 '\" The line above instructs most `man' programs to invoke tbl
3 '\"
4 '\" Separate paragraphs; not the same as PP which resets indent level.
5 .de SP
6 .if t .sp .5
7 .if n .sp
8 ..
9 '\"
10 '\" Replacement em-dash for nroff (default is too short).
11 .ie n .ds m " - 
12 .el .ds m \(em
13 '\"
14 '\" Placeholder macro for if longer nroff arrow is needed.
15 .ds RA \(->
16 '\"
17 '\" Decimal point set slightly raised
18 .if t .ds d \v'-.15m'.\v'+.15m'
19 .if n .ds d .
20 '\"
21 '\" Enclosure macro for examples
22 .de EX
23 .SP
24 .nf
25 .ft CW
27 .de EE
28 .ft R
29 .SP
30 .fi
32 .TH SoX 3 "February 19, 2011" "libsox" "Sound eXchange"
33 .SH NAME
34 libsox \- SoX, an audio file-format and effect library
35 .SH SYNOPSIS
36 .nf
37 .B #include <sox.h>
39 .B int sox_format_init(void);
41 .B void sox_format_quit(void);
43 .B sox_format_t sox_open_read(const char *\fIpath\fB, const sox_signalinfo_t *\fIinfo\fB, const char *\fIfiletype\fB);
45 .B sox_format_t sox_open_write(sox_bool (*\fIoverwrite_permitted\fB)(const char *\fIfilename\fB), const char *\fIpath\fB, const sox_signalinfo_t *\fIinfo\fB, const char *\fIfiletype\fB, const char *\fIcomment\fB, sox_size_t \fIlength\fB, const sox_instrinfo_t *\fIinstr\fB, const sox_loopinfo_t *\fIloops\fB);
47 .B sox_size_t sox_read(sox_format_t \fIft\fB, sox_ssample_t *\fIbuf\fB, sox_size_t \fIlen\fB);
49 .B sox_size_t sox_write(sox_format_t \fIft\fB, sox_ssample_t *\fIbuf\fB, sox_size_t \fIlen\fB);
51 .B int sox_close(sox_format_t \fIft\fB);
53 .B int sox_seek(sox_format_t \fIft\fB, sox_size_t \fIoffset\fB, int \fIwhence\fB);
55 .B sox_effect_handler_t const *sox_find_effect(char const *\fIname\fB);
57 .B sox_effect_t *sox_create_effect(sox_effect_handler_t const *\fIeh\fB);
59 .B int sox_effect_options(sox_effect_t *\fIeffp\fB, int \fIargc\fB, char * const \fIargv[]\fB);
61 .B sox_effects_chain_t *sox_create_effects_chain(sox_encodinginfo_t const *\fIin_enc\fB, sox_encodinginfo_t const *\fIout_enc\fB);
63 .B void sox_delete_effects_chain(sox_effects_chain_t *\fIecp\fB);
65 .B int sox_add_effect(sox_effects_chaint_t *\fIchain\fB, sox_effect_t*\fIeffp\fB, sox_signalinfo_t *\fIin\fB, sox_signalinfo_t const *\fIout\fB);
67 .B cc \fIfile.c\fB -o \fIfile \fB-lsox
68 .fi
69 .SH DESCRIPTION
70 .I libsox
71 is a library of sound sample file format readers/writers and sound
72 effects processors. It is mainly developed for use by SoX but is
73 useful for any sound application.
75 \fBsox_format_init\fR function performs some required initialization
76 related to all file format handlers.  If compiled with dynamic
77 library support then this will detect and initialize all external
78 libraries.  This should be called before any other file operations
79 are performed.
81 \fBsox_format_quit\fR function performs some required cleanup
82 related to all file format handlers.
84 \fBsox_open_read\fR function opens the file for reading whose name is
85 the string pointed to by \fIpath\fR and associates an sox_format_t with it. If
86 \fIinfo\fR is non-NULL then it will be used to specify the data format
87 of the input file. This is normally only needed for headerless audio
88 files since the information is not stored in the file. If
89 \fIfiletype\fR is non-NULL then it will be used to specify the file
90 type. If this is not specified then the file type is attempted to be
91 derived by looking at the file header and/or the filename extension. A
92 special name of "-" can be used to read data from stdin.
94 \fBsox_open_write\fR function opens the file for writing whose name is
95 the string pointed to by \fIpath\fR and associates an sox_format_t with it. If
96 \fIinfo\fR is non-NULL then it will be used to specify the data format
97 of the output file. Since most file formats can write data in
98 different data formats, this generally has to be specified. The info
99 structure from the input format handler can be specified to copy data
100 over in the same format. If \fIcomment\fR is non-NULL, it will be
101 written in the file header for formats that support comments. If
102 \fIfiletype\fR is non-NULL then it will be used to specify the file
103 type. If this is not specified then the file type is attempted to be
104 derived by looking at the filename extension. A special name of "-"
105 can be used to write data to stdout.
107 The function \fBsox_read\fR reads \fIlen\fR samples in to \fIbuf\fR
108 using the format handler specified by \fIft\fR. All data read is
109 converted to 32-bit signed samples before being placed in to
110 \fIbuf\fR. The value of \fIlen\fR is specified in total samples. If
111 its value is not evenly divisable by the number of channels, undefined
112 behavior will occur.
114 The function \fBsox_write\fR writes \fIlen\fR samples from \fIbuf\fR
115 using the format handler specified by \fIft\fR. Data in \fIbuf\fR must
116 be 32-bit signed samples and will be converted during the write
117 process. The value of \fIlen\fR is specified in total samples. If its
118 value is not evenly divisable by the number of channels, undefined
119 behavior will occur.
121 The \fBsox_close\fR function dissociates the named \fIsox_format_t\fR from its
122 underlying file or set of functions. If the format handler was being
123 used for output, any buffered data is written first.
125 The function \fBsox_find_effect\fR finds effect \fIname\fR, returning
126 a pointer to its \fIsox_effect_handler_t\fR if it exists, and NULL
127 otherwise.
129 The function \fBsox_create_effect\fR instantiates an effect into a
130 \fIsox_effect_t\fR given a \fIsox_effect_handler_t *\fR. Any missing
131 methods are automatically set to the corresponding \fBnothing\fR
132 method.
134 The function \fBsox_effect_options\fR allows passing options into the effect to control its behavior.  It will return SOX_EOF if there were any invalid options passed in.  On success, the \fIeffp->in_signal\fR will optional contain the rate and channel count it requires input data from and \fIeffp->out_signal\fR will optionally contain the rate and channel count it outputs in.  When present, this information should be used to make sure appropriate effects are placed in the effects chain to handle any needed conversions.
136 Passing in options is currently only supported when they are passed in before the effect is ever started.  The behavior is undefined if its called once the effect is started.
138 \fBsox_create_effects_chain\fR will instantiate an effects chain that
139 effects can be added to.  \fIin_enc\fR and \fIout_enc\fR are the 
140 signal encoding of the input and output of the chain respectively.
141 The pointers to \fIin_enc\fR and \fIout_enc\fR
142 are stored internally and so their memory should not be freed.  Also,
143 it is OK if their values change over time to reflect new input or
144 output encodings as they are referenced only as effects
145 start up or are restarted.
147 \fBsox_delete_effects_chain\fR will release any resources reserved during
148 the creation of the chain.  This will also call \fBsox_delete_effects\fR
149 if any effects are still in the chain.
151 \fBsox_add_effect\fR adds an effect to the chain.  \fIin\fR specifies the input
152 signal info for this effect.  \fIout\fR is a suggestion
153 as to what the output signal should be but depending on the effects
154 given options and on \fIin\fR the effect can choose to do differently.
155 Whatever output rate and channels the effect does produce are written
156 back to \fIin\fR.  It is meant that \fIin\fR be stored and passed to each
157 new call to \fBsox_add_effect\fR so that changes will be propagated to each new effect.
159 SoX includes skeleton C files to assist you in writing new
160 formats (skelform.c) and effects (skeleff.c). Note that new formats 
161 can often just deal with the header and then use raw.c's routines 
162 for reading and writing.
164 example0.c and example1.c are a good starting point to see how
165 to write applications using libsox.  sox.c itself is also a good
166 reference.
168 .SH RETURN VALUE
169 Upon successful completion \fBsox_open_read\fR and
170 \fBsox_open_write\fR return an \fIsox_format_t\fR (which is a pointer).
171 Otherwise, NULL is returned. TODO: Need a way to return reason for
172 failures. Currently, relies on \fBsox_warn\fR to print information.
174 \fBsox_read\fR and \fBsox_write\fR return the number of samples
175 successfully read or written. If an error occurs, or the end-of-file
176 is reached, the return value is a short item count or SOX_EOF. TODO:
177 \fBsox_read\fR does not distiguish between end-of-file and error. Need
178 an feof() and ferror() concept to determine which occurred.
180 Upon successful completion \fBsox_close\fR returns 0. Otherwise, SOX_EOF
181 is returned. In either case, any further access (including another
182 call to \fBsox_close\fR()) to the handler results in undefined
183 behavior. TODO: Need a way to return reason for failures. Currently,
184 relies on sox_warn to print information.
186 Upon successful completion \fBsox_seek\fR returns 0. Otherwise, SOX_EOF
187 is returned. TODO Need to set a global error and implement sox_tell.
188 .SH ERRORS
189 TODO
190 .SH INTERNALS
191 SoX's formats and effects operate with an internal sample format of
192 signed 32-bit integer.  The data processing routines are called with
193 buffers of these samples, and buffer sizes which refer to the number
194 of samples processed, not the number of bytes.  File readers translate
195 the input samples to signed 32-bit integers and return the number of
196 samples read.  For example, data in linear signed byte format is
197 left-shifted 24 bits.
199 Representing samples as integers can cause problems when processing the audio.  
200 For example, if an effect to
201 mix down left and right channels into one monophonic channel
202 were to use the line
204    *obuf++ = (*ibuf++ + *ibuf++)/2;
206 distortion might occur since
207 the intermediate addition can overflow 32 bits.
208 The line
210    *obuf++ = *ibuf++/2 + *ibuf++/2;
212 would get round the overflow problem (at the expense of the least significant
213 bit).
215 Stereo data is stored with the left and right speaker data in
216 successive samples.
217 Quadraphonic data is stored in this order: 
218 left front, right front, left rear, right rear.
219 .SH FORMATS
221 .I format 
222 is responsible for translating between sound sample files
223 and an internal buffer.  The internal buffer is store in signed longs
224 with a fixed sampling rate.  The 
225 .I format
226 operates from two data structures:
227 a format structure, and a private structure.
229 The format structure contains a list of control parameters for
230 the sample: sampling rate, data size (8, 16, or 32 bits),
231 encoding (unsigned, signed, floating point, etc.), number of sound channels.
232 It also contains other state information: whether the sample file
233 needs to be byte-swapped, whether sox_seek() will work, its suffix,
234 its file stream pointer, its 
235 .I format
236 pointer, and the 
237 .I private
238 structure for the 
239 .I format .
241 The 
242 .I private 
243 area is just a preallocated data array for the 
244 .I format
245 to use however it wishes.  
246 It should have a defined data structure
247 and cast the array to that structure.  
248 See voc.c for the use of a private data area.  
249 Voc.c has to track the number of samples it 
250 writes and when finishing, seek back to the beginning of the file
251 and write it out.
252 The private area is not very large.
253 The ``echo'' effect has to malloc() a much larger area for its
254 delay line buffers.
257 .I format
258 has 6 routines:
259 .TP 20
260 startread
261 Set up the format parameters, or read in
262 a data header, or do what needs to be done.
263 .TP 20
264 read
265 Given a buffer and a length: 
266 read up to that many samples, 
267 transform them into signed long integers,
268 and copy them into the buffer.
269 Return the number of samples actually read.
270 .TP 20
271 stopread
272 Do what needs to be done.
273 .TP 20
274 startwrite
275 Set up the format parameters, or write out 
276 a data header, or do what needs to be done.
277 .TP 20
278 write
279 Given a buffer and a length: 
280 copy that many samples out of the buffer,
281 convert them from signed longs to the appropriate
282 data, and write them to the file.
283 If it can't write out all the samples,
284 fail.
285 .TP 20
286 stopwrite
287 Fix up any file header, or do what needs to be done.
288 .SH EFFECTS
289 Each effect runs with one input and one output stream.
290 An effect's implementation comprises six functions that may be called
291 to the follow flow diagram:
293 LOOP (invocations with different parameters)
294   getopts
295   LOOP (invocations with the same parameters)
296     LOOP (channels)
297       start
298     LOOP (whilst there is input audio to process)
299       LOOP (channels)
300         flow
301     LOOP (whilst there is output audio to generate)
302       LOOP (channels)
303         drain
304     LOOP (channels)
305       stop
306   kill
308 Notes: For some effects, some of the functions may not be needed and can
309 be NULL.  An effect that is marked `MCHAN' does not use the LOOP
310 (channels) lines and must therefore perform multiple channel processing
311 inside the affected functions.  Multiple effect instances may be
312 processed (according to the above flow diagram) in parallel.
313 .TP 20
314 getopts
315 is called with a character string argument list for the effect.
316 .TP 20
317 start
318 is called with the signal parameters for the input and output
319 streams.
320 .TP 20 
321 flow
322 is called with input and output data buffers,
323 and (by reference) the input and output data buffer sizes.
324 It processes the input buffer into the output buffer,
325 and sets the size variables to the numbers of samples
326 actually processed.
327 It is under no obligation to read from the input buffer or
328 write to the output buffer during the same call.  If the
329 call returns SOX_EOF then this should be used as an indication
330 that this effect will no longer read any data and can be used
331 to switch to drain mode sooner.
332 .TP 20 
333 drain
334 is called after there are no more input data samples.
335 If the effect wishes to generate more data samples
336 it copies the generated data into a given buffer
337 and returns the number of samples generated.
338 If it fills the buffer, it will be called again, etc.
339 The echo effect uses this to fade away.
340 .TP 20
341 stop
342 is called when there are no more input samples and no more output
343 samples to process.
344 It is typically used to release or close resources (e.g. allocated
345 memory or temporary files) that were set-up in
346 .IR start .
347 See echo.c for an example.
348 .TP 20
349 kill
350 is called to allow resources allocated by
351 .I getopts
352 to be released.
353 See pad.c for an example.
354 .SH LINKING
355 The method of linking against libsox depends on how SoX was
356 built on your system. For a static build, just link against the
357 libraries as normal. For a dynamic build, you should use libtool to
358 link with the correct linker flags. See the libtool manual for
359 details; basically, you use it as:
361    libtool \-\-mode=link gcc \-o prog /path/to/libsox.la
363 .SH BUGS
364 This manual page is both incomplete and out of date.
365 .SH SEE ALSO
366 .BR sox (1),
367 .BR soxformat (7)
369 example*.c in the SoX source distribution.
370 .SH LICENSE
371 Copyright 1998\-2011 by Chris Bagwell and SoX Contributors.
373 Copyright 1991 Lance Norskog and Sundry Contributors.
375 This library is free software; you can redistribute it and/or modify
376 it under the terms of the GNU Lesser General Public License as published by
377 the Free Software Foundation; either version 2.1, or (at your option)
378 any later version.
380 This library is distributed in the hope that it will be useful,
381 but WITHOUT ANY WARRANTY; without even the implied warranty of
382 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
383 GNU Lesser General Public License for more details.
384 .SH AUTHORS
385 Chris Bagwell (cbagwell@users.sourceforge.net).
386 Other authors and contributors are listed in the ChangeLog file that
387 is distributed with the source code.