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