1 /* libOggFLAC - Free Lossless Audio Codec + Ogg library
2 * Copyright (C) 2002 Josh Coalson
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
20 #ifndef OggFLAC__FILE_DECODER_H
21 #define OggFLAC__FILE_DECODER_H
25 #include "FLAC/file_decoder.h"
32 /** \file include/OggFLAC/file_decoder.h
35 * This module contains the functions which implement the file
38 * See the detailed documentation in the
39 * \link oggflac_file_decoder file decoder \endlink module.
42 /** \defgroup oggflac_file_decoder OggFLAC/file_decoder.h: file decoder interface
43 * \ingroup oggflac_decoder
46 * This module contains the functions which implement the file
49 * The interface here is identical to FLAC's file decoder. See the
50 * defaults, including the callbacks. See the \link flac_file_decoder
51 * FLAC file decoder module \endlink for full documentation.
57 /** State values for an OggFLAC__FileDecoder
59 * The decoder's state can be obtained by calling OggFLAC__file_decoder_get_state().
63 OggFLAC__FILE_DECODER_OK = 0,
64 /**< The decoder is in the normal OK state. */
66 OggFLAC__FILE_DECODER_FLAC_FILE_DECODER_ERROR,
67 /**< An error occurred in the underlying FLAC file decoder;
68 * check OggFLAC__file_decoder_get_FLAC_file_decoder_state().
71 OggFLAC__FILE_DECODER_INVALID_CALLBACK,
72 /**< The decoder was initialized before setting all the required callbacks. */
74 OggFLAC__FILE_DECODER_MEMORY_ALLOCATION_ERROR,
75 /**< Memory allocation failed. */
77 OggFLAC__FILE_DECODER_ALREADY_INITIALIZED,
78 /**< OggFLAC__file_decoder_init() was called when the decoder was
79 * already initialized, usually because
80 * OggFLAC__file_decoder_finish() was not called.
83 OggFLAC__FILE_DECODER_UNINITIALIZED
84 /**< The decoder is in the uninitialized state. */
86 } OggFLAC__FileDecoderState;
88 /** Maps an OggFLAC__FileDecoderState to a C string.
90 * Using an OggFLAC__FileDecoderState as the index to this array
91 * will give the string equivalent. The contents should not be modified.
93 extern OggFLAC_API const char * const OggFLAC__FileDecoderStateString[];
96 /***********************************************************************
98 * class OggFLAC__FileDecoder : public FLAC__FileDecoder
100 ***********************************************************************/
102 struct OggFLAC__FileDecoderProtected;
103 struct OggFLAC__FileDecoderPrivate;
104 /** The opaque structure definition for the file decoder type. See the
105 * \link oggflac_file_decoder file decoder module \endlink for a detailed
109 struct OggFLAC__FileDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */
110 struct OggFLAC__FileDecoderPrivate *private_; /* avoid the C++ keyword 'private' */
111 } OggFLAC__FileDecoder;
113 typedef FLAC__StreamDecoderWriteStatus (*OggFLAC__FileDecoderWriteCallback)(const OggFLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
114 typedef void (*OggFLAC__FileDecoderMetadataCallback)(const OggFLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
115 typedef void (*OggFLAC__FileDecoderErrorCallback)(const OggFLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
118 /***********************************************************************
120 * Class constructor/destructor
122 ***********************************************************************/
124 /** Create a new file decoder instance. The instance is created with
125 * default settings; see the individual OggFLAC__file_decoder_set_*()
126 * functions for each setting's default.
128 * \retval OggFLAC__FileDecoder*
129 * \c NULL if there was an error allocating memory, else the new instance.
131 OggFLAC_API OggFLAC__FileDecoder *OggFLAC__file_decoder_new();
133 /** Free a decoder instance. Deletes the object pointed to by \a decoder.
135 * \param decoder A pointer to an existing decoder.
137 * \code decoder != NULL \endcode
139 OggFLAC_API void OggFLAC__file_decoder_delete(OggFLAC__FileDecoder *decoder);
142 /***********************************************************************
144 * Public class method prototypes
146 ***********************************************************************/
148 /*@@@inherit set_serial_number*/
150 /** Set the "MD5 signature checking" flag.
151 * This is inherited from FLAC__FileDecoder; see
152 * FLAC__file_decoder_set_md5_checking().
155 * \param decoder A decoder instance to set.
156 * \param value See above.
158 * \code decoder != NULL \endcode
160 * \c false if the decoder is already initialized, else \c true.
162 OggFLAC_API FLAC__bool OggFLAC__file_decoder_set_md5_checking(OggFLAC__FileDecoder *decoder, FLAC__bool value);
164 /** Set the input file name to decode.
165 * This is inherited from FLAC__FileDecoder; see
166 * FLAC__file_decoder_set_filename().
169 * \param decoder A decoder instance to set.
170 * \param value The input file name, or "-" for \c stdin.
172 * \code decoder != NULL \endcode
173 * \code value != NULL \endcode
175 * \c false if the decoder is already initialized, or there was a memory
176 * allocation error, else \c true.
178 OggFLAC_API FLAC__bool OggFLAC__file_decoder_set_filename(OggFLAC__FileDecoder *decoder, const char *value);
180 /** Set the write callback.
181 * This is inherited from FLAC__FileDecoder; see
182 * FLAC__file_decoder_set_write_callback().
185 * The callback is mandatory and must be set before initialization.
188 * \param decoder A decoder instance to set.
189 * \param value See above.
191 * \code decoder != NULL \endcode
192 * \code value != NULL \endcode
194 * \c false if the decoder is already initialized, else \c true.
196 OggFLAC_API FLAC__bool OggFLAC__file_decoder_set_write_callback(OggFLAC__FileDecoder *decoder, OggFLAC__FileDecoderWriteCallback value);
198 /** Set the metadata callback.
199 * This is inherited from FLAC__FileDecoder; see
200 * FLAC__file_decoder_set_metadata_callback().
203 * The callback is mandatory and must be set before initialization.
206 * \param decoder A decoder instance to set.
207 * \param value See above.
209 * \code decoder != NULL \endcode
210 * \code value != NULL \endcode
212 * \c false if the decoder is already initialized, else \c true.
214 OggFLAC_API FLAC__bool OggFLAC__file_decoder_set_metadata_callback(OggFLAC__FileDecoder *decoder, OggFLAC__FileDecoderMetadataCallback value);
216 /** Set the error callback.
217 * This is inherited from FLAC__FileDecoder; see
218 * FLAC__file_decoder_set_error_callback().
221 * The callback is mandatory and must be set before initialization.
224 * \param decoder A decoder instance to set.
225 * \param value See above.
227 * \code decoder != NULL \endcode
228 * \code value != NULL \endcode
230 * \c false if the decoder is already initialized, else \c true.
232 OggFLAC_API FLAC__bool OggFLAC__file_decoder_set_error_callback(OggFLAC__FileDecoder *decoder, OggFLAC__FileDecoderErrorCallback value);
234 /** Set the client data to be passed back to callbacks.
235 * This value will be supplied to callbacks in their \a client_data
239 * \param decoder A decoder instance to set.
240 * \param value See above.
242 * \code decoder != NULL \endcode
244 * \c false if the decoder is already initialized, else \c true.
246 OggFLAC_API FLAC__bool OggFLAC__file_decoder_set_client_data(OggFLAC__FileDecoder *decoder, void *value);
248 /** This is inherited from FLAC__FileDecoder; see
249 * FLAC__file_decoder_set_metadata_respond().
251 * \default By default, only the \c STREAMINFO block is returned via the
253 * \param decoder A decoder instance to set.
254 * \param type See above.
256 * \code decoder != NULL \endcode
259 * \c false if the decoder is already initialized, else \c true.
261 OggFLAC_API FLAC__bool OggFLAC__file_decoder_set_metadata_respond(OggFLAC__FileDecoder *decoder, OggFLAC__MetadataType type);
263 /** This is inherited from FLAC__FileDecoder; see
264 * FLAC__file_decoder_set_metadata_respond_application().
266 * \default By default, only the \c STREAMINFO block is returned via the
268 * \param decoder A decoder instance to set.
269 * \param id See above.
271 * \code decoder != NULL \endcode
272 * \code id != NULL \endcode
274 * \c false if the decoder is already initialized, else \c true.
276 OggFLAC_API FLAC__bool OggFLAC__file_decoder_set_metadata_respond_application(OggFLAC__FileDecoder *decoder, const FLAC__byte id[4]);
278 /** This is inherited from FLAC__FileDecoder; see
279 * FLAC__file_decoder_set_metadata_respond_all().
281 * \default By default, only the \c STREAMINFO block is returned via the
283 * \param decoder A decoder instance to set.
285 * \code decoder != NULL \endcode
287 * \c false if the decoder is already initialized, else \c true.
289 OggFLAC_API FLAC__bool OggFLAC__file_decoder_set_metadata_respond_all(OggFLAC__FileDecoder *decoder);
291 /** This is inherited from FLAC__FileDecoder; see
292 * FLAC__file_decoder_set_metadata_ignore().
294 * \default By default, only the \c STREAMINFO block is returned via the
296 * \param decoder A decoder instance to set.
297 * \param type See above.
299 * \code decoder != NULL \endcode
302 * \c false if the decoder is already initialized, else \c true.
304 OggFLAC_API FLAC__bool OggFLAC__file_decoder_set_metadata_ignore(OggFLAC__FileDecoder *decoder, OggFLAC__MetadataType type);
306 /** This is inherited from FLAC__FileDecoder; see
307 * FLAC__file_decoder_set_metadata_ignore_application().
309 * \default By default, only the \c STREAMINFO block is returned via the
311 * \param decoder A decoder instance to set.
312 * \param id See above.
314 * \code decoder != NULL \endcode
315 * \code id != NULL \endcode
317 * \c false if the decoder is already initialized, else \c true.
319 OggFLAC_API FLAC__bool OggFLAC__file_decoder_set_metadata_ignore_application(OggFLAC__FileDecoder *decoder, const FLAC__byte id[4]);
321 /** This is inherited from FLAC__FileDecoder; see
322 * FLAC__file_decoder_set_metadata_ignore_all().
324 * \default By default, only the \c STREAMINFO block is returned via the
326 * \param decoder A decoder instance to set.
328 * \code decoder != NULL \endcode
330 * \c false if the decoder is already initialized, else \c true.
332 OggFLAC_API FLAC__bool OggFLAC__file_decoder_set_metadata_ignore_all(OggFLAC__FileDecoder *decoder);
334 /** Get the current decoder state.
336 * \param decoder A decoder instance to query.
338 * \code decoder != NULL \endcode
339 * \retval OggFLAC__FileDecoderState
340 * The current decoder state.
342 OggFLAC_API OggFLAC__FileDecoderState OggFLAC__file_decoder_get_state(const OggFLAC__FileDecoder *decoder);
344 /** Get the state of the underlying FLAC file decoder.
345 * Useful when the file decoder state is
346 * \c OggFLAC__FILE_DECODER_FLAC_FILE_DECODER_ERROR.
348 * \param decoder A decoder instance to query.
350 * \code decoder != NULL \endcode
351 * \retval FLAC__FileDecoderState
352 * The FLAC file decoder state.
354 OggFLAC_API FLAC__FileDecoderState OggFLAC__file_decoder_get_FLAC_file_decoder_state(const OggFLAC__FileDecoder *decoder);
356 /** Get the state of the underlying FLAC file decoder's seekable stream decoder.
357 * Useful when the file decoder state is
358 * \c OggFLAC__FILE_DECODER_FLAC_FILE_DECODER_ERROR and the FLAC file decoder state is
359 * \c FLAC__FILE_DECODER_SEEKABLE_STREAM_DECODER_ERROR.
361 * \param decoder A decoder instance to query.
363 * \code decoder != NULL \endcode
364 * \retval FLAC__SeekableStreamDecoderState
365 * The FLAC seekable stream decoder state.
367 OggFLAC_API FLAC__SeekableStreamDecoderState OggFLAC__file_decoder_get_FLAC_seekable_stream_decoder_state(const OggFLAC__FileDecoder *decoder);
369 /** Get the state of the underlying FLAC file decoder's stream decoder.
370 * Useful when the file decoder state is
371 * \c OggFLAC__FILE_DECODER_FLAC_FILE_DECODER_ERROR and the FLAC file decoder state is
372 * \c FLAC__FILE_DECODER_SEEKABLE_STREAM_DECODER_ERROR and the
373 * FLAC seekable stream decoder state is \c FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR.
375 * \param decoder A decoder instance to query.
377 * \code decoder != NULL \endcode
378 * \retval FLAC__StreamDecoderState
379 * The FLAC stream decoder state.
381 OggFLAC_API FLAC__StreamDecoderState OggFLAC__file_decoder_get_FLAC_stream_decoder_state(const OggFLAC__FileDecoder *decoder);
383 /** This is inherited from FLAC__FileDecoder; see
384 * FLAC__file_decoder_get_md5_checking().
386 * \param decoder A decoder instance to query.
388 * \code decoder != NULL \endcode
392 OggFLAC_API FLAC__bool OggFLAC__file_decoder_get_md5_checking(const OggFLAC__FileDecoder *decoder);
394 /** This is inherited from FLAC__FileDecoder; see
395 * FLAC__file_decoder_get_channels().
397 * \param decoder A decoder instance to query.
399 * \code decoder != NULL \endcode
403 OggFLAC_API unsigned OggFLAC__file_decoder_get_channels(const OggFLAC__FileDecoder *decoder);
405 /** This is inherited from FLAC__FileDecoder; see
406 * FLAC__file_decoder_get_channel_assignment().
408 * \param decoder A decoder instance to query.
410 * \code decoder != NULL \endcode
411 * \retval OggFLAC__ChannelAssignment
414 OggFLAC_API OggFLAC__ChannelAssignment OggFLAC__file_decoder_get_channel_assignment(const OggFLAC__FileDecoder *decoder);
416 /** This is inherited from FLAC__FileDecoder; see
417 * FLAC__file_decoder_get_bits_per_sample().
419 * \param decoder A decoder instance to query.
421 * \code decoder != NULL \endcode
425 OggFLAC_API unsigned OggFLAC__file_decoder_get_bits_per_sample(const OggFLAC__FileDecoder *decoder);
427 /** This is inherited from FLAC__FileDecoder; see
428 * FLAC__file_decoder_get_sample_rate().
430 * \param decoder A decoder instance to query.
432 * \code decoder != NULL \endcode
436 OggFLAC_API unsigned OggFLAC__file_decoder_get_sample_rate(const OggFLAC__FileDecoder *decoder);
438 /** This is inherited from FLAC__FileDecoder; see
439 * FLAC__file_decoder_get_blocksize().
441 * \param decoder A decoder instance to query.
443 * \code decoder != NULL \endcode
447 OggFLAC_API unsigned OggFLAC__file_decoder_get_blocksize(const OggFLAC__FileDecoder *decoder);
449 /** Initialize the decoder instance.
450 * Should be called after OggFLAC__file_decoder_new() and
451 * OggFLAC__file_decoder_set_*() but before any of the
452 * OggFLAC__file_decoder_process_*() functions. Will set and return
453 * the decoder state, which will be OggFLAC__FILE_DECODER_OK if
454 * initialization succeeded.
456 * \param decoder An uninitialized decoder instance.
458 * \code decoder != NULL \endcode
459 * \retval OggFLAC__FileDecoderState
460 * \c OggFLAC__FILE_DECODER_OK if initialization was successful; see
461 * OggFLAC__FileDecoderState for the meanings of other return values.
463 OggFLAC_API OggFLAC__FileDecoderState OggFLAC__file_decoder_init(OggFLAC__FileDecoder *decoder);
465 /** Finish the decoding process.
466 * Flushes the decoding buffer, releases resources, resets the decoder
467 * settings to their defaults, and returns the decoder state to
468 * OggFLAC__FILE_DECODER_UNINITIALIZED.
470 * In the event of a prematurely-terminated decode, it is not strictly
471 * necessary to call this immediately before OggFLAC__file_decoder_delete()
472 * but it is good practice to match every OggFLAC__file_decoder_init() with
473 * an OggFLAC__file_decoder_finish().
475 * \param decoder An uninitialized decoder instance.
477 * \code decoder != NULL \endcode
479 * \c false if MD5 checking is on AND a STREAMINFO block was available
480 * AND the MD5 signature in the STREAMINFO block was non-zero AND the
481 * signature does not match the one computed by the decoder; else
484 OggFLAC_API FLAC__bool OggFLAC__file_decoder_finish(OggFLAC__FileDecoder *decoder);
486 /** This is inherited from FLAC__FileDecoder; see
487 * FLAC__file_decoder_process_single().
489 * \param decoder A decoder instance.
491 * \code decoder != NULL \endcode
495 OggFLAC_API FLAC__bool OggFLAC__file_decoder_process_single(OggFLAC__FileDecoder *decoder);
497 /** This is inherited from FLAC__FileDecoder; see
498 * FLAC__file_decoder_process_until_end_of_metadata().
500 * \param decoder A decoder instance.
502 * \code decoder != NULL \endcode
506 OggFLAC_API FLAC__bool OggFLAC__file_decoder_process_until_end_of_metadata(OggFLAC__FileDecoder *decoder);
508 /** This is inherited from FLAC__FileDecoder; see
509 * FLAC__file_decoder_process_until_end_of_stream().
511 * \param decoder A decoder instance.
513 * \code decoder != NULL \endcode
517 OggFLAC_API FLAC__bool OggFLAC__file_decoder_process_until_end_of_file(OggFLAC__FileDecoder *decoder);
519 /** This is inherited from FLAC__FileDecoder; see
520 * FLAC__file_decoder_process_remaining_frames().
522 * \param decoder A decoder instance.
524 * \code decoder != NULL \endcode
528 OggFLAC_API FLAC__bool OggFLAC__file_decoder_process_remaining_frames(OggFLAC__FileDecoder *decoder);
530 /** This is inherited from FLAC__FileDecoder; see
531 * FLAC__file_decoder_seek_absolute().
533 * \param decoder A decoder instance.
534 * \param sample The target sample number to seek to.
536 * \code decoder != NULL \endcode
538 * \c true if successful, else \c false.
540 OggFLAC_API FLAC__bool OggFLAC__file_decoder_seek_absolute(OggFLAC__FileDecoder *decoder, FLAC__uint64 sample);