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

Windows CE

开发平台:

C/C++

  1. /* libOggFLAC - Free Lossless Audio Codec + Ogg library
  2.  * Copyright (C) 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 OggFLAC__SEEKABLE_STREAM_ENCODER_H
  32. #define OggFLAC__SEEKABLE_STREAM_ENCODER_H
  33. #include "export.h"
  34. #include "FLAC/stream_encoder.h"
  35. #include "FLAC/seekable_stream_encoder.h"
  36. #ifdef __cplusplus
  37. extern "C" {
  38. #endif
  39. /** file include/OggFLAC/seekable_stream_encoder.h
  40.  *
  41.  *  brief
  42.  *  This module contains the functions which implement the seekable
  43.  *  stream encoder.
  44.  *
  45.  *  See the detailed documentation in the
  46.  *  link oggflac_seekable_stream_encoder seekable stream encoder endlink module.
  47.  */
  48. /** defgroup oggflac_seekable_stream_encoder OggFLAC/seekable_stream_encoder.h: seekable stream encoder interface
  49.  *  ingroup oggflac_encoder
  50.  *
  51.  *  brief
  52.  *  This module contains the functions which implement the seekable
  53.  *  stream encoder.  The Ogg seekable stream encoder is derived
  54.  *  from the FLAC seekable stream encoder.
  55.  *
  56.  * The interface here is nearly identical to FLAC's seekable stream
  57.  * encoder, including the callbacks, with the addition of a new required
  58.  * read callback (needed when writing back STREAMINFO after encoding) and
  59.  * OggFLAC__seekable_stream_encoder_set_serial_number().  See the
  60.  * link flac_seekable_stream_encoder FLAC seekable stream encoder module endlink
  61.  * for full documentation.
  62.  *
  63.  * {
  64.  */
  65. /** State values for an OggFLAC__SeekableStreamEncoder
  66.  *
  67.  *  The encoder's state can be obtained by calling OggFLAC__stream_encoder_get_state().
  68.  */
  69. typedef enum {
  70. OggFLAC__SEEKABLE_STREAM_ENCODER_OK = 0,
  71. /**< The encoder is in the normal OK state. */
  72. OggFLAC__SEEKABLE_STREAM_ENCODER_OGG_ERROR,
  73. /**< An error occurred in the underlying Ogg layer.  */
  74. OggFLAC__SEEKABLE_STREAM_ENCODER_FLAC_STREAM_ENCODER_ERROR,
  75. /**< An error occurred in the underlying FLAC stream encoder;
  76.  * check OggFLAC__seekable_stream_encoder_get_FLAC_stream_encoder_state().
  77.  */
  78. OggFLAC__SEEKABLE_STREAM_ENCODER_MEMORY_ALLOCATION_ERROR,
  79. /**< Memory allocation failed. */
  80. OggFLAC__SEEKABLE_STREAM_ENCODER_WRITE_ERROR,
  81. /**< The write callback returned an error. */
  82. OggFLAC__SEEKABLE_STREAM_ENCODER_READ_ERROR,
  83. /**< The read callback returned an error. */
  84. OggFLAC__SEEKABLE_STREAM_ENCODER_SEEK_ERROR,
  85. /**< The seek callback returned an error. */
  86. OggFLAC__SEEKABLE_STREAM_ENCODER_TELL_ERROR,
  87. /**< The tell callback returned an error. */
  88. OggFLAC__SEEKABLE_STREAM_ENCODER_ALREADY_INITIALIZED,
  89. /**< OggFLAC__seekable_stream_encoder_init() was called when the encoder was
  90.  * already initialized, usually because
  91.  * OggFLAC__seekable_stream_encoder_finish() was not called.
  92.  */
  93. OggFLAC__SEEKABLE_STREAM_ENCODER_INVALID_CALLBACK,
  94. /**< OggFLAC__seekable_stream_encoder_init() was called without all
  95.  * callbacks being set.
  96.  */
  97. OggFLAC__SEEKABLE_STREAM_ENCODER_INVALID_SEEKTABLE,
  98. /**< An invalid seek table was passed is the metadata to
  99.  * OggFLAC__seekable_stream_encoder_set_metadata().
  100.  */
  101. OggFLAC__SEEKABLE_STREAM_ENCODER_UNINITIALIZED
  102. /**< The encoder is in the uninitialized state. */
  103. } OggFLAC__SeekableStreamEncoderState;
  104. /** Maps an OggFLAC__StreamEncoderState to a C string.
  105.  *
  106.  *  Using an OggFLAC__StreamEncoderState as the index to this array
  107.  *  will give the string equivalent.  The contents should not be modified.
  108.  */
  109. extern OggFLAC_API const char * const OggFLAC__SeekableStreamEncoderStateString[];
  110. /** Return values for the OggFLAC__SeekableStreamEncoder read callback.
  111.  */
  112. typedef enum {
  113. OggFLAC__SEEKABLE_STREAM_ENCODER_READ_STATUS_CONTINUE,
  114. /**< The read was OK and decoding can continue. */
  115. OggFLAC__SEEKABLE_STREAM_ENCODER_READ_STATUS_END_OF_STREAM,
  116. /**< The read was attempted at the end of the stream. */
  117. OggFLAC__SEEKABLE_STREAM_ENCODER_READ_STATUS_ABORT
  118. /**< An unrecoverable error occurred. */
  119. } OggFLAC__SeekableStreamEncoderReadStatus;
  120. /** Maps a OggFLAC__SeekableStreamEncoderReadStatus to a C string.
  121.  *
  122.  *  Using a OggFLAC__SeekableStreamEncoderReadStatus as the index to this array
  123.  *  will give the string equivalent.  The contents should not be modified.
  124.  */
  125. extern OggFLAC_API const char * const OggFLAC__SeekableStreamEncoderReadStatusString[];
  126. /***********************************************************************
  127.  *
  128.  * class OggFLAC__StreamEncoder
  129.  *
  130.  ***********************************************************************/
  131. struct OggFLAC__SeekableStreamEncoderProtected;
  132. struct OggFLAC__SeekableStreamEncoderPrivate;
  133. /** The opaque structure definition for the seekable stream encoder type.
  134.  *  See the link oggflac_seekable_stream_encoder seekable stream encoder module endlink
  135.  *  for a detailed description.
  136.  */
  137. typedef struct {
  138. struct OggFLAC__SeekableStreamEncoderProtected *protected_; /* avoid the C++ keyword 'protected' */
  139. struct OggFLAC__SeekableStreamEncoderPrivate *private_; /* avoid the C++ keyword 'private' */
  140. } OggFLAC__SeekableStreamEncoder;
  141. /** Signature for the read callback.
  142.  *  See OggFLAC__seekable_stream_encoder_set_read_callback() for more info.
  143.  *
  144.  * param  encoder  The encoder instance calling the callback.
  145.  * param  buffer   A pointer to a location for the callee to store
  146.  *                  data to be encoded.
  147.  * param  bytes    A pointer to the size of the buffer.  On entry
  148.  *                  to the callback, it contains the maximum number
  149.  *                  of bytes that may be stored in a buffer.  The
  150.  *                  callee must set it to the actual number of bytes
  151.  *                  stored (0 in case of error or end-of-stream) before
  152.  *                  returning.
  153.  * param  client_data  The callee's client data set through
  154.  *                      OggFLAC__seekable_stream_encoder_set_client_data().
  155.  * retval OggFLAC__SeekableStreamEncoderReadStatus
  156.  *    The callee's return status.
  157.  */
  158. typedef OggFLAC__SeekableStreamEncoderReadStatus (*OggFLAC__SeekableStreamEncoderReadCallback)(const OggFLAC__SeekableStreamEncoder *encoder, FLAC__byte buffer[], unsigned *bytes, void *client_data);
  159. /** Signature for the seek callback.
  160.  *  See OggFLAC__seekable_stream_encoder_set_seek_callback()
  161.  *  and FLAC__SeekableStreamEncoderSeekCallback for more info.
  162.  *
  163.  * param  encoder  The encoder instance calling the callback.
  164.  * param  absolute_byte_offset  The offset from the beginning of the stream
  165.  *                               to seek to.
  166.  * param  client_data  The callee's client data set through
  167.  *                      OggFLAC__seekable_stream_encoder_set_client_data().
  168.  * retval FLAC__SeekableStreamEncoderSeekStatus
  169.  *    The callee's return status.
  170.  */
  171. typedef FLAC__SeekableStreamEncoderSeekStatus (*OggFLAC__SeekableStreamEncoderSeekCallback)(const OggFLAC__SeekableStreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data);
  172. /** Signature for the tell callback.
  173.  *  See OggFLAC__seekable_stream_encoder_set_tell_callback()
  174.  *  and FLAC__SeekableStreamEncoderTellCallback for more info.
  175.  *
  176.  * param  encoder  The encoder instance calling the callback.
  177.  * param  absolute_byte_offset  The address at which to store the current
  178.  *                               position of the output.
  179.  * param  client_data  The callee's client data set through
  180.  *                      OggFLAC__seekable_stream_encoder_set_client_data().
  181.  * retval FLAC__SeekableStreamEncoderTellStatus
  182.  *    The callee's return status.
  183.  */
  184. typedef FLAC__SeekableStreamEncoderTellStatus (*OggFLAC__SeekableStreamEncoderTellCallback)(const OggFLAC__SeekableStreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
  185. /** Signature for the write callback.
  186.  *  See OggFLAC__seekable_stream_encoder_set_write_callback()
  187.  *  and FLAC__SeekableStreamEncoderWriteCallback for more info.
  188.  *
  189.  * param  encoder  The encoder instance calling the callback.
  190.  * param  buffer   An array of encoded data of length a bytes.
  191.  * param  bytes    The byte length of a buffer.
  192.  * param  samples  The number of samples encoded by a buffer.
  193.  *                  c 0 has a special meaning; see
  194.  *                  OggFLAC__seekable_stream_encoder_set_write_callback().
  195.  * param  current_frame  The number of current frame being encoded.
  196.  * param  client_data  The callee's client data set through
  197.  *                      OggFLAC__seekable_stream_encoder_set_client_data().
  198.  * retval FLAC__StreamEncoderWriteStatus
  199.  *    The callee's return status.
  200.  */
  201. typedef FLAC__StreamEncoderWriteStatus (*OggFLAC__SeekableStreamEncoderWriteCallback)(const OggFLAC__SeekableStreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data);
  202. /***********************************************************************
  203.  *
  204.  * Class constructor/destructor
  205.  *
  206.  ***********************************************************************/
  207. /** Create a new seekable stream encoder instance.  The instance is created with
  208.  *  default settings; see the individual OggFLAC__seekable_stream_encoder_set_*()
  209.  *  functions for each setting's default.
  210.  *
  211.  * retval OggFLAC__SeekableStreamEncoder*
  212.  *    c NULL if there was an error allocating memory, else the new instance.
  213.  */
  214. OggFLAC_API OggFLAC__SeekableStreamEncoder *OggFLAC__seekable_stream_encoder_new();
  215. /** Free an encoder instance.  Deletes the object pointed to by a encoder.
  216.  *
  217.  * param encoder  A pointer to an existing encoder.
  218.  * assert
  219.  *    code encoder != NULL endcode
  220.  */
  221. OggFLAC_API void OggFLAC__seekable_stream_encoder_delete(OggFLAC__SeekableStreamEncoder *encoder);
  222. /***********************************************************************
  223.  *
  224.  * Public class method prototypes
  225.  *
  226.  ***********************************************************************/
  227. /** Set the serial number for the FLAC stream.
  228.  *
  229.  * default c 0
  230.  * param  encoder        An encoder instance to set.
  231.  * param  serial_number  See above.
  232.  * assert
  233.  *    code encoder != NULL endcode
  234.  * retval FLAC__bool
  235.  *    c false if the encoder is already initialized, else c true.
  236.  */
  237. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_serial_number(OggFLAC__SeekableStreamEncoder *encoder, long serial_number);
  238. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_verify()
  239.  *
  240.  * default c false
  241.  * param  encoder  An encoder instance to set.
  242.  * param  value    Flag value (see above).
  243.  * assert
  244.  *    code encoder != NULL endcode
  245.  * retval FLAC__bool
  246.  *    c false if the encoder is already initialized, else c true.
  247.  */
  248. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_verify(OggFLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
  249. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_streamable_subset()
  250.  *
  251.  * default c true
  252.  * param  encoder  An encoder instance to set.
  253.  * param  value    Flag value (see above).
  254.  * assert
  255.  *    code encoder != NULL endcode
  256.  * retval FLAC__bool
  257.  *    c false if the encoder is already initialized, else c true.
  258.  */
  259. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_streamable_subset(OggFLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
  260. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_do_mid_side_stereo()
  261.  *
  262.  * default c false
  263.  * param  encoder  An encoder instance to set.
  264.  * param  value    Flag value (see above).
  265.  * assert
  266.  *    code encoder != NULL endcode
  267.  * retval FLAC__bool
  268.  *    c false if the encoder is already initialized, else c true.
  269.  */
  270. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_do_mid_side_stereo(OggFLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
  271. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_loose_mid_side_stereo()
  272.  *
  273.  * default c false
  274.  * param  encoder  An encoder instance to set.
  275.  * param  value    Flag value (see above).
  276.  * assert
  277.  *    code encoder != NULL endcode
  278.  * retval FLAC__bool
  279.  *    c false if the encoder is already initialized, else c true.
  280.  */
  281. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_loose_mid_side_stereo(OggFLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
  282. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_channels()
  283.  *
  284.  * default c 2
  285.  * param  encoder  An encoder instance to set.
  286.  * param  value    See above.
  287.  * assert
  288.  *    code encoder != NULL endcode
  289.  * retval FLAC__bool
  290.  *    c false if the encoder is already initialized, else c true.
  291.  */
  292. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_channels(OggFLAC__SeekableStreamEncoder *encoder, unsigned value);
  293. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_bits_per_sample()
  294.  *
  295.  * default c 16
  296.  * param  encoder  An encoder instance to set.
  297.  * param  value    See above.
  298.  * assert
  299.  *    code encoder != NULL endcode
  300.  * retval FLAC__bool
  301.  *    c false if the encoder is already initialized, else c true.
  302.  */
  303. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_bits_per_sample(OggFLAC__SeekableStreamEncoder *encoder, unsigned value);
  304. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_sample_rate()
  305.  *
  306.  * default c 44100
  307.  * param  encoder  An encoder instance to set.
  308.  * param  value    See above.
  309.  * assert
  310.  *    code encoder != NULL endcode
  311.  * retval FLAC__bool
  312.  *    c false if the encoder is already initialized, else c true.
  313.  */
  314. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_sample_rate(OggFLAC__SeekableStreamEncoder *encoder, unsigned value);
  315. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_blocksize()
  316.  *
  317.  * default c 1152
  318.  * param  encoder  An encoder instance to set.
  319.  * param  value    See above.
  320.  * assert
  321.  *    code encoder != NULL endcode
  322.  * retval FLAC__bool
  323.  *    c false if the encoder is already initialized, else c true.
  324.  */
  325. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_blocksize(OggFLAC__SeekableStreamEncoder *encoder, unsigned value);
  326. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_max_lpc_order()
  327.  *
  328.  * default c 0
  329.  * param  encoder  An encoder instance to set.
  330.  * param  value    See above.
  331.  * assert
  332.  *    code encoder != NULL endcode
  333.  * retval FLAC__bool
  334.  *    c false if the encoder is already initialized, else c true.
  335.  */
  336. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_max_lpc_order(OggFLAC__SeekableStreamEncoder *encoder, unsigned value);
  337. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_qlp_coeff_precision()
  338.  *
  339.  * default c 0
  340.  * param  encoder  An encoder instance to set.
  341.  * param  value    See above.
  342.  * assert
  343.  *    code encoder != NULL endcode
  344.  * retval FLAC__bool
  345.  *    c false if the encoder is already initialized, else c true.
  346.  */
  347. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_qlp_coeff_precision(OggFLAC__SeekableStreamEncoder *encoder, unsigned value);
  348. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_qlp_coeff_prec_search()
  349.  *
  350.  * default c false
  351.  * param  encoder  An encoder instance to set.
  352.  * param  value    See above.
  353.  * assert
  354.  *    code encoder != NULL endcode
  355.  * retval FLAC__bool
  356.  *    c false if the encoder is already initialized, else c true.
  357.  */
  358. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_do_qlp_coeff_prec_search(OggFLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
  359. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_do_escape_coding()
  360.  *
  361.  * default c false
  362.  * param  encoder  An encoder instance to set.
  363.  * param  value    See above.
  364.  * assert
  365.  *    code encoder != NULL endcode
  366.  * retval FLAC__bool
  367.  *    c false if the encoder is already initialized, else c true.
  368.  */
  369. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_do_escape_coding(OggFLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
  370. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_do_exhaustive_model_search()
  371.  *
  372.  * default c false
  373.  * param  encoder  An encoder instance to set.
  374.  * param  value    See above.
  375.  * assert
  376.  *    code encoder != NULL endcode
  377.  * retval FLAC__bool
  378.  *    c false if the encoder is already initialized, else c true.
  379.  */
  380. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_do_exhaustive_model_search(OggFLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
  381. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_min_residual_partition_order()
  382.  *
  383.  * default c 0
  384.  * param  encoder  An encoder instance to set.
  385.  * param  value    See above.
  386.  * assert
  387.  *    code encoder != NULL endcode
  388.  * retval FLAC__bool
  389.  *    c false if the encoder is already initialized, else c true.
  390.  */
  391. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_min_residual_partition_order(OggFLAC__SeekableStreamEncoder *encoder, unsigned value);
  392. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_max_residual_partition_order()
  393.  *
  394.  * default c 0
  395.  * param  encoder  An encoder instance to set.
  396.  * param  value    See above.
  397.  * assert
  398.  *    code encoder != NULL endcode
  399.  * retval FLAC__bool
  400.  *    c false if the encoder is already initialized, else c true.
  401.  */
  402. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_max_residual_partition_order(OggFLAC__SeekableStreamEncoder *encoder, unsigned value);
  403. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_rice_parameter_search_dist()
  404.  *
  405.  * default c 0
  406.  * param  encoder  An encoder instance to set.
  407.  * param  value    See above.
  408.  * assert
  409.  *    code encoder != NULL endcode
  410.  * retval FLAC__bool
  411.  *    c false if the encoder is already initialized, else c true.
  412.  */
  413. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_rice_parameter_search_dist(OggFLAC__SeekableStreamEncoder *encoder, unsigned value);
  414. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_total_samples_estimate()
  415.  *
  416.  * default c 0
  417.  * param  encoder  An encoder instance to set.
  418.  * param  value    See above.
  419.  * assert
  420.  *    code encoder != NULL endcode
  421.  * retval FLAC__bool
  422.  *    c false if the encoder is already initialized, else c true.
  423.  */
  424. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_total_samples_estimate(OggFLAC__SeekableStreamEncoder *encoder, FLAC__uint64 value);
  425. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_set_metadata()
  426.  *
  427.  * note The Ogg FLAC mapping requires that the VORBIS_COMMENT block be
  428.  * the second metadata block of the stream.  The encoder already supplies
  429.  * the STREAMINFO block automatically.  If a metadata does not contain a
  430.  * VORBIS_COMMENT block, the encoder will supply that too.  Otherwise, if
  431.  * a metadata does contain a VORBIS_COMMENT block and it is not the
  432.  * first, this function will reorder a metadata by moving the
  433.  * VORBIS_COMMENT block to the front; the relative ordering of the other
  434.  * blocks will remain as they were.
  435.  *
  436.  * note The Ogg FLAC mapping limits the number of metadata blocks per
  437.  * stream to c 65535.  If a num_blocks exceeds this the function will
  438.  * return c false.
  439.  *
  440.  * default c NULL, 0
  441.  * param  encoder     An encoder instance to set.
  442.  * param  metadata    See above.
  443.  * param  num_blocks  See above.
  444.  * assert
  445.  *    code encoder != NULL endcode
  446.  * retval FLAC__bool
  447.  *    c false if the encoder is already initialized, or if
  448.  *    a num_blocks > 65535, else c true.
  449.  */
  450. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_metadata(OggFLAC__SeekableStreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks);
  451. /** Set the read callback.
  452.  *  The supplied function will be called when the encoder needs to read back
  453.  *  encoded data.  This happens during the metadata callback, when the encoder
  454.  *  has to read, modify, and rewrite the metadata (e.g. seekpoints) gathered
  455.  *  while encoding.  The address of the buffer to be filled is supplied, along
  456.  *  with the number of bytes the buffer can hold.  The callback may choose to
  457.  *  supply less data and modify the byte count but must be careful not to
  458.  *  overflow the buffer.  The callback then returns a status code chosen from
  459.  *  OggFLAC__SeekableStreamEncoderReadStatus.
  460.  *
  461.  * note
  462.  * The callback is mandatory and must be set before initialization.
  463.  *
  464.  * default c NULL
  465.  * param  encoder  A encoder instance to set.
  466.  * param  value    See above.
  467.  * assert
  468.  *    code encoder != NULL endcode
  469.  *    code value != NULL endcode
  470.  * retval FLAC__bool
  471.  *    c false if the encoder is already initialized, else c true.
  472.  */
  473. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_read_callback(OggFLAC__SeekableStreamEncoder *encoder, OggFLAC__SeekableStreamEncoderReadCallback value);
  474. /** Set the seek callback.
  475.  *  The supplied function will be called when the encoder needs to seek
  476.  *  the output stream.  The encoder will pass the absolute byte offset
  477.  *  to seek to, 0 meaning the beginning of the stream.
  478.  *
  479.  * note
  480.  * The callback is mandatory and must be set before initialization.
  481.  *
  482.  * default c NULL
  483.  * param  encoder  An encoder instance to set.
  484.  * param  value    See above.
  485.  * assert
  486.  *    code encoder != NULL endcode
  487.  *    code value != NULL endcode
  488.  * retval FLAC__bool
  489.  *    c false if the encoder is already initialized, else c true.
  490.  */
  491. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_seek_callback(OggFLAC__SeekableStreamEncoder *encoder, OggFLAC__SeekableStreamEncoderSeekCallback value);
  492. /** Set the tell callback.
  493.  *  The supplied function will be called when the encoder needs to know
  494.  *  the current position of the output stream.
  495.  *
  496.  * note
  497.  * The callback is mandatory and must be set before initialization.
  498.  *
  499.  * default c NULL
  500.  * param  encoder  An encoder instance to set.
  501.  * param  value    See above.
  502.  * assert
  503.  *    code encoder != NULL endcode
  504.  *    code value != NULL endcode
  505.  * retval FLAC__bool
  506.  *    c false if the encoder is already initialized, else c true.
  507.  */
  508. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_tell_callback(OggFLAC__SeekableStreamEncoder *encoder, OggFLAC__SeekableStreamEncoderTellCallback value);
  509. /** Set the write callback.
  510.  *  This is inherited from FLAC__StreamEncoder; see
  511.  *  FLAC__stream_encoder_set_write_callback().
  512.  *
  513.  * note
  514.  * Unlike the FLAC seekable stream encoder write callback, the Ogg
  515.  * seekable stream encoder write callback will be called twice when
  516.  * writing audio frames; once for the page header, and once for the page
  517.  * body.  When writing the page header, the a samples argument to the
  518.  * write callback will be c 0.
  519.  *
  520.  * note
  521.  * The callback is mandatory and must be set before initialization.
  522.  *
  523.  * default c NULL
  524.  * param  encoder  An encoder instance to set.
  525.  * param  value    See above.
  526.  * assert
  527.  *    code encoder != NULL endcode
  528.  *    code value != NULL endcode
  529.  * retval FLAC__bool
  530.  *    c false if the encoder is already initialized, else c true.
  531.  */
  532. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_write_callback(OggFLAC__SeekableStreamEncoder *encoder, OggFLAC__SeekableStreamEncoderWriteCallback value);
  533. /** Set the client data to be passed back to callbacks.
  534.  *  This value will be supplied to callbacks in their a client_data
  535.  *  argument.
  536.  *
  537.  * default c NULL
  538.  * param  encoder  An encoder instance to set.
  539.  * param  value    See above.
  540.  * assert
  541.  *    code encoder != NULL endcode
  542.  * retval FLAC__bool
  543.  *    c false if the encoder is already initialized, else c true.
  544.  */
  545. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_set_client_data(OggFLAC__SeekableStreamEncoder *encoder, void *value);
  546. /** Get the current encoder state.
  547.  *
  548.  * param  encoder  An encoder instance to query.
  549.  * assert
  550.  *    code encoder != NULL endcode
  551.  * retval OggFLAC__SeekableStreamEncoderState
  552.  *    The current encoder state.
  553.  */
  554. OggFLAC_API OggFLAC__SeekableStreamEncoderState OggFLAC__seekable_stream_encoder_get_state(const OggFLAC__SeekableStreamEncoder *encoder);
  555. /** Get the state of the underlying FLAC stream encoder.
  556.  *  Useful when the seekable stream encoder state is
  557.  *  c OggFLAC__SEEKABLE_STREAM_ENCODER_FLAC_STREAM_ENCODER_ERROR.
  558.  *
  559.  * param  encoder  An encoder instance to query.
  560.  * assert
  561.  *    code encoder != NULL endcode
  562.  * retval FLAC__StreamEncoderState
  563.  *    The FLAC stream encoder state.
  564.  */
  565. OggFLAC_API FLAC__StreamEncoderState OggFLAC__seekable_stream_encoder_get_FLAC_stream_encoder_state(const OggFLAC__SeekableStreamEncoder *encoder);
  566. /** Get the state of the underlying FLAC encoder's verify decoder.
  567.  *  Useful when the seekable stream encoder state is
  568.  *  c OggFLAC__SEEKABLE_STREAM_ENCODER_FLAC_STREAM_ENCODER_ERROR
  569.  *  and the FLAC stream encoder state is
  570.  *  c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR.
  571.  *
  572.  * param  encoder  An encoder instance to query.
  573.  * assert
  574.  *    code encoder != NULL endcode
  575.  * retval FLAC__StreamDecoderState
  576.  *    The FLAC verify decoder state.
  577.  */
  578. OggFLAC_API FLAC__StreamDecoderState OggFLAC__seekable_stream_encoder_get_verify_decoder_state(const OggFLAC__SeekableStreamEncoder *encoder);
  579. /** Get the current encoder state as a C string.
  580.  *  This version automatically resolves
  581.  *  c OggFLAC__SEEKABLE_STREAM_ENCODER_FLAC_STREAM_ENCODER_ERROR
  582.  *  by getting the FLAC stream encoder's resolved state.
  583.  *
  584.  * param  encoder  A encoder instance to query.
  585.  * assert
  586.  *    code encoder != NULL endcode
  587.  * retval const char *
  588.  *    The encoder state as a C string.  Do not modify the contents.
  589.  */
  590. OggFLAC_API const char *OggFLAC__seekable_stream_encoder_get_resolved_state_string(const OggFLAC__SeekableStreamEncoder *encoder);
  591. /** Get relevant values about the nature of a verify decoder error.
  592.  *  Inherited from FLAC__stream_encoder_get_verify_decoder_error_stats().
  593.  *  Useful when the seekable stream encoder state is
  594.  *  c OggFLAC__SEEKABLE_STREAM_ENCODER_FLAC_STREAM_ENCODER_ERROR
  595.  *  and the FLAC stream encoder state is
  596.  *  c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR.
  597.  *
  598.  * param  encoder  An encoder instance to query.
  599.  * param  absolute_sample  The absolute sample number of the mismatch.
  600.  * param  frame_number  The number of the frame in which the mismatch occurred.
  601.  * param  channel       The channel in which the mismatch occurred.
  602.  * param  sample        The number of the sample (relative to the frame) in
  603.  *                       which the mismatch occurred.
  604.  * param  expected      The expected value for the sample in question.
  605.  * param  got           The actual value returned by the decoder.
  606.  * assert
  607.  *    code encoder != NULL endcode
  608.  *    code absolute_sample != NULL endcode
  609.  *    code frame_number != NULL endcode
  610.  *    code channel != NULL endcode
  611.  *    code sample != NULL endcode
  612.  *    code expected != NULL endcode
  613.  */
  614. OggFLAC_API void OggFLAC__seekable_stream_encoder_get_verify_decoder_error_stats(const OggFLAC__SeekableStreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got);
  615. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_verify()
  616.  *
  617.  * param  encoder  An encoder instance to query.
  618.  * assert
  619.  *    code encoder != NULL endcode
  620.  * retval FLAC__bool
  621.  *    See OggFLAC__seekable_stream_encoder_set_verify().
  622.  */
  623. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_get_verify(const OggFLAC__SeekableStreamEncoder *encoder);
  624. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_streamable_subset()
  625.  *
  626.  * param  encoder  An encoder instance to query.
  627.  * assert
  628.  *    code encoder != NULL endcode
  629.  * retval FLAC__bool
  630.  *    See OggFLAC__seekable_stream_encoder_set_streamable_subset().
  631.  */
  632. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_get_streamable_subset(const OggFLAC__SeekableStreamEncoder *encoder);
  633. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_do_mid_side_stereo()
  634.  *
  635.  * param  encoder  An encoder instance to query.
  636.  * assert
  637.  *    code encoder != NULL endcode
  638.  * retval FLAC__bool
  639.  *    See OggFLAC__seekable_stream_encoder_get_do_mid_side_stereo().
  640.  */
  641. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_get_do_mid_side_stereo(const OggFLAC__SeekableStreamEncoder *encoder);
  642. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_loose_mid_side_stereo()
  643.  *
  644.  * param  encoder  An encoder instance to query.
  645.  * assert
  646.  *    code encoder != NULL endcode
  647.  * retval FLAC__bool
  648.  *    See OggFLAC__seekable_stream_encoder_set_loose_mid_side_stereo().
  649.  */
  650. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_get_loose_mid_side_stereo(const OggFLAC__SeekableStreamEncoder *encoder);
  651. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_channels()
  652.  *
  653.  * param  encoder  An encoder instance to query.
  654.  * assert
  655.  *    code encoder != NULL endcode
  656.  * retval unsigned
  657.  *    See OggFLAC__seekable_stream_encoder_set_channels().
  658.  */
  659. OggFLAC_API unsigned OggFLAC__seekable_stream_encoder_get_channels(const OggFLAC__SeekableStreamEncoder *encoder);
  660. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_bits_per_sample()
  661.  *
  662.  * param  encoder  An encoder instance to query.
  663.  * assert
  664.  *    code encoder != NULL endcode
  665.  * retval unsigned
  666.  *    See OggFLAC__seekable_stream_encoder_set_bits_per_sample().
  667.  */
  668. OggFLAC_API unsigned OggFLAC__seekable_stream_encoder_get_bits_per_sample(const OggFLAC__SeekableStreamEncoder *encoder);
  669. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_sample_rate()
  670.  *
  671.  * param  encoder  An encoder instance to query.
  672.  * assert
  673.  *    code encoder != NULL endcode
  674.  * retval unsigned
  675.  *    See OggFLAC__seekable_stream_encoder_set_sample_rate().
  676.  */
  677. OggFLAC_API unsigned OggFLAC__seekable_stream_encoder_get_sample_rate(const OggFLAC__SeekableStreamEncoder *encoder);
  678. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_blocksize()
  679.  *
  680.  * param  encoder  An encoder instance to query.
  681.  * assert
  682.  *    code encoder != NULL endcode
  683.  * retval unsigned
  684.  *    See OggFLAC__seekable_stream_encoder_set_blocksize().
  685.  */
  686. OggFLAC_API unsigned OggFLAC__seekable_stream_encoder_get_blocksize(const OggFLAC__SeekableStreamEncoder *encoder);
  687. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_max_lpc_order()
  688.  *
  689.  * param  encoder  An encoder instance to query.
  690.  * assert
  691.  *    code encoder != NULL endcode
  692.  * retval unsigned
  693.  *    See OggFLAC__seekable_stream_encoder_set_max_lpc_order().
  694.  */
  695. OggFLAC_API unsigned OggFLAC__seekable_stream_encoder_get_max_lpc_order(const OggFLAC__SeekableStreamEncoder *encoder);
  696. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_qlp_coeff_precision()
  697.  *
  698.  * param  encoder  An encoder instance to query.
  699.  * assert
  700.  *    code encoder != NULL endcode
  701.  * retval unsigned
  702.  *    See OggFLAC__seekable_stream_encoder_set_qlp_coeff_precision().
  703.  */
  704. OggFLAC_API unsigned OggFLAC__seekable_stream_encoder_get_qlp_coeff_precision(const OggFLAC__SeekableStreamEncoder *encoder);
  705. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_do_qlp_coeff_prec_search()
  706.  *
  707.  * param  encoder  An encoder instance to query.
  708.  * assert
  709.  *    code encoder != NULL endcode
  710.  * retval FLAC__bool
  711.  *    See OggFLAC__seekable_stream_encoder_set_do_qlp_coeff_prec_search().
  712.  */
  713. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_get_do_qlp_coeff_prec_search(const OggFLAC__SeekableStreamEncoder *encoder);
  714. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_do_escape_coding()
  715.  *
  716.  * param  encoder  An encoder instance to query.
  717.  * assert
  718.  *    code encoder != NULL endcode
  719.  * retval FLAC__bool
  720.  *    See OggFLAC__seekable_stream_encoder_set_do_escape_coding().
  721.  */
  722. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_get_do_escape_coding(const OggFLAC__SeekableStreamEncoder *encoder);
  723. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_do_exhaustive_model_search()
  724.  *
  725.  * param  encoder  An encoder instance to query.
  726.  * assert
  727.  *    code encoder != NULL endcode
  728.  * retval FLAC__bool
  729.  *    See OggFLAC__seekable_stream_encoder_set_do_exhaustive_model_search().
  730.  */
  731. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_get_do_exhaustive_model_search(const OggFLAC__SeekableStreamEncoder *encoder);
  732. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_min_residual_partition_order()
  733.  *
  734.  * param  encoder  An encoder instance to query.
  735.  * assert
  736.  *    code encoder != NULL endcode
  737.  * retval unsigned
  738.  *    See OggFLAC__seekable_stream_encoder_set_min_residual_partition_order().
  739.  */
  740. OggFLAC_API unsigned OggFLAC__seekable_stream_encoder_get_min_residual_partition_order(const OggFLAC__SeekableStreamEncoder *encoder);
  741. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_man_residual_partition_order()
  742.  *
  743.  * param  encoder  An encoder instance to query.
  744.  * assert
  745.  *    code encoder != NULL endcode
  746.  * retval unsigned
  747.  *    See OggFLAC__seekable_stream_encoder_set_max_residual_partition_order().
  748.  */
  749. OggFLAC_API unsigned OggFLAC__seekable_stream_encoder_get_max_residual_partition_order(const OggFLAC__SeekableStreamEncoder *encoder);
  750. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_rice_parameter_search_dist()
  751.  *
  752.  * param  encoder  An encoder instance to query.
  753.  * assert
  754.  *    code encoder != NULL endcode
  755.  * retval unsigned
  756.  *    See OggFLAC__seekable_stream_encoder_set_rice_parameter_search_dist().
  757.  */
  758. OggFLAC_API unsigned OggFLAC__seekable_stream_encoder_get_rice_parameter_search_dist(const OggFLAC__SeekableStreamEncoder *encoder);
  759. /** This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_get_total_samples_estimate()
  760.  *
  761.  * param  encoder  An encoder instance to set.
  762.  * assert
  763.  *    code encoder != NULL endcode
  764.  * retval FLAC__uint64
  765.  *    See OggFLAC__seekable_stream_encoder_get_total_samples_estimate().
  766.  */
  767. OggFLAC_API FLAC__uint64 OggFLAC__seekable_stream_encoder_get_total_samples_estimate(const OggFLAC__SeekableStreamEncoder *encoder);
  768. /** Initialize the encoder instance.
  769.  *  Should be called after OggFLAC__seekable_stream_encoder_new() and
  770.  *  OggFLAC__seekable_stream_encoder_set_*() but before OggFLAC__seekable_stream_encoder_process()
  771.  *  or OggFLAC__seekable_stream_encoder_process_interleaved().  Will set and return
  772.  *  the encoder state, which will be OggFLAC__SEEKABLE_STREAM_ENCODER_OK if
  773.  *  initialization succeeded.
  774.  *
  775.  *  The call to OggFLAC__seekable_stream_encoder_init() currently will also immediately
  776.  *  call the write callback several times, once with the c fLaC signature,
  777.  *  and once for each encoded metadata block.
  778.  *
  779.  * param  encoder  An uninitialized encoder instance.
  780.  * assert
  781.  *    code encoder != NULL endcode
  782.  * retval OggFLAC__SeekableStreamEncoderState
  783.  *    c OggFLAC__SEEKABLE_STREAM_ENCODER_OK if initialization was successful; see
  784.  *    OggFLAC__SeekableStreamEncoderState for the meanings of other return values.
  785.  */
  786. OggFLAC_API OggFLAC__SeekableStreamEncoderState OggFLAC__seekable_stream_encoder_init(OggFLAC__SeekableStreamEncoder *encoder);
  787. /** Finish the encoding process.
  788.  *  Flushes the encoding buffer, releases resources, resets the encoder
  789.  *  settings to their defaults, and returns the encoder state to
  790.  *  OggFLAC__SEEKABLE_STREAM_ENCODER_UNINITIALIZED.  Note that this can generate
  791.  *  one or more write callbacks before returning.
  792.  *
  793.  *  In the event of a prematurely-terminated encode, it is not strictly
  794.  *  necessary to call this immediately before OggFLAC__seekable_stream_encoder_delete()
  795.  *  but it is good practice to match every OggFLAC__seekable_stream_encoder_init()
  796.  *  with an OggFLAC__seekable_stream_encoder_finish().
  797.  *
  798.  * param  encoder  An uninitialized encoder instance.
  799.  * assert
  800.  *    code encoder != NULL endcode
  801.  */
  802. OggFLAC_API void OggFLAC__seekable_stream_encoder_finish(OggFLAC__SeekableStreamEncoder *encoder);
  803. /** Submit data for encoding.
  804.  * This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_process().
  805.  *
  806.  * param  encoder  An initialized encoder instance in the OK state.
  807.  * param  buffer   An array of pointers to each channel's signal.
  808.  * param  samples  The number of samples in one channel.
  809.  * assert
  810.  *    code encoder != NULL endcode
  811.  *    code OggFLAC__seekable_stream_encoder_get_state(encoder) == OggFLAC__SEEKABLE_STREAM_ENCODER_OK endcode
  812.  * retval FLAC__bool
  813.  *    c true if successful, else c false; in this case, check the
  814.  *    encoder state with OggFLAC__seekable_stream_encoder_get_state() to see what
  815.  *    went wrong.
  816.  */
  817. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_process(OggFLAC__SeekableStreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples);
  818. /** Submit data for encoding.
  819.  * This is inherited from FLAC__StreamEncoder; see FLAC__stream_encoder_process_interleaved().
  820.  *
  821.  * param  encoder  An initialized encoder instance in the OK state.
  822.  * param  buffer   An array of channel-interleaved data (see above).
  823.  * param  samples  The number of samples in one channel, the same as for
  824.  *                  OggFLAC__seekable_stream_encoder_process().  For example, if
  825.  *                  encoding two channels, c 1000 a samples corresponds
  826.  *                  to a a buffer of 2000 values.
  827.  * assert
  828.  *    code encoder != NULL endcode
  829.  *    code OggFLAC__seekable_stream_encoder_get_state(encoder) == OggFLAC__SEEKABLE_STREAM_ENCODER_OK endcode
  830.  * retval FLAC__bool
  831.  *    c true if successful, else c false; in this case, check the
  832.  *    encoder state with OggFLAC__seekable_stream_encoder_get_state() to see what
  833.  *    went wrong.
  834.  */
  835. OggFLAC_API FLAC__bool OggFLAC__seekable_stream_encoder_process_interleaved(OggFLAC__SeekableStreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples);
  836. /* } */
  837. #ifdef __cplusplus
  838. }
  839. #endif
  840. #endif