vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

file_encoder.h (33083B)


      1 /* libFLAC - Free Lossless Audio Codec 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 
     32 #ifndef FLAC__FILE_ENCODER_H
     33 #define FLAC__FILE_ENCODER_H
     34 
     35 #include "export.h"
     36 #include "seekable_stream_encoder.h"
     37 
     38 #ifdef __cplusplus
     39 extern "C" {
     40 #endif
     41 
     42 
     43 /** \file include/FLAC/file_encoder.h
     44  *
     45  *  \brief
     46  *  This module contains the functions which implement the file
     47  *  encoder.
     48  *
     49  *  See the detailed documentation in the
     50  *  \link flac_file_encoder file encoder \endlink module.
     51  */
     52 
     53 /** \defgroup flac_file_encoder FLAC/file_encoder.h: file encoder interface
     54  *  \ingroup flac_encoder
     55  *
     56  *  \brief
     57  *  This module contains the functions which implement the file
     58  *  encoder.
     59  *
     60  * The basic usage of this encoder is as follows:
     61  * - The program creates an instance of an encoder using
     62  *   FLAC__file_encoder_new().
     63  * - The program overrides the default settings using
     64  *   FLAC__file_encoder_set_*() functions.
     65  * - The program initializes the instance to validate the settings and
     66  *   prepare for encoding using FLAC__file_encoder_init().
     67  * - The program calls FLAC__file_encoder_process() or
     68  *   FLAC__file_encoder_process_interleaved() to encode data, which
     69  *   subsequently writes data to the output file.
     70  * - The program finishes the encoding with FLAC__file_encoder_finish(),
     71  *   which causes the encoder to encode any data still in its input pipe,
     72  *   rewind and write the STREAMINFO metadata to file, and finally reset
     73  *   the encoder to the uninitialized state.
     74  * - The instance may be used again or deleted with
     75  *   FLAC__file_encoder_delete().
     76  *
     77  * The file encoder is a wrapper around the
     78  * \link flac_seekable_stream_encoder seekable stream encoder \endlink which supplies all
     79  * callbacks internally; the user need specify only the filename.
     80  *
     81  * Make sure to read the detailed description of the
     82  * \link flac_seekable_stream_encoder seekable stream encoder module \endlink since the
     83  * \link flac_stream_encoder stream encoder module \endlink since the
     84  * file encoder inherits much of its behavior from them.
     85  *
     86  * \note
     87  * The "set" functions may only be called when the encoder is in the
     88  * state FLAC__FILE_ENCODER_UNINITIALIZED, i.e. after
     89  * FLAC__file_encoder_new() or FLAC__file_encoder_finish(), but
     90  * before FLAC__file_encoder_init().  If this is the case they will
     91  * return \c true, otherwise \c false.
     92  *
     93  * \note
     94  * FLAC__file_encoder_finish() resets all settings to the constructor
     95  * defaults.
     96  *
     97  * \{
     98  */
     99 
    100 
    101 /** State values for a FLAC__FileEncoder
    102  *
    103  *  The encoder's state can be obtained by calling FLAC__file_encoder_get_state().
    104  */
    105 typedef enum {
    106 
    107 	FLAC__FILE_ENCODER_OK = 0,
    108 	/**< The encoder is in the normal OK state. */
    109 
    110 	FLAC__FILE_ENCODER_NO_FILENAME,
    111 	/**< FLAC__file_encoder_init() was called without first calling
    112 	 * FLAC__file_encoder_set_filename().
    113 	 */
    114 
    115 	FLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR,
    116 	/**< An error occurred in the underlying seekable stream encoder;
    117 	 * check FLAC__file_encoder_get_seekable_stream_encoder_state().
    118 	 */
    119 
    120 	FLAC__FILE_ENCODER_FATAL_ERROR_WHILE_WRITING,
    121 	/**< A fatal error occurred while writing to the encoded file. */
    122 
    123 	FLAC__FILE_ENCODER_ERROR_OPENING_FILE,
    124 	/**< An error occurred opening the output file for writing. */
    125 
    126 	FLAC__FILE_ENCODER_MEMORY_ALLOCATION_ERROR,
    127 	/**< Memory allocation failed. */
    128 
    129 	FLAC__FILE_ENCODER_ALREADY_INITIALIZED,
    130 	/**< FLAC__file_encoder_init() was called when the encoder was
    131 	 * already initialized, usually because
    132 	 * FLAC__file_encoder_finish() was not called.
    133 	 */
    134 
    135 	FLAC__FILE_ENCODER_UNINITIALIZED
    136 	/**< The encoder is in the uninitialized state. */
    137 
    138 } FLAC__FileEncoderState;
    139 
    140 /** Maps a FLAC__FileEncoderState to a C string.
    141  *
    142  *  Using a FLAC__FileEncoderState as the index to this array
    143  *  will give the string equivalent.  The contents should not be modified.
    144  */
    145 extern FLAC_API const char * const FLAC__FileEncoderStateString[];
    146 
    147 
    148 /***********************************************************************
    149  *
    150  * class FLAC__FileEncoder
    151  *
    152  ***********************************************************************/
    153 
    154 struct FLAC__FileEncoderProtected;
    155 struct FLAC__FileEncoderPrivate;
    156 /** The opaque structure definition for the file encoder type.
    157  *  See the \link flac_file_encoder file encoder module \endlink
    158  *  for a detailed description.
    159  */
    160 typedef struct {
    161 	struct FLAC__FileEncoderProtected *protected_; /* avoid the C++ keyword 'protected' */
    162 	struct FLAC__FileEncoderPrivate *private_; /* avoid the C++ keyword 'private' */
    163 } FLAC__FileEncoder;
    164 
    165 /** Signature for the progress callback.
    166  *  See FLAC__file_encoder_set_progress_callback() for more info.
    167  *
    168  * \param  encoder          The encoder instance calling the callback.
    169  * \param  bytes_written    Bytes written so far.
    170  * \param  samples_written  Samples written so far.
    171  * \param  frames_written   Frames written so far.
    172  * \param  total_frames_estimate  The estimate of the total number of
    173  *                                frames to be written.
    174  * \param  client_data      The callee's client data set through
    175  *                          FLAC__file_encoder_set_client_data().
    176  */
    177 typedef void (*FLAC__FileEncoderProgressCallback)(const FLAC__FileEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data);
    178 
    179 
    180 /***********************************************************************
    181  *
    182  * Class constructor/destructor
    183  *
    184  ***********************************************************************/
    185 
    186 /** Create a new file encoder instance.  The instance is created with
    187  *  default settings; see the individual FLAC__file_encoder_set_*()
    188  *  functions for each setting's default.
    189  *
    190  * \retval FLAC__FileEncoder*
    191  *    \c NULL if there was an error allocating memory, else the new instance.
    192  */
    193 FLAC_API FLAC__FileEncoder *FLAC__file_encoder_new();
    194 
    195 /** Free an encoder instance.  Deletes the object pointed to by \a encoder.
    196  *
    197  * \param encoder  A pointer to an existing encoder.
    198  * \assert
    199  *    \code encoder != NULL \endcode
    200  */
    201 FLAC_API void FLAC__file_encoder_delete(FLAC__FileEncoder *encoder);
    202 
    203 /***********************************************************************
    204  *
    205  * Public class method prototypes
    206  *
    207  ***********************************************************************/
    208 
    209 /** This is inherited from FLAC__SeekableStreamEncoder; see
    210  *  FLAC__seekable_stream_encoder_set_verify().
    211  *
    212  * \default \c true
    213  * \param  encoder  An encoder instance to set.
    214  * \param  value    See above.
    215  * \assert
    216  *    \code encoder != NULL \endcode
    217  * \retval FLAC__bool
    218  *    \c false if the encoder is already initialized, else \c true.
    219  */
    220 FLAC_API FLAC__bool FLAC__file_encoder_set_verify(FLAC__FileEncoder *encoder, FLAC__bool value);
    221 
    222 /** This is inherited from FLAC__SeekableStreamEncoder; see
    223  *  FLAC__seekable_stream_encoder_set_streamable_subset().
    224  *
    225  * \default \c true
    226  * \param  encoder  An encoder instance to set.
    227  * \param  value    See above.
    228  * \assert
    229  *    \code encoder != NULL \endcode
    230  * \retval FLAC__bool
    231  *    \c false if the encoder is already initialized, else \c true.
    232  */
    233 FLAC_API FLAC__bool FLAC__file_encoder_set_streamable_subset(FLAC__FileEncoder *encoder, FLAC__bool value);
    234 
    235 /** This is inherited from FLAC__SeekableStreamEncoder; see
    236  *  FLAC__seekable_stream_encoder_set_do_mid_side_stereo().
    237  *
    238  * \default \c false
    239  * \param  encoder  An encoder instance to set.
    240  * \param  value    See above.
    241  * \assert
    242  *    \code encoder != NULL \endcode
    243  * \retval FLAC__bool
    244  *    \c false if the encoder is already initialized, else \c true.
    245  */
    246 FLAC_API FLAC__bool FLAC__file_encoder_set_do_mid_side_stereo(FLAC__FileEncoder *encoder, FLAC__bool value);
    247 
    248 /** This is inherited from FLAC__SeekableStreamEncoder; see
    249  *  FLAC__seekable_stream_encoder_set_loose_mid_side_stereo().
    250  *
    251  * \default \c false
    252  * \param  encoder  An encoder instance to set.
    253  * \param  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 FLAC_API FLAC__bool FLAC__file_encoder_set_loose_mid_side_stereo(FLAC__FileEncoder *encoder, FLAC__bool value);
    260 
    261 /** This is inherited from FLAC__SeekableStreamEncoder; see
    262  *  FLAC__seekable_stream_encoder_set_channels().
    263  *
    264  * \default \c 2
    265  * \param  encoder  An encoder instance to set.
    266  * \param  value    See above.
    267  * \assert
    268  *    \code encoder != NULL \endcode
    269  * \retval FLAC__bool
    270  *    \c false if the encoder is already initialized, else \c true.
    271  */
    272 FLAC_API FLAC__bool FLAC__file_encoder_set_channels(FLAC__FileEncoder *encoder, unsigned value);
    273 
    274 /** This is inherited from FLAC__SeekableStreamEncoder; see
    275  *  FLAC__seekable_stream_encoder_set_bits_per_sample().
    276  *
    277  * \warning
    278  * Do not feed the encoder data that is wider than the value you
    279  * set here or you will generate an invalid stream.
    280  *
    281  * \default \c 16
    282  * \param  encoder  An encoder instance to set.
    283  * \param  value    See above.
    284  * \assert
    285  *    \code encoder != NULL \endcode
    286  * \retval FLAC__bool
    287  *    \c false if the encoder is already initialized, else \c true.
    288  */
    289 FLAC_API FLAC__bool FLAC__file_encoder_set_bits_per_sample(FLAC__FileEncoder *encoder, unsigned value);
    290 
    291 /** This is inherited from FLAC__SeekableStreamEncoder; see
    292  *  FLAC__seekable_stream_encoder_set_sample_rate().
    293  *
    294  * \default \c 44100
    295  * \param  encoder  An encoder instance to set.
    296  * \param  value    See above.
    297  * \assert
    298  *    \code encoder != NULL \endcode
    299  * \retval FLAC__bool
    300  *    \c false if the encoder is already initialized, else \c true.
    301  */
    302 FLAC_API FLAC__bool FLAC__file_encoder_set_sample_rate(FLAC__FileEncoder *encoder, unsigned value);
    303 
    304 /** This is inherited from FLAC__SeekableStreamEncoder; see
    305  *  FLAC__seekable_stream_encoder_set_blocksize().
    306  *
    307  * \default \c 1152
    308  * \param  encoder  An encoder instance to set.
    309  * \param  value    See above.
    310  * \assert
    311  *    \code encoder != NULL \endcode
    312  * \retval FLAC__bool
    313  *    \c false if the encoder is already initialized, else \c true.
    314  */
    315 FLAC_API FLAC__bool FLAC__file_encoder_set_blocksize(FLAC__FileEncoder *encoder, unsigned value);
    316 
    317 /** This is inherited from FLAC__SeekableStreamEncoder; see
    318  *  FLAC__seekable_stream_encoder_set_max_lpc_order().
    319  *
    320  * \default \c 0
    321  * \param  encoder  An encoder instance to set.
    322  * \param  value    See above.
    323  * \assert
    324  *    \code encoder != NULL \endcode
    325  * \retval FLAC__bool
    326  *    \c false if the encoder is already initialized, else \c true.
    327  */
    328 FLAC_API FLAC__bool FLAC__file_encoder_set_max_lpc_order(FLAC__FileEncoder *encoder, unsigned value);
    329 
    330 /** This is inherited from FLAC__SeekableStreamEncoder; see
    331  *  FLAC__seekable_stream_encoder_set_qlp_coeff_precision().
    332  *
    333  * \note
    334  * In the current implementation, qlp_coeff_precision + bits_per_sample must
    335  * be less than 32.
    336  *
    337  * \default \c 0
    338  * \param  encoder  An encoder instance to set.
    339  * \param  value    See above.
    340  * \assert
    341  *    \code encoder != NULL \endcode
    342  * \retval FLAC__bool
    343  *    \c false if the encoder is already initialized, else \c true.
    344  */
    345 FLAC_API FLAC__bool FLAC__file_encoder_set_qlp_coeff_precision(FLAC__FileEncoder *encoder, unsigned value);
    346 
    347 /** This is inherited from FLAC__SeekableStreamEncoder; see
    348  *  FLAC__seekable_stream_encoder_set_do_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 FLAC_API FLAC__bool FLAC__file_encoder_set_do_qlp_coeff_prec_search(FLAC__FileEncoder *encoder, FLAC__bool value);
    359 
    360 /** This is inherited from FLAC__SeekableStreamEncoder; see
    361  *  FLAC__seekable_stream_encoder_set_do_escape_coding().
    362  *
    363  * \default \c false
    364  * \param  encoder  An encoder instance to set.
    365  * \param  value    See above.
    366  * \assert
    367  *    \code encoder != NULL \endcode
    368  * \retval FLAC__bool
    369  *    \c false if the encoder is already initialized, else \c true.
    370  */
    371 FLAC_API FLAC__bool FLAC__file_encoder_set_do_escape_coding(FLAC__FileEncoder *encoder, FLAC__bool value);
    372 
    373 /** This is inherited from FLAC__SeekableStreamEncoder; see
    374  *  FLAC__seekable_stream_encoder_set_do_exhaustive_model_search().
    375  *
    376  * \default \c false
    377  * \param  encoder  An encoder instance to set.
    378  * \param  value    See above.
    379  * \assert
    380  *    \code encoder != NULL \endcode
    381  * \retval FLAC__bool
    382  *    \c false if the encoder is already initialized, else \c true.
    383  */
    384 FLAC_API FLAC__bool FLAC__file_encoder_set_do_exhaustive_model_search(FLAC__FileEncoder *encoder, FLAC__bool value);
    385 
    386 /** This is inherited from FLAC__SeekableStreamEncoder; see
    387  *  FLAC__seekable_stream_encoder_set_min_residual_partition_order().
    388  *
    389  * \default \c 0
    390  * \param  encoder  An encoder instance to set.
    391  * \param  value    See above.
    392  * \assert
    393  *    \code encoder != NULL \endcode
    394  * \retval FLAC__bool
    395  *    \c false if the encoder is already initialized, else \c true.
    396  */
    397 FLAC_API FLAC__bool FLAC__file_encoder_set_min_residual_partition_order(FLAC__FileEncoder *encoder, unsigned value);
    398 
    399 /** This is inherited from FLAC__SeekableStreamEncoder; see
    400  *  FLAC__seekable_stream_encoder_set_max_residual_partition_order().
    401  *
    402  * \default \c 0
    403  * \param  encoder  An encoder instance to set.
    404  * \param  value    See above.
    405  * \assert
    406  *    \code encoder != NULL \endcode
    407  * \retval FLAC__bool
    408  *    \c false if the encoder is already initialized, else \c true.
    409  */
    410 FLAC_API FLAC__bool FLAC__file_encoder_set_max_residual_partition_order(FLAC__FileEncoder *encoder, unsigned value);
    411 
    412 /** This is inherited from FLAC__SeekableStreamEncoder; see
    413  *  FLAC__seekable_stream_encoder_set_rice_parameter_search_dist().
    414  *
    415  * \default \c 0
    416  * \param  encoder  An encoder instance to set.
    417  * \param  value    See above.
    418  * \assert
    419  *    \code encoder != NULL \endcode
    420  * \retval FLAC__bool
    421  *    \c false if the encoder is already initialized, else \c true.
    422  */
    423 FLAC_API FLAC__bool FLAC__file_encoder_set_rice_parameter_search_dist(FLAC__FileEncoder *encoder, unsigned value);
    424 
    425 /** This is inherited from FLAC__SeekableStreamEncoder; see
    426  *  FLAC__seekable_stream_encoder_set_total_samples_estimate().
    427  *
    428  * \default \c 0
    429  * \param  encoder  An encoder instance to set.
    430  * \param  value    See above.
    431  * \assert
    432  *    \code encoder != NULL \endcode
    433  * \retval FLAC__bool
    434  *    \c false if the encoder is already initialized, else \c true.
    435  */
    436 FLAC_API FLAC__bool FLAC__file_encoder_set_total_samples_estimate(FLAC__FileEncoder *encoder, FLAC__uint64 value);
    437 
    438 /** This is inherited from FLAC__SeekableStreamEncoder; see
    439  *  FLAC__seekable_stream_encoder_set_metadata().
    440  *
    441  * \default \c NULL, 0
    442  * \param  encoder     An encoder instance to set.
    443  * \param  metadata    See above.
    444  * \param  num_blocks  See above.
    445  * \assert
    446  *    \code encoder != NULL \endcode
    447  * \retval FLAC__bool
    448  *    \c false if the encoder is already initialized, else \c true.
    449  */
    450 FLAC_API FLAC__bool FLAC__file_encoder_set_metadata(FLAC__FileEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks);
    451 
    452 /** Set the output file name encode to.
    453  *
    454  * \note
    455  * The filename is mandatory and must be set before initialization.
    456  *
    457  * \note
    458  * Unlike the FLAC__FileDecoder, the filename does not interpret "-" for
    459  * \c stdout; writing to \c stdout is not relevant in the file encoder.
    460  *
    461  * \default \c NULL
    462  * \param  encoder  A encoder instance to set.
    463  * \param  value    The output file name.
    464  * \assert
    465  *    \code encoder != NULL \endcode
    466  *    \code value != NULL \endcode
    467  * \retval FLAC__bool
    468  *    \c false if the encoder is already initialized, or there was a memory
    469  *    allocation error, else \c true.
    470  */
    471 FLAC_API FLAC__bool FLAC__file_encoder_set_filename(FLAC__FileEncoder *encoder, const char *value);
    472 
    473 /** Set the progress callback.
    474  *  The supplied function will be called when the encoder has finished
    475  *  writing a frame.  The \c total_frames_estimate argument to the callback
    476  *  will be based on the value from
    477  *  FLAC__file_encoder_set_total_samples_estimate().
    478  *
    479  * \note
    480  * Unlike most other callbacks, the progress callback is \b not mandatory
    481  * and need not be set before initialization.
    482  *
    483  * \default \c NULL
    484  * \param  encoder  An encoder instance to set.
    485  * \param  value    See above.
    486  * \assert
    487  *    \code encoder != NULL \endcode
    488  *    \code value != NULL \endcode
    489  * \retval FLAC__bool
    490  *    \c false if the encoder is already initialized, else \c true.
    491  */
    492 FLAC_API FLAC__bool FLAC__file_encoder_set_progress_callback(FLAC__FileEncoder *encoder, FLAC__FileEncoderProgressCallback value);
    493 
    494 /** Set the client data to be passed back to callbacks.
    495  *  This value will be supplied to callbacks in their \a client_data
    496  *  argument.
    497  *
    498  * \default \c NULL
    499  * \param  encoder  An encoder instance to set.
    500  * \param  value    See above.
    501  * \assert
    502  *    \code encoder != NULL \endcode
    503  * \retval FLAC__bool
    504  *    \c false if the encoder is already initialized, else \c true.
    505  */
    506 FLAC_API FLAC__bool FLAC__file_encoder_set_client_data(FLAC__FileEncoder *encoder, void *value);
    507 
    508 /** Get the current encoder state.
    509  *
    510  * \param  encoder  An encoder instance to query.
    511  * \assert
    512  *    \code encoder != NULL \endcode
    513  * \retval FLAC__FileEncoderState
    514  *    The current encoder state.
    515  */
    516 FLAC_API FLAC__FileEncoderState FLAC__file_encoder_get_state(const FLAC__FileEncoder *encoder);
    517 
    518 /** Get the state of the underlying seekable stream encoder.
    519  *  Useful when the file encoder state is
    520  *  \c FLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR.
    521  *
    522  * \param  encoder  An encoder instance to query.
    523  * \assert
    524  *    \code encoder != NULL \endcode
    525  * \retval FLAC__SeekableStreamEncoderState
    526  *    The seekable stream encoder state.
    527  */
    528 FLAC_API FLAC__SeekableStreamEncoderState FLAC__file_encoder_get_seekable_stream_encoder_state(const FLAC__FileEncoder *encoder);
    529 
    530 /** Get the state of the underlying stream encoder.
    531  *  Useful when the file encoder state is
    532  *  \c FLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR and the seekable stream
    533  *  encoder state is \c FLAC__SEEKABLE_STREAM_ENCODER_STREAM_ENCODER_ERROR.
    534  *
    535  * \param  encoder  An encoder instance to query.
    536  * \assert
    537  *    \code encoder != NULL \endcode
    538  * \retval FLAC__StreamEncoderState
    539  *    The seekable stream encoder state.
    540  */
    541 FLAC_API FLAC__StreamEncoderState FLAC__file_encoder_get_stream_encoder_state(const FLAC__FileEncoder *encoder);
    542 
    543 /** Get the state of the underlying stream encoder's verify decoder.
    544  *  Useful when the file encoder state is
    545  *  \c FLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR and the seekable stream
    546  *  encoder state is \c FLAC__SEEKABLE_STREAM_ENCODER_STREAM_ENCODER_ERROR and
    547  *  the stream encoder state is \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR.
    548  *
    549  * \param  encoder  An encoder instance to query.
    550  * \assert
    551  *    \code encoder != NULL \endcode
    552  * \retval FLAC__StreamDecoderState
    553  *    The stream encoder state.
    554  */
    555 FLAC_API FLAC__StreamDecoderState FLAC__file_encoder_get_verify_decoder_state(const FLAC__FileEncoder *encoder);
    556 
    557 /** Get the current encoder state as a C string.
    558  *  This version automatically resolves
    559  *  \c FLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR by getting the
    560  *  seekable stream encoder's state.
    561  *
    562  * \param  encoder  A encoder instance to query.
    563  * \assert
    564  *    \code encoder != NULL \endcode
    565  * \retval const char *
    566  *    The encoder state as a C string.  Do not modify the contents.
    567  */
    568 FLAC_API const char *FLAC__file_encoder_get_resolved_state_string(const FLAC__FileEncoder *encoder);
    569 
    570 /** Get relevant values about the nature of a verify decoder error.
    571  *  Inherited from FLAC__seekable_stream_encoder_get_verify_decoder_error_stats().
    572  *  Useful when the file encoder state is
    573  *  \c FLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR and the seekable stream
    574  *  encoder state is
    575  *  \c FLAC__SEEKABLE_STREAM_ENCODER_STREAM_ENCODER_ERROR and the
    576  *  stream encoder state is
    577  *  \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR.
    578  *
    579  * \param  encoder  An encoder instance to query.
    580  * \param  absolute_sample  The absolute sample number of the mismatch.
    581  * \param  frame_number  The number of the frame in which the mismatch occurred.
    582  * \param  channel       The channel in which the mismatch occurred.
    583  * \param  sample        The number of the sample (relative to the frame) in
    584  *                       which the mismatch occurred.
    585  * \param  expected      The expected value for the sample in question.
    586  * \param  got           The actual value returned by the decoder.
    587  * \assert
    588  *    \code encoder != NULL \endcode
    589  */
    590 FLAC_API void FLAC__file_encoder_get_verify_decoder_error_stats(const FLAC__FileEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got);
    591 
    592 /** Get the "verify" flag.
    593  *  This is inherited from FLAC__SeekableStreamEncoder; see
    594  *  FLAC__seekable_stream_encoder_get_verify().
    595  *
    596  * \param  encoder  An encoder instance to query.
    597  * \assert
    598  *    \code encoder != NULL \endcode
    599  * \retval FLAC__bool
    600  *    See FLAC__file_encoder_set_verify().
    601  */
    602 FLAC_API FLAC__bool FLAC__file_encoder_get_verify(const FLAC__FileEncoder *encoder);
    603 
    604 /** Get the "streamable subset" flag.
    605  *  This is inherited from FLAC__SeekableStreamEncoder; see
    606  *  FLAC__seekable_stream_encoder_get_streamable_subset().
    607  *
    608  * \param  encoder  An encoder instance to query.
    609  * \assert
    610  *    \code encoder != NULL \endcode
    611  * \retval FLAC__bool
    612  *    See FLAC__file_encoder_set_streamable_subset().
    613  */
    614 FLAC_API FLAC__bool FLAC__file_encoder_get_streamable_subset(const FLAC__FileEncoder *encoder);
    615 
    616 /** Get the "mid/side stereo coding" flag.
    617  *  This is inherited from FLAC__SeekableStreamEncoder; see
    618  *  FLAC__seekable_stream_encoder_get_do_mid_side_stereo().
    619  *
    620  * \param  encoder  An encoder instance to query.
    621  * \assert
    622  *    \code encoder != NULL \endcode
    623  * \retval FLAC__bool
    624  *    See FLAC__file_encoder_get_do_mid_side_stereo().
    625  */
    626 FLAC_API FLAC__bool FLAC__file_encoder_get_do_mid_side_stereo(const FLAC__FileEncoder *encoder);
    627 
    628 /** Get the "adaptive mid/side switching" flag.
    629  *  This is inherited from FLAC__SeekableStreamEncoder; see
    630  *  FLAC__seekable_stream_encoder_get_loose_mid_side_stereo().
    631  *
    632  * \param  encoder  An encoder instance to query.
    633  * \assert
    634  *    \code encoder != NULL \endcode
    635  * \retval FLAC__bool
    636  *    See FLAC__file_encoder_set_loose_mid_side_stereo().
    637  */
    638 FLAC_API FLAC__bool FLAC__file_encoder_get_loose_mid_side_stereo(const FLAC__FileEncoder *encoder);
    639 
    640 /** Get the number of input channels being processed.
    641  *  This is inherited from FLAC__SeekableStreamEncoder; see
    642  *  FLAC__seekable_stream_encoder_get_channels().
    643  *
    644  * \param  encoder  An encoder instance to query.
    645  * \assert
    646  *    \code encoder != NULL \endcode
    647  * \retval unsigned
    648  *    See FLAC__file_encoder_set_channels().
    649  */
    650 FLAC_API unsigned FLAC__file_encoder_get_channels(const FLAC__FileEncoder *encoder);
    651 
    652 /** Get the input sample resolution setting.
    653  *  This is inherited from FLAC__SeekableStreamEncoder; see
    654  *  FLAC__seekable_stream_encoder_get_bits_per_sample().
    655  *
    656  * \param  encoder  An encoder instance to query.
    657  * \assert
    658  *    \code encoder != NULL \endcode
    659  * \retval unsigned
    660  *    See FLAC__file_encoder_set_bits_per_sample().
    661  */
    662 FLAC_API unsigned FLAC__file_encoder_get_bits_per_sample(const FLAC__FileEncoder *encoder);
    663 
    664 /** Get the input sample rate setting.
    665  *  This is inherited from FLAC__SeekableStreamEncoder; see
    666  *  FLAC__seekable_stream_encoder_get_sample_rate().
    667  *
    668  * \param  encoder  An encoder instance to query.
    669  * \assert
    670  *    \code encoder != NULL \endcode
    671  * \retval unsigned
    672  *    See FLAC__file_encoder_set_sample_rate().
    673  */
    674 FLAC_API unsigned FLAC__file_encoder_get_sample_rate(const FLAC__FileEncoder *encoder);
    675 
    676 /** Get the blocksize setting.
    677  *  This is inherited from FLAC__SeekableStreamEncoder; see
    678  *  FLAC__seekable_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 FLAC__file_encoder_set_blocksize().
    685  */
    686 FLAC_API unsigned FLAC__file_encoder_get_blocksize(const FLAC__FileEncoder *encoder);
    687 
    688 /** Get the maximum LPC order setting.
    689  *  This is inherited from FLAC__SeekableStreamEncoder; see
    690  *  FLAC__seekable_stream_encoder_get_max_lpc_order().
    691  *
    692  * \param  encoder  An encoder instance to query.
    693  * \assert
    694  *    \code encoder != NULL \endcode
    695  * \retval unsigned
    696  *    See FLAC__file_encoder_set_max_lpc_order().
    697  */
    698 FLAC_API unsigned FLAC__file_encoder_get_max_lpc_order(const FLAC__FileEncoder *encoder);
    699 
    700 /** Get the quantized linear predictor coefficient precision setting.
    701  *  This is inherited from FLAC__SeekableStreamEncoder; see
    702  *  FLAC__seekable_stream_encoder_get_qlp_coeff_precision().
    703  *
    704  * \param  encoder  An encoder instance to query.
    705  * \assert
    706  *    \code encoder != NULL \endcode
    707  * \retval unsigned
    708  *    See FLAC__file_encoder_set_qlp_coeff_precision().
    709  */
    710 FLAC_API unsigned FLAC__file_encoder_get_qlp_coeff_precision(const FLAC__FileEncoder *encoder);
    711 
    712 /** Get the qlp coefficient precision search flag.
    713  *  This is inherited from FLAC__SeekableStreamEncoder; see
    714  *  FLAC__seekable_stream_encoder_get_do_qlp_coeff_prec_search().
    715  *
    716  * \param  encoder  An encoder instance to query.
    717  * \assert
    718  *    \code encoder != NULL \endcode
    719  * \retval FLAC__bool
    720  *    See FLAC__file_encoder_set_do_qlp_coeff_prec_search().
    721  */
    722 FLAC_API FLAC__bool FLAC__file_encoder_get_do_qlp_coeff_prec_search(const FLAC__FileEncoder *encoder);
    723 
    724 /** Get the "escape coding" flag.
    725  *  This is inherited from FLAC__SeekableStreamEncoder; see
    726  *  FLAC__seekable_stream_encoder_get_do_escape_coding().
    727  *
    728  * \param  encoder  An encoder instance to query.
    729  * \assert
    730  *    \code encoder != NULL \endcode
    731  * \retval FLAC__bool
    732  *    See FLAC__file_encoder_set_do_escape_coding().
    733  */
    734 FLAC_API FLAC__bool FLAC__file_encoder_get_do_escape_coding(const FLAC__FileEncoder *encoder);
    735 
    736 /** Get the exhaustive model search flag.
    737  *  This is inherited from FLAC__SeekableStreamEncoder; see
    738  *  FLAC__seekable_stream_encoder_get_do_exhaustive_model_search().
    739  *
    740  * \param  encoder  An encoder instance to query.
    741  * \assert
    742  *    \code encoder != NULL \endcode
    743  * \retval FLAC__bool
    744  *    See FLAC__file_encoder_set_do_exhaustive_model_search().
    745  */
    746 FLAC_API FLAC__bool FLAC__file_encoder_get_do_exhaustive_model_search(const FLAC__FileEncoder *encoder);
    747 
    748 /** Get the minimum residual partition order setting.
    749  *  This is inherited from FLAC__SeekableStreamEncoder; see
    750  *  FLAC__seekable_stream_encoder_get_min_residual_partition_order().
    751  *
    752  * \param  encoder  An encoder instance to query.
    753  * \assert
    754  *    \code encoder != NULL \endcode
    755  * \retval unsigned
    756  *    See FLAC__file_encoder_set_min_residual_partition_order().
    757  */
    758 FLAC_API unsigned FLAC__file_encoder_get_min_residual_partition_order(const FLAC__FileEncoder *encoder);
    759 
    760 /** Get maximum residual partition order setting.
    761  *  This is inherited from FLAC__SeekableStreamEncoder; see
    762  *  FLAC__seekable_stream_encoder_get_max_residual_partition_order().
    763  *
    764  * \param  encoder  An encoder instance to query.
    765  * \assert
    766  *    \code encoder != NULL \endcode
    767  * \retval unsigned
    768  *    See FLAC__file_encoder_set_max_residual_partition_order().
    769  */
    770 FLAC_API unsigned FLAC__file_encoder_get_max_residual_partition_order(const FLAC__FileEncoder *encoder);
    771 
    772 /** Get the Rice parameter search distance setting.
    773  *  This is inherited from FLAC__SeekableStreamEncoder; see
    774  *  FLAC__seekable_stream_encoder_get_rice_parameter_search_dist().
    775  *
    776  * \param  encoder  An encoder instance to query.
    777  * \assert
    778  *    \code encoder != NULL \endcode
    779  * \retval unsigned
    780  *    See FLAC__file_encoder_set_rice_parameter_search_dist().
    781  */
    782 FLAC_API unsigned FLAC__file_encoder_get_rice_parameter_search_dist(const FLAC__FileEncoder *encoder);
    783 
    784 /** Get the previously set estimate of the total samples to be encoded.
    785  *  This is inherited from FLAC__SeekableStreamEncoder; see
    786  *  FLAC__seekable_stream_encoder_get_total_samples_estimate().
    787  *
    788  * \param  encoder  An encoder instance to query.
    789  * \assert
    790  *    \code encoder != NULL \endcode
    791  * \retval FLAC__uint64
    792  *    See FLAC__file_encoder_set_total_samples_estimate().
    793  */
    794 FLAC_API FLAC__uint64 FLAC__file_encoder_get_total_samples_estimate(const FLAC__FileEncoder *encoder);
    795 
    796 /** Initialize the encoder instance.
    797  *  Should be called after FLAC__file_encoder_new() and
    798  *  FLAC__file_encoder_set_*() but before FLAC__file_encoder_process()
    799  *  or FLAC__file_encoder_process_interleaved().  Will set and return
    800  *  the encoder state, which will be FLAC__FILE_ENCODER_OK if
    801  *  initialization succeeded.
    802  *
    803  * \param  encoder  An uninitialized encoder instance.
    804  * \assert
    805  *    \code encoder != NULL \endcode
    806  * \retval FLAC__FileEncoderState
    807  *    \c FLAC__FILE_ENCODER_OK if initialization was successful; see
    808  *    FLAC__FileEncoderState for the meanings of other return values.
    809  */
    810 FLAC_API FLAC__FileEncoderState FLAC__file_encoder_init(FLAC__FileEncoder *encoder);
    811 
    812 /** Finish the encoding process.
    813  *  Flushes the encoding buffer, releases resources, resets the encoder
    814  *  settings to their defaults, and returns the encoder state to
    815  *  FLAC__FILE_ENCODER_UNINITIALIZED.
    816  *
    817  *  In the event of a prematurely-terminated encode, it is not strictly
    818  *  necessary to call this immediately before FLAC__file_encoder_delete()
    819  *  but it is good practice to match every FLAC__file_encoder_init()
    820  *  with a FLAC__file_encoder_finish().
    821  *
    822  * \param  encoder  An uninitialized encoder instance.
    823  * \assert
    824  *    \code encoder != NULL \endcode
    825  */
    826 FLAC_API void FLAC__file_encoder_finish(FLAC__FileEncoder *encoder);
    827 
    828 /** Submit data for encoding.
    829  *  This is inherited from FLAC__SeekableStreamEncoder; see
    830  *  FLAC__seekable_stream_encoder_process().
    831  *
    832  * \param  encoder  An initialized encoder instance in the OK state.
    833  * \param  buffer   An array of pointers to each channel's signal.
    834  * \param  samples  The number of samples in one channel.
    835  * \assert
    836  *    \code encoder != NULL \endcode
    837  *    \code FLAC__file_encoder_get_state(encoder) == FLAC__FILE_ENCODER_OK \endcode
    838  * \retval FLAC__bool
    839  *    \c true if successful, else \c false; in this case, check the
    840  *    encoder state with FLAC__file_encoder_get_state() to see what
    841  *    went wrong.
    842  */
    843 FLAC_API FLAC__bool FLAC__file_encoder_process(FLAC__FileEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples);
    844 
    845 /** Submit data for encoding.
    846  *  This is inherited from FLAC__SeekableStreamEncoder; see
    847  *  FLAC__seekable_stream_encoder_process_interleaved().
    848  *
    849  * \param  encoder  An initialized encoder instance in the OK state.
    850  * \param  buffer   An array of channel-interleaved data (see above).
    851  * \param  samples  The number of samples in one channel, the same as for
    852  *                  FLAC__file_encoder_process().  For example, if
    853  *                  encoding two channels, \c 1000 \a samples corresponds
    854  *                  to a \a buffer of 2000 values.
    855  * \assert
    856  *    \code encoder != NULL \endcode
    857  *    \code FLAC__file_encoder_get_state(encoder) == FLAC__FILE_ENCODER_OK \endcode
    858  * \retval FLAC__bool
    859  *    \c true if successful, else \c false; in this case, check the
    860  *    encoder state with FLAC__file_encoder_get_state() to see what
    861  *    went wrong.
    862  */
    863 FLAC_API FLAC__bool FLAC__file_encoder_process_interleaved(FLAC__FileEncoder *encoder, const FLAC__int32 buffer[], unsigned samples);
    864 
    865 /* \} */
    866 
    867 #ifdef __cplusplus
    868 }
    869 #endif
    870 
    871 #endif