#ifndef FLAC__FILE_DECODER_H
#define FLAC__FILE_DECODER_H
-#include "stream_decoder.h"
+#include "seekable_stream_decoder.h"
#ifdef __cplusplus
extern "C" {
*/
FLAC__FileDecoderState FLAC__file_decoder_get_state(const FLAC__FileDecoder *decoder);
+/** Get the state of the underlying seekable stream decoder.
+ * Useful when the file decoder state is
+ * \c FLAC__FILE_DECODER_SEEKABLE_STREAM_DECODER_ERROR.
+ *
+ * \param decoder An decoder instance to query.
+ * \assert
+ * \code decoder != NULL \endcode
+ * \retval FLAC__SeekableStreamDecoderState
+ * The seekable stream decoder state.
+ */
+FLAC__SeekableStreamDecoderState FLAC__file_decoder_get_seekable_stream_decoder_state(const FLAC__FileDecoder *decoder);
+
+/** Get the state of the underlying stream decoder.
+ * Useful when the file decoder state is
+ * \c FLAC__FILE_DECODER_SEEKABLE_STREAM_DECODER_ERROR and the seekable stream
+ * decoder state is \c FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR.
+ *
+ * \param decoder An decoder instance to query.
+ * \assert
+ * \code decoder != NULL \endcode
+ * \retval FLAC__SeekableStreamDecoderState
+ * The seekable stream decoder state.
+ */
+FLAC__StreamDecoderState FLAC__file_decoder_get_stream_decoder_state(const FLAC__FileDecoder *decoder);
+
/** Get the "MD5 signature checking" flag.
* This is inherited from FLAC__SeekableStreamDecoder; see
* FLAC__seekable_stream_decoder_get_md5_checking().
*/
FLAC__SeekableStreamDecoderState FLAC__seekable_stream_decoder_get_state(const FLAC__SeekableStreamDecoder *decoder);
+/** Get the state of the underlying stream decoder.
+ * Useful when the seekable stream decoder state is
+ * \c FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR.
+ *
+ * \param decoder An decoder instance to query.
+ * \assert
+ * \code decoder != NULL \endcode
+ * \retval FLAC__StreamDecoderState
+ * The stream decoder state.
+ */
+FLAC__StreamDecoderState FLAC__seekable_stream_decoder_get_stream_decoder_state(const FLAC__SeekableStreamDecoder *decoder);
+
/** Get the "MD5 signature checking" flag.
* This is the value of the setting, not whether or not the decoder is
* currently checking the MD5 (remember, it can be turned off automatically
return decoder->protected_->state;
}
+FLAC__SeekableStreamDecoderState FLAC__file_decoder_get_seekable_stream_decoder_state(const FLAC__FileDecoder *decoder)
+{
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__seekable_stream_decoder_get_state(decoder->private_->seekable_stream_decoder);
+}
+
+FLAC__StreamDecoderState FLAC__file_decoder_get_stream_decoder_state(const FLAC__FileDecoder *decoder)
+{
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__seekable_stream_decoder_get_stream_decoder_state(decoder->private_->seekable_stream_decoder);
+}
+
FLAC__bool FLAC__file_decoder_get_md5_checking(const FLAC__FileDecoder *decoder)
{
FLAC__ASSERT(0 != decoder);
unsigned FLAC__file_decoder_get_channels(const FLAC__FileDecoder *decoder)
{
- FLAC__ASSERT(0 != decoder);
- FLAC__ASSERT(0 != decoder->private_);
- return FLAC__seekable_stream_decoder_get_channels(decoder->private_->seekable_stream_decoder);
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__seekable_stream_decoder_get_channels(decoder->private_->seekable_stream_decoder);
}
FLAC__ChannelAssignment FLAC__file_decoder_get_channel_assignment(const FLAC__FileDecoder *decoder)
{
- FLAC__ASSERT(0 != decoder);
- FLAC__ASSERT(0 != decoder->private_);
- return FLAC__seekable_stream_decoder_get_channel_assignment(decoder->private_->seekable_stream_decoder);
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__seekable_stream_decoder_get_channel_assignment(decoder->private_->seekable_stream_decoder);
}
unsigned FLAC__file_decoder_get_bits_per_sample(const FLAC__FileDecoder *decoder)
{
- FLAC__ASSERT(0 != decoder);
- FLAC__ASSERT(0 != decoder->private_);
- return FLAC__seekable_stream_decoder_get_bits_per_sample(decoder->private_->seekable_stream_decoder);
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__seekable_stream_decoder_get_bits_per_sample(decoder->private_->seekable_stream_decoder);
}
unsigned FLAC__file_decoder_get_sample_rate(const FLAC__FileDecoder *decoder)
{
- FLAC__ASSERT(0 != decoder);
- FLAC__ASSERT(0 != decoder->private_);
- return FLAC__seekable_stream_decoder_get_sample_rate(decoder->private_->seekable_stream_decoder);
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__seekable_stream_decoder_get_sample_rate(decoder->private_->seekable_stream_decoder);
}
unsigned FLAC__file_decoder_get_blocksize(const FLAC__FileDecoder *decoder)
{
- FLAC__ASSERT(0 != decoder);
- FLAC__ASSERT(0 != decoder->private_);
- return FLAC__seekable_stream_decoder_get_blocksize(decoder->private_->seekable_stream_decoder);
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__seekable_stream_decoder_get_blocksize(decoder->private_->seekable_stream_decoder);
}
FLAC__bool FLAC__file_decoder_process_whole_file(FLAC__FileDecoder *decoder)
}
}
+
/***********************************************************************
*
* Private class methods
void set_defaults_(FLAC__FileDecoder *decoder)
{
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+
decoder->private_->filename = 0;
decoder->private_->write_callback = 0;
decoder->private_->metadata_callback = 0;
"FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR",
"FLAC__SEEKABLE_STREAM_DECODER_READ_ERROR",
"FLAC__SEEKABLE_STREAM_DECODER_SEEK_ERROR",
- "FLAC__SEEKABLE_STREAM_DECODER_ALREADY_INITIALIZED",
- "FLAC__SEEKABLE_STREAM_DECODER_INVALID_CALLBACK",
- "FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED"
+ "FLAC__SEEKABLE_STREAM_DECODER_ALREADY_INITIALIZED",
+ "FLAC__SEEKABLE_STREAM_DECODER_INVALID_CALLBACK",
+ "FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED"
};
const char * const FLAC__SeekableStreamDecoderReadStatusString[] = {
"FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR"
};
+
/***********************************************************************
*
* Class constructor/destructor
return decoder->protected_->state;
}
+FLAC__SeekableStreamDecoderState FLAC__seekable_stream_decoder_get_stream_decoder_state(const FLAC__SeekableStreamDecoder *decoder)
+{
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__stream_decoder_get_state(decoder->private_->stream_decoder);
+}
+
FLAC__bool FLAC__seekable_stream_decoder_get_md5_checking(const FLAC__SeekableStreamDecoder *decoder)
{
FLAC__ASSERT(0 != decoder);
unsigned FLAC__seekable_stream_decoder_get_channels(const FLAC__SeekableStreamDecoder *decoder)
{
- FLAC__ASSERT(0 != decoder);
- FLAC__ASSERT(0 != decoder->private_);
- return FLAC__stream_decoder_get_channels(decoder->private_->stream_decoder);
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__stream_decoder_get_channels(decoder->private_->stream_decoder);
}
FLAC__ChannelAssignment FLAC__seekable_stream_decoder_get_channel_assignment(const FLAC__SeekableStreamDecoder *decoder)
{
- FLAC__ASSERT(0 != decoder);
- FLAC__ASSERT(0 != decoder->private_);
- return FLAC__stream_decoder_get_channel_assignment(decoder->private_->stream_decoder);
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__stream_decoder_get_channel_assignment(decoder->private_->stream_decoder);
}
unsigned FLAC__seekable_stream_decoder_get_bits_per_sample(const FLAC__SeekableStreamDecoder *decoder)
{
- FLAC__ASSERT(0 != decoder);
- FLAC__ASSERT(0 != decoder->private_);
- return FLAC__stream_decoder_get_bits_per_sample(decoder->private_->stream_decoder);
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__stream_decoder_get_bits_per_sample(decoder->private_->stream_decoder);
}
unsigned FLAC__seekable_stream_decoder_get_sample_rate(const FLAC__SeekableStreamDecoder *decoder)
{
- FLAC__ASSERT(0 != decoder);
- FLAC__ASSERT(0 != decoder->private_);
- return FLAC__stream_decoder_get_sample_rate(decoder->private_->stream_decoder);
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__stream_decoder_get_sample_rate(decoder->private_->stream_decoder);
}
unsigned FLAC__seekable_stream_decoder_get_blocksize(const FLAC__SeekableStreamDecoder *decoder)
{
- FLAC__ASSERT(0 != decoder);
- FLAC__ASSERT(0 != decoder->private_);
- return FLAC__stream_decoder_get_blocksize(decoder->private_->stream_decoder);
+ FLAC__ASSERT(0 != decoder);
+ FLAC__ASSERT(0 != decoder->private_);
+ return FLAC__stream_decoder_get_blocksize(decoder->private_->stream_decoder);
}
FLAC__bool FLAC__seekable_stream_decoder_flush(FLAC__SeekableStreamDecoder *decoder)
{
FLAC__SeekableStreamDecoder *decoder;
FLAC__SeekableStreamDecoderState state;
+ FLAC__StreamDecoderState sstate;
seekable_stream_decoder_client_data_struct decoder_client_data;
printf("\n+++ libFLAC unit test: FLAC__SeekableStreamDecoder\n\n");
state = FLAC__seekable_stream_decoder_get_state(decoder);
printf("returned state = %u (%s)... OK\n", state, FLAC__SeekableStreamDecoderStateString[state]);
+ printf("testing FLAC__seekable_stream_decoder_get_stream_decoder_state()... ");
+ sstate = FLAC__seekable_stream_decoder_get_stream_decoder_state(decoder);
+ printf("returned state = %u (%s)... OK\n", sstate, FLAC__StreamDecoderStateString[sstate]);
+
decoder_client_data.current_metadata_number = 0;
decoder_client_data.ignore_errors = false;
decoder_client_data.error_occurred = false;
{
FLAC__FileDecoder *decoder;
FLAC__FileDecoderState state;
+ FLAC__SeekableStreamDecoderState ssstate;
+ FLAC__StreamDecoderState sstate;
seekable_stream_decoder_client_data_struct decoder_client_data;
printf("\n+++ libFLAC unit test: FLAC__FileDecoder\n\n");
state = FLAC__file_decoder_get_state(decoder);
printf("returned state = %u (%s)... OK\n", state, FLAC__FileDecoderStateString[state]);
+ printf("testing FLAC__file_decoder_get_seekable_stream_decoder_state()... ");
+ ssstate = FLAC__file_decoder_get_seekable_stream_decoder_state(decoder);
+ printf("returned state = %u (%s)... OK\n", ssstate, FLAC__SeekableStreamDecoderStateString[ssstate]);
+
+ printf("testing FLAC__file_decoder_get_stream_decoder_state()... ");
+ sstate = FLAC__file_decoder_get_stream_decoder_state(decoder);
+ printf("returned state = %u (%s)... OK\n", sstate, FLAC__StreamDecoderStateString[sstate]);
+
decoder_client_data.current_metadata_number = 0;
decoder_client_data.ignore_errors = false;
decoder_client_data.error_occurred = false;