annotate src/flac-1.2.1/include/FLAC/stream_decoder.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 05aa0afa9217
children
rev   line source
Chris@1 1 /* libFLAC - Free Lossless Audio Codec library
Chris@1 2 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson
Chris@1 3 *
Chris@1 4 * Redistribution and use in source and binary forms, with or without
Chris@1 5 * modification, are permitted provided that the following conditions
Chris@1 6 * are met:
Chris@1 7 *
Chris@1 8 * - Redistributions of source code must retain the above copyright
Chris@1 9 * notice, this list of conditions and the following disclaimer.
Chris@1 10 *
Chris@1 11 * - Redistributions in binary form must reproduce the above copyright
Chris@1 12 * notice, this list of conditions and the following disclaimer in the
Chris@1 13 * documentation and/or other materials provided with the distribution.
Chris@1 14 *
Chris@1 15 * - Neither the name of the Xiph.org Foundation nor the names of its
Chris@1 16 * contributors may be used to endorse or promote products derived from
Chris@1 17 * this software without specific prior written permission.
Chris@1 18 *
Chris@1 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Chris@1 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Chris@1 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Chris@1 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
Chris@1 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
Chris@1 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
Chris@1 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
Chris@1 26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Chris@1 27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Chris@1 28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Chris@1 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Chris@1 30 */
Chris@1 31
Chris@1 32 #ifndef FLAC__STREAM_DECODER_H
Chris@1 33 #define FLAC__STREAM_DECODER_H
Chris@1 34
Chris@1 35 #include <stdio.h> /* for FILE */
Chris@1 36 #include "export.h"
Chris@1 37 #include "format.h"
Chris@1 38
Chris@1 39 #ifdef __cplusplus
Chris@1 40 extern "C" {
Chris@1 41 #endif
Chris@1 42
Chris@1 43
Chris@1 44 /** \file include/FLAC/stream_decoder.h
Chris@1 45 *
Chris@1 46 * \brief
Chris@1 47 * This module contains the functions which implement the stream
Chris@1 48 * decoder.
Chris@1 49 *
Chris@1 50 * See the detailed documentation in the
Chris@1 51 * \link flac_stream_decoder stream decoder \endlink module.
Chris@1 52 */
Chris@1 53
Chris@1 54 /** \defgroup flac_decoder FLAC/ \*_decoder.h: decoder interfaces
Chris@1 55 * \ingroup flac
Chris@1 56 *
Chris@1 57 * \brief
Chris@1 58 * This module describes the decoder layers provided by libFLAC.
Chris@1 59 *
Chris@1 60 * The stream decoder can be used to decode complete streams either from
Chris@1 61 * the client via callbacks, or directly from a file, depending on how
Chris@1 62 * it is initialized. When decoding via callbacks, the client provides
Chris@1 63 * callbacks for reading FLAC data and writing decoded samples, and
Chris@1 64 * handling metadata and errors. If the client also supplies seek-related
Chris@1 65 * callback, the decoder function for sample-accurate seeking within the
Chris@1 66 * FLAC input is also available. When decoding from a file, the client
Chris@1 67 * needs only supply a filename or open \c FILE* and write/metadata/error
Chris@1 68 * callbacks; the rest of the callbacks are supplied internally. For more
Chris@1 69 * info see the \link flac_stream_decoder stream decoder \endlink module.
Chris@1 70 */
Chris@1 71
Chris@1 72 /** \defgroup flac_stream_decoder FLAC/stream_decoder.h: stream decoder interface
Chris@1 73 * \ingroup flac_decoder
Chris@1 74 *
Chris@1 75 * \brief
Chris@1 76 * This module contains the functions which implement the stream
Chris@1 77 * decoder.
Chris@1 78 *
Chris@1 79 * The stream decoder can decode native FLAC, and optionally Ogg FLAC
Chris@1 80 * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files.
Chris@1 81 *
Chris@1 82 * The basic usage of this decoder is as follows:
Chris@1 83 * - The program creates an instance of a decoder using
Chris@1 84 * FLAC__stream_decoder_new().
Chris@1 85 * - The program overrides the default settings using
Chris@1 86 * FLAC__stream_decoder_set_*() functions.
Chris@1 87 * - The program initializes the instance to validate the settings and
Chris@1 88 * prepare for decoding using
Chris@1 89 * - FLAC__stream_decoder_init_stream() or FLAC__stream_decoder_init_FILE()
Chris@1 90 * or FLAC__stream_decoder_init_file() for native FLAC,
Chris@1 91 * - FLAC__stream_decoder_init_ogg_stream() or FLAC__stream_decoder_init_ogg_FILE()
Chris@1 92 * or FLAC__stream_decoder_init_ogg_file() for Ogg FLAC
Chris@1 93 * - The program calls the FLAC__stream_decoder_process_*() functions
Chris@1 94 * to decode data, which subsequently calls the callbacks.
Chris@1 95 * - The program finishes the decoding with FLAC__stream_decoder_finish(),
Chris@1 96 * which flushes the input and output and resets the decoder to the
Chris@1 97 * uninitialized state.
Chris@1 98 * - The instance may be used again or deleted with
Chris@1 99 * FLAC__stream_decoder_delete().
Chris@1 100 *
Chris@1 101 * In more detail, the program will create a new instance by calling
Chris@1 102 * FLAC__stream_decoder_new(), then call FLAC__stream_decoder_set_*()
Chris@1 103 * functions to override the default decoder options, and call
Chris@1 104 * one of the FLAC__stream_decoder_init_*() functions.
Chris@1 105 *
Chris@1 106 * There are three initialization functions for native FLAC, one for
Chris@1 107 * setting up the decoder to decode FLAC data from the client via
Chris@1 108 * callbacks, and two for decoding directly from a FLAC file.
Chris@1 109 *
Chris@1 110 * For decoding via callbacks, use FLAC__stream_decoder_init_stream().
Chris@1 111 * You must also supply several callbacks for handling I/O. Some (like
Chris@1 112 * seeking) are optional, depending on the capabilities of the input.
Chris@1 113 *
Chris@1 114 * For decoding directly from a file, use FLAC__stream_decoder_init_FILE()
Chris@1 115 * or FLAC__stream_decoder_init_file(). Then you must only supply an open
Chris@1 116 * \c FILE* or filename and fewer callbacks; the decoder will handle
Chris@1 117 * the other callbacks internally.
Chris@1 118 *
Chris@1 119 * There are three similarly-named init functions for decoding from Ogg
Chris@1 120 * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the
Chris@1 121 * library has been built with Ogg support.
Chris@1 122 *
Chris@1 123 * Once the decoder is initialized, your program will call one of several
Chris@1 124 * functions to start the decoding process:
Chris@1 125 *
Chris@1 126 * - FLAC__stream_decoder_process_single() - Tells the decoder to process at
Chris@1 127 * most one metadata block or audio frame and return, calling either the
Chris@1 128 * metadata callback or write callback, respectively, once. If the decoder
Chris@1 129 * loses sync it will return with only the error callback being called.
Chris@1 130 * - FLAC__stream_decoder_process_until_end_of_metadata() - Tells the decoder
Chris@1 131 * to process the stream from the current location and stop upon reaching
Chris@1 132 * the first audio frame. The client will get one metadata, write, or error
Chris@1 133 * callback per metadata block, audio frame, or sync error, respectively.
Chris@1 134 * - FLAC__stream_decoder_process_until_end_of_stream() - Tells the decoder
Chris@1 135 * to process the stream from the current location until the read callback
Chris@1 136 * returns FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM or
Chris@1 137 * FLAC__STREAM_DECODER_READ_STATUS_ABORT. The client will get one metadata,
Chris@1 138 * write, or error callback per metadata block, audio frame, or sync error,
Chris@1 139 * respectively.
Chris@1 140 *
Chris@1 141 * When the decoder has finished decoding (normally or through an abort),
Chris@1 142 * the instance is finished by calling FLAC__stream_decoder_finish(), which
Chris@1 143 * ensures the decoder is in the correct state and frees memory. Then the
Chris@1 144 * instance may be deleted with FLAC__stream_decoder_delete() or initialized
Chris@1 145 * again to decode another stream.
Chris@1 146 *
Chris@1 147 * Seeking is exposed through the FLAC__stream_decoder_seek_absolute() method.
Chris@1 148 * At any point after the stream decoder has been initialized, the client can
Chris@1 149 * call this function to seek to an exact sample within the stream.
Chris@1 150 * Subsequently, the first time the write callback is called it will be
Chris@1 151 * passed a (possibly partial) block starting at that sample.
Chris@1 152 *
Chris@1 153 * If the client cannot seek via the callback interface provided, but still
Chris@1 154 * has another way of seeking, it can flush the decoder using
Chris@1 155 * FLAC__stream_decoder_flush() and start feeding data from the new position
Chris@1 156 * through the read callback.
Chris@1 157 *
Chris@1 158 * The stream decoder also provides MD5 signature checking. If this is
Chris@1 159 * turned on before initialization, FLAC__stream_decoder_finish() will
Chris@1 160 * report when the decoded MD5 signature does not match the one stored
Chris@1 161 * in the STREAMINFO block. MD5 checking is automatically turned off
Chris@1 162 * (until the next FLAC__stream_decoder_reset()) if there is no signature
Chris@1 163 * in the STREAMINFO block or when a seek is attempted.
Chris@1 164 *
Chris@1 165 * The FLAC__stream_decoder_set_metadata_*() functions deserve special
Chris@1 166 * attention. By default, the decoder only calls the metadata_callback for
Chris@1 167 * the STREAMINFO block. These functions allow you to tell the decoder
Chris@1 168 * explicitly which blocks to parse and return via the metadata_callback
Chris@1 169 * and/or which to skip. Use a FLAC__stream_decoder_set_metadata_respond_all(),
Chris@1 170 * FLAC__stream_decoder_set_metadata_ignore() ... or FLAC__stream_decoder_set_metadata_ignore_all(),
Chris@1 171 * FLAC__stream_decoder_set_metadata_respond() ... sequence to exactly specify
Chris@1 172 * which blocks to return. Remember that metadata blocks can potentially
Chris@1 173 * be big (for example, cover art) so filtering out the ones you don't
Chris@1 174 * use can reduce the memory requirements of the decoder. Also note the
Chris@1 175 * special forms FLAC__stream_decoder_set_metadata_respond_application(id)
Chris@1 176 * and FLAC__stream_decoder_set_metadata_ignore_application(id) for
Chris@1 177 * filtering APPLICATION blocks based on the application ID.
Chris@1 178 *
Chris@1 179 * STREAMINFO and SEEKTABLE blocks are always parsed and used internally, but
Chris@1 180 * they still can legally be filtered from the metadata_callback.
Chris@1 181 *
Chris@1 182 * \note
Chris@1 183 * The "set" functions may only be called when the decoder is in the
Chris@1 184 * state FLAC__STREAM_DECODER_UNINITIALIZED, i.e. after
Chris@1 185 * FLAC__stream_decoder_new() or FLAC__stream_decoder_finish(), but
Chris@1 186 * before FLAC__stream_decoder_init_*(). If this is the case they will
Chris@1 187 * return \c true, otherwise \c false.
Chris@1 188 *
Chris@1 189 * \note
Chris@1 190 * FLAC__stream_decoder_finish() resets all settings to the constructor
Chris@1 191 * defaults, including the callbacks.
Chris@1 192 *
Chris@1 193 * \{
Chris@1 194 */
Chris@1 195
Chris@1 196
Chris@1 197 /** State values for a FLAC__StreamDecoder
Chris@1 198 *
Chris@1 199 * The decoder's state can be obtained by calling FLAC__stream_decoder_get_state().
Chris@1 200 */
Chris@1 201 typedef enum {
Chris@1 202
Chris@1 203 FLAC__STREAM_DECODER_SEARCH_FOR_METADATA = 0,
Chris@1 204 /**< The decoder is ready to search for metadata. */
Chris@1 205
Chris@1 206 FLAC__STREAM_DECODER_READ_METADATA,
Chris@1 207 /**< The decoder is ready to or is in the process of reading metadata. */
Chris@1 208
Chris@1 209 FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC,
Chris@1 210 /**< The decoder is ready to or is in the process of searching for the
Chris@1 211 * frame sync code.
Chris@1 212 */
Chris@1 213
Chris@1 214 FLAC__STREAM_DECODER_READ_FRAME,
Chris@1 215 /**< The decoder is ready to or is in the process of reading a frame. */
Chris@1 216
Chris@1 217 FLAC__STREAM_DECODER_END_OF_STREAM,
Chris@1 218 /**< The decoder has reached the end of the stream. */
Chris@1 219
Chris@1 220 FLAC__STREAM_DECODER_OGG_ERROR,
Chris@1 221 /**< An error occurred in the underlying Ogg layer. */
Chris@1 222
Chris@1 223 FLAC__STREAM_DECODER_SEEK_ERROR,
Chris@1 224 /**< An error occurred while seeking. The decoder must be flushed
Chris@1 225 * with FLAC__stream_decoder_flush() or reset with
Chris@1 226 * FLAC__stream_decoder_reset() before decoding can continue.
Chris@1 227 */
Chris@1 228
Chris@1 229 FLAC__STREAM_DECODER_ABORTED,
Chris@1 230 /**< The decoder was aborted by the read callback. */
Chris@1 231
Chris@1 232 FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR,
Chris@1 233 /**< An error occurred allocating memory. The decoder is in an invalid
Chris@1 234 * state and can no longer be used.
Chris@1 235 */
Chris@1 236
Chris@1 237 FLAC__STREAM_DECODER_UNINITIALIZED
Chris@1 238 /**< The decoder is in the uninitialized state; one of the
Chris@1 239 * FLAC__stream_decoder_init_*() functions must be called before samples
Chris@1 240 * can be processed.
Chris@1 241 */
Chris@1 242
Chris@1 243 } FLAC__StreamDecoderState;
Chris@1 244
Chris@1 245 /** Maps a FLAC__StreamDecoderState to a C string.
Chris@1 246 *
Chris@1 247 * Using a FLAC__StreamDecoderState as the index to this array
Chris@1 248 * will give the string equivalent. The contents should not be modified.
Chris@1 249 */
Chris@1 250 extern FLAC_API const char * const FLAC__StreamDecoderStateString[];
Chris@1 251
Chris@1 252
Chris@1 253 /** Possible return values for the FLAC__stream_decoder_init_*() functions.
Chris@1 254 */
Chris@1 255 typedef enum {
Chris@1 256
Chris@1 257 FLAC__STREAM_DECODER_INIT_STATUS_OK = 0,
Chris@1 258 /**< Initialization was successful. */
Chris@1 259
Chris@1 260 FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER,
Chris@1 261 /**< The library was not compiled with support for the given container
Chris@1 262 * format.
Chris@1 263 */
Chris@1 264
Chris@1 265 FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS,
Chris@1 266 /**< A required callback was not supplied. */
Chris@1 267
Chris@1 268 FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR,
Chris@1 269 /**< An error occurred allocating memory. */
Chris@1 270
Chris@1 271 FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE,
Chris@1 272 /**< fopen() failed in FLAC__stream_decoder_init_file() or
Chris@1 273 * FLAC__stream_decoder_init_ogg_file(). */
Chris@1 274
Chris@1 275 FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED
Chris@1 276 /**< FLAC__stream_decoder_init_*() was called when the decoder was
Chris@1 277 * already initialized, usually because
Chris@1 278 * FLAC__stream_decoder_finish() was not called.
Chris@1 279 */
Chris@1 280
Chris@1 281 } FLAC__StreamDecoderInitStatus;
Chris@1 282
Chris@1 283 /** Maps a FLAC__StreamDecoderInitStatus to a C string.
Chris@1 284 *
Chris@1 285 * Using a FLAC__StreamDecoderInitStatus as the index to this array
Chris@1 286 * will give the string equivalent. The contents should not be modified.
Chris@1 287 */
Chris@1 288 extern FLAC_API const char * const FLAC__StreamDecoderInitStatusString[];
Chris@1 289
Chris@1 290
Chris@1 291 /** Return values for the FLAC__StreamDecoder read callback.
Chris@1 292 */
Chris@1 293 typedef enum {
Chris@1 294
Chris@1 295 FLAC__STREAM_DECODER_READ_STATUS_CONTINUE,
Chris@1 296 /**< The read was OK and decoding can continue. */
Chris@1 297
Chris@1 298 FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM,
Chris@1 299 /**< The read was attempted while at the end of the stream. Note that
Chris@1 300 * the client must only return this value when the read callback was
Chris@1 301 * called when already at the end of the stream. Otherwise, if the read
Chris@1 302 * itself moves to the end of the stream, the client should still return
Chris@1 303 * the data and \c FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, and then on
Chris@1 304 * the next read callback it should return
Chris@1 305 * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM with a byte count
Chris@1 306 * of \c 0.
Chris@1 307 */
Chris@1 308
Chris@1 309 FLAC__STREAM_DECODER_READ_STATUS_ABORT
Chris@1 310 /**< An unrecoverable error occurred. The decoder will return from the process call. */
Chris@1 311
Chris@1 312 } FLAC__StreamDecoderReadStatus;
Chris@1 313
Chris@1 314 /** Maps a FLAC__StreamDecoderReadStatus to a C string.
Chris@1 315 *
Chris@1 316 * Using a FLAC__StreamDecoderReadStatus as the index to this array
Chris@1 317 * will give the string equivalent. The contents should not be modified.
Chris@1 318 */
Chris@1 319 extern FLAC_API const char * const FLAC__StreamDecoderReadStatusString[];
Chris@1 320
Chris@1 321
Chris@1 322 /** Return values for the FLAC__StreamDecoder seek callback.
Chris@1 323 */
Chris@1 324 typedef enum {
Chris@1 325
Chris@1 326 FLAC__STREAM_DECODER_SEEK_STATUS_OK,
Chris@1 327 /**< The seek was OK and decoding can continue. */
Chris@1 328
Chris@1 329 FLAC__STREAM_DECODER_SEEK_STATUS_ERROR,
Chris@1 330 /**< An unrecoverable error occurred. The decoder will return from the process call. */
Chris@1 331
Chris@1 332 FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED
Chris@1 333 /**< Client does not support seeking. */
Chris@1 334
Chris@1 335 } FLAC__StreamDecoderSeekStatus;
Chris@1 336
Chris@1 337 /** Maps a FLAC__StreamDecoderSeekStatus to a C string.
Chris@1 338 *
Chris@1 339 * Using a FLAC__StreamDecoderSeekStatus as the index to this array
Chris@1 340 * will give the string equivalent. The contents should not be modified.
Chris@1 341 */
Chris@1 342 extern FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[];
Chris@1 343
Chris@1 344
Chris@1 345 /** Return values for the FLAC__StreamDecoder tell callback.
Chris@1 346 */
Chris@1 347 typedef enum {
Chris@1 348
Chris@1 349 FLAC__STREAM_DECODER_TELL_STATUS_OK,
Chris@1 350 /**< The tell was OK and decoding can continue. */
Chris@1 351
Chris@1 352 FLAC__STREAM_DECODER_TELL_STATUS_ERROR,
Chris@1 353 /**< An unrecoverable error occurred. The decoder will return from the process call. */
Chris@1 354
Chris@1 355 FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED
Chris@1 356 /**< Client does not support telling the position. */
Chris@1 357
Chris@1 358 } FLAC__StreamDecoderTellStatus;
Chris@1 359
Chris@1 360 /** Maps a FLAC__StreamDecoderTellStatus to a C string.
Chris@1 361 *
Chris@1 362 * Using a FLAC__StreamDecoderTellStatus as the index to this array
Chris@1 363 * will give the string equivalent. The contents should not be modified.
Chris@1 364 */
Chris@1 365 extern FLAC_API const char * const FLAC__StreamDecoderTellStatusString[];
Chris@1 366
Chris@1 367
Chris@1 368 /** Return values for the FLAC__StreamDecoder length callback.
Chris@1 369 */
Chris@1 370 typedef enum {
Chris@1 371
Chris@1 372 FLAC__STREAM_DECODER_LENGTH_STATUS_OK,
Chris@1 373 /**< The length call was OK and decoding can continue. */
Chris@1 374
Chris@1 375 FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR,
Chris@1 376 /**< An unrecoverable error occurred. The decoder will return from the process call. */
Chris@1 377
Chris@1 378 FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED
Chris@1 379 /**< Client does not support reporting the length. */
Chris@1 380
Chris@1 381 } FLAC__StreamDecoderLengthStatus;
Chris@1 382
Chris@1 383 /** Maps a FLAC__StreamDecoderLengthStatus to a C string.
Chris@1 384 *
Chris@1 385 * Using a FLAC__StreamDecoderLengthStatus as the index to this array
Chris@1 386 * will give the string equivalent. The contents should not be modified.
Chris@1 387 */
Chris@1 388 extern FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[];
Chris@1 389
Chris@1 390
Chris@1 391 /** Return values for the FLAC__StreamDecoder write callback.
Chris@1 392 */
Chris@1 393 typedef enum {
Chris@1 394
Chris@1 395 FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE,
Chris@1 396 /**< The write was OK and decoding can continue. */
Chris@1 397
Chris@1 398 FLAC__STREAM_DECODER_WRITE_STATUS_ABORT
Chris@1 399 /**< An unrecoverable error occurred. The decoder will return from the process call. */
Chris@1 400
Chris@1 401 } FLAC__StreamDecoderWriteStatus;
Chris@1 402
Chris@1 403 /** Maps a FLAC__StreamDecoderWriteStatus to a C string.
Chris@1 404 *
Chris@1 405 * Using a FLAC__StreamDecoderWriteStatus as the index to this array
Chris@1 406 * will give the string equivalent. The contents should not be modified.
Chris@1 407 */
Chris@1 408 extern FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[];
Chris@1 409
Chris@1 410
Chris@1 411 /** Possible values passed back to the FLAC__StreamDecoder error callback.
Chris@1 412 * \c FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC is the generic catch-
Chris@1 413 * all. The rest could be caused by bad sync (false synchronization on
Chris@1 414 * data that is not the start of a frame) or corrupted data. The error
Chris@1 415 * itself is the decoder's best guess at what happened assuming a correct
Chris@1 416 * sync. For example \c FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER
Chris@1 417 * could be caused by a correct sync on the start of a frame, but some
Chris@1 418 * data in the frame header was corrupted. Or it could be the result of
Chris@1 419 * syncing on a point the stream that looked like the starting of a frame
Chris@1 420 * but was not. \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM
Chris@1 421 * could be because the decoder encountered a valid frame made by a future
Chris@1 422 * version of the encoder which it cannot parse, or because of a false
Chris@1 423 * sync making it appear as though an encountered frame was generated by
Chris@1 424 * a future encoder.
Chris@1 425 */
Chris@1 426 typedef enum {
Chris@1 427
Chris@1 428 FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC,
Chris@1 429 /**< An error in the stream caused the decoder to lose synchronization. */
Chris@1 430
Chris@1 431 FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER,
Chris@1 432 /**< The decoder encountered a corrupted frame header. */
Chris@1 433
Chris@1 434 FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH,
Chris@1 435 /**< The frame's data did not match the CRC in the footer. */
Chris@1 436
Chris@1 437 FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM
Chris@1 438 /**< The decoder encountered reserved fields in use in the stream. */
Chris@1 439
Chris@1 440 } FLAC__StreamDecoderErrorStatus;
Chris@1 441
Chris@1 442 /** Maps a FLAC__StreamDecoderErrorStatus to a C string.
Chris@1 443 *
Chris@1 444 * Using a FLAC__StreamDecoderErrorStatus as the index to this array
Chris@1 445 * will give the string equivalent. The contents should not be modified.
Chris@1 446 */
Chris@1 447 extern FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[];
Chris@1 448
Chris@1 449
Chris@1 450 /***********************************************************************
Chris@1 451 *
Chris@1 452 * class FLAC__StreamDecoder
Chris@1 453 *
Chris@1 454 ***********************************************************************/
Chris@1 455
Chris@1 456 struct FLAC__StreamDecoderProtected;
Chris@1 457 struct FLAC__StreamDecoderPrivate;
Chris@1 458 /** The opaque structure definition for the stream decoder type.
Chris@1 459 * See the \link flac_stream_decoder stream decoder module \endlink
Chris@1 460 * for a detailed description.
Chris@1 461 */
Chris@1 462 typedef struct {
Chris@1 463 struct FLAC__StreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */
Chris@1 464 struct FLAC__StreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */
Chris@1 465 } FLAC__StreamDecoder;
Chris@1 466
Chris@1 467 /** Signature for the read callback.
Chris@1 468 *
Chris@1 469 * A function pointer matching this signature must be passed to
Chris@1 470 * FLAC__stream_decoder_init*_stream(). The supplied function will be
Chris@1 471 * called when the decoder needs more input data. The address of the
Chris@1 472 * buffer to be filled is supplied, along with the number of bytes the
Chris@1 473 * buffer can hold. The callback may choose to supply less data and
Chris@1 474 * modify the byte count but must be careful not to overflow the buffer.
Chris@1 475 * The callback then returns a status code chosen from
Chris@1 476 * FLAC__StreamDecoderReadStatus.
Chris@1 477 *
Chris@1 478 * Here is an example of a read callback for stdio streams:
Chris@1 479 * \code
Chris@1 480 * FLAC__StreamDecoderReadStatus read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
Chris@1 481 * {
Chris@1 482 * FILE *file = ((MyClientData*)client_data)->file;
Chris@1 483 * if(*bytes > 0) {
Chris@1 484 * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file);
Chris@1 485 * if(ferror(file))
Chris@1 486 * return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
Chris@1 487 * else if(*bytes == 0)
Chris@1 488 * return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
Chris@1 489 * else
Chris@1 490 * return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
Chris@1 491 * }
Chris@1 492 * else
Chris@1 493 * return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
Chris@1 494 * }
Chris@1 495 * \endcode
Chris@1 496 *
Chris@1 497 * \note In general, FLAC__StreamDecoder functions which change the
Chris@1 498 * state should not be called on the \a decoder while in the callback.
Chris@1 499 *
Chris@1 500 * \param decoder The decoder instance calling the callback.
Chris@1 501 * \param buffer A pointer to a location for the callee to store
Chris@1 502 * data to be decoded.
Chris@1 503 * \param bytes A pointer to the size of the buffer. On entry
Chris@1 504 * to the callback, it contains the maximum number
Chris@1 505 * of bytes that may be stored in \a buffer. The
Chris@1 506 * callee must set it to the actual number of bytes
Chris@1 507 * stored (0 in case of error or end-of-stream) before
Chris@1 508 * returning.
Chris@1 509 * \param client_data The callee's client data set through
Chris@1 510 * FLAC__stream_decoder_init_*().
Chris@1 511 * \retval FLAC__StreamDecoderReadStatus
Chris@1 512 * The callee's return status. Note that the callback should return
Chris@1 513 * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM if and only if
Chris@1 514 * zero bytes were read and there is no more data to be read.
Chris@1 515 */
Chris@1 516 typedef FLAC__StreamDecoderReadStatus (*FLAC__StreamDecoderReadCallback)(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
Chris@1 517
Chris@1 518 /** Signature for the seek callback.
Chris@1 519 *
Chris@1 520 * A function pointer matching this signature may be passed to
Chris@1 521 * FLAC__stream_decoder_init*_stream(). The supplied function will be
Chris@1 522 * called when the decoder needs to seek the input stream. The decoder
Chris@1 523 * will pass the absolute byte offset to seek to, 0 meaning the
Chris@1 524 * beginning of the stream.
Chris@1 525 *
Chris@1 526 * Here is an example of a seek callback for stdio streams:
Chris@1 527 * \code
Chris@1 528 * FLAC__StreamDecoderSeekStatus seek_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
Chris@1 529 * {
Chris@1 530 * FILE *file = ((MyClientData*)client_data)->file;
Chris@1 531 * if(file == stdin)
Chris@1 532 * return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED;
Chris@1 533 * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0)
Chris@1 534 * return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
Chris@1 535 * else
Chris@1 536 * return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
Chris@1 537 * }
Chris@1 538 * \endcode
Chris@1 539 *
Chris@1 540 * \note In general, FLAC__StreamDecoder functions which change the
Chris@1 541 * state should not be called on the \a decoder while in the callback.
Chris@1 542 *
Chris@1 543 * \param decoder The decoder instance calling the callback.
Chris@1 544 * \param absolute_byte_offset The offset from the beginning of the stream
Chris@1 545 * to seek to.
Chris@1 546 * \param client_data The callee's client data set through
Chris@1 547 * FLAC__stream_decoder_init_*().
Chris@1 548 * \retval FLAC__StreamDecoderSeekStatus
Chris@1 549 * The callee's return status.
Chris@1 550 */
Chris@1 551 typedef FLAC__StreamDecoderSeekStatus (*FLAC__StreamDecoderSeekCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data);
Chris@1 552
Chris@1 553 /** Signature for the tell callback.
Chris@1 554 *
Chris@1 555 * A function pointer matching this signature may be passed to
Chris@1 556 * FLAC__stream_decoder_init*_stream(). The supplied function will be
Chris@1 557 * called when the decoder wants to know the current position of the
Chris@1 558 * stream. The callback should return the byte offset from the
Chris@1 559 * beginning of the stream.
Chris@1 560 *
Chris@1 561 * Here is an example of a tell callback for stdio streams:
Chris@1 562 * \code
Chris@1 563 * FLAC__StreamDecoderTellStatus tell_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
Chris@1 564 * {
Chris@1 565 * FILE *file = ((MyClientData*)client_data)->file;
Chris@1 566 * off_t pos;
Chris@1 567 * if(file == stdin)
Chris@1 568 * return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED;
Chris@1 569 * else if((pos = ftello(file)) < 0)
Chris@1 570 * return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
Chris@1 571 * else {
Chris@1 572 * *absolute_byte_offset = (FLAC__uint64)pos;
Chris@1 573 * return FLAC__STREAM_DECODER_TELL_STATUS_OK;
Chris@1 574 * }
Chris@1 575 * }
Chris@1 576 * \endcode
Chris@1 577 *
Chris@1 578 * \note In general, FLAC__StreamDecoder functions which change the
Chris@1 579 * state should not be called on the \a decoder while in the callback.
Chris@1 580 *
Chris@1 581 * \param decoder The decoder instance calling the callback.
Chris@1 582 * \param absolute_byte_offset A pointer to storage for the current offset
Chris@1 583 * from the beginning of the stream.
Chris@1 584 * \param client_data The callee's client data set through
Chris@1 585 * FLAC__stream_decoder_init_*().
Chris@1 586 * \retval FLAC__StreamDecoderTellStatus
Chris@1 587 * The callee's return status.
Chris@1 588 */
Chris@1 589 typedef FLAC__StreamDecoderTellStatus (*FLAC__StreamDecoderTellCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
Chris@1 590
Chris@1 591 /** Signature for the length callback.
Chris@1 592 *
Chris@1 593 * A function pointer matching this signature may be passed to
Chris@1 594 * FLAC__stream_decoder_init*_stream(). The supplied function will be
Chris@1 595 * called when the decoder wants to know the total length of the stream
Chris@1 596 * in bytes.
Chris@1 597 *
Chris@1 598 * Here is an example of a length callback for stdio streams:
Chris@1 599 * \code
Chris@1 600 * FLAC__StreamDecoderLengthStatus length_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
Chris@1 601 * {
Chris@1 602 * FILE *file = ((MyClientData*)client_data)->file;
Chris@1 603 * struct stat filestats;
Chris@1 604 *
Chris@1 605 * if(file == stdin)
Chris@1 606 * return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED;
Chris@1 607 * else if(fstat(fileno(file), &filestats) != 0)
Chris@1 608 * return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
Chris@1 609 * else {
Chris@1 610 * *stream_length = (FLAC__uint64)filestats.st_size;
Chris@1 611 * return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
Chris@1 612 * }
Chris@1 613 * }
Chris@1 614 * \endcode
Chris@1 615 *
Chris@1 616 * \note In general, FLAC__StreamDecoder functions which change the
Chris@1 617 * state should not be called on the \a decoder while in the callback.
Chris@1 618 *
Chris@1 619 * \param decoder The decoder instance calling the callback.
Chris@1 620 * \param stream_length A pointer to storage for the length of the stream
Chris@1 621 * in bytes.
Chris@1 622 * \param client_data The callee's client data set through
Chris@1 623 * FLAC__stream_decoder_init_*().
Chris@1 624 * \retval FLAC__StreamDecoderLengthStatus
Chris@1 625 * The callee's return status.
Chris@1 626 */
Chris@1 627 typedef FLAC__StreamDecoderLengthStatus (*FLAC__StreamDecoderLengthCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data);
Chris@1 628
Chris@1 629 /** Signature for the EOF callback.
Chris@1 630 *
Chris@1 631 * A function pointer matching this signature may be passed to
Chris@1 632 * FLAC__stream_decoder_init*_stream(). The supplied function will be
Chris@1 633 * called when the decoder needs to know if the end of the stream has
Chris@1 634 * been reached.
Chris@1 635 *
Chris@1 636 * Here is an example of a EOF callback for stdio streams:
Chris@1 637 * FLAC__bool eof_cb(const FLAC__StreamDecoder *decoder, void *client_data)
Chris@1 638 * \code
Chris@1 639 * {
Chris@1 640 * FILE *file = ((MyClientData*)client_data)->file;
Chris@1 641 * return feof(file)? true : false;
Chris@1 642 * }
Chris@1 643 * \endcode
Chris@1 644 *
Chris@1 645 * \note In general, FLAC__StreamDecoder functions which change the
Chris@1 646 * state should not be called on the \a decoder while in the callback.
Chris@1 647 *
Chris@1 648 * \param decoder The decoder instance calling the callback.
Chris@1 649 * \param client_data The callee's client data set through
Chris@1 650 * FLAC__stream_decoder_init_*().
Chris@1 651 * \retval FLAC__bool
Chris@1 652 * \c true if the currently at the end of the stream, else \c false.
Chris@1 653 */
Chris@1 654 typedef FLAC__bool (*FLAC__StreamDecoderEofCallback)(const FLAC__StreamDecoder *decoder, void *client_data);
Chris@1 655
Chris@1 656 /** Signature for the write callback.
Chris@1 657 *
Chris@1 658 * A function pointer matching this signature must be passed to one of
Chris@1 659 * the FLAC__stream_decoder_init_*() functions.
Chris@1 660 * The supplied function will be called when the decoder has decoded a
Chris@1 661 * single audio frame. The decoder will pass the frame metadata as well
Chris@1 662 * as an array of pointers (one for each channel) pointing to the
Chris@1 663 * decoded audio.
Chris@1 664 *
Chris@1 665 * \note In general, FLAC__StreamDecoder functions which change the
Chris@1 666 * state should not be called on the \a decoder while in the callback.
Chris@1 667 *
Chris@1 668 * \param decoder The decoder instance calling the callback.
Chris@1 669 * \param frame The description of the decoded frame. See
Chris@1 670 * FLAC__Frame.
Chris@1 671 * \param buffer An array of pointers to decoded channels of data.
Chris@1 672 * Each pointer will point to an array of signed
Chris@1 673 * samples of length \a frame->header.blocksize.
Chris@1 674 * Channels will be ordered according to the FLAC
Chris@1 675 * specification; see the documentation for the
Chris@1 676 * <A HREF="../format.html#frame_header">frame header</A>.
Chris@1 677 * \param client_data The callee's client data set through
Chris@1 678 * FLAC__stream_decoder_init_*().
Chris@1 679 * \retval FLAC__StreamDecoderWriteStatus
Chris@1 680 * The callee's return status.
Chris@1 681 */
Chris@1 682 typedef FLAC__StreamDecoderWriteStatus (*FLAC__StreamDecoderWriteCallback)(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
Chris@1 683
Chris@1 684 /** Signature for the metadata callback.
Chris@1 685 *
Chris@1 686 * A function pointer matching this signature must be passed to one of
Chris@1 687 * the FLAC__stream_decoder_init_*() functions.
Chris@1 688 * The supplied function will be called when the decoder has decoded a
Chris@1 689 * metadata block. In a valid FLAC file there will always be one
Chris@1 690 * \c STREAMINFO block, followed by zero or more other metadata blocks.
Chris@1 691 * These will be supplied by the decoder in the same order as they
Chris@1 692 * appear in the stream and always before the first audio frame (i.e.
Chris@1 693 * write callback). The metadata block that is passed in must not be
Chris@1 694 * modified, and it doesn't live beyond the callback, so you should make
Chris@1 695 * a copy of it with FLAC__metadata_object_clone() if you will need it
Chris@1 696 * elsewhere. Since metadata blocks can potentially be large, by
Chris@1 697 * default the decoder only calls the metadata callback for the
Chris@1 698 * \c STREAMINFO block; you can instruct the decoder to pass or filter
Chris@1 699 * other blocks with FLAC__stream_decoder_set_metadata_*() calls.
Chris@1 700 *
Chris@1 701 * \note In general, FLAC__StreamDecoder functions which change the
Chris@1 702 * state should not be called on the \a decoder while in the callback.
Chris@1 703 *
Chris@1 704 * \param decoder The decoder instance calling the callback.
Chris@1 705 * \param metadata The decoded metadata block.
Chris@1 706 * \param client_data The callee's client data set through
Chris@1 707 * FLAC__stream_decoder_init_*().
Chris@1 708 */
Chris@1 709 typedef void (*FLAC__StreamDecoderMetadataCallback)(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
Chris@1 710
Chris@1 711 /** Signature for the error callback.
Chris@1 712 *
Chris@1 713 * A function pointer matching this signature must be passed to one of
Chris@1 714 * the FLAC__stream_decoder_init_*() functions.
Chris@1 715 * The supplied function will be called whenever an error occurs during
Chris@1 716 * decoding.
Chris@1 717 *
Chris@1 718 * \note In general, FLAC__StreamDecoder functions which change the
Chris@1 719 * state should not be called on the \a decoder while in the callback.
Chris@1 720 *
Chris@1 721 * \param decoder The decoder instance calling the callback.
Chris@1 722 * \param status The error encountered by the decoder.
Chris@1 723 * \param client_data The callee's client data set through
Chris@1 724 * FLAC__stream_decoder_init_*().
Chris@1 725 */
Chris@1 726 typedef void (*FLAC__StreamDecoderErrorCallback)(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
Chris@1 727
Chris@1 728
Chris@1 729 /***********************************************************************
Chris@1 730 *
Chris@1 731 * Class constructor/destructor
Chris@1 732 *
Chris@1 733 ***********************************************************************/
Chris@1 734
Chris@1 735 /** Create a new stream decoder instance. The instance is created with
Chris@1 736 * default settings; see the individual FLAC__stream_decoder_set_*()
Chris@1 737 * functions for each setting's default.
Chris@1 738 *
Chris@1 739 * \retval FLAC__StreamDecoder*
Chris@1 740 * \c NULL if there was an error allocating memory, else the new instance.
Chris@1 741 */
Chris@1 742 FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void);
Chris@1 743
Chris@1 744 /** Free a decoder instance. Deletes the object pointed to by \a decoder.
Chris@1 745 *
Chris@1 746 * \param decoder A pointer to an existing decoder.
Chris@1 747 * \assert
Chris@1 748 * \code decoder != NULL \endcode
Chris@1 749 */
Chris@1 750 FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder);
Chris@1 751
Chris@1 752
Chris@1 753 /***********************************************************************
Chris@1 754 *
Chris@1 755 * Public class method prototypes
Chris@1 756 *
Chris@1 757 ***********************************************************************/
Chris@1 758
Chris@1 759 /** Set the serial number for the FLAC stream within the Ogg container.
Chris@1 760 * The default behavior is to use the serial number of the first Ogg
Chris@1 761 * page. Setting a serial number here will explicitly specify which
Chris@1 762 * stream is to be decoded.
Chris@1 763 *
Chris@1 764 * \note
Chris@1 765 * This does not need to be set for native FLAC decoding.
Chris@1 766 *
Chris@1 767 * \default \c use serial number of first page
Chris@1 768 * \param decoder A decoder instance to set.
Chris@1 769 * \param serial_number See above.
Chris@1 770 * \assert
Chris@1 771 * \code decoder != NULL \endcode
Chris@1 772 * \retval FLAC__bool
Chris@1 773 * \c false if the decoder is already initialized, else \c true.
Chris@1 774 */
Chris@1 775 FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long serial_number);
Chris@1 776
Chris@1 777 /** Set the "MD5 signature checking" flag. If \c true, the decoder will
Chris@1 778 * compute the MD5 signature of the unencoded audio data while decoding
Chris@1 779 * and compare it to the signature from the STREAMINFO block, if it
Chris@1 780 * exists, during FLAC__stream_decoder_finish().
Chris@1 781 *
Chris@1 782 * MD5 signature checking will be turned off (until the next
Chris@1 783 * FLAC__stream_decoder_reset()) if there is no signature in the
Chris@1 784 * STREAMINFO block or when a seek is attempted.
Chris@1 785 *
Chris@1 786 * Clients that do not use the MD5 check should leave this off to speed
Chris@1 787 * up decoding.
Chris@1 788 *
Chris@1 789 * \default \c false
Chris@1 790 * \param decoder A decoder instance to set.
Chris@1 791 * \param value Flag value (see above).
Chris@1 792 * \assert
Chris@1 793 * \code decoder != NULL \endcode
Chris@1 794 * \retval FLAC__bool
Chris@1 795 * \c false if the decoder is already initialized, else \c true.
Chris@1 796 */
Chris@1 797 FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value);
Chris@1 798
Chris@1 799 /** Direct the decoder to pass on all metadata blocks of type \a type.
Chris@1 800 *
Chris@1 801 * \default By default, only the \c STREAMINFO block is returned via the
Chris@1 802 * metadata callback.
Chris@1 803 * \param decoder A decoder instance to set.
Chris@1 804 * \param type See above.
Chris@1 805 * \assert
Chris@1 806 * \code decoder != NULL \endcode
Chris@1 807 * \a type is valid
Chris@1 808 * \retval FLAC__bool
Chris@1 809 * \c false if the decoder is already initialized, else \c true.
Chris@1 810 */
Chris@1 811 FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type);
Chris@1 812
Chris@1 813 /** Direct the decoder to pass on all APPLICATION metadata blocks of the
Chris@1 814 * given \a id.
Chris@1 815 *
Chris@1 816 * \default By default, only the \c STREAMINFO block is returned via the
Chris@1 817 * metadata callback.
Chris@1 818 * \param decoder A decoder instance to set.
Chris@1 819 * \param id See above.
Chris@1 820 * \assert
Chris@1 821 * \code decoder != NULL \endcode
Chris@1 822 * \code id != NULL \endcode
Chris@1 823 * \retval FLAC__bool
Chris@1 824 * \c false if the decoder is already initialized, else \c true.
Chris@1 825 */
Chris@1 826 FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]);
Chris@1 827
Chris@1 828 /** Direct the decoder to pass on all metadata blocks of any type.
Chris@1 829 *
Chris@1 830 * \default By default, only the \c STREAMINFO block is returned via the
Chris@1 831 * metadata callback.
Chris@1 832 * \param decoder A decoder instance to set.
Chris@1 833 * \assert
Chris@1 834 * \code decoder != NULL \endcode
Chris@1 835 * \retval FLAC__bool
Chris@1 836 * \c false if the decoder is already initialized, else \c true.
Chris@1 837 */
Chris@1 838 FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder);
Chris@1 839
Chris@1 840 /** Direct the decoder to filter out all metadata blocks of type \a type.
Chris@1 841 *
Chris@1 842 * \default By default, only the \c STREAMINFO block is returned via the
Chris@1 843 * metadata callback.
Chris@1 844 * \param decoder A decoder instance to set.
Chris@1 845 * \param type See above.
Chris@1 846 * \assert
Chris@1 847 * \code decoder != NULL \endcode
Chris@1 848 * \a type is valid
Chris@1 849 * \retval FLAC__bool
Chris@1 850 * \c false if the decoder is already initialized, else \c true.
Chris@1 851 */
Chris@1 852 FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type);
Chris@1 853
Chris@1 854 /** Direct the decoder to filter out all APPLICATION metadata blocks of
Chris@1 855 * the given \a id.
Chris@1 856 *
Chris@1 857 * \default By default, only the \c STREAMINFO block is returned via the
Chris@1 858 * metadata callback.
Chris@1 859 * \param decoder A decoder instance to set.
Chris@1 860 * \param id See above.
Chris@1 861 * \assert
Chris@1 862 * \code decoder != NULL \endcode
Chris@1 863 * \code id != NULL \endcode
Chris@1 864 * \retval FLAC__bool
Chris@1 865 * \c false if the decoder is already initialized, else \c true.
Chris@1 866 */
Chris@1 867 FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]);
Chris@1 868
Chris@1 869 /** Direct the decoder to filter out all metadata blocks of any type.
Chris@1 870 *
Chris@1 871 * \default By default, only the \c STREAMINFO block is returned via the
Chris@1 872 * metadata callback.
Chris@1 873 * \param decoder A decoder instance to set.
Chris@1 874 * \assert
Chris@1 875 * \code decoder != NULL \endcode
Chris@1 876 * \retval FLAC__bool
Chris@1 877 * \c false if the decoder is already initialized, else \c true.
Chris@1 878 */
Chris@1 879 FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder);
Chris@1 880
Chris@1 881 /** Get the current decoder state.
Chris@1 882 *
Chris@1 883 * \param decoder A decoder instance to query.
Chris@1 884 * \assert
Chris@1 885 * \code decoder != NULL \endcode
Chris@1 886 * \retval FLAC__StreamDecoderState
Chris@1 887 * The current decoder state.
Chris@1 888 */
Chris@1 889 FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder);
Chris@1 890
Chris@1 891 /** Get the current decoder state as a C string.
Chris@1 892 *
Chris@1 893 * \param decoder A decoder instance to query.
Chris@1 894 * \assert
Chris@1 895 * \code decoder != NULL \endcode
Chris@1 896 * \retval const char *
Chris@1 897 * The decoder state as a C string. Do not modify the contents.
Chris@1 898 */
Chris@1 899 FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder);
Chris@1 900
Chris@1 901 /** Get the "MD5 signature checking" flag.
Chris@1 902 * This is the value of the setting, not whether or not the decoder is
Chris@1 903 * currently checking the MD5 (remember, it can be turned off automatically
Chris@1 904 * by a seek). When the decoder is reset the flag will be restored to the
Chris@1 905 * value returned by this function.
Chris@1 906 *
Chris@1 907 * \param decoder A decoder instance to query.
Chris@1 908 * \assert
Chris@1 909 * \code decoder != NULL \endcode
Chris@1 910 * \retval FLAC__bool
Chris@1 911 * See above.
Chris@1 912 */
Chris@1 913 FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder);
Chris@1 914
Chris@1 915 /** Get the total number of samples in the stream being decoded.
Chris@1 916 * Will only be valid after decoding has started and will contain the
Chris@1 917 * value from the \c STREAMINFO block. A value of \c 0 means "unknown".
Chris@1 918 *
Chris@1 919 * \param decoder A decoder instance to query.
Chris@1 920 * \assert
Chris@1 921 * \code decoder != NULL \endcode
Chris@1 922 * \retval unsigned
Chris@1 923 * See above.
Chris@1 924 */
Chris@1 925 FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder);
Chris@1 926
Chris@1 927 /** Get the current number of channels in the stream being decoded.
Chris@1 928 * Will only be valid after decoding has started and will contain the
Chris@1 929 * value from the most recently decoded frame header.
Chris@1 930 *
Chris@1 931 * \param decoder A decoder instance to query.
Chris@1 932 * \assert
Chris@1 933 * \code decoder != NULL \endcode
Chris@1 934 * \retval unsigned
Chris@1 935 * See above.
Chris@1 936 */
Chris@1 937 FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder);
Chris@1 938
Chris@1 939 /** Get the current channel assignment in the stream being decoded.
Chris@1 940 * Will only be valid after decoding has started and will contain the
Chris@1 941 * value from the most recently decoded frame header.
Chris@1 942 *
Chris@1 943 * \param decoder A decoder instance to query.
Chris@1 944 * \assert
Chris@1 945 * \code decoder != NULL \endcode
Chris@1 946 * \retval FLAC__ChannelAssignment
Chris@1 947 * See above.
Chris@1 948 */
Chris@1 949 FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder);
Chris@1 950
Chris@1 951 /** Get the current sample resolution in the stream being decoded.
Chris@1 952 * Will only be valid after decoding has started and will contain the
Chris@1 953 * value from the most recently decoded frame header.
Chris@1 954 *
Chris@1 955 * \param decoder A decoder instance to query.
Chris@1 956 * \assert
Chris@1 957 * \code decoder != NULL \endcode
Chris@1 958 * \retval unsigned
Chris@1 959 * See above.
Chris@1 960 */
Chris@1 961 FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder);
Chris@1 962
Chris@1 963 /** Get the current sample rate in Hz of the stream being decoded.
Chris@1 964 * Will only be valid after decoding has started and will contain the
Chris@1 965 * value from the most recently decoded frame header.
Chris@1 966 *
Chris@1 967 * \param decoder A decoder instance to query.
Chris@1 968 * \assert
Chris@1 969 * \code decoder != NULL \endcode
Chris@1 970 * \retval unsigned
Chris@1 971 * See above.
Chris@1 972 */
Chris@1 973 FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder);
Chris@1 974
Chris@1 975 /** Get the current blocksize of the stream being decoded.
Chris@1 976 * Will only be valid after decoding has started and will contain the
Chris@1 977 * value from the most recently decoded frame header.
Chris@1 978 *
Chris@1 979 * \param decoder A decoder instance to query.
Chris@1 980 * \assert
Chris@1 981 * \code decoder != NULL \endcode
Chris@1 982 * \retval unsigned
Chris@1 983 * See above.
Chris@1 984 */
Chris@1 985 FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder);
Chris@1 986
Chris@1 987 /** Returns the decoder's current read position within the stream.
Chris@1 988 * The position is the byte offset from the start of the stream.
Chris@1 989 * Bytes before this position have been fully decoded. Note that
Chris@1 990 * there may still be undecoded bytes in the decoder's read FIFO.
Chris@1 991 * The returned position is correct even after a seek.
Chris@1 992 *
Chris@1 993 * \warning This function currently only works for native FLAC,
Chris@1 994 * not Ogg FLAC streams.
Chris@1 995 *
Chris@1 996 * \param decoder A decoder instance to query.
Chris@1 997 * \param position Address at which to return the desired position.
Chris@1 998 * \assert
Chris@1 999 * \code decoder != NULL \endcode
Chris@1 1000 * \code position != NULL \endcode
Chris@1 1001 * \retval FLAC__bool
Chris@1 1002 * \c true if successful, \c false if the stream is not native FLAC,
Chris@1 1003 * or there was an error from the 'tell' callback or it returned
Chris@1 1004 * \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED.
Chris@1 1005 */
Chris@1 1006 FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position);
Chris@1 1007
Chris@1 1008 /** Initialize the decoder instance to decode native FLAC streams.
Chris@1 1009 *
Chris@1 1010 * This flavor of initialization sets up the decoder to decode from a
Chris@1 1011 * native FLAC stream. I/O is performed via callbacks to the client.
Chris@1 1012 * For decoding from a plain file via filename or open FILE*,
Chris@1 1013 * FLAC__stream_decoder_init_file() and FLAC__stream_decoder_init_FILE()
Chris@1 1014 * provide a simpler interface.
Chris@1 1015 *
Chris@1 1016 * This function should be called after FLAC__stream_decoder_new() and
Chris@1 1017 * FLAC__stream_decoder_set_*() but before any of the
Chris@1 1018 * FLAC__stream_decoder_process_*() functions. Will set and return the
Chris@1 1019 * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA
Chris@1 1020 * if initialization succeeded.
Chris@1 1021 *
Chris@1 1022 * \param decoder An uninitialized decoder instance.
Chris@1 1023 * \param read_callback See FLAC__StreamDecoderReadCallback. This
Chris@1 1024 * pointer must not be \c NULL.
Chris@1 1025 * \param seek_callback See FLAC__StreamDecoderSeekCallback. This
Chris@1 1026 * pointer may be \c NULL if seeking is not
Chris@1 1027 * supported. If \a seek_callback is not \c NULL then a
Chris@1 1028 * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied.
Chris@1 1029 * Alternatively, a dummy seek callback that just
Chris@1 1030 * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED
Chris@1 1031 * may also be supplied, all though this is slightly
Chris@1 1032 * less efficient for the decoder.
Chris@1 1033 * \param tell_callback See FLAC__StreamDecoderTellCallback. This
Chris@1 1034 * pointer may be \c NULL if not supported by the client. If
Chris@1 1035 * \a seek_callback is not \c NULL then a
Chris@1 1036 * \a tell_callback must also be supplied.
Chris@1 1037 * Alternatively, a dummy tell callback that just
Chris@1 1038 * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED
Chris@1 1039 * may also be supplied, all though this is slightly
Chris@1 1040 * less efficient for the decoder.
Chris@1 1041 * \param length_callback See FLAC__StreamDecoderLengthCallback. This
Chris@1 1042 * pointer may be \c NULL if not supported by the client. If
Chris@1 1043 * \a seek_callback is not \c NULL then a
Chris@1 1044 * \a length_callback must also be supplied.
Chris@1 1045 * Alternatively, a dummy length callback that just
Chris@1 1046 * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED
Chris@1 1047 * may also be supplied, all though this is slightly
Chris@1 1048 * less efficient for the decoder.
Chris@1 1049 * \param eof_callback See FLAC__StreamDecoderEofCallback. This
Chris@1 1050 * pointer may be \c NULL if not supported by the client. If
Chris@1 1051 * \a seek_callback is not \c NULL then a
Chris@1 1052 * \a eof_callback must also be supplied.
Chris@1 1053 * Alternatively, a dummy length callback that just
Chris@1 1054 * returns \c false
Chris@1 1055 * may also be supplied, all though this is slightly
Chris@1 1056 * less efficient for the decoder.
Chris@1 1057 * \param write_callback See FLAC__StreamDecoderWriteCallback. This
Chris@1 1058 * pointer must not be \c NULL.
Chris@1 1059 * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This
Chris@1 1060 * pointer may be \c NULL if the callback is not
Chris@1 1061 * desired.
Chris@1 1062 * \param error_callback See FLAC__StreamDecoderErrorCallback. This
Chris@1 1063 * pointer must not be \c NULL.
Chris@1 1064 * \param client_data This value will be supplied to callbacks in their
Chris@1 1065 * \a client_data argument.
Chris@1 1066 * \assert
Chris@1 1067 * \code decoder != NULL \endcode
Chris@1 1068 * \retval FLAC__StreamDecoderInitStatus
Chris@1 1069 * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful;
Chris@1 1070 * see FLAC__StreamDecoderInitStatus for the meanings of other return values.
Chris@1 1071 */
Chris@1 1072 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream(
Chris@1 1073 FLAC__StreamDecoder *decoder,
Chris@1 1074 FLAC__StreamDecoderReadCallback read_callback,
Chris@1 1075 FLAC__StreamDecoderSeekCallback seek_callback,
Chris@1 1076 FLAC__StreamDecoderTellCallback tell_callback,
Chris@1 1077 FLAC__StreamDecoderLengthCallback length_callback,
Chris@1 1078 FLAC__StreamDecoderEofCallback eof_callback,
Chris@1 1079 FLAC__StreamDecoderWriteCallback write_callback,
Chris@1 1080 FLAC__StreamDecoderMetadataCallback metadata_callback,
Chris@1 1081 FLAC__StreamDecoderErrorCallback error_callback,
Chris@1 1082 void *client_data
Chris@1 1083 );
Chris@1 1084
Chris@1 1085 /** Initialize the decoder instance to decode Ogg FLAC streams.
Chris@1 1086 *
Chris@1 1087 * This flavor of initialization sets up the decoder to decode from a
Chris@1 1088 * FLAC stream in an Ogg container. I/O is performed via callbacks to the
Chris@1 1089 * client. For decoding from a plain file via filename or open FILE*,
Chris@1 1090 * FLAC__stream_decoder_init_ogg_file() and FLAC__stream_decoder_init_ogg_FILE()
Chris@1 1091 * provide a simpler interface.
Chris@1 1092 *
Chris@1 1093 * This function should be called after FLAC__stream_decoder_new() and
Chris@1 1094 * FLAC__stream_decoder_set_*() but before any of the
Chris@1 1095 * FLAC__stream_decoder_process_*() functions. Will set and return the
Chris@1 1096 * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA
Chris@1 1097 * if initialization succeeded.
Chris@1 1098 *
Chris@1 1099 * \note Support for Ogg FLAC in the library is optional. If this
Chris@1 1100 * library has been built without support for Ogg FLAC, this function
Chris@1 1101 * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER.
Chris@1 1102 *
Chris@1 1103 * \param decoder An uninitialized decoder instance.
Chris@1 1104 * \param read_callback See FLAC__StreamDecoderReadCallback. This
Chris@1 1105 * pointer must not be \c NULL.
Chris@1 1106 * \param seek_callback See FLAC__StreamDecoderSeekCallback. This
Chris@1 1107 * pointer may be \c NULL if seeking is not
Chris@1 1108 * supported. If \a seek_callback is not \c NULL then a
Chris@1 1109 * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied.
Chris@1 1110 * Alternatively, a dummy seek callback that just
Chris@1 1111 * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED
Chris@1 1112 * may also be supplied, all though this is slightly
Chris@1 1113 * less efficient for the decoder.
Chris@1 1114 * \param tell_callback See FLAC__StreamDecoderTellCallback. This
Chris@1 1115 * pointer may be \c NULL if not supported by the client. If
Chris@1 1116 * \a seek_callback is not \c NULL then a
Chris@1 1117 * \a tell_callback must also be supplied.
Chris@1 1118 * Alternatively, a dummy tell callback that just
Chris@1 1119 * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED
Chris@1 1120 * may also be supplied, all though this is slightly
Chris@1 1121 * less efficient for the decoder.
Chris@1 1122 * \param length_callback See FLAC__StreamDecoderLengthCallback. This
Chris@1 1123 * pointer may be \c NULL if not supported by the client. If
Chris@1 1124 * \a seek_callback is not \c NULL then a
Chris@1 1125 * \a length_callback must also be supplied.
Chris@1 1126 * Alternatively, a dummy length callback that just
Chris@1 1127 * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED
Chris@1 1128 * may also be supplied, all though this is slightly
Chris@1 1129 * less efficient for the decoder.
Chris@1 1130 * \param eof_callback See FLAC__StreamDecoderEofCallback. This
Chris@1 1131 * pointer may be \c NULL if not supported by the client. If
Chris@1 1132 * \a seek_callback is not \c NULL then a
Chris@1 1133 * \a eof_callback must also be supplied.
Chris@1 1134 * Alternatively, a dummy length callback that just
Chris@1 1135 * returns \c false
Chris@1 1136 * may also be supplied, all though this is slightly
Chris@1 1137 * less efficient for the decoder.
Chris@1 1138 * \param write_callback See FLAC__StreamDecoderWriteCallback. This
Chris@1 1139 * pointer must not be \c NULL.
Chris@1 1140 * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This
Chris@1 1141 * pointer may be \c NULL if the callback is not
Chris@1 1142 * desired.
Chris@1 1143 * \param error_callback See FLAC__StreamDecoderErrorCallback. This
Chris@1 1144 * pointer must not be \c NULL.
Chris@1 1145 * \param client_data This value will be supplied to callbacks in their
Chris@1 1146 * \a client_data argument.
Chris@1 1147 * \assert
Chris@1 1148 * \code decoder != NULL \endcode
Chris@1 1149 * \retval FLAC__StreamDecoderInitStatus
Chris@1 1150 * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful;
Chris@1 1151 * see FLAC__StreamDecoderInitStatus for the meanings of other return values.
Chris@1 1152 */
Chris@1 1153 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream(
Chris@1 1154 FLAC__StreamDecoder *decoder,
Chris@1 1155 FLAC__StreamDecoderReadCallback read_callback,
Chris@1 1156 FLAC__StreamDecoderSeekCallback seek_callback,
Chris@1 1157 FLAC__StreamDecoderTellCallback tell_callback,
Chris@1 1158 FLAC__StreamDecoderLengthCallback length_callback,
Chris@1 1159 FLAC__StreamDecoderEofCallback eof_callback,
Chris@1 1160 FLAC__StreamDecoderWriteCallback write_callback,
Chris@1 1161 FLAC__StreamDecoderMetadataCallback metadata_callback,
Chris@1 1162 FLAC__StreamDecoderErrorCallback error_callback,
Chris@1 1163 void *client_data
Chris@1 1164 );
Chris@1 1165
Chris@1 1166 /** Initialize the decoder instance to decode native FLAC files.
Chris@1 1167 *
Chris@1 1168 * This flavor of initialization sets up the decoder to decode from a
Chris@1 1169 * plain native FLAC file. For non-stdio streams, you must use
Chris@1 1170 * FLAC__stream_decoder_init_stream() and provide callbacks for the I/O.
Chris@1 1171 *
Chris@1 1172 * This function should be called after FLAC__stream_decoder_new() and
Chris@1 1173 * FLAC__stream_decoder_set_*() but before any of the
Chris@1 1174 * FLAC__stream_decoder_process_*() functions. Will set and return the
Chris@1 1175 * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA
Chris@1 1176 * if initialization succeeded.
Chris@1 1177 *
Chris@1 1178 * \param decoder An uninitialized decoder instance.
Chris@1 1179 * \param file An open FLAC file. The file should have been
Chris@1 1180 * opened with mode \c "rb" and rewound. The file
Chris@1 1181 * becomes owned by the decoder and should not be
Chris@1 1182 * manipulated by the client while decoding.
Chris@1 1183 * Unless \a file is \c stdin, it will be closed
Chris@1 1184 * when FLAC__stream_decoder_finish() is called.
Chris@1 1185 * Note however that seeking will not work when
Chris@1 1186 * decoding from \c stdout since it is not seekable.
Chris@1 1187 * \param write_callback See FLAC__StreamDecoderWriteCallback. This
Chris@1 1188 * pointer must not be \c NULL.
Chris@1 1189 * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This
Chris@1 1190 * pointer may be \c NULL if the callback is not
Chris@1 1191 * desired.
Chris@1 1192 * \param error_callback See FLAC__StreamDecoderErrorCallback. This
Chris@1 1193 * pointer must not be \c NULL.
Chris@1 1194 * \param client_data This value will be supplied to callbacks in their
Chris@1 1195 * \a client_data argument.
Chris@1 1196 * \assert
Chris@1 1197 * \code decoder != NULL \endcode
Chris@1 1198 * \code file != NULL \endcode
Chris@1 1199 * \retval FLAC__StreamDecoderInitStatus
Chris@1 1200 * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful;
Chris@1 1201 * see FLAC__StreamDecoderInitStatus for the meanings of other return values.
Chris@1 1202 */
Chris@1 1203 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE(
Chris@1 1204 FLAC__StreamDecoder *decoder,
Chris@1 1205 FILE *file,
Chris@1 1206 FLAC__StreamDecoderWriteCallback write_callback,
Chris@1 1207 FLAC__StreamDecoderMetadataCallback metadata_callback,
Chris@1 1208 FLAC__StreamDecoderErrorCallback error_callback,
Chris@1 1209 void *client_data
Chris@1 1210 );
Chris@1 1211
Chris@1 1212 /** Initialize the decoder instance to decode Ogg FLAC files.
Chris@1 1213 *
Chris@1 1214 * This flavor of initialization sets up the decoder to decode from a
Chris@1 1215 * plain Ogg FLAC file. For non-stdio streams, you must use
Chris@1 1216 * FLAC__stream_decoder_init_ogg_stream() and provide callbacks for the I/O.
Chris@1 1217 *
Chris@1 1218 * This function should be called after FLAC__stream_decoder_new() and
Chris@1 1219 * FLAC__stream_decoder_set_*() but before any of the
Chris@1 1220 * FLAC__stream_decoder_process_*() functions. Will set and return the
Chris@1 1221 * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA
Chris@1 1222 * if initialization succeeded.
Chris@1 1223 *
Chris@1 1224 * \note Support for Ogg FLAC in the library is optional. If this
Chris@1 1225 * library has been built without support for Ogg FLAC, this function
Chris@1 1226 * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER.
Chris@1 1227 *
Chris@1 1228 * \param decoder An uninitialized decoder instance.
Chris@1 1229 * \param file An open FLAC file. The file should have been
Chris@1 1230 * opened with mode \c "rb" and rewound. The file
Chris@1 1231 * becomes owned by the decoder and should not be
Chris@1 1232 * manipulated by the client while decoding.
Chris@1 1233 * Unless \a file is \c stdin, it will be closed
Chris@1 1234 * when FLAC__stream_decoder_finish() is called.
Chris@1 1235 * Note however that seeking will not work when
Chris@1 1236 * decoding from \c stdout since it is not seekable.
Chris@1 1237 * \param write_callback See FLAC__StreamDecoderWriteCallback. This
Chris@1 1238 * pointer must not be \c NULL.
Chris@1 1239 * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This
Chris@1 1240 * pointer may be \c NULL if the callback is not
Chris@1 1241 * desired.
Chris@1 1242 * \param error_callback See FLAC__StreamDecoderErrorCallback. This
Chris@1 1243 * pointer must not be \c NULL.
Chris@1 1244 * \param client_data This value will be supplied to callbacks in their
Chris@1 1245 * \a client_data argument.
Chris@1 1246 * \assert
Chris@1 1247 * \code decoder != NULL \endcode
Chris@1 1248 * \code file != NULL \endcode
Chris@1 1249 * \retval FLAC__StreamDecoderInitStatus
Chris@1 1250 * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful;
Chris@1 1251 * see FLAC__StreamDecoderInitStatus for the meanings of other return values.
Chris@1 1252 */
Chris@1 1253 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE(
Chris@1 1254 FLAC__StreamDecoder *decoder,
Chris@1 1255 FILE *file,
Chris@1 1256 FLAC__StreamDecoderWriteCallback write_callback,
Chris@1 1257 FLAC__StreamDecoderMetadataCallback metadata_callback,
Chris@1 1258 FLAC__StreamDecoderErrorCallback error_callback,
Chris@1 1259 void *client_data
Chris@1 1260 );
Chris@1 1261
Chris@1 1262 /** Initialize the decoder instance to decode native FLAC files.
Chris@1 1263 *
Chris@1 1264 * This flavor of initialization sets up the decoder to decode from a plain
Chris@1 1265 * native FLAC file. If POSIX fopen() semantics are not sufficient, (for
Chris@1 1266 * example, with Unicode filenames on Windows), you must use
Chris@1 1267 * FLAC__stream_decoder_init_FILE(), or FLAC__stream_decoder_init_stream()
Chris@1 1268 * and provide callbacks for the I/O.
Chris@1 1269 *
Chris@1 1270 * This function should be called after FLAC__stream_decoder_new() and
Chris@1 1271 * FLAC__stream_decoder_set_*() but before any of the
Chris@1 1272 * FLAC__stream_decoder_process_*() functions. Will set and return the
Chris@1 1273 * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA
Chris@1 1274 * if initialization succeeded.
Chris@1 1275 *
Chris@1 1276 * \param decoder An uninitialized decoder instance.
Chris@1 1277 * \param filename The name of the file to decode from. The file will
Chris@1 1278 * be opened with fopen(). Use \c NULL to decode from
Chris@1 1279 * \c stdin. Note that \c stdin is not seekable.
Chris@1 1280 * \param write_callback See FLAC__StreamDecoderWriteCallback. This
Chris@1 1281 * pointer must not be \c NULL.
Chris@1 1282 * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This
Chris@1 1283 * pointer may be \c NULL if the callback is not
Chris@1 1284 * desired.
Chris@1 1285 * \param error_callback See FLAC__StreamDecoderErrorCallback. This
Chris@1 1286 * pointer must not be \c NULL.
Chris@1 1287 * \param client_data This value will be supplied to callbacks in their
Chris@1 1288 * \a client_data argument.
Chris@1 1289 * \assert
Chris@1 1290 * \code decoder != NULL \endcode
Chris@1 1291 * \retval FLAC__StreamDecoderInitStatus
Chris@1 1292 * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful;
Chris@1 1293 * see FLAC__StreamDecoderInitStatus for the meanings of other return values.
Chris@1 1294 */
Chris@1 1295 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file(
Chris@1 1296 FLAC__StreamDecoder *decoder,
Chris@1 1297 const char *filename,
Chris@1 1298 FLAC__StreamDecoderWriteCallback write_callback,
Chris@1 1299 FLAC__StreamDecoderMetadataCallback metadata_callback,
Chris@1 1300 FLAC__StreamDecoderErrorCallback error_callback,
Chris@1 1301 void *client_data
Chris@1 1302 );
Chris@1 1303
Chris@1 1304 /** Initialize the decoder instance to decode Ogg FLAC files.
Chris@1 1305 *
Chris@1 1306 * This flavor of initialization sets up the decoder to decode from a plain
Chris@1 1307 * Ogg FLAC file. If POSIX fopen() semantics are not sufficient, (for
Chris@1 1308 * example, with Unicode filenames on Windows), you must use
Chris@1 1309 * FLAC__stream_decoder_init_ogg_FILE(), or FLAC__stream_decoder_init_ogg_stream()
Chris@1 1310 * and provide callbacks for the I/O.
Chris@1 1311 *
Chris@1 1312 * This function should be called after FLAC__stream_decoder_new() and
Chris@1 1313 * FLAC__stream_decoder_set_*() but before any of the
Chris@1 1314 * FLAC__stream_decoder_process_*() functions. Will set and return the
Chris@1 1315 * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA
Chris@1 1316 * if initialization succeeded.
Chris@1 1317 *
Chris@1 1318 * \note Support for Ogg FLAC in the library is optional. If this
Chris@1 1319 * library has been built without support for Ogg FLAC, this function
Chris@1 1320 * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER.
Chris@1 1321 *
Chris@1 1322 * \param decoder An uninitialized decoder instance.
Chris@1 1323 * \param filename The name of the file to decode from. The file will
Chris@1 1324 * be opened with fopen(). Use \c NULL to decode from
Chris@1 1325 * \c stdin. Note that \c stdin is not seekable.
Chris@1 1326 * \param write_callback See FLAC__StreamDecoderWriteCallback. This
Chris@1 1327 * pointer must not be \c NULL.
Chris@1 1328 * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This
Chris@1 1329 * pointer may be \c NULL if the callback is not
Chris@1 1330 * desired.
Chris@1 1331 * \param error_callback See FLAC__StreamDecoderErrorCallback. This
Chris@1 1332 * pointer must not be \c NULL.
Chris@1 1333 * \param client_data This value will be supplied to callbacks in their
Chris@1 1334 * \a client_data argument.
Chris@1 1335 * \assert
Chris@1 1336 * \code decoder != NULL \endcode
Chris@1 1337 * \retval FLAC__StreamDecoderInitStatus
Chris@1 1338 * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful;
Chris@1 1339 * see FLAC__StreamDecoderInitStatus for the meanings of other return values.
Chris@1 1340 */
Chris@1 1341 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file(
Chris@1 1342 FLAC__StreamDecoder *decoder,
Chris@1 1343 const char *filename,
Chris@1 1344 FLAC__StreamDecoderWriteCallback write_callback,
Chris@1 1345 FLAC__StreamDecoderMetadataCallback metadata_callback,
Chris@1 1346 FLAC__StreamDecoderErrorCallback error_callback,
Chris@1 1347 void *client_data
Chris@1 1348 );
Chris@1 1349
Chris@1 1350 /** Finish the decoding process.
Chris@1 1351 * Flushes the decoding buffer, releases resources, resets the decoder
Chris@1 1352 * settings to their defaults, and returns the decoder state to
Chris@1 1353 * FLAC__STREAM_DECODER_UNINITIALIZED.
Chris@1 1354 *
Chris@1 1355 * In the event of a prematurely-terminated decode, it is not strictly
Chris@1 1356 * necessary to call this immediately before FLAC__stream_decoder_delete()
Chris@1 1357 * but it is good practice to match every FLAC__stream_decoder_init_*()
Chris@1 1358 * with a FLAC__stream_decoder_finish().
Chris@1 1359 *
Chris@1 1360 * \param decoder An uninitialized decoder instance.
Chris@1 1361 * \assert
Chris@1 1362 * \code decoder != NULL \endcode
Chris@1 1363 * \retval FLAC__bool
Chris@1 1364 * \c false if MD5 checking is on AND a STREAMINFO block was available
Chris@1 1365 * AND the MD5 signature in the STREAMINFO block was non-zero AND the
Chris@1 1366 * signature does not match the one computed by the decoder; else
Chris@1 1367 * \c true.
Chris@1 1368 */
Chris@1 1369 FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder);
Chris@1 1370
Chris@1 1371 /** Flush the stream input.
Chris@1 1372 * The decoder's input buffer will be cleared and the state set to
Chris@1 1373 * \c FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC. This will also turn
Chris@1 1374 * off MD5 checking.
Chris@1 1375 *
Chris@1 1376 * \param decoder A decoder instance.
Chris@1 1377 * \assert
Chris@1 1378 * \code decoder != NULL \endcode
Chris@1 1379 * \retval FLAC__bool
Chris@1 1380 * \c true if successful, else \c false if a memory allocation
Chris@1 1381 * error occurs (in which case the state will be set to
Chris@1 1382 * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR).
Chris@1 1383 */
Chris@1 1384 FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder);
Chris@1 1385
Chris@1 1386 /** Reset the decoding process.
Chris@1 1387 * The decoder's input buffer will be cleared and the state set to
Chris@1 1388 * \c FLAC__STREAM_DECODER_SEARCH_FOR_METADATA. This is similar to
Chris@1 1389 * FLAC__stream_decoder_finish() except that the settings are
Chris@1 1390 * preserved; there is no need to call FLAC__stream_decoder_init_*()
Chris@1 1391 * before decoding again. MD5 checking will be restored to its original
Chris@1 1392 * setting.
Chris@1 1393 *
Chris@1 1394 * If the decoder is seekable, or was initialized with
Chris@1 1395 * FLAC__stream_decoder_init*_FILE() or FLAC__stream_decoder_init*_file(),
Chris@1 1396 * the decoder will also attempt to seek to the beginning of the file.
Chris@1 1397 * If this rewind fails, this function will return \c false. It follows
Chris@1 1398 * that FLAC__stream_decoder_reset() cannot be used when decoding from
Chris@1 1399 * \c stdin.
Chris@1 1400 *
Chris@1 1401 * If the decoder was initialized with FLAC__stream_encoder_init*_stream()
Chris@1 1402 * and is not seekable (i.e. no seek callback was provided or the seek
Chris@1 1403 * callback returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED), it
Chris@1 1404 * is the duty of the client to start feeding data from the beginning of
Chris@1 1405 * the stream on the next FLAC__stream_decoder_process() or
Chris@1 1406 * FLAC__stream_decoder_process_interleaved() call.
Chris@1 1407 *
Chris@1 1408 * \param decoder A decoder instance.
Chris@1 1409 * \assert
Chris@1 1410 * \code decoder != NULL \endcode
Chris@1 1411 * \retval FLAC__bool
Chris@1 1412 * \c true if successful, else \c false if a memory allocation occurs
Chris@1 1413 * (in which case the state will be set to
Chris@1 1414 * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR) or a seek error
Chris@1 1415 * occurs (the state will be unchanged).
Chris@1 1416 */
Chris@1 1417 FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder);
Chris@1 1418
Chris@1 1419 /** Decode one metadata block or audio frame.
Chris@1 1420 * This version instructs the decoder to decode a either a single metadata
Chris@1 1421 * block or a single frame and stop, unless the callbacks return a fatal
Chris@1 1422 * error or the read callback returns
Chris@1 1423 * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM.
Chris@1 1424 *
Chris@1 1425 * As the decoder needs more input it will call the read callback.
Chris@1 1426 * Depending on what was decoded, the metadata or write callback will be
Chris@1 1427 * called with the decoded metadata block or audio frame.
Chris@1 1428 *
Chris@1 1429 * Unless there is a fatal read error or end of stream, this function
Chris@1 1430 * will return once one whole frame is decoded. In other words, if the
Chris@1 1431 * stream is not synchronized or points to a corrupt frame header, the
Chris@1 1432 * decoder will continue to try and resync until it gets to a valid
Chris@1 1433 * frame, then decode one frame, then return. If the decoder points to
Chris@1 1434 * a frame whose frame CRC in the frame footer does not match the
Chris@1 1435 * computed frame CRC, this function will issue a
Chris@1 1436 * FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH error to the
Chris@1 1437 * error callback, and return, having decoded one complete, although
Chris@1 1438 * corrupt, frame. (Such corrupted frames are sent as silence of the
Chris@1 1439 * correct length to the write callback.)
Chris@1 1440 *
Chris@1 1441 * \param decoder An initialized decoder instance.
Chris@1 1442 * \assert
Chris@1 1443 * \code decoder != NULL \endcode
Chris@1 1444 * \retval FLAC__bool
Chris@1 1445 * \c false if any fatal read, write, or memory allocation error
Chris@1 1446 * occurred (meaning decoding must stop), else \c true; for more
Chris@1 1447 * information about the decoder, check the decoder state with
Chris@1 1448 * FLAC__stream_decoder_get_state().
Chris@1 1449 */
Chris@1 1450 FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder);
Chris@1 1451
Chris@1 1452 /** Decode until the end of the metadata.
Chris@1 1453 * This version instructs the decoder to decode from the current position
Chris@1 1454 * and continue until all the metadata has been read, or until the
Chris@1 1455 * callbacks return a fatal error or the read callback returns
Chris@1 1456 * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM.
Chris@1 1457 *
Chris@1 1458 * As the decoder needs more input it will call the read callback.
Chris@1 1459 * As each metadata block is decoded, the metadata callback will be called
Chris@1 1460 * with the decoded metadata.
Chris@1 1461 *
Chris@1 1462 * \param decoder An initialized decoder instance.
Chris@1 1463 * \assert
Chris@1 1464 * \code decoder != NULL \endcode
Chris@1 1465 * \retval FLAC__bool
Chris@1 1466 * \c false if any fatal read, write, or memory allocation error
Chris@1 1467 * occurred (meaning decoding must stop), else \c true; for more
Chris@1 1468 * information about the decoder, check the decoder state with
Chris@1 1469 * FLAC__stream_decoder_get_state().
Chris@1 1470 */
Chris@1 1471 FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder);
Chris@1 1472
Chris@1 1473 /** Decode until the end of the stream.
Chris@1 1474 * This version instructs the decoder to decode from the current position
Chris@1 1475 * and continue until the end of stream (the read callback returns
Chris@1 1476 * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM), or until the
Chris@1 1477 * callbacks return a fatal error.
Chris@1 1478 *
Chris@1 1479 * As the decoder needs more input it will call the read callback.
Chris@1 1480 * As each metadata block and frame is decoded, the metadata or write
Chris@1 1481 * callback will be called with the decoded metadata or frame.
Chris@1 1482 *
Chris@1 1483 * \param decoder An initialized decoder instance.
Chris@1 1484 * \assert
Chris@1 1485 * \code decoder != NULL \endcode
Chris@1 1486 * \retval FLAC__bool
Chris@1 1487 * \c false if any fatal read, write, or memory allocation error
Chris@1 1488 * occurred (meaning decoding must stop), else \c true; for more
Chris@1 1489 * information about the decoder, check the decoder state with
Chris@1 1490 * FLAC__stream_decoder_get_state().
Chris@1 1491 */
Chris@1 1492 FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder);
Chris@1 1493
Chris@1 1494 /** Skip one audio frame.
Chris@1 1495 * This version instructs the decoder to 'skip' a single frame and stop,
Chris@1 1496 * unless the callbacks return a fatal error or the read callback returns
Chris@1 1497 * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM.
Chris@1 1498 *
Chris@1 1499 * The decoding flow is the same as what occurs when
Chris@1 1500 * FLAC__stream_decoder_process_single() is called to process an audio
Chris@1 1501 * frame, except that this function does not decode the parsed data into
Chris@1 1502 * PCM or call the write callback. The integrity of the frame is still
Chris@1 1503 * checked the same way as in the other process functions.
Chris@1 1504 *
Chris@1 1505 * This function will return once one whole frame is skipped, in the
Chris@1 1506 * same way that FLAC__stream_decoder_process_single() will return once
Chris@1 1507 * one whole frame is decoded.
Chris@1 1508 *
Chris@1 1509 * This function can be used in more quickly determining FLAC frame
Chris@1 1510 * boundaries when decoding of the actual data is not needed, for
Chris@1 1511 * example when an application is separating a FLAC stream into frames
Chris@1 1512 * for editing or storing in a container. To do this, the application
Chris@1 1513 * can use FLAC__stream_decoder_skip_single_frame() to quickly advance
Chris@1 1514 * to the next frame, then use
Chris@1 1515 * FLAC__stream_decoder_get_decode_position() to find the new frame
Chris@1 1516 * boundary.
Chris@1 1517 *
Chris@1 1518 * This function should only be called when the stream has advanced
Chris@1 1519 * past all the metadata, otherwise it will return \c false.
Chris@1 1520 *
Chris@1 1521 * \param decoder An initialized decoder instance not in a metadata
Chris@1 1522 * state.
Chris@1 1523 * \assert
Chris@1 1524 * \code decoder != NULL \endcode
Chris@1 1525 * \retval FLAC__bool
Chris@1 1526 * \c false if any fatal read, write, or memory allocation error
Chris@1 1527 * occurred (meaning decoding must stop), or if the decoder
Chris@1 1528 * is in the FLAC__STREAM_DECODER_SEARCH_FOR_METADATA or
Chris@1 1529 * FLAC__STREAM_DECODER_READ_METADATA state, else \c true; for more
Chris@1 1530 * information about the decoder, check the decoder state with
Chris@1 1531 * FLAC__stream_decoder_get_state().
Chris@1 1532 */
Chris@1 1533 FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder);
Chris@1 1534
Chris@1 1535 /** Flush the input and seek to an absolute sample.
Chris@1 1536 * Decoding will resume at the given sample. Note that because of
Chris@1 1537 * this, the next write callback may contain a partial block. The
Chris@1 1538 * client must support seeking the input or this function will fail
Chris@1 1539 * and return \c false. Furthermore, if the decoder state is
Chris@1 1540 * \c FLAC__STREAM_DECODER_SEEK_ERROR, then the decoder must be flushed
Chris@1 1541 * with FLAC__stream_decoder_flush() or reset with
Chris@1 1542 * FLAC__stream_decoder_reset() before decoding can continue.
Chris@1 1543 *
Chris@1 1544 * \param decoder A decoder instance.
Chris@1 1545 * \param sample The target sample number to seek to.
Chris@1 1546 * \assert
Chris@1 1547 * \code decoder != NULL \endcode
Chris@1 1548 * \retval FLAC__bool
Chris@1 1549 * \c true if successful, else \c false.
Chris@1 1550 */
Chris@1 1551 FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample);
Chris@1 1552
Chris@1 1553 /* \} */
Chris@1 1554
Chris@1 1555 #ifdef __cplusplus
Chris@1 1556 }
Chris@1 1557 #endif
Chris@1 1558
Chris@1 1559 #endif