cannam@86: cannam@86:
cannam@86:00001 /* libFLAC - Free Lossless Audio Codec library cannam@86: 00002 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson cannam@86: 00003 * cannam@86: 00004 * Redistribution and use in source and binary forms, with or without cannam@86: 00005 * modification, are permitted provided that the following conditions cannam@86: 00006 * are met: cannam@86: 00007 * cannam@86: 00008 * - Redistributions of source code must retain the above copyright cannam@86: 00009 * notice, this list of conditions and the following disclaimer. cannam@86: 00010 * cannam@86: 00011 * - Redistributions in binary form must reproduce the above copyright cannam@86: 00012 * notice, this list of conditions and the following disclaimer in the cannam@86: 00013 * documentation and/or other materials provided with the distribution. cannam@86: 00014 * cannam@86: 00015 * - Neither the name of the Xiph.org Foundation nor the names of its cannam@86: 00016 * contributors may be used to endorse or promote products derived from cannam@86: 00017 * this software without specific prior written permission. cannam@86: 00018 * cannam@86: 00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS cannam@86: 00020 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT cannam@86: 00021 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR cannam@86: 00022 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR cannam@86: 00023 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, cannam@86: 00024 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, cannam@86: 00025 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR cannam@86: 00026 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF cannam@86: 00027 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING cannam@86: 00028 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS cannam@86: 00029 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. cannam@86: 00030 */ cannam@86: 00031 cannam@86: 00032 #ifndef FLAC__STREAM_DECODER_H cannam@86: 00033 #define FLAC__STREAM_DECODER_H cannam@86: 00034 cannam@86: 00035 #include <stdio.h> /* for FILE */ cannam@86: 00036 #include "export.h" cannam@86: 00037 #include "format.h" cannam@86: 00038 cannam@86: 00039 #ifdef __cplusplus cannam@86: 00040 extern "C" { cannam@86: 00041 #endif cannam@86: 00042 cannam@86: 00043 cannam@86: 00201 typedef enum { cannam@86: 00202 cannam@86: 00203 FLAC__STREAM_DECODER_SEARCH_FOR_METADATA = 0, cannam@86: 00206 FLAC__STREAM_DECODER_READ_METADATA, cannam@86: 00209 FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC, cannam@86: 00214 FLAC__STREAM_DECODER_READ_FRAME, cannam@86: 00217 FLAC__STREAM_DECODER_END_OF_STREAM, cannam@86: 00220 FLAC__STREAM_DECODER_OGG_ERROR, cannam@86: 00223 FLAC__STREAM_DECODER_SEEK_ERROR, cannam@86: 00229 FLAC__STREAM_DECODER_ABORTED, cannam@86: 00232 FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR, cannam@86: 00237 FLAC__STREAM_DECODER_UNINITIALIZED cannam@86: 00243 } FLAC__StreamDecoderState; cannam@86: 00244 cannam@86: 00250 extern FLAC_API const char * const FLAC__StreamDecoderStateString[]; cannam@86: 00251 cannam@86: 00252 cannam@86: 00255 typedef enum { cannam@86: 00256 cannam@86: 00257 FLAC__STREAM_DECODER_INIT_STATUS_OK = 0, cannam@86: 00260 FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER, cannam@86: 00265 FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS, cannam@86: 00268 FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR, cannam@86: 00271 FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE, cannam@86: 00275 FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED cannam@86: 00281 } FLAC__StreamDecoderInitStatus; cannam@86: 00282 cannam@86: 00288 extern FLAC_API const char * const FLAC__StreamDecoderInitStatusString[]; cannam@86: 00289 cannam@86: 00290 cannam@86: 00293 typedef enum { cannam@86: 00294 cannam@86: 00295 FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, cannam@86: 00298 FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM, cannam@86: 00309 FLAC__STREAM_DECODER_READ_STATUS_ABORT cannam@86: 00312 } FLAC__StreamDecoderReadStatus; cannam@86: 00313 cannam@86: 00319 extern FLAC_API const char * const FLAC__StreamDecoderReadStatusString[]; cannam@86: 00320 cannam@86: 00321 cannam@86: 00324 typedef enum { cannam@86: 00325 cannam@86: 00326 FLAC__STREAM_DECODER_SEEK_STATUS_OK, cannam@86: 00329 FLAC__STREAM_DECODER_SEEK_STATUS_ERROR, cannam@86: 00332 FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED cannam@86: 00335 } FLAC__StreamDecoderSeekStatus; cannam@86: 00336 cannam@86: 00342 extern FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[]; cannam@86: 00343 cannam@86: 00344 cannam@86: 00347 typedef enum { cannam@86: 00348 cannam@86: 00349 FLAC__STREAM_DECODER_TELL_STATUS_OK, cannam@86: 00352 FLAC__STREAM_DECODER_TELL_STATUS_ERROR, cannam@86: 00355 FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED cannam@86: 00358 } FLAC__StreamDecoderTellStatus; cannam@86: 00359 cannam@86: 00365 extern FLAC_API const char * const FLAC__StreamDecoderTellStatusString[]; cannam@86: 00366 cannam@86: 00367 cannam@86: 00370 typedef enum { cannam@86: 00371 cannam@86: 00372 FLAC__STREAM_DECODER_LENGTH_STATUS_OK, cannam@86: 00375 FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR, cannam@86: 00378 FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED cannam@86: 00381 } FLAC__StreamDecoderLengthStatus; cannam@86: 00382 cannam@86: 00388 extern FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[]; cannam@86: 00389 cannam@86: 00390 cannam@86: 00393 typedef enum { cannam@86: 00394 cannam@86: 00395 FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE, cannam@86: 00398 FLAC__STREAM_DECODER_WRITE_STATUS_ABORT cannam@86: 00401 } FLAC__StreamDecoderWriteStatus; cannam@86: 00402 cannam@86: 00408 extern FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[]; cannam@86: 00409 cannam@86: 00410 cannam@86: 00426 typedef enum { cannam@86: 00427 cannam@86: 00428 FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC, cannam@86: 00431 FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER, cannam@86: 00434 FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH, cannam@86: 00437 FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM cannam@86: 00440 } FLAC__StreamDecoderErrorStatus; cannam@86: 00441 cannam@86: 00447 extern FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[]; cannam@86: 00448 cannam@86: 00449 cannam@86: 00450 /*********************************************************************** cannam@86: 00451 * cannam@86: 00452 * class FLAC__StreamDecoder cannam@86: 00453 * cannam@86: 00454 ***********************************************************************/ cannam@86: 00455 cannam@86: 00456 struct FLAC__StreamDecoderProtected; cannam@86: 00457 struct FLAC__StreamDecoderPrivate; cannam@86: 00462 typedef struct { cannam@86: 00463 struct FLAC__StreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */ cannam@86: 00464 struct FLAC__StreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */ cannam@86: 00465 } FLAC__StreamDecoder; cannam@86: 00466 cannam@86: 00516 typedef FLAC__StreamDecoderReadStatus (*FLAC__StreamDecoderReadCallback)(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); cannam@86: 00517 cannam@86: 00551 typedef FLAC__StreamDecoderSeekStatus (*FLAC__StreamDecoderSeekCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); cannam@86: 00552 cannam@86: 00589 typedef FLAC__StreamDecoderTellStatus (*FLAC__StreamDecoderTellCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); cannam@86: 00590 cannam@86: 00627 typedef FLAC__StreamDecoderLengthStatus (*FLAC__StreamDecoderLengthCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); cannam@86: 00628 cannam@86: 00654 typedef FLAC__bool (*FLAC__StreamDecoderEofCallback)(const FLAC__StreamDecoder *decoder, void *client_data); cannam@86: 00655 cannam@86: 00682 typedef FLAC__StreamDecoderWriteStatus (*FLAC__StreamDecoderWriteCallback)(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); cannam@86: 00683 cannam@86: 00709 typedef void (*FLAC__StreamDecoderMetadataCallback)(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); cannam@86: 00710 cannam@86: 00726 typedef void (*FLAC__StreamDecoderErrorCallback)(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); cannam@86: 00727 cannam@86: 00728 cannam@86: 00729 /*********************************************************************** cannam@86: 00730 * cannam@86: 00731 * Class constructor/destructor cannam@86: 00732 * cannam@86: 00733 ***********************************************************************/ cannam@86: 00734 cannam@86: 00742 FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void); cannam@86: 00743 cannam@86: 00750 FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder); cannam@86: 00751 cannam@86: 00752 cannam@86: 00753 /*********************************************************************** cannam@86: 00754 * cannam@86: 00755 * Public class method prototypes cannam@86: 00756 * cannam@86: 00757 ***********************************************************************/ cannam@86: 00758 cannam@86: 00775 FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long serial_number); cannam@86: 00776 cannam@86: 00797 FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value); cannam@86: 00798 cannam@86: 00811 FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); cannam@86: 00812 cannam@86: 00826 FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); cannam@86: 00827 cannam@86: 00838 FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder); cannam@86: 00839 cannam@86: 00852 FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); cannam@86: 00853 cannam@86: 00867 FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); cannam@86: 00868 cannam@86: 00879 FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder); cannam@86: 00880 cannam@86: 00889 FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder); cannam@86: 00890 cannam@86: 00899 FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder); cannam@86: 00900 cannam@86: 00913 FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder); cannam@86: 00914 cannam@86: 00925 FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder); cannam@86: 00926 cannam@86: 00937 FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder); cannam@86: 00938 cannam@86: 00949 FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder); cannam@86: 00950 cannam@86: 00961 FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder); cannam@86: 00962 cannam@86: 00973 FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder); cannam@86: 00974 cannam@86: 00985 FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder); cannam@86: 00986 cannam@86: 01006 FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position); cannam@86: 01007 cannam@86: 01072 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( cannam@86: 01073 FLAC__StreamDecoder *decoder, cannam@86: 01074 FLAC__StreamDecoderReadCallback read_callback, cannam@86: 01075 FLAC__StreamDecoderSeekCallback seek_callback, cannam@86: 01076 FLAC__StreamDecoderTellCallback tell_callback, cannam@86: 01077 FLAC__StreamDecoderLengthCallback length_callback, cannam@86: 01078 FLAC__StreamDecoderEofCallback eof_callback, cannam@86: 01079 FLAC__StreamDecoderWriteCallback write_callback, cannam@86: 01080 FLAC__StreamDecoderMetadataCallback metadata_callback, cannam@86: 01081 FLAC__StreamDecoderErrorCallback error_callback, cannam@86: 01082 void *client_data cannam@86: 01083 ); cannam@86: 01084 cannam@86: 01153 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( cannam@86: 01154 FLAC__StreamDecoder *decoder, cannam@86: 01155 FLAC__StreamDecoderReadCallback read_callback, cannam@86: 01156 FLAC__StreamDecoderSeekCallback seek_callback, cannam@86: 01157 FLAC__StreamDecoderTellCallback tell_callback, cannam@86: 01158 FLAC__StreamDecoderLengthCallback length_callback, cannam@86: 01159 FLAC__StreamDecoderEofCallback eof_callback, cannam@86: 01160 FLAC__StreamDecoderWriteCallback write_callback, cannam@86: 01161 FLAC__StreamDecoderMetadataCallback metadata_callback, cannam@86: 01162 FLAC__StreamDecoderErrorCallback error_callback, cannam@86: 01163 void *client_data cannam@86: 01164 ); cannam@86: 01165 cannam@86: 01203 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( cannam@86: 01204 FLAC__StreamDecoder *decoder, cannam@86: 01205 FILE *file, cannam@86: 01206 FLAC__StreamDecoderWriteCallback write_callback, cannam@86: 01207 FLAC__StreamDecoderMetadataCallback metadata_callback, cannam@86: 01208 FLAC__StreamDecoderErrorCallback error_callback, cannam@86: 01209 void *client_data cannam@86: 01210 ); cannam@86: 01211 cannam@86: 01253 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( cannam@86: 01254 FLAC__StreamDecoder *decoder, cannam@86: 01255 FILE *file, cannam@86: 01256 FLAC__StreamDecoderWriteCallback write_callback, cannam@86: 01257 FLAC__StreamDecoderMetadataCallback metadata_callback, cannam@86: 01258 FLAC__StreamDecoderErrorCallback error_callback, cannam@86: 01259 void *client_data cannam@86: 01260 ); cannam@86: 01261 cannam@86: 01295 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( cannam@86: 01296 FLAC__StreamDecoder *decoder, cannam@86: 01297 const char *filename, cannam@86: 01298 FLAC__StreamDecoderWriteCallback write_callback, cannam@86: 01299 FLAC__StreamDecoderMetadataCallback metadata_callback, cannam@86: 01300 FLAC__StreamDecoderErrorCallback error_callback, cannam@86: 01301 void *client_data cannam@86: 01302 ); cannam@86: 01303 cannam@86: 01341 FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( cannam@86: 01342 FLAC__StreamDecoder *decoder, cannam@86: 01343 const char *filename, cannam@86: 01344 FLAC__StreamDecoderWriteCallback write_callback, cannam@86: 01345 FLAC__StreamDecoderMetadataCallback metadata_callback, cannam@86: 01346 FLAC__StreamDecoderErrorCallback error_callback, cannam@86: 01347 void *client_data cannam@86: 01348 ); cannam@86: 01349 cannam@86: 01369 FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder); cannam@86: 01370 cannam@86: 01384 FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder); cannam@86: 01385 cannam@86: 01417 FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder); cannam@86: 01418 cannam@86: 01450 FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder); cannam@86: 01451 cannam@86: 01471 FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder); cannam@86: 01472 cannam@86: 01492 FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder); cannam@86: 01493 cannam@86: 01533 FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder); cannam@86: 01534 cannam@86: 01551 FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample); cannam@86: 01552 cannam@86: 01553 /* \} */ cannam@86: 01554 cannam@86: 01555 #ifdef __cplusplus cannam@86: 01556 } cannam@86: 01557 #endif cannam@86: 01558 cannam@86: 01559 #endif cannam@86: