annotate osx/include/FLAC/all.h @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents cc5d363db385
children
rev   line source
Chris@2 1 /* libFLAC - Free Lossless Audio Codec library
Chris@2 2 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson
Chris@2 3 *
Chris@2 4 * Redistribution and use in source and binary forms, with or without
Chris@2 5 * modification, are permitted provided that the following conditions
Chris@2 6 * are met:
Chris@2 7 *
Chris@2 8 * - Redistributions of source code must retain the above copyright
Chris@2 9 * notice, this list of conditions and the following disclaimer.
Chris@2 10 *
Chris@2 11 * - Redistributions in binary form must reproduce the above copyright
Chris@2 12 * notice, this list of conditions and the following disclaimer in the
Chris@2 13 * documentation and/or other materials provided with the distribution.
Chris@2 14 *
Chris@2 15 * - Neither the name of the Xiph.org Foundation nor the names of its
Chris@2 16 * contributors may be used to endorse or promote products derived from
Chris@2 17 * this software without specific prior written permission.
Chris@2 18 *
Chris@2 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Chris@2 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Chris@2 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Chris@2 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
Chris@2 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
Chris@2 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
Chris@2 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
Chris@2 26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Chris@2 27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Chris@2 28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Chris@2 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Chris@2 30 */
Chris@2 31
Chris@2 32 #ifndef FLAC__ALL_H
Chris@2 33 #define FLAC__ALL_H
Chris@2 34
Chris@2 35 #include "export.h"
Chris@2 36
Chris@2 37 #include "assert.h"
Chris@2 38 #include "callback.h"
Chris@2 39 #include "format.h"
Chris@2 40 #include "metadata.h"
Chris@2 41 #include "ordinals.h"
Chris@2 42 #include "stream_decoder.h"
Chris@2 43 #include "stream_encoder.h"
Chris@2 44
Chris@2 45 /** \mainpage
Chris@2 46 *
Chris@2 47 * \section intro Introduction
Chris@2 48 *
Chris@2 49 * This is the documentation for the FLAC C and C++ APIs. It is
Chris@2 50 * highly interconnected; this introduction should give you a top
Chris@2 51 * level idea of the structure and how to find the information you
Chris@2 52 * need. As a prerequisite you should have at least a basic
Chris@2 53 * knowledge of the FLAC format, documented
Chris@2 54 * <A HREF="../format.html">here</A>.
Chris@2 55 *
Chris@2 56 * \section c_api FLAC C API
Chris@2 57 *
Chris@2 58 * The FLAC C API is the interface to libFLAC, a set of structures
Chris@2 59 * describing the components of FLAC streams, and functions for
Chris@2 60 * encoding and decoding streams, as well as manipulating FLAC
Chris@2 61 * metadata in files. The public include files will be installed
Chris@2 62 * in your include area (for example /usr/include/FLAC/...).
Chris@2 63 *
Chris@2 64 * By writing a little code and linking against libFLAC, it is
Chris@2 65 * relatively easy to add FLAC support to another program. The
Chris@2 66 * library is licensed under <A HREF="../license.html">Xiph's BSD license</A>.
Chris@2 67 * Complete source code of libFLAC as well as the command-line
Chris@2 68 * encoder and plugins is available and is a useful source of
Chris@2 69 * examples.
Chris@2 70 *
Chris@2 71 * Aside from encoders and decoders, libFLAC provides a powerful
Chris@2 72 * metadata interface for manipulating metadata in FLAC files. It
Chris@2 73 * allows the user to add, delete, and modify FLAC metadata blocks
Chris@2 74 * and it can automatically take advantage of PADDING blocks to avoid
Chris@2 75 * rewriting the entire FLAC file when changing the size of the
Chris@2 76 * metadata.
Chris@2 77 *
Chris@2 78 * libFLAC usually only requires the standard C library and C math
Chris@2 79 * library. In particular, threading is not used so there is no
Chris@2 80 * dependency on a thread library. However, libFLAC does not use
Chris@2 81 * global variables and should be thread-safe.
Chris@2 82 *
Chris@2 83 * libFLAC also supports encoding to and decoding from Ogg FLAC.
Chris@2 84 * However the metadata editing interfaces currently have limited
Chris@2 85 * read-only support for Ogg FLAC files.
Chris@2 86 *
Chris@2 87 * \section cpp_api FLAC C++ API
Chris@2 88 *
Chris@2 89 * The FLAC C++ API is a set of classes that encapsulate the
Chris@2 90 * structures and functions in libFLAC. They provide slightly more
Chris@2 91 * functionality with respect to metadata but are otherwise
Chris@2 92 * equivalent. For the most part, they share the same usage as
Chris@2 93 * their counterparts in libFLAC, and the FLAC C API documentation
Chris@2 94 * can be used as a supplement. The public include files
Chris@2 95 * for the C++ API will be installed in your include area (for
Chris@2 96 * example /usr/include/FLAC++/...).
Chris@2 97 *
Chris@2 98 * libFLAC++ is also licensed under
Chris@2 99 * <A HREF="../license.html">Xiph's BSD license</A>.
Chris@2 100 *
Chris@2 101 * \section getting_started Getting Started
Chris@2 102 *
Chris@2 103 * A good starting point for learning the API is to browse through
Chris@2 104 * the <A HREF="modules.html">modules</A>. Modules are logical
Chris@2 105 * groupings of related functions or classes, which correspond roughly
Chris@2 106 * to header files or sections of header files. Each module includes a
Chris@2 107 * detailed description of the general usage of its functions or
Chris@2 108 * classes.
Chris@2 109 *
Chris@2 110 * From there you can go on to look at the documentation of
Chris@2 111 * individual functions. You can see different views of the individual
Chris@2 112 * functions through the links in top bar across this page.
Chris@2 113 *
Chris@2 114 * If you prefer a more hands-on approach, you can jump right to some
Chris@2 115 * <A HREF="../documentation_example_code.html">example code</A>.
Chris@2 116 *
Chris@2 117 * \section porting_guide Porting Guide
Chris@2 118 *
Chris@2 119 * Starting with FLAC 1.1.3 a \link porting Porting Guide \endlink
Chris@2 120 * has been introduced which gives detailed instructions on how to
Chris@2 121 * port your code to newer versions of FLAC.
Chris@2 122 *
Chris@2 123 * \section embedded_developers Embedded Developers
Chris@2 124 *
Chris@2 125 * libFLAC has grown larger over time as more functionality has been
Chris@2 126 * included, but much of it may be unnecessary for a particular embedded
Chris@2 127 * implementation. Unused parts may be pruned by some simple editing of
Chris@2 128 * src/libFLAC/Makefile.am. In general, the decoders, encoders, and
Chris@2 129 * metadata interface are all independent from each other.
Chris@2 130 *
Chris@2 131 * It is easiest to just describe the dependencies:
Chris@2 132 *
Chris@2 133 * - All modules depend on the \link flac_format Format \endlink module.
Chris@2 134 * - The decoders and encoders depend on the bitbuffer.
Chris@2 135 * - The decoder is independent of the encoder. The encoder uses the
Chris@2 136 * decoder because of the verify feature, but this can be removed if
Chris@2 137 * not needed.
Chris@2 138 * - Parts of the metadata interface require the stream decoder (but not
Chris@2 139 * the encoder).
Chris@2 140 * - Ogg support is selectable through the compile time macro
Chris@2 141 * \c FLAC__HAS_OGG.
Chris@2 142 *
Chris@2 143 * For example, if your application only requires the stream decoder, no
Chris@2 144 * encoder, and no metadata interface, you can remove the stream encoder
Chris@2 145 * and the metadata interface, which will greatly reduce the size of the
Chris@2 146 * library.
Chris@2 147 *
Chris@2 148 * Also, there are several places in the libFLAC code with comments marked
Chris@2 149 * with "OPT:" where a #define can be changed to enable code that might be
Chris@2 150 * faster on a specific platform. Experimenting with these can yield faster
Chris@2 151 * binaries.
Chris@2 152 */
Chris@2 153
Chris@2 154 /** \defgroup porting Porting Guide for New Versions
Chris@2 155 *
Chris@2 156 * This module describes differences in the library interfaces from
Chris@2 157 * version to version. It assists in the porting of code that uses
Chris@2 158 * the libraries to newer versions of FLAC.
Chris@2 159 *
Chris@2 160 * One simple facility for making porting easier that has been added
Chris@2 161 * in FLAC 1.1.3 is a set of \c #defines in \c export.h of each
Chris@2 162 * library's includes (e.g. \c include/FLAC/export.h). The
Chris@2 163 * \c #defines mirror the libraries'
Chris@2 164 * <A HREF="http://www.gnu.org/software/libtool/manual.html#Libtool-versioning">libtool version numbers</A>,
Chris@2 165 * e.g. in libFLAC there are \c FLAC_API_VERSION_CURRENT,
Chris@2 166 * \c FLAC_API_VERSION_REVISION, and \c FLAC_API_VERSION_AGE.
Chris@2 167 * These can be used to support multiple versions of an API during the
Chris@2 168 * transition phase, e.g.
Chris@2 169 *
Chris@2 170 * \code
Chris@2 171 * #if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7
Chris@2 172 * legacy code
Chris@2 173 * #else
Chris@2 174 * new code
Chris@2 175 * #endif
Chris@2 176 * \endcode
Chris@2 177 *
Chris@2 178 * The the source will work for multiple versions and the legacy code can
Chris@2 179 * easily be removed when the transition is complete.
Chris@2 180 *
Chris@2 181 * Another available symbol is FLAC_API_SUPPORTS_OGG_FLAC (defined in
Chris@2 182 * include/FLAC/export.h), which can be used to determine whether or not
Chris@2 183 * the library has been compiled with support for Ogg FLAC. This is
Chris@2 184 * simpler than trying to call an Ogg init function and catching the
Chris@2 185 * error.
Chris@2 186 */
Chris@2 187
Chris@2 188 /** \defgroup porting_1_1_2_to_1_1_3 Porting from FLAC 1.1.2 to 1.1.3
Chris@2 189 * \ingroup porting
Chris@2 190 *
Chris@2 191 * \brief
Chris@2 192 * This module describes porting from FLAC 1.1.2 to FLAC 1.1.3.
Chris@2 193 *
Chris@2 194 * The main change between the APIs in 1.1.2 and 1.1.3 is that they have
Chris@2 195 * been simplified. First, libOggFLAC has been merged into libFLAC and
Chris@2 196 * libOggFLAC++ has been merged into libFLAC++. Second, both the three
Chris@2 197 * decoding layers and three encoding layers have been merged into a
Chris@2 198 * single stream decoder and stream encoder. That is, the functionality
Chris@2 199 * of FLAC__SeekableStreamDecoder and FLAC__FileDecoder has been merged
Chris@2 200 * into FLAC__StreamDecoder, and FLAC__SeekableStreamEncoder and
Chris@2 201 * FLAC__FileEncoder into FLAC__StreamEncoder. Only the
Chris@2 202 * FLAC__StreamDecoder and FLAC__StreamEncoder remain. What this means
Chris@2 203 * is there is now a single API that can be used to encode or decode
Chris@2 204 * streams to/from native FLAC or Ogg FLAC and the single API can work
Chris@2 205 * on both seekable and non-seekable streams.
Chris@2 206 *
Chris@2 207 * Instead of creating an encoder or decoder of a certain layer, now the
Chris@2 208 * client will always create a FLAC__StreamEncoder or
Chris@2 209 * FLAC__StreamDecoder. The old layers are now differentiated by the
Chris@2 210 * initialization function. For example, for the decoder,
Chris@2 211 * FLAC__stream_decoder_init() has been replaced by
Chris@2 212 * FLAC__stream_decoder_init_stream(). This init function takes
Chris@2 213 * callbacks for the I/O, and the seeking callbacks are optional. This
Chris@2 214 * allows the client to use the same object for seekable and
Chris@2 215 * non-seekable streams. For decoding a FLAC file directly, the client
Chris@2 216 * can use FLAC__stream_decoder_init_file() and pass just a filename
Chris@2 217 * and fewer callbacks; most of the other callbacks are supplied
Chris@2 218 * internally. For situations where fopen()ing by filename is not
Chris@2 219 * possible (e.g. Unicode filenames on Windows) the client can instead
Chris@2 220 * open the file itself and supply the FILE* to
Chris@2 221 * FLAC__stream_decoder_init_FILE(). The init functions now returns a
Chris@2 222 * FLAC__StreamDecoderInitStatus instead of FLAC__StreamDecoderState.
Chris@2 223 * Since the callbacks and client data are now passed to the init
Chris@2 224 * function, the FLAC__stream_decoder_set_*_callback() functions and
Chris@2 225 * FLAC__stream_decoder_set_client_data() are no longer needed. The
Chris@2 226 * rest of the calls to the decoder are the same as before.
Chris@2 227 *
Chris@2 228 * There are counterpart init functions for Ogg FLAC, e.g.
Chris@2 229 * FLAC__stream_decoder_init_ogg_stream(). All the rest of the calls
Chris@2 230 * and callbacks are the same as for native FLAC.
Chris@2 231 *
Chris@2 232 * As an example, in FLAC 1.1.2 a seekable stream decoder would have
Chris@2 233 * been set up like so:
Chris@2 234 *
Chris@2 235 * \code
Chris@2 236 * FLAC__SeekableStreamDecoder *decoder = FLAC__seekable_stream_decoder_new();
Chris@2 237 * if(decoder == NULL) do_something;
Chris@2 238 * FLAC__seekable_stream_decoder_set_md5_checking(decoder, true);
Chris@2 239 * [... other settings ...]
Chris@2 240 * FLAC__seekable_stream_decoder_set_read_callback(decoder, my_read_callback);
Chris@2 241 * FLAC__seekable_stream_decoder_set_seek_callback(decoder, my_seek_callback);
Chris@2 242 * FLAC__seekable_stream_decoder_set_tell_callback(decoder, my_tell_callback);
Chris@2 243 * FLAC__seekable_stream_decoder_set_length_callback(decoder, my_length_callback);
Chris@2 244 * FLAC__seekable_stream_decoder_set_eof_callback(decoder, my_eof_callback);
Chris@2 245 * FLAC__seekable_stream_decoder_set_write_callback(decoder, my_write_callback);
Chris@2 246 * FLAC__seekable_stream_decoder_set_metadata_callback(decoder, my_metadata_callback);
Chris@2 247 * FLAC__seekable_stream_decoder_set_error_callback(decoder, my_error_callback);
Chris@2 248 * FLAC__seekable_stream_decoder_set_client_data(decoder, my_client_data);
Chris@2 249 * if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK) do_something;
Chris@2 250 * \endcode
Chris@2 251 *
Chris@2 252 * In FLAC 1.1.3 it is like this:
Chris@2 253 *
Chris@2 254 * \code
Chris@2 255 * FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new();
Chris@2 256 * if(decoder == NULL) do_something;
Chris@2 257 * FLAC__stream_decoder_set_md5_checking(decoder, true);
Chris@2 258 * [... other settings ...]
Chris@2 259 * if(FLAC__stream_decoder_init_stream(
Chris@2 260 * decoder,
Chris@2 261 * my_read_callback,
Chris@2 262 * my_seek_callback, // or NULL
Chris@2 263 * my_tell_callback, // or NULL
Chris@2 264 * my_length_callback, // or NULL
Chris@2 265 * my_eof_callback, // or NULL
Chris@2 266 * my_write_callback,
Chris@2 267 * my_metadata_callback, // or NULL
Chris@2 268 * my_error_callback,
Chris@2 269 * my_client_data
Chris@2 270 * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something;
Chris@2 271 * \endcode
Chris@2 272 *
Chris@2 273 * or you could do;
Chris@2 274 *
Chris@2 275 * \code
Chris@2 276 * [...]
Chris@2 277 * FILE *file = fopen("somefile.flac","rb");
Chris@2 278 * if(file == NULL) do_somthing;
Chris@2 279 * if(FLAC__stream_decoder_init_FILE(
Chris@2 280 * decoder,
Chris@2 281 * file,
Chris@2 282 * my_write_callback,
Chris@2 283 * my_metadata_callback, // or NULL
Chris@2 284 * my_error_callback,
Chris@2 285 * my_client_data
Chris@2 286 * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something;
Chris@2 287 * \endcode
Chris@2 288 *
Chris@2 289 * or just:
Chris@2 290 *
Chris@2 291 * \code
Chris@2 292 * [...]
Chris@2 293 * if(FLAC__stream_decoder_init_file(
Chris@2 294 * decoder,
Chris@2 295 * "somefile.flac",
Chris@2 296 * my_write_callback,
Chris@2 297 * my_metadata_callback, // or NULL
Chris@2 298 * my_error_callback,
Chris@2 299 * my_client_data
Chris@2 300 * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something;
Chris@2 301 * \endcode
Chris@2 302 *
Chris@2 303 * Another small change to the decoder is in how it handles unparseable
Chris@2 304 * streams. Before, when the decoder found an unparseable stream
Chris@2 305 * (reserved for when the decoder encounters a stream from a future
Chris@2 306 * encoder that it can't parse), it changed the state to
Chris@2 307 * \c FLAC__STREAM_DECODER_UNPARSEABLE_STREAM. Now the decoder instead
Chris@2 308 * drops sync and calls the error callback with a new error code
Chris@2 309 * \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM. This is
Chris@2 310 * more robust. If your error callback does not discriminate on the the
Chris@2 311 * error state, your code does not need to be changed.
Chris@2 312 *
Chris@2 313 * The encoder now has a new setting:
Chris@2 314 * FLAC__stream_encoder_set_apodization(). This is for setting the
Chris@2 315 * method used to window the data before LPC analysis. You only need to
Chris@2 316 * add a call to this function if the default is not suitable. There
Chris@2 317 * are also two new convenience functions that may be useful:
Chris@2 318 * FLAC__metadata_object_cuesheet_calculate_cddb_id() and
Chris@2 319 * FLAC__metadata_get_cuesheet().
Chris@2 320 *
Chris@2 321 * The \a bytes parameter to FLAC__StreamDecoderReadCallback,
Chris@2 322 * FLAC__StreamEncoderReadCallback, and FLAC__StreamEncoderWriteCallback
Chris@2 323 * is now \c size_t instead of \c unsigned.
Chris@2 324 */
Chris@2 325
Chris@2 326 /** \defgroup porting_1_1_3_to_1_1_4 Porting from FLAC 1.1.3 to 1.1.4
Chris@2 327 * \ingroup porting
Chris@2 328 *
Chris@2 329 * \brief
Chris@2 330 * This module describes porting from FLAC 1.1.3 to FLAC 1.1.4.
Chris@2 331 *
Chris@2 332 * There were no changes to any of the interfaces from 1.1.3 to 1.1.4.
Chris@2 333 * There was a slight change in the implementation of
Chris@2 334 * FLAC__stream_encoder_set_metadata(); the function now makes a copy
Chris@2 335 * of the \a metadata array of pointers so the client no longer needs
Chris@2 336 * to maintain it after the call. The objects themselves that are
Chris@2 337 * pointed to by the array are still not copied though and must be
Chris@2 338 * maintained until the call to FLAC__stream_encoder_finish().
Chris@2 339 */
Chris@2 340
Chris@2 341 /** \defgroup porting_1_1_4_to_1_2_0 Porting from FLAC 1.1.4 to 1.2.0
Chris@2 342 * \ingroup porting
Chris@2 343 *
Chris@2 344 * \brief
Chris@2 345 * This module describes porting from FLAC 1.1.4 to FLAC 1.2.0.
Chris@2 346 *
Chris@2 347 * There were only very minor changes to the interfaces from 1.1.4 to 1.2.0.
Chris@2 348 * In libFLAC, \c FLAC__format_sample_rate_is_subset() was added.
Chris@2 349 * In libFLAC++, \c FLAC::Decoder::Stream::get_decode_position() was added.
Chris@2 350 *
Chris@2 351 * Finally, value of the constant \c FLAC__FRAME_HEADER_RESERVED_LEN
Chris@2 352 * has changed to reflect the conversion of one of the reserved bits
Chris@2 353 * into active use. It used to be \c 2 and now is \c 1. However the
Chris@2 354 * FLAC frame header length has not changed, so to skip the proper
Chris@2 355 * number of bits, use \c FLAC__FRAME_HEADER_RESERVED_LEN +
Chris@2 356 * \c FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN
Chris@2 357 */
Chris@2 358
Chris@2 359 /** \defgroup flac FLAC C API
Chris@2 360 *
Chris@2 361 * The FLAC C API is the interface to libFLAC, a set of structures
Chris@2 362 * describing the components of FLAC streams, and functions for
Chris@2 363 * encoding and decoding streams, as well as manipulating FLAC
Chris@2 364 * metadata in files.
Chris@2 365 *
Chris@2 366 * You should start with the format components as all other modules
Chris@2 367 * are dependent on it.
Chris@2 368 */
Chris@2 369
Chris@2 370 #endif