seekable_stream_decoder.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:36k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* libFLAC - Free Lossless Audio Codec library
  2.  * Copyright (C) 2000,2001,2002,2003,2004,2005  Josh Coalson
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * - Redistributions of source code must retain the above copyright
  9.  * notice, this list of conditions and the following disclaimer.
  10.  *
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  * notice, this list of conditions and the following disclaimer in the
  13.  * documentation and/or other materials provided with the distribution.
  14.  *
  15.  * - Neither the name of the Xiph.org Foundation nor the names of its
  16.  * contributors may be used to endorse or promote products derived from
  17.  * this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20.  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22.  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
  23.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29.  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30.  */
  31. #ifndef FLAC__SEEKABLE_STREAM_DECODER_H
  32. #define FLAC__SEEKABLE_STREAM_DECODER_H
  33. #include "export.h"
  34. #include "stream_decoder.h"
  35. #ifdef __cplusplus
  36. extern "C" {
  37. #endif
  38. /** file include/FLAC/seekable_stream_decoder.h
  39.  *
  40.  *  brief
  41.  *  This module contains the functions which implement the seekable stream
  42.  *  decoder.
  43.  *
  44.  *  See the detailed documentation in the
  45.  *  link flac_seekable_stream_decoder seekable stream decoder endlink module.
  46.  */
  47. /** defgroup flac_seekable_stream_decoder FLAC/seekable_stream_decoder.h: seekable stream decoder interface
  48.  *  ingroup flac_decoder
  49.  *
  50.  *  brief
  51.  *  This module contains the functions which implement the seekable stream
  52.  *  decoder.
  53.  *
  54.  * The basic usage of this decoder is as follows:
  55.  * - The program creates an instance of a decoder using
  56.  *   FLAC__seekable_stream_decoder_new().
  57.  * - The program overrides the default settings and sets callbacks for
  58.  *   reading, writing, seeking, error reporting, and metadata reporting
  59.  *   using FLAC__seekable_stream_decoder_set_*() functions.
  60.  * - The program initializes the instance to validate the settings and
  61.  *   prepare for decoding using FLAC__seekable_stream_decoder_init().
  62.  * - The program calls the FLAC__seekable_stream_decoder_process_*()
  63.  *   functions to decode data, which subsequently calls the callbacks.
  64.  * - The program finishes the decoding with
  65.  *   FLAC__seekable_stream_decoder_finish(), which flushes the input and
  66.  *   output and resets the decoder to the uninitialized state.
  67.  * - The instance may be used again or deleted with
  68.  *   FLAC__seekable_stream_decoder_delete().
  69.  *
  70.  * The seekable stream decoder is a wrapper around the
  71.  * link flac_stream_decoder stream decoder endlink which also provides
  72.  * seeking capability.  In addition to the Read/Write/Metadata/Error
  73.  * callbacks of the stream decoder, the user must also provide the following:
  74.  *
  75.  * - Seek callback - This function will be called when the decoder wants to
  76.  *   seek to an absolute position in the stream.
  77.  * - Tell callback - This function will be called when the decoder wants to
  78.  *   know the current absolute position of the stream.
  79.  * - Length callback - This function will be called when the decoder wants
  80.  *   to know length of the stream.  The seeking algorithm currently requires
  81.  *   that the overall stream length be known.
  82.  * - EOF callback - This function will be called when the decoder wants to
  83.  *   know if it is at the end of the stream.  This could be synthesized from
  84.  *   the tell and length callbacks but it may be more expensive that way, so
  85.  *   there is a separate callback for it.
  86.  *
  87.  * Seeking is exposed through the
  88.  * FLAC__seekable_stream_decoder_seek_absolute() method.  At any point after
  89.  * the seekable stream decoder has been initialized, the user can call this
  90.  * function to seek to an exact sample within the stream.  Subsequently, the
  91.  * first time the write callback is called it will be passed a (possibly
  92.  * partial) block starting at that sample.
  93.  *
  94.  * The seekable stream decoder also provides MD5 signature checking.  If
  95.  * this is turned on before initialization,
  96.  * FLAC__seekable_stream_decoder_finish() will report when the decoded MD5
  97.  * signature does not match the one stored in the STREAMINFO block.  MD5
  98.  * checking is automatically turned off (until the next
  99.  * FLAC__seekable_stream_decoder_reset()) if there is no signature in the
  100.  * STREAMINFO block or when a seek is attempted.
  101.  *
  102.  * Make sure to read the detailed description of the
  103.  * link flac_stream_decoder stream decoder module endlink since the
  104.  * seekable stream decoder inherits much of its behavior.
  105.  *
  106.  * note
  107.  * The "set" functions may only be called when the decoder is in the
  108.  * state FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED, i.e. after
  109.  * FLAC__seekable_stream_decoder_new() or
  110.  * FLAC__seekable_stream_decoder_finish(), but before
  111.  * FLAC__seekable_stream_decoder_init().  If this is the case they will
  112.  * return c true, otherwise c false.
  113.  *
  114.  * note
  115.  * FLAC__stream_decoder_finish() resets all settings to the constructor
  116.  * defaults, including the callbacks.
  117.  *
  118.  * {
  119.  */
  120. /** State values for a FLAC__SeekableStreamDecoder
  121.  *
  122.  *  The decoder's state can be obtained by calling FLAC__seekable_stream_decoder_get_state().
  123.  */
  124. typedef enum {
  125. FLAC__SEEKABLE_STREAM_DECODER_OK = 0,
  126. /**< The decoder is in the normal OK state. */
  127. FLAC__SEEKABLE_STREAM_DECODER_SEEKING,
  128. /**< The decoder is in the process of seeking. */
  129. FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM,
  130. /**< The decoder has reached the end of the stream. */
  131. FLAC__SEEKABLE_STREAM_DECODER_MEMORY_ALLOCATION_ERROR,
  132. /**< An error occurred allocating memory. */
  133. FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR,
  134. /**< An error occurred in the underlying stream decoder. */
  135. FLAC__SEEKABLE_STREAM_DECODER_READ_ERROR,
  136. /**< The read callback returned an error. */
  137. FLAC__SEEKABLE_STREAM_DECODER_SEEK_ERROR,
  138. /**< An error occurred while seeking or the seek or tell
  139.  * callback returned an error.
  140.  */
  141. FLAC__SEEKABLE_STREAM_DECODER_ALREADY_INITIALIZED,
  142. /**< FLAC__seekable_stream_decoder_init() was called when the
  143.  * decoder was already initialized, usually because
  144.  * FLAC__seekable_stream_decoder_finish() was not called.
  145.  */
  146. FLAC__SEEKABLE_STREAM_DECODER_INVALID_CALLBACK,
  147. /**< FLAC__seekable_stream_decoder_init() was called without all
  148.  * callbacks being set.
  149.  */
  150. FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED
  151. /**< The decoder is in the uninitialized state. */
  152. } FLAC__SeekableStreamDecoderState;
  153. /** Maps a FLAC__SeekableStreamDecoderState to a C string.
  154.  *
  155.  *  Using a FLAC__SeekableStreamDecoderState as the index to this array
  156.  *  will give the string equivalent.  The contents should not be modified.
  157.  */
  158. extern FLAC_API const char * const FLAC__SeekableStreamDecoderStateString[];
  159. /** Return values for the FLAC__SeekableStreamDecoder read callback.
  160.  */
  161. typedef enum {
  162. FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK,
  163. /**< The read was OK and decoding can continue. */
  164. FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR
  165. /**< An unrecoverable error occurred.  The decoder will return from the process call. */
  166. } FLAC__SeekableStreamDecoderReadStatus;
  167. /** Maps a FLAC__SeekableStreamDecoderReadStatus to a C string.
  168.  *
  169.  *  Using a FLAC__SeekableStreamDecoderReadStatus as the index to this array
  170.  *  will give the string equivalent.  The contents should not be modified.
  171.  */
  172. extern FLAC_API const char * const FLAC__SeekableStreamDecoderReadStatusString[];
  173. /** Return values for the FLAC__SeekableStreamDecoder seek callback.
  174.  */
  175. typedef enum {
  176. FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK,
  177. /**< The seek was OK and decoding can continue. */
  178. FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR
  179. /**< An unrecoverable error occurred.  The decoder will return from the process call. */
  180. } FLAC__SeekableStreamDecoderSeekStatus;
  181. /** Maps a FLAC__SeekableStreamDecoderSeekStatus to a C string.
  182.  *
  183.  *  Using a FLAC__SeekableStreamDecoderSeekStatus as the index to this array
  184.  *  will give the string equivalent.  The contents should not be modified.
  185.  */
  186. extern FLAC_API const char * const FLAC__SeekableStreamDecoderSeekStatusString[];
  187. /** Return values for the FLAC__SeekableStreamDecoder tell callback.
  188.  */
  189. typedef enum {
  190. FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK,
  191. /**< The tell was OK and decoding can continue. */
  192. FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR
  193. /**< An unrecoverable error occurred.  The decoder will return from the process call. */
  194. } FLAC__SeekableStreamDecoderTellStatus;
  195. /** Maps a FLAC__SeekableStreamDecoderTellStatus to a C string.
  196.  *
  197.  *  Using a FLAC__SeekableStreamDecoderTellStatus as the index to this array
  198.  *  will give the string equivalent.  The contents should not be modified.
  199.  */
  200. extern FLAC_API const char * const FLAC__SeekableStreamDecoderTellStatusString[];
  201. /** Return values for the FLAC__SeekableStreamDecoder length callback.
  202.  */
  203. typedef enum {
  204. FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK,
  205. /**< The length call was OK and decoding can continue. */
  206. FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR
  207. /**< An unrecoverable error occurred.  The decoder will return from the process call. */
  208. } FLAC__SeekableStreamDecoderLengthStatus;
  209. /** Maps a FLAC__SeekableStreamDecoderLengthStatus to a C string.
  210.  *
  211.  *  Using a FLAC__SeekableStreamDecoderLengthStatus as the index to this array
  212.  *  will give the string equivalent.  The contents should not be modified.
  213.  */
  214. extern FLAC_API const char * const FLAC__SeekableStreamDecoderLengthStatusString[];
  215. /***********************************************************************
  216.  *
  217.  * class FLAC__SeekableStreamDecoder : public FLAC__StreamDecoder
  218.  *
  219.  ***********************************************************************/
  220. struct FLAC__SeekableStreamDecoderProtected;
  221. struct FLAC__SeekableStreamDecoderPrivate;
  222. /** The opaque structure definition for the seekable stream decoder type.
  223.  *  See the
  224.  *  link flac_seekable_stream_decoder seekable stream decoder module endlink
  225.  *  for a detailed description.
  226.  */
  227. typedef struct {
  228. struct FLAC__SeekableStreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */
  229. struct FLAC__SeekableStreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */
  230. } FLAC__SeekableStreamDecoder;
  231. /** Signature for the read callback.
  232.  *  See FLAC__seekable_stream_decoder_set_read_callback()
  233.  *  and FLAC__StreamDecoderReadCallback for more info.
  234.  *
  235.  * param  decoder  The decoder instance calling the callback.
  236.  * param  buffer   A pointer to a location for the callee to store
  237.  *                  data to be decoded.
  238.  * param  bytes    A pointer to the size of the buffer.
  239.  * param  client_data  The callee's client data set through
  240.  *                      FLAC__seekable_stream_decoder_set_client_data().
  241.  * retval FLAC__SeekableStreamDecoderReadStatus
  242.  *    The callee's return status.
  243.  */
  244. typedef FLAC__SeekableStreamDecoderReadStatus (*FLAC__SeekableStreamDecoderReadCallback)(const FLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data);
  245. /** Signature for the seek callback.
  246.  *  See FLAC__seekable_stream_decoder_set_seek_callback() for more info.
  247.  *
  248.  * param  decoder  The decoder instance calling the callback.
  249.  * param  absolute_byte_offset  The offset from the beginning of the stream
  250.  *                               to seek to.
  251.  * param  client_data  The callee's client data set through
  252.  *                      FLAC__seekable_stream_decoder_set_client_data().
  253.  * retval FLAC__SeekableStreamDecoderSeekStatus
  254.  *    The callee's return status.
  255.  */
  256. typedef FLAC__SeekableStreamDecoderSeekStatus (*FLAC__SeekableStreamDecoderSeekCallback)(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data);
  257. /** Signature for the tell callback.
  258.  *  See FLAC__seekable_stream_decoder_set_tell_callback() for more info.
  259.  *
  260.  * param  decoder  The decoder instance calling the callback.
  261.  * param  absolute_byte_offset  A pointer to storage for the current offset
  262.  *                               from the beginning of the stream.
  263.  * param  client_data  The callee's client data set through
  264.  *                      FLAC__seekable_stream_decoder_set_client_data().
  265.  * retval FLAC__SeekableStreamDecoderTellStatus
  266.  *    The callee's return status.
  267.  */
  268. typedef FLAC__SeekableStreamDecoderTellStatus (*FLAC__SeekableStreamDecoderTellCallback)(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
  269. /** Signature for the length callback.
  270.  *  See FLAC__seekable_stream_decoder_set_length_callback() for more info.
  271.  *
  272.  * param  decoder  The decoder instance calling the callback.
  273.  * param  stream_length  A pointer to storage for the length of the stream
  274.  *                        in bytes.
  275.  * param  client_data  The callee's client data set through
  276.  *                      FLAC__seekable_stream_decoder_set_client_data().
  277.  * retval FLAC__SeekableStreamDecoderLengthStatus
  278.  *    The callee's return status.
  279.  */
  280. typedef FLAC__SeekableStreamDecoderLengthStatus (*FLAC__SeekableStreamDecoderLengthCallback)(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data);
  281. /** Signature for the EOF callback.
  282.  *  See FLAC__seekable_stream_decoder_set_eof_callback() for more info.
  283.  *
  284.  * param  decoder  The decoder instance calling the callback.
  285.  * param  client_data  The callee's client data set through
  286.  *                      FLAC__seekable_stream_decoder_set_client_data().
  287.  * retval FLAC__bool
  288.  *    c true if the currently at the end of the stream, else c false.
  289.  */
  290. typedef FLAC__bool (*FLAC__SeekableStreamDecoderEofCallback)(const FLAC__SeekableStreamDecoder *decoder, void *client_data);
  291. /** Signature for the write callback.
  292.  *  See FLAC__seekable_stream_decoder_set_write_callback()
  293.  *  and FLAC__StreamDecoderWriteCallback for more info.
  294.  *
  295.  * param  decoder  The decoder instance calling the callback.
  296.  * param  frame    The description of the decoded frame.
  297.  * param  buffer   An array of pointers to decoded channels of data.
  298.  * param  client_data  The callee's client data set through
  299.  *                      FLAC__seekable_stream_decoder_set_client_data().
  300.  * retval FLAC__StreamDecoderWriteStatus
  301.  *    The callee's return status.
  302.  */
  303. typedef FLAC__StreamDecoderWriteStatus (*FLAC__SeekableStreamDecoderWriteCallback)(const FLAC__SeekableStreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
  304. /** Signature for the metadata callback.
  305.  *  See FLAC__seekable_stream_decoder_set_metadata_callback()
  306.  *  and FLAC__StreamDecoderMetadataCallback for more info.
  307.  *
  308.  * param  decoder  The decoder instance calling the callback.
  309.  * param  metadata The decoded metadata block.
  310.  * param  client_data  The callee's client data set through
  311.  *                      FLAC__seekable_stream_decoder_set_client_data().
  312.  */
  313. typedef void (*FLAC__SeekableStreamDecoderMetadataCallback)(const FLAC__SeekableStreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
  314. /** Signature for the error callback.
  315.  *  See FLAC__seekable_stream_decoder_set_error_callback()
  316.  *  and FLAC__StreamDecoderErrorCallback for more info.
  317.  *
  318.  * param  decoder  The decoder instance calling the callback.
  319.  * param  status   The error encountered by the decoder.
  320.  * param  client_data  The callee's client data set through
  321.  *                      FLAC__seekable_stream_decoder_set_client_data().
  322.  */
  323. typedef void (*FLAC__SeekableStreamDecoderErrorCallback)(const FLAC__SeekableStreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
  324. /***********************************************************************
  325.  *
  326.  * Class constructor/destructor
  327.  *
  328.  ***********************************************************************/
  329. /** Create a new seekable stream decoder instance.  The instance is created
  330.  *  with default settings; see the individual
  331.  *  FLAC__seekable_stream_decoder_set_*() functions for each setting's
  332.  *  default.
  333.  *
  334.  * retval FLAC__SeekableStreamDecoder*
  335.  *    c NULL if there was an error allocating memory, else the new instance.
  336.  */
  337. FLAC_API FLAC__SeekableStreamDecoder *FLAC__seekable_stream_decoder_new();
  338. /** Free a decoder instance.  Deletes the object pointed to by a decoder.
  339.  *
  340.  * param decoder  A pointer to an existing decoder.
  341.  * assert
  342.  *    code decoder != NULL endcode
  343.  */
  344. FLAC_API void FLAC__seekable_stream_decoder_delete(FLAC__SeekableStreamDecoder *decoder);
  345. /***********************************************************************
  346.  *
  347.  * Public class method prototypes
  348.  *
  349.  ***********************************************************************/
  350. /** Set the "MD5 signature checking" flag.  If c true, the decoder will
  351.  *  compute the MD5 signature of the unencoded audio data while decoding
  352.  *  and compare it to the signature from the STREAMINFO block, if it
  353.  *  exists, during FLAC__seekable_stream_decoder_finish().
  354.  *
  355.  *  MD5 signature checking will be turned off (until the next
  356.  *  FLAC__seekable_stream_decoder_reset()) if there is no signature in
  357.  *  the STREAMINFO block or when a seek is attempted.
  358.  *
  359.  * default c false
  360.  * param  decoder  A decoder instance to set.
  361.  * param  value    Flag value (see above).
  362.  * assert
  363.  *    code decoder != NULL endcode
  364.  * retval FLAC__bool
  365.  *    c false if the decoder is already initialized, else c true.
  366.  */
  367. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_md5_checking(FLAC__SeekableStreamDecoder *decoder, FLAC__bool value);
  368. /** Set the read callback.
  369.  *  This is inherited from FLAC__StreamDecoder; see
  370.  *  FLAC__stream_decoder_set_read_callback().
  371.  *
  372.  * note
  373.  * The callback is mandatory and must be set before initialization.
  374.  *
  375.  * default c NULL
  376.  * param  decoder  A decoder instance to set.
  377.  * param  value    See above.
  378.  * assert
  379.  *    code decoder != NULL endcode
  380.  *    code value != NULL endcode
  381.  * retval FLAC__bool
  382.  *    c false if the decoder is already initialized, else c true.
  383.  */
  384. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_read_callback(FLAC__SeekableStreamDecoder *decoder, FLAC__SeekableStreamDecoderReadCallback value);
  385. /** Set the seek callback.
  386.  *  The supplied function will be called when the decoder needs to seek
  387.  *  the input stream.  The decoder will pass the absolute byte offset
  388.  *  to seek to, 0 meaning the beginning of the stream.
  389.  *
  390.  * note
  391.  * The callback is mandatory and must be set before initialization.
  392.  *
  393.  * default c NULL
  394.  * param  decoder  A decoder instance to set.
  395.  * param  value    See above.
  396.  * assert
  397.  *    code decoder != NULL endcode
  398.  *    code value != NULL endcode
  399.  * retval FLAC__bool
  400.  *    c false if the decoder is already initialized, else c true.
  401.  */
  402. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_seek_callback(FLAC__SeekableStreamDecoder *decoder, FLAC__SeekableStreamDecoderSeekCallback value);
  403. /** Set the tell callback.
  404.  *  The supplied function will be called when the decoder wants to know
  405.  *  the current position of the stream.  The callback should return the
  406.  *  byte offset from the beginning of the stream.
  407.  *
  408.  * note
  409.  * The callback is mandatory and must be set before initialization.
  410.  *
  411.  * default c NULL
  412.  * param  decoder  A decoder instance to set.
  413.  * param  value    See above.
  414.  * assert
  415.  *    code decoder != NULL endcode
  416.  *    code value != NULL endcode
  417.  * retval FLAC__bool
  418.  *    c false if the decoder is already initialized, else c true.
  419.  */
  420. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_tell_callback(FLAC__SeekableStreamDecoder *decoder, FLAC__SeekableStreamDecoderTellCallback value);
  421. /** Set the length callback.
  422.  *  The supplied function will be called when the decoder wants to know
  423.  *  the total length of the stream in bytes.
  424.  *
  425.  * note
  426.  * The callback is mandatory and must be set before initialization.
  427.  *
  428.  * default c NULL
  429.  * param  decoder  A decoder instance to set.
  430.  * param  value    See above.
  431.  * assert
  432.  *    code decoder != NULL endcode
  433.  *    code value != NULL endcode
  434.  * retval FLAC__bool
  435.  *    c false if the decoder is already initialized, else c true.
  436.  */
  437. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_length_callback(FLAC__SeekableStreamDecoder *decoder, FLAC__SeekableStreamDecoderLengthCallback value);
  438. /** Set the eof callback.
  439.  *  The supplied function will be called when the decoder needs to know
  440.  *  if the end of the stream has been reached.
  441.  *
  442.  * note
  443.  * The callback is mandatory and must be set before initialization.
  444.  *
  445.  * default c NULL
  446.  * param  decoder  A decoder instance to set.
  447.  * param  value    See above.
  448.  * assert
  449.  *    code decoder != NULL endcode
  450.  *    code value != NULL endcode
  451.  * retval FLAC__bool
  452.  *    c false if the decoder is already initialized, else c true.
  453.  */
  454. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_eof_callback(FLAC__SeekableStreamDecoder *decoder, FLAC__SeekableStreamDecoderEofCallback value);
  455. /** Set the write callback.
  456.  *  This is inherited from FLAC__StreamDecoder; see
  457.  *  FLAC__stream_decoder_set_write_callback().
  458.  *
  459.  * note
  460.  * The callback is mandatory and must be set before initialization.
  461.  *
  462.  * default c NULL
  463.  * param  decoder  A decoder instance to set.
  464.  * param  value    See above.
  465.  * assert
  466.  *    code decoder != NULL endcode
  467.  *    code value != NULL endcode
  468.  * retval FLAC__bool
  469.  *    c false if the decoder is already initialized, else c true.
  470.  */
  471. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_write_callback(FLAC__SeekableStreamDecoder *decoder, FLAC__SeekableStreamDecoderWriteCallback value);
  472. /** Set the metadata callback.
  473.  *  This is inherited from FLAC__StreamDecoder; see
  474.  *  FLAC__stream_decoder_set_metadata_callback().
  475.  *
  476.  * note
  477.  * The callback is mandatory and must be set before initialization.
  478.  *
  479.  * default c NULL
  480.  * param  decoder  A decoder instance to set.
  481.  * param  value    See above.
  482.  * assert
  483.  *    code decoder != NULL endcode
  484.  *    code value != NULL endcode
  485.  * retval FLAC__bool
  486.  *    c false if the decoder is already initialized, else c true.
  487.  */
  488. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_metadata_callback(FLAC__SeekableStreamDecoder *decoder, FLAC__SeekableStreamDecoderMetadataCallback value);
  489. /** Set the error callback.
  490.  *  This is inherited from FLAC__StreamDecoder; see
  491.  *  FLAC__stream_decoder_set_error_callback().
  492.  *
  493.  * note
  494.  * The callback is mandatory and must be set before initialization.
  495.  *
  496.  * default c NULL
  497.  * param  decoder  A decoder instance to set.
  498.  * param  value    See above.
  499.  * assert
  500.  *    code decoder != NULL endcode
  501.  *    code value != NULL endcode
  502.  * retval FLAC__bool
  503.  *    c false if the decoder is already initialized, else c true.
  504.  */
  505. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_error_callback(FLAC__SeekableStreamDecoder *decoder, FLAC__SeekableStreamDecoderErrorCallback value);
  506. /** Set the client data to be passed back to callbacks.
  507.  *  This value will be supplied to callbacks in their a client_data
  508.  *  argument.
  509.  *
  510.  * default c NULL
  511.  * param  decoder  A decoder instance to set.
  512.  * param  value    See above.
  513.  * assert
  514.  *    code decoder != NULL endcode
  515.  * retval FLAC__bool
  516.  *    c false if the decoder is already initialized, else c true.
  517.  */
  518. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_client_data(FLAC__SeekableStreamDecoder *decoder, void *value);
  519. /** This is inherited from FLAC__StreamDecoder; see
  520.  *  FLAC__stream_decoder_set_metadata_respond().
  521.  *
  522.  * default By default, only the c STREAMINFO block is returned via the
  523.  *          metadata callback.
  524.  * param  decoder  A decoder instance to set.
  525.  * param  type     See above.
  526.  * assert
  527.  *    code decoder != NULL endcode
  528.  *    a type is valid
  529.  * retval FLAC__bool
  530.  *    c false if the decoder is already initialized, else c true.
  531.  */
  532. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_metadata_respond(FLAC__SeekableStreamDecoder *decoder, FLAC__MetadataType type);
  533. /** This is inherited from FLAC__StreamDecoder; see
  534.  *  FLAC__stream_decoder_set_metadata_respond_application().
  535.  *
  536.  * default By default, only the c STREAMINFO block is returned via the
  537.  *          metadata callback.
  538.  * param  decoder  A decoder instance to set.
  539.  * param  id       See above.
  540.  * assert
  541.  *    code decoder != NULL endcode
  542.  *    code id != NULL endcode
  543.  * retval FLAC__bool
  544.  *    c false if the decoder is already initialized, else c true.
  545.  */
  546. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_metadata_respond_application(FLAC__SeekableStreamDecoder *decoder, const FLAC__byte id[4]);
  547. /** This is inherited from FLAC__StreamDecoder; see
  548.  *  FLAC__stream_decoder_set_metadata_respond_all().
  549.  *
  550.  * default By default, only the c STREAMINFO block is returned via the
  551.  *          metadata callback.
  552.  * param  decoder  A decoder instance to set.
  553.  * assert
  554.  *    code decoder != NULL endcode
  555.  * retval FLAC__bool
  556.  *    c false if the decoder is already initialized, else c true.
  557.  */
  558. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_metadata_respond_all(FLAC__SeekableStreamDecoder *decoder);
  559. /** This is inherited from FLAC__StreamDecoder; see
  560.  *  FLAC__stream_decoder_set_metadata_ignore().
  561.  *
  562.  * default By default, only the c STREAMINFO block is returned via the
  563.  *          metadata callback.
  564.  * param  decoder  A decoder instance to set.
  565.  * param  type     See above.
  566.  * assert
  567.  *    code decoder != NULL endcode
  568.  *    a type is valid
  569.  * retval FLAC__bool
  570.  *    c false if the decoder is already initialized, else c true.
  571.  */
  572. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_metadata_ignore(FLAC__SeekableStreamDecoder *decoder, FLAC__MetadataType type);
  573. /** This is inherited from FLAC__StreamDecoder; see
  574.  *  FLAC__stream_decoder_set_metadata_ignore_application().
  575.  *
  576.  * default By default, only the c STREAMINFO block is returned via the
  577.  *          metadata callback.
  578.  * param  decoder  A decoder instance to set.
  579.  * param  id       See above.
  580.  * assert
  581.  *    code decoder != NULL endcode
  582.  *    code id != NULL endcode
  583.  * retval FLAC__bool
  584.  *    c false if the decoder is already initialized, else c true.
  585.  */
  586. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_metadata_ignore_application(FLAC__SeekableStreamDecoder *decoder, const FLAC__byte id[4]);
  587. /** This is inherited from FLAC__StreamDecoder; see
  588.  *  FLAC__stream_decoder_set_metadata_ignore_all().
  589.  *
  590.  * default By default, only the c STREAMINFO block is returned via the
  591.  *          metadata callback.
  592.  * param  decoder  A decoder instance to set.
  593.  * assert
  594.  *    code decoder != NULL endcode
  595.  * retval FLAC__bool
  596.  *    c false if the decoder is already initialized, else c true.
  597.  */
  598. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_set_metadata_ignore_all(FLAC__SeekableStreamDecoder *decoder);
  599. /** Get the current decoder state.
  600.  *
  601.  * param  decoder  A decoder instance to query.
  602.  * assert
  603.  *    code decoder != NULL endcode
  604.  * retval FLAC__SeekableStreamDecoderState
  605.  *    The current decoder state.
  606.  */
  607. FLAC_API FLAC__SeekableStreamDecoderState FLAC__seekable_stream_decoder_get_state(const FLAC__SeekableStreamDecoder *decoder);
  608. /** Get the state of the underlying stream decoder.
  609.  *  Useful when the seekable stream decoder state is
  610.  *  c FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR.
  611.  *
  612.  * param  decoder  A decoder instance to query.
  613.  * assert
  614.  *    code decoder != NULL endcode
  615.  * retval FLAC__StreamDecoderState
  616.  *    The stream decoder state.
  617.  */
  618. FLAC_API FLAC__StreamDecoderState FLAC__seekable_stream_decoder_get_stream_decoder_state(const FLAC__SeekableStreamDecoder *decoder);
  619. /** Get the current decoder state as a C string.
  620.  *  This version automatically resolves
  621.  *  c FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR by getting the
  622.  *  stream decoder's state.
  623.  *
  624.  * param  decoder  A decoder instance to query.
  625.  * assert
  626.  *    code decoder != NULL endcode
  627.  * retval const char *
  628.  *    The decoder state as a C string.  Do not modify the contents.
  629.  */
  630. FLAC_API const char *FLAC__seekable_stream_decoder_get_resolved_state_string(const FLAC__SeekableStreamDecoder *decoder);
  631. /** Get the "MD5 signature checking" flag.
  632.  *  This is the value of the setting, not whether or not the decoder is
  633.  *  currently checking the MD5 (remember, it can be turned off automatically
  634.  *  by a seek).  When the decoder is reset the flag will be restored to the
  635.  *  value returned by this function.
  636.  *
  637.  * param  decoder  A decoder instance to query.
  638.  * assert
  639.  *    code decoder != NULL endcode
  640.  * retval FLAC__bool
  641.  *    See above.
  642.  */
  643. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_get_md5_checking(const FLAC__SeekableStreamDecoder *decoder);
  644. /** This is inherited from FLAC__StreamDecoder; see
  645.  *  FLAC__stream_decoder_get_channels().
  646.  *
  647.  * param  decoder  A decoder instance to query.
  648.  * assert
  649.  *    code decoder != NULL endcode
  650.  * retval unsigned
  651.  *    See above.
  652.  */
  653. FLAC_API unsigned FLAC__seekable_stream_decoder_get_channels(const FLAC__SeekableStreamDecoder *decoder);
  654. /** This is inherited from FLAC__StreamDecoder; see
  655.  *  FLAC__stream_decoder_get_channel_assignment().
  656.  *
  657.  * param  decoder  A decoder instance to query.
  658.  * assert
  659.  *    code decoder != NULL endcode
  660.  * retval FLAC__ChannelAssignment
  661.  *    See above.
  662.  */
  663. FLAC_API FLAC__ChannelAssignment FLAC__seekable_stream_decoder_get_channel_assignment(const FLAC__SeekableStreamDecoder *decoder);
  664. /** This is inherited from FLAC__StreamDecoder; see
  665.  *  FLAC__stream_decoder_get_bits_per_sample().
  666.  *
  667.  * param  decoder  A decoder instance to query.
  668.  * assert
  669.  *    code decoder != NULL endcode
  670.  * retval unsigned
  671.  *    See above.
  672.  */
  673. FLAC_API unsigned FLAC__seekable_stream_decoder_get_bits_per_sample(const FLAC__SeekableStreamDecoder *decoder);
  674. /** This is inherited from FLAC__StreamDecoder; see
  675.  *  FLAC__stream_decoder_get_sample_rate().
  676.  *
  677.  * param  decoder  A decoder instance to query.
  678.  * assert
  679.  *    code decoder != NULL endcode
  680.  * retval unsigned
  681.  *    See above.
  682.  */
  683. FLAC_API unsigned FLAC__seekable_stream_decoder_get_sample_rate(const FLAC__SeekableStreamDecoder *decoder);
  684. /** This is inherited from FLAC__StreamDecoder; see
  685.  *  FLAC__stream_decoder_get_blocksize().
  686.  *
  687.  * param  decoder  A decoder instance to query.
  688.  * assert
  689.  *    code decoder != NULL endcode
  690.  * retval unsigned
  691.  *    See above.
  692.  */
  693. FLAC_API unsigned FLAC__seekable_stream_decoder_get_blocksize(const FLAC__SeekableStreamDecoder *decoder);
  694. /** Returns the decoder's current read position within the stream.
  695.  *  The position is the byte offset from the start of the stream.
  696.  *  Bytes before this position have been fully decoded.  Note that
  697.  *  there may still be undecoded bytes in the decoder's read FIFO.
  698.  *  The returned position is correct even after a seek.
  699.  *
  700.  * param  decoder   A decoder instance to query.
  701.  * param  position  Address at which to return the desired position.
  702.  * assert
  703.  *    code decoder != NULL endcode
  704.  *    code position != NULL endcode
  705.  * retval FLAC__bool
  706.  *    c true if successful, c false if there was an error from
  707.  *    the 'tell' callback.
  708.  */
  709. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_get_decode_position(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *position);
  710. /** Initialize the decoder instance.
  711.  *  Should be called after FLAC__seekable_stream_decoder_new() and
  712.  *  FLAC__seekable_stream_decoder_set_*() but before any of the
  713.  *  FLAC__seekable_stream_decoder_process_*() functions.  Will set and return
  714.  *  the decoder state, which will be FLAC__SEEKABLE_STREAM_DECODER_OK
  715.  *  if initialization succeeded.
  716.  *
  717.  * param  decoder  An uninitialized decoder instance.
  718.  * assert
  719.  *    code decoder != NULL endcode
  720.  * retval FLAC__SeekableStreamDecoderState
  721.  *    c FLAC__SEEKABLE_STREAM_DECODER_OK if initialization was
  722.  *    successful; see FLAC__SeekableStreamDecoderState for the meanings
  723.  *    of other return values.
  724.  */
  725. FLAC_API FLAC__SeekableStreamDecoderState FLAC__seekable_stream_decoder_init(FLAC__SeekableStreamDecoder *decoder);
  726. /** Finish the decoding process.
  727.  *  Flushes the decoding buffer, releases resources, resets the decoder
  728.  *  settings to their defaults, and returns the decoder state to
  729.  *  FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED.
  730.  *
  731.  *  In the event of a prematurely-terminated decode, it is not strictly
  732.  *  necessary to call this immediately before
  733.  *  FLAC__seekable_stream_decoder_delete() but it is good practice to match
  734.  *  every FLAC__seekable_stream_decoder_init() with a
  735.  *  FLAC__seekable_stream_decoder_finish().
  736.  *
  737.  * param  decoder  An uninitialized decoder instance.
  738.  * assert
  739.  *    code decoder != NULL endcode
  740.  * retval FLAC__bool
  741.  *    c false if MD5 checking is on AND a STREAMINFO block was available
  742.  *    AND the MD5 signature in the STREAMINFO block was non-zero AND the
  743.  *    signature does not match the one computed by the decoder; else
  744.  *    c true.
  745.  */
  746. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_finish(FLAC__SeekableStreamDecoder *decoder);
  747. /** Flush the stream input.
  748.  *  The decoder's input buffer will be cleared and the state set to
  749.  *  c FLAC__SEEKABLE_STREAM_DECODER_OK.  This will also turn off MD5
  750.  *  checking.
  751.  *
  752.  * param  decoder  A decoder instance.
  753.  * assert
  754.  *    code decoder != NULL endcode
  755.  * retval FLAC__bool
  756.  *    c true if successful, else c false if a memory allocation
  757.  *    or stream decoder error occurs.
  758.  */
  759. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_flush(FLAC__SeekableStreamDecoder *decoder);
  760. /** Reset the decoding process.
  761.  *  The decoder's input buffer will be cleared and the state set to
  762.  *  c FLAC__SEEKABLE_STREAM_DECODER_OK.  This is similar to
  763.  *  FLAC__seekable_stream_decoder_finish() except that the settings are
  764.  *  preserved; there is no need to call FLAC__seekable_stream_decoder_init()
  765.  *  before decoding again.  MD5 checking will be restored to its original
  766.  *  setting.
  767.  *
  768.  * param  decoder  A decoder instance.
  769.  * assert
  770.  *    code decoder != NULL endcode
  771.  * retval FLAC__bool
  772.  *    c true if successful, else c false if a memory allocation
  773.  *    or stream decoder error occurs.
  774.  */
  775. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_reset(FLAC__SeekableStreamDecoder *decoder);
  776. /** This is inherited from FLAC__StreamDecoder; see
  777.  *  FLAC__stream_decoder_process_single().
  778.  *
  779.  * param  decoder  A decoder instance.
  780.  * assert
  781.  *    code decoder != NULL endcode
  782.  * retval FLAC__bool
  783.  *    See above.
  784.  */
  785. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_process_single(FLAC__SeekableStreamDecoder *decoder);
  786. /** This is inherited from FLAC__StreamDecoder; see
  787.  *  FLAC__stream_decoder_process_until_end_of_metadata().
  788.  *
  789.  * param  decoder  A decoder instance.
  790.  * assert
  791.  *    code decoder != NULL endcode
  792.  * retval FLAC__bool
  793.  *    See above.
  794.  */
  795. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_process_until_end_of_metadata(FLAC__SeekableStreamDecoder *decoder);
  796. /** This is inherited from FLAC__StreamDecoder; see
  797.  *  FLAC__stream_decoder_process_until_end_of_stream().
  798.  *
  799.  * param  decoder  A decoder instance.
  800.  * assert
  801.  *    code decoder != NULL endcode
  802.  * retval FLAC__bool
  803.  *    See above.
  804.  */
  805. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_process_until_end_of_stream(FLAC__SeekableStreamDecoder *decoder);
  806. /** This is inherited from FLAC__StreamDecoder; see
  807.  *  FLAC__stream_decoder_skip_single_frame().
  808.  *
  809.  * param  decoder  A decoder instance.
  810.  * assert
  811.  *    code decoder != NULL endcode
  812.  * retval FLAC__bool
  813.  *    See above.
  814.  */
  815. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_skip_single_frame(FLAC__SeekableStreamDecoder *decoder);
  816. /** Flush the input and seek to an absolute sample.
  817.  *  Decoding will resume at the given sample.  Note that because of
  818.  *  this, the next write callback may contain a partial block.
  819.  *
  820.  * param  decoder  A decoder instance.
  821.  * param  sample   The target sample number to seek to.
  822.  * assert
  823.  *    code decoder != NULL endcode
  824.  * retval FLAC__bool
  825.  *    c true if successful, else c false.
  826.  */
  827. FLAC_API FLAC__bool FLAC__seekable_stream_decoder_seek_absolute(FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 sample);
  828. /* } */
  829. #ifdef __cplusplus
  830. }
  831. #endif
  832. #endif