diff options
Diffstat (limited to 'src/test_libFLAC/decoders.c')
-rw-r--r-- | src/test_libFLAC/decoders.c | 1672 |
1 files changed, 266 insertions, 1406 deletions
diff --git a/src/test_libFLAC/decoders.c b/src/test_libFLAC/decoders.c index f208a5bf..1ac22d4e 100644 --- a/src/test_libFLAC/decoders.c +++ b/src/test_libFLAC/decoders.c @@ -30,23 +30,33 @@ #define ftello ftell #endif #include "decoders.h" -#include "file_utils.h" -#include "metadata_utils.h" #include "FLAC/assert.h" -#include "FLAC/file_decoder.h" -#include "FLAC/seekable_stream_decoder.h" #include "FLAC/stream_decoder.h" #include "share/grabbag.h" +#include "test_libs_common/file_utils_flac.h" +#include "test_libs_common/metadata_utils.h" + +typedef enum { + LAYER_STREAM = 0, /* FLAC__stream_decoder_init_stream() without seeking */ + LAYER_SEEKABLE_STREAM, /* FLAC__stream_decoder_init_stream() with seeking */ + LAYER_FILE, /* FLAC__stream_decoder_init_FILE() */ + LAYER_FILENAME /* FLAC__stream_decoder_init_file() */ +} Layer; + +static const char * const LayerString[] = { + "Stream", + "Seekable Stream", + "FILE*", + "Filename" +}; typedef struct { + Layer layer; FILE *file; unsigned current_metadata_number; FLAC__bool ignore_errors; FLAC__bool error_occurred; -} stream_decoder_client_data_struct; - -typedef stream_decoder_client_data_struct seekable_stream_decoder_client_data_struct; -typedef stream_decoder_client_data_struct file_decoder_client_data_struct; +} StreamDecoderClientData; static FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_, cuesheet_, unknown_; static FLAC__StreamMetadata *expected_metadata_sequence_[8]; @@ -74,46 +84,6 @@ static FLAC__bool die_s_(const char *msg, const FLAC__StreamDecoder *decoder) return false; } -static FLAC__bool die_ss_(const char *msg, const FLAC__SeekableStreamDecoder *decoder) -{ - FLAC__SeekableStreamDecoderState state = FLAC__seekable_stream_decoder_get_state(decoder); - - if(msg) - printf("FAILED, %s", msg); - else - printf("FAILED"); - - printf(", state = %u (%s)\n", (unsigned)state, FLAC__SeekableStreamDecoderStateString[state]); - if(state == FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR) { - FLAC__StreamDecoderState state_ = FLAC__seekable_stream_decoder_get_stream_decoder_state(decoder); - printf(" stream decoder state = %u (%s)\n", (unsigned)state_, FLAC__StreamDecoderStateString[state_]); - } - - return false; -} - -static FLAC__bool die_f_(const char *msg, const FLAC__FileDecoder *decoder) -{ - FLAC__FileDecoderState state = FLAC__file_decoder_get_state(decoder); - - if(msg) - printf("FAILED, %s", msg); - else - printf("FAILED"); - - printf(", state = %u (%s)\n", (unsigned)state, FLAC__FileDecoderStateString[state]); - if(state == FLAC__FILE_DECODER_SEEKABLE_STREAM_DECODER_ERROR) { - FLAC__SeekableStreamDecoderState state_ = FLAC__file_decoder_get_seekable_stream_decoder_state(decoder); - printf(" seekable stream decoder state = %u (%s)\n", (unsigned)state, FLAC__SeekableStreamDecoderStateString[state_]); - if(state_ == FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR) { - FLAC__StreamDecoderState state__ = FLAC__file_decoder_get_stream_decoder_state(decoder); - printf(" stream decoder state = %u (%s)\n", (unsigned)state__, FLAC__StreamDecoderStateString[state__]); - } - } - - return false; -} - static void init_metadata_blocks_() { mutils__init_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_); @@ -145,7 +115,7 @@ static FLAC__bool generate_file_() static FLAC__StreamDecoderReadStatus stream_decoder_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data) { - stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data; + StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data; const unsigned requested_bytes = *bytes; (void)decoder; @@ -178,9 +148,92 @@ static FLAC__StreamDecoderReadStatus stream_decoder_read_callback_(const FLAC__S return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */ } +static FLAC__StreamDecoderSeekStatus stream_decoder_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) +{ + StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data; + + (void)decoder; + + if(0 == dcd) { + printf("ERROR: client_data in seek callback is NULL\n"); + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + } + + if(dcd->error_occurred) + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + + if(fseeko(dcd->file, (off_t)absolute_byte_offset, SEEK_SET) < 0) { + dcd->error_occurred = true; + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + } + + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; +} + +static FLAC__StreamDecoderTellStatus stream_decoder_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) +{ + StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data; + off_t offset; + + (void)decoder; + + if(0 == dcd) { + printf("ERROR: client_data in tell callback is NULL\n"); + return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; + } + + if(dcd->error_occurred) + return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; + + offset = ftello(dcd->file); + *absolute_byte_offset = (FLAC__uint64)offset; + + if(offset < 0) { + dcd->error_occurred = true; + return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; + } + + return FLAC__STREAM_DECODER_TELL_STATUS_OK; +} + +static FLAC__StreamDecoderLengthStatus stream_decoder_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) +{ + StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data; + + (void)decoder; + + if(0 == dcd) { + printf("ERROR: client_data in length callback is NULL\n"); + return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; + } + + if(dcd->error_occurred) + return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; + + *stream_length = (FLAC__uint64)flacfilesize_; + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; +} + +static FLAC__bool stream_decoder_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data) +{ + StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data; + + (void)decoder; + + if(0 == dcd) { + printf("ERROR: client_data in eof callback is NULL\n"); + return true; + } + + if(dcd->error_occurred) + return true; + + return feof(dcd->file); +} + static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) { - stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data; + StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data; (void)decoder, (void)buffer; @@ -205,7 +258,7 @@ static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const FLAC_ static void stream_decoder_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) { - stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data; + StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data; (void)decoder; @@ -235,7 +288,7 @@ static void stream_decoder_metadata_callback_(const FLAC__StreamDecoder *decoder static void stream_decoder_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) { - stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data; + StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data; (void)decoder; @@ -250,31 +303,49 @@ static void stream_decoder_error_callback_(const FLAC__StreamDecoder *decoder, F } } -static FLAC__bool stream_decoder_test_respond_(FLAC__StreamDecoder *decoder, stream_decoder_client_data_struct *dcd) +static FLAC__bool stream_decoder_test_respond_(FLAC__StreamDecoder *decoder, StreamDecoderClientData *dcd) { - if(!FLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_)) - return die_s_("at FLAC__stream_decoder_set_read_callback(), returned false", decoder); + FLAC__StreamDecoderInitStatus init_status; - if(!FLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_)) - return die_s_("at FLAC__stream_decoder_set_write_callback(), returned false", decoder); + if(!FLAC__stream_decoder_set_md5_checking(decoder, true)) + return die_s_("at FLAC__stream_decoder_set_md5_checking(), returned false", decoder); - if(!FLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_)) - return die_s_("at FLAC__stream_decoder_set_metadata_callback(), returned false", decoder); - - if(!FLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_)) - return die_s_("at FLAC__stream_decoder_set_error_callback(), returned false", decoder); - - if(!FLAC__stream_decoder_set_client_data(decoder, dcd)) - return die_s_("at FLAC__stream_decoder_set_client_data(), returned false", decoder); - - printf("testing FLAC__stream_decoder_init()... "); - if(FLAC__stream_decoder_init(decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA) + /* for FLAC__stream_encoder_init_FILE(), the FLAC__stream_encoder_finish() closes the file so we have to keep re-opening: */ + if(dcd->layer == LAYER_FILE) { + printf("opening FLAC file... "); + dcd->file = fopen(flacfilename_, "rb"); + if(0 == dcd->file) { + printf("ERROR (%s)\n", strerror(errno)); + return false; + } + printf("OK\n"); + } + + printf("testing FLAC__stream_decoder_init_stream()... "); + switch(dcd->layer) { + case LAYER_STREAM: + init_status = FLAC__stream_decoder_init_stream(decoder, stream_decoder_read_callback_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd); + break; + case LAYER_SEEKABLE_STREAM: + init_status = FLAC__stream_decoder_init_stream(decoder, stream_decoder_read_callback_, stream_decoder_seek_callback_, stream_decoder_tell_callback_, stream_decoder_length_callback_, stream_decoder_eof_callback_, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd); + break; + case LAYER_FILE: + init_status = FLAC__stream_decoder_init_FILE(decoder, dcd->file, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd); + break; + case LAYER_FILENAME: + init_status = FLAC__stream_decoder_init_file(decoder, flacfilename_, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd); + break; + default: + die_("internal error 000"); + return false; + } + if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK) return die_s_(0, decoder); printf("OK\n"); dcd->current_metadata_number = 0; - if(fseeko(dcd->file, 0, SEEK_SET) < 0) { + if(dcd->layer < LAYER_FILE && fseeko(dcd->file, 0, SEEK_SET) < 0) { printf("FAILED rewinding input, errno = %d\n", errno); return false; } @@ -291,13 +362,16 @@ static FLAC__bool stream_decoder_test_respond_(FLAC__StreamDecoder *decoder, str return true; } -static FLAC__bool test_stream_decoder() +static FLAC__bool test_stream_decoder(Layer layer) { FLAC__StreamDecoder *decoder; FLAC__StreamDecoderState state; - stream_decoder_client_data_struct decoder_client_data; + StreamDecoderClientData decoder_client_data; + FLAC__bool expect; - printf("\n+++ libFLAC unit test: FLAC__StreamDecoder\n\n"); + decoder_client_data.layer = layer; + + printf("\n+++ libFLAC unit test: FLAC__StreamDecoder (layer: %s)\n\n", LayerString[layer]); printf("testing FLAC__stream_decoder_new()... "); decoder = FLAC__stream_decoder_new(); @@ -319,9 +393,27 @@ static FLAC__bool test_stream_decoder() } printf("OK\n"); - printf("testing FLAC__stream_decoder_init()... "); - if(FLAC__stream_decoder_init(decoder) == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA) - return die_s_(0, decoder); + switch(layer) { + case LAYER_STREAM: + case LAYER_SEEKABLE_STREAM: + printf("testing FLAC__stream_decoder_init_stream()... "); + if(FLAC__stream_decoder_init_stream(decoder, 0, 0, 0, 0, 0, 0, 0, 0, 0) != FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS) + return die_s_(0, decoder); + break; + case LAYER_FILE: + printf("testing FLAC__stream_decoder_init_FILE()... "); + if(FLAC__stream_decoder_init_FILE(decoder, stdin, 0, 0, 0, 0) != FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS) + return die_s_(0, decoder); + break; + case LAYER_FILENAME: + printf("testing FLAC__stream_decoder_init_file()... "); + if(FLAC__stream_decoder_init_file(decoder, flacfilename_, 0, 0, 0, 0) != FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS) + return die_s_(0, decoder); + break; + default: + die_("internal error 003"); + return false; + } printf("OK\n"); printf("testing FLAC__stream_decoder_delete()... "); @@ -339,34 +431,46 @@ static FLAC__bool test_stream_decoder() } printf("OK\n"); - printf("testing FLAC__stream_decoder_set_read_callback()... "); - if(!FLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_)) + printf("testing FLAC__stream_decoder_set_md5_checking()... "); + if(!FLAC__stream_decoder_set_md5_checking(decoder, true)) return die_s_("returned false", decoder); printf("OK\n"); - printf("testing FLAC__stream_decoder_set_write_callback()... "); - if(!FLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_)) - return die_s_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__stream_decoder_set_metadata_callback()... "); - if(!FLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_)) - return die_s_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__stream_decoder_set_error_callback()... "); - if(!FLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_)) - return die_s_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__stream_decoder_set_client_data()... "); - if(!FLAC__stream_decoder_set_client_data(decoder, &decoder_client_data)) - return die_s_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__stream_decoder_init()... "); - if(FLAC__stream_decoder_init(decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA) - return die_s_(0, decoder); + if(layer < LAYER_FILENAME) { + printf("opening FLAC file... "); + decoder_client_data.file = fopen(flacfilename_, "rb"); + if(0 == decoder_client_data.file) { + printf("ERROR (%s)\n", strerror(errno)); + return false; + } + printf("OK\n"); + } + + switch(layer) { + case LAYER_STREAM: + printf("testing FLAC__stream_decoder_init_stream()... "); + if(FLAC__stream_decoder_init_stream(decoder, stream_decoder_read_callback_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data) != FLAC__STREAM_DECODER_INIT_STATUS_OK) + return die_s_(0, decoder); + break; + case LAYER_SEEKABLE_STREAM: + printf("testing FLAC__stream_decoder_init_stream()... "); + if(FLAC__stream_decoder_init_stream(decoder, stream_decoder_read_callback_, stream_decoder_seek_callback_, stream_decoder_tell_callback_, stream_decoder_length_callback_, stream_decoder_eof_callback_, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data) != FLAC__STREAM_DECODER_INIT_STATUS_OK) + return die_s_(0, decoder); + break; + case LAYER_FILE: + printf("testing FLAC__stream_decoder_init_FILE()... "); + if(FLAC__stream_decoder_init_FILE(decoder, decoder_client_data.file, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data) != FLAC__STREAM_DECODER_INIT_STATUS_OK) + return die_s_(0, decoder); + break; + case LAYER_FILENAME: + printf("testing FLAC__stream_decoder_init_file()... "); + if(FLAC__stream_decoder_init_file(decoder, flacfilename_, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data) != FLAC__STREAM_DECODER_INIT_STATUS_OK) + return die_s_(0, decoder); + break; + default: + die_("internal error 009"); + return false; + } printf("OK\n"); printf("testing FLAC__stream_decoder_get_state()... "); @@ -377,10 +481,9 @@ static FLAC__bool test_stream_decoder() decoder_client_data.ignore_errors = false; decoder_client_data.error_occurred = false; - printf("opening FLAC file... "); - decoder_client_data.file = fopen(flacfilename_, "rb"); - if(0 == decoder_client_data.file) { - printf("ERROR (%s)\n", strerror(errno)); + printf("testing FLAC__stream_decoder_get_md5_checking()... "); + if(!FLAC__stream_decoder_get_md5_checking(decoder)) { + printf("FAILED, returned false, expected true\n"); return false; } printf("OK\n"); @@ -400,23 +503,37 @@ static FLAC__bool test_stream_decoder() return die_s_("returned false", decoder); printf("OK\n"); - printf("testing FLAC__stream_decoder_flush()... "); - if(!FLAC__stream_decoder_flush(decoder)) - return die_s_("returned false", decoder); - printf("OK\n"); + if(layer < LAYER_FILE) { + printf("testing FLAC__stream_decoder_flush()... "); + if(!FLAC__stream_decoder_flush(decoder)) + return die_s_("returned false", decoder); + printf("OK\n"); - decoder_client_data.ignore_errors = true; - printf("testing FLAC__stream_decoder_process_single()... "); - if(!FLAC__stream_decoder_process_single(decoder)) - return die_s_("returned false", decoder); + decoder_client_data.ignore_errors = true; + printf("testing FLAC__stream_decoder_process_single()... "); + if(!FLAC__stream_decoder_process_single(decoder)) + return die_s_("returned false", decoder); + printf("OK\n"); + decoder_client_data.ignore_errors = false; + } + + expect = (layer != LAYER_STREAM); + printf("testing FLAC__stream_decoder_seek_absolute()... "); + if(FLAC__stream_decoder_seek_absolute(decoder, 0) != expect) + return die_s_(expect? "returned false" : "returned true", decoder); printf("OK\n"); - decoder_client_data.ignore_errors = false; printf("testing FLAC__stream_decoder_process_until_end_of_stream()... "); if(!FLAC__stream_decoder_process_until_end_of_stream(decoder)) return die_s_("returned false", decoder); printf("OK\n"); + expect = (layer != LAYER_STREAM); + printf("testing FLAC__stream_decoder_seek_absolute()... "); + if(FLAC__stream_decoder_seek_absolute(decoder, 0) != expect) + return die_s_(expect? "returned false" : "returned true", decoder); + printf("OK\n"); + printf("testing FLAC__stream_decoder_get_channels()... "); { unsigned channels = FLAC__stream_decoder_get_channels(decoder); @@ -450,8 +567,10 @@ static FLAC__bool test_stream_decoder() printf("testing FLAC__stream_decoder_get_blocksize()... "); { unsigned blocksize = FLAC__stream_decoder_get_blocksize(decoder); - /* value could be anything since we're at the last block, so accept any answer */ - printf("returned %u... OK\n", blocksize); + /* value could be anything since we're at the last block, so accept any reasonable answer */ + printf("returned %u... %s\n", blocksize, blocksize>0? "OK" : "FAILED"); + if(blocksize == 0) + return false; } printf("testing FLAC__stream_decoder_get_channel_assignment()... "); @@ -460,30 +579,35 @@ static FLAC__bool test_stream_decoder() printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]); } - printf("testing FLAC__stream_decoder_reset()... "); - if(!FLAC__stream_decoder_reset(decoder)) { - state = FLAC__stream_decoder_get_state(decoder); - printf("FAILED, returned false, state = %u (%s)\n", state, FLAC__StreamDecoderStateString[state]); - return false; - } - printf("OK\n"); + if(layer < LAYER_FILE) { + printf("testing FLAC__stream_decoder_reset()... "); + if(!FLAC__stream_decoder_reset(decoder)) { + state = FLAC__stream_decoder_get_state(decoder); + printf("FAILED, returned false, state = %u (%s)\n", state, FLAC__StreamDecoderStateString[state]); + return false; + } + printf("OK\n"); + + if(layer == LAYER_STREAM) { + /* after a reset() we have to rewind the input ourselves */ + printf("rewinding input... "); + if(fseeko(decoder_client_data.file, 0, SEEK_SET) < 0) { + printf("FAILED, errno = %d\n", errno); + return false; + } + printf("OK\n"); + } - decoder_client_data.current_metadata_number = 0; + decoder_client_data.current_metadata_number = 0; - printf("rewinding input... "); - if(fseeko(decoder_client_data.file, 0, SEEK_SET) < 0) { - printf("FAILED, errno = %d\n", errno); - return false; + printf("testing FLAC__stream_decoder_process_until_end_of_stream()... "); + if(!FLAC__stream_decoder_process_until_end_of_stream(decoder)) + return die_s_("returned false", decoder); + printf("OK\n"); } - printf("OK\n"); - - printf("testing FLAC__stream_decoder_process_until_end_of_stream()... "); - if(!FLAC__stream_decoder_process_until_end_of_stream(decoder)) - return die_s_("returned false", decoder); - printf("OK\n"); printf("testing FLAC__stream_decoder_finish()... "); - FLAC__stream_decoder_finish(decoder); + (void) FLAC__stream_decoder_finish(decoder); printf("OK\n"); /* @@ -772,1280 +896,13 @@ static FLAC__bool test_stream_decoder() if(!stream_decoder_test_respond_(decoder, &decoder_client_data)) return false; - /* done, now leave the sequence the way we found it... */ - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &application2_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; + if(layer < LAYER_FILE) /* for LAYER_FILE, FLAC__stream_decoder_finish() closes the file */ + fclose(decoder_client_data.file); printf("testing FLAC__stream_decoder_delete()... "); FLAC__stream_decoder_delete(decoder); printf("OK\n"); - fclose(decoder_client_data.file); - - printf("\nPASSED!\n"); - - return true; -} - -static FLAC__SeekableStreamDecoderReadStatus seekable_stream_decoder_read_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data) -{ - (void)decoder; - switch(stream_decoder_read_callback_(0, buffer, bytes, client_data)) { - case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE: - return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK; - case FLAC__STREAM_DECODER_READ_STATUS_ABORT: - case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM: - return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR; - default: - FLAC__ASSERT(0); - return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR; - } -} - -static FLAC__SeekableStreamDecoderSeekStatus seekable_stream_decoder_seek_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) -{ - seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data; - - (void)decoder; - - if(0 == dcd) { - printf("ERROR: client_data in seek callback is NULL\n"); - return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR; - } - - if(dcd->error_occurred) - return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR; - - if(fseeko(dcd->file, (off_t)absolute_byte_offset, SEEK_SET) < 0) { - dcd->error_occurred = true; - return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR; - } - - return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK; -} - -static FLAC__SeekableStreamDecoderTellStatus seekable_stream_decoder_tell_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) -{ - seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data; - off_t offset; - - (void)decoder; - - if(0 == dcd) { - printf("ERROR: client_data in tell callback is NULL\n"); - return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR; - } - - if(dcd->error_occurred) - return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR; - - offset = ftello(dcd->file); - *absolute_byte_offset = (FLAC__uint64)offset; - - if(offset < 0) { - dcd->error_occurred = true; - return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR; - } - - return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK; -} - -static FLAC__SeekableStreamDecoderLengthStatus seekable_stream_decoder_length_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) -{ - seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data; - - (void)decoder; - - if(0 == dcd) { - printf("ERROR: client_data in length callback is NULL\n"); - return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR; - } - - if(dcd->error_occurred) - return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR; - - *stream_length = (FLAC__uint64)flacfilesize_; - return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK; -} - -static FLAC__bool seekable_stream_decoder_eof_callback_(const FLAC__SeekableStreamDecoder *decoder, void *client_data) -{ - seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data; - - (void)decoder; - - if(0 == dcd) { - printf("ERROR: client_data in eof callback is NULL\n"); - return true; - } - - if(dcd->error_occurred) - return true; - - return feof(dcd->file); -} - -static FLAC__StreamDecoderWriteStatus seekable_stream_decoder_write_callback_(const FLAC__SeekableStreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) -{ - (void)decoder; - return stream_decoder_write_callback_(0, frame, buffer, client_data); -} - -static void seekable_stream_decoder_metadata_callback_(const FLAC__SeekableStreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) -{ - (void)decoder; - stream_decoder_metadata_callback_(0, metadata, client_data); -} - -static void seekable_stream_decoder_error_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) -{ - (void)decoder; - stream_decoder_error_callback_(0, status, client_data); -} - -static FLAC__bool seekable_stream_decoder_test_respond_(FLAC__SeekableStreamDecoder *decoder, seekable_stream_decoder_client_data_struct *dcd) -{ - if(!FLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_)) - return die_ss_("at FLAC__seekable_stream_decoder_set_read_callback(), returned false", decoder); - - if(!FLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_)) - return die_ss_("at FLAC__seekable_stream_decoder_set_seek_callback(), returned false", decoder); - - if(!FLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_)) - return die_ss_("at FLAC__seekable_stream_decoder_set_tell_callback(), returned false", decoder); - - if(!FLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_)) - return die_ss_("at FLAC__seekable_stream_decoder_set_length_callback(), returned false", decoder); - - if(!FLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_)) - return die_ss_("at FLAC__seekable_stream_decoder_set_eof_callback(), returned false", decoder); - - if(!FLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_)) - return die_ss_("at FLAC__seekable_stream_decoder_set_write_callback(), returned false", decoder); - - if(!FLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_)) - return die_ss_("at FLAC__seekable_stream_decoder_set_metadata_callback(), returned false", decoder); - - if(!FLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_)) - return die_ss_("at FLAC__seekable_stream_decoder_set_error_callback(), returned false", decoder); - - if(!FLAC__seekable_stream_decoder_set_client_data(decoder, dcd)) - return die_ss_("at FLAC__seekable_stream_decoder_set_client_data(), returned false", decoder); - - if(!FLAC__seekable_stream_decoder_set_md5_checking(decoder, true)) - return die_ss_("at FLAC__seekable_stream_decoder_set_md5_checking(), returned false", decoder); - - printf("testing FLAC__seekable_stream_decoder_init()... "); - if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK) - return die_ss_(0, decoder); - printf("OK\n"); - - dcd->current_metadata_number = 0; - - if(fseeko(dcd->file, 0, SEEK_SET) < 0) { - printf("FAILED rewinding input, errno = %d\n", errno); - return false; - } - - printf("testing FLAC__seekable_stream_decoder_process_until_end_of_stream()... "); - if(!FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_finish()... "); - (void) FLAC__seekable_stream_decoder_finish(decoder); - printf("OK\n"); - - return true; -} - -static FLAC__bool test_seekable_stream_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"); - - printf("testing FLAC__seekable_stream_decoder_new()... "); - decoder = FLAC__seekable_stream_decoder_new(); - if(0 == decoder) { - printf("FAILED, returned NULL\n"); - return false; - } - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_delete()... "); - FLAC__seekable_stream_decoder_delete(decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_new()... "); - decoder = FLAC__seekable_stream_decoder_new(); - if(0 == decoder) { - printf("FAILED, returned NULL\n"); - return false; - } - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_init()... "); - if(FLAC__seekable_stream_decoder_init(decoder) == FLAC__SEEKABLE_STREAM_DECODER_OK) - return die_ss_(0, decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_delete()... "); - FLAC__seekable_stream_decoder_delete(decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - - printf("testing FLAC__seekable_stream_decoder_new()... "); - decoder = FLAC__seekable_stream_decoder_new(); - if(0 == decoder) { - printf("FAILED, returned NULL\n"); - return false; - } - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_read_callback()... "); - if(!FLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_seek_callback()... "); - if(!FLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_tell_callback()... "); - if(!FLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_length_callback()... "); - if(!FLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_eof_callback()... "); - if(!FLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_write_callback()... "); - if(!FLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_callback()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_error_callback()... "); - if(!FLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_client_data()... "); - if(!FLAC__seekable_stream_decoder_set_client_data(decoder, &decoder_client_data)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_md5_checking()... "); - if(!FLAC__seekable_stream_decoder_set_md5_checking(decoder, true)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_init()... "); - if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK) - return die_ss_(0, decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_get_state()... "); - 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; - - printf("opening FLAC file... "); - decoder_client_data.file = fopen(flacfilename_, "rb"); - if(0 == decoder_client_data.file) { - printf("ERROR (%s)\n", strerror(errno)); - return false; - } - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_get_md5_checking()... "); - if(!FLAC__seekable_stream_decoder_get_md5_checking(decoder)) { - printf("FAILED, returned false, expected true\n"); - return false; - } - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_process_until_end_of_metadata()... "); - if(!FLAC__seekable_stream_decoder_process_until_end_of_metadata(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_process_single()... "); - if(!FLAC__seekable_stream_decoder_process_single(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_skip_single_frame()... "); - if(!FLAC__seekable_stream_decoder_skip_single_frame(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_flush()... "); - if(!FLAC__seekable_stream_decoder_flush(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - decoder_client_data.ignore_errors = true; - printf("testing FLAC__seekable_stream_decoder_process_single()... "); - if(!FLAC__seekable_stream_decoder_process_single(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - decoder_client_data.ignore_errors = false; - - printf("testing FLAC__seekable_stream_decoder_seek_absolute()... "); - if(!FLAC__seekable_stream_decoder_seek_absolute(decoder, 0)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_process_until_end_of_stream()... "); - if(!FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_get_channels()... "); - { - unsigned channels = FLAC__seekable_stream_decoder_get_channels(decoder); - if(channels != streaminfo_.data.stream_info.channels) { - printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels); - return false; - } - } - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_get_bits_per_sample()... "); - { - unsigned bits_per_sample = FLAC__seekable_stream_decoder_get_bits_per_sample(decoder); - if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) { - printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample); - return false; - } - } - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_get_sample_rate()... "); - { - unsigned sample_rate = FLAC__seekable_stream_decoder_get_sample_rate(decoder); - if(sample_rate != streaminfo_.data.stream_info.sample_rate) { - printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate); - return false; - } - } - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_get_blocksize()... "); - { - unsigned blocksize = FLAC__seekable_stream_decoder_get_blocksize(decoder); - /* value could be anything since we're at the last block, so accept any answer */ - printf("returned %u... OK\n", blocksize); - } - - printf("testing FLAC__seekable_stream_decoder_get_channel_assignment()... "); - { - FLAC__ChannelAssignment ca = FLAC__seekable_stream_decoder_get_channel_assignment(decoder); - printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]); - } - - printf("testing FLAC__seekable_stream_decoder_reset()... "); - if(!FLAC__seekable_stream_decoder_reset(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - decoder_client_data.current_metadata_number = 0; - - printf("rewinding input... "); - if(fseeko(decoder_client_data.file, 0, SEEK_SET) < 0) { - printf("FAILED, errno = %d\n", errno); - return false; - } - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_process_until_end_of_stream()... "); - if(!FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_finish()... "); - (void) FLAC__seekable_stream_decoder_finish(decoder); - printf("OK\n"); - - /* - * respond all - */ - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &application2_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * ignore all - */ - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - - if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * respond all, ignore VORBIS_COMMENT - */ - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &application2_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * respond all, ignore APPLICATION - */ - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * respond all, ignore APPLICATION id of app#1 - */ - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &application2_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * respond all, ignore APPLICATION id of app#1 & app#2 - */ - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #2)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * ignore all, respond VORBIS_COMMENT - */ - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(VORBIS_COMMENT)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - - if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * ignore all, respond APPLICATION - */ - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &application2_; - - if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * ignore all, respond APPLICATION id of app#1 - */ - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &application1_; - - if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * ignore all, respond APPLICATION id of app#1 & app#2 - */ - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #2)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &application2_; - - if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * respond all, ignore APPLICATION, respond APPLICATION id of app#1 - */ - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * ignore all, respond APPLICATION, ignore APPLICATION id of app#1 - */ - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... "); - if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id)) - return die_ss_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &application2_; - - if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* done, now leave the sequence the way we found it... */ - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &application2_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - printf("testing FLAC__seekable_stream_decoder_delete()... "); - FLAC__seekable_stream_decoder_delete(decoder); - printf("OK\n"); - - fclose(decoder_client_data.file); - - printf("\nPASSED!\n"); - - return true; -} - -static FLAC__StreamDecoderWriteStatus file_decoder_write_callback_(const FLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) -{ - (void)decoder; - return stream_decoder_write_callback_(0, frame, buffer, client_data); -} - -static void file_decoder_metadata_callback_(const FLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) -{ - (void)decoder; - stream_decoder_metadata_callback_(0, metadata, client_data); -} - -static void file_decoder_error_callback_(const FLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) -{ - (void)decoder; - stream_decoder_error_callback_(0, status, client_data); -} - -static FLAC__bool file_decoder_test_respond_(FLAC__FileDecoder *decoder, file_decoder_client_data_struct *dcd) -{ - if(!FLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_)) - return die_f_("at FLAC__file_decoder_set_write_callback(), returned false", decoder); - - if(!FLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_)) - return die_f_("at FLAC__file_decoder_set_metadata_callback(), returned false", decoder); - - if(!FLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_)) - return die_f_("at FLAC__file_decoder_set_error_callback(), returned false", decoder); - - if(!FLAC__file_decoder_set_client_data(decoder, dcd)) - return die_f_("at FLAC__file_decoder_set_client_data(), returned false", decoder); - - if(!FLAC__file_decoder_set_filename(decoder, flacfilename_)) - return die_f_("at FLAC__file_decoder_set_filename(), returned false", decoder); - - if(!FLAC__file_decoder_set_md5_checking(decoder, true)) - return die_f_("at FLAC__file_decoder_set_md5_checking(), returned false", decoder); - - printf("testing FLAC__file_decoder_init()... "); - if(FLAC__file_decoder_init(decoder) != FLAC__FILE_DECODER_OK) - return die_f_(0, decoder); - printf("OK\n"); - - dcd->current_metadata_number = 0; - - printf("testing FLAC__file_decoder_process_until_end_of_file()... "); - if(!FLAC__file_decoder_process_until_end_of_file(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_finish()... "); - (void) FLAC__file_decoder_finish(decoder); - printf("OK\n"); - - return true; -} - -static FLAC__bool test_file_decoder() -{ - 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"); - - printf("testing FLAC__file_decoder_new()... "); - decoder = FLAC__file_decoder_new(); - if(0 == decoder) { - printf("FAILED, returned NULL\n"); - return false; - } - printf("OK\n"); - - printf("testing FLAC__file_decoder_delete()... "); - FLAC__file_decoder_delete(decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_new()... "); - decoder = FLAC__file_decoder_new(); - if(0 == decoder) { - printf("FAILED, returned NULL\n"); - return false; - } - printf("OK\n"); - - printf("testing FLAC__file_decoder_init()... "); - if(FLAC__file_decoder_init(decoder) == FLAC__FILE_DECODER_OK) - return die_f_(0, decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_delete()... "); - FLAC__file_decoder_delete(decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - - printf("testing FLAC__file_decoder_new()... "); - decoder = FLAC__file_decoder_new(); - if(0 == decoder) { - printf("FAILED, returned NULL\n"); - return false; - } - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_write_callback()... "); - if(!FLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_callback()... "); - if(!FLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_error_callback()... "); - if(!FLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_client_data()... "); - if(!FLAC__file_decoder_set_client_data(decoder, &decoder_client_data)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_filename()... "); - if(!FLAC__file_decoder_set_filename(decoder, flacfilename_)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_md5_checking()... "); - if(!FLAC__file_decoder_set_md5_checking(decoder, true)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_init()... "); - if(FLAC__file_decoder_init(decoder) != FLAC__FILE_DECODER_OK) - return die_f_(0, decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_get_state()... "); - 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; - - printf("testing FLAC__file_decoder_get_md5_checking()... "); - if(!FLAC__file_decoder_get_md5_checking(decoder)) { - printf("FAILED, returned false, expected true\n"); - return false; - } - printf("OK\n"); - - printf("testing FLAC__file_decoder_process_until_end_of_metadata()... "); - if(!FLAC__file_decoder_process_until_end_of_metadata(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_process_single()... "); - if(!FLAC__file_decoder_process_single(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_skip_single_frame()... "); - if(!FLAC__file_decoder_skip_single_frame(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_seek_absolute()... "); - if(!FLAC__file_decoder_seek_absolute(decoder, 0)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_process_until_end_of_file()... "); - if(!FLAC__file_decoder_process_until_end_of_file(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_get_channels()... "); - { - unsigned channels = FLAC__file_decoder_get_channels(decoder); - if(channels != streaminfo_.data.stream_info.channels) { - printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels); - return false; - } - } - printf("OK\n"); - - printf("testing FLAC__file_decoder_get_bits_per_sample()... "); - { - unsigned bits_per_sample = FLAC__file_decoder_get_bits_per_sample(decoder); - if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) { - printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample); - return false; - } - } - printf("OK\n"); - - printf("testing FLAC__file_decoder_get_sample_rate()... "); - { - unsigned sample_rate = FLAC__file_decoder_get_sample_rate(decoder); - if(sample_rate != streaminfo_.data.stream_info.sample_rate) { - printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate); - return false; - } - } - printf("OK\n"); - - printf("testing FLAC__file_decoder_get_blocksize()... "); - { - unsigned blocksize = FLAC__file_decoder_get_blocksize(decoder); - /* value could be anything since we're at the last block, so accept any answer */ - printf("returned %u... OK\n", blocksize); - } - - printf("testing FLAC__file_decoder_get_channel_assignment()... "); - { - FLAC__ChannelAssignment ca = FLAC__file_decoder_get_channel_assignment(decoder); - printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]); - } - - printf("testing FLAC__file_decoder_finish()... "); - (void) FLAC__file_decoder_finish(decoder); - printf("OK\n"); - - /* - * respond all - */ - - printf("testing FLAC__file_decoder_set_metadata_respond_all()... "); - if(!FLAC__file_decoder_set_metadata_respond_all(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &application2_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - if(!file_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * ignore all - */ - - printf("testing FLAC__file_decoder_set_metadata_ignore_all()... "); - if(!FLAC__file_decoder_set_metadata_ignore_all(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - - if(!file_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * respond all, ignore VORBIS_COMMENT - */ - - printf("testing FLAC__file_decoder_set_metadata_respond_all()... "); - if(!FLAC__file_decoder_set_metadata_respond_all(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_ignore(VORBIS_COMMENT)... "); - if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT)) - return die_f_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &application2_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - if(!file_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * respond all, ignore APPLICATION - */ - - printf("testing FLAC__file_decoder_set_metadata_respond_all()... "); - if(!FLAC__file_decoder_set_metadata_respond_all(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_ignore(APPLICATION)... "); - if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION)) - return die_f_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - if(!file_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * respond all, ignore APPLICATION id of app#1 - */ - - printf("testing FLAC__file_decoder_set_metadata_respond_all()... "); - if(!FLAC__file_decoder_set_metadata_respond_all(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... "); - if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id)) - return die_f_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &application2_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - if(!file_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * respond all, ignore APPLICATION id of app#1 & app#2 - */ - - printf("testing FLAC__file_decoder_set_metadata_respond_all()... "); - if(!FLAC__file_decoder_set_metadata_respond_all(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... "); - if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #2)... "); - if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id)) - return die_f_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - if(!file_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * ignore all, respond VORBIS_COMMENT - */ - - printf("testing FLAC__file_decoder_set_metadata_ignore_all()... "); - if(!FLAC__file_decoder_set_metadata_ignore_all(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_respond(VORBIS_COMMENT)... "); - if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT)) - return die_f_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - - if(!file_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * ignore all, respond APPLICATION - */ - - printf("testing FLAC__file_decoder_set_metadata_ignore_all()... "); - if(!FLAC__file_decoder_set_metadata_ignore_all(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_respond(APPLICATION)... "); - if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION)) - return die_f_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &application2_; - - if(!file_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * ignore all, respond APPLICATION id of app#1 - */ - - printf("testing FLAC__file_decoder_set_metadata_ignore_all()... "); - if(!FLAC__file_decoder_set_metadata_ignore_all(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... "); - if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id)) - return die_f_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &application1_; - - if(!file_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * ignore all, respond APPLICATION id of app#1 & app#2 - */ - - printf("testing FLAC__file_decoder_set_metadata_ignore_all()... "); - if(!FLAC__file_decoder_set_metadata_ignore_all(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... "); - if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #2)... "); - if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application2_.data.application.id)) - return die_f_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &application2_; - - if(!file_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * respond all, ignore APPLICATION, respond APPLICATION id of app#1 - */ - - printf("testing FLAC__file_decoder_set_metadata_respond_all()... "); - if(!FLAC__file_decoder_set_metadata_respond_all(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_ignore(APPLICATION)... "); - if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... "); - if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id)) - return die_f_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - if(!file_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* - * ignore all, respond APPLICATION, ignore APPLICATION id of app#1 - */ - - printf("testing FLAC__file_decoder_set_metadata_ignore_all()... "); - if(!FLAC__file_decoder_set_metadata_ignore_all(decoder)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_respond(APPLICATION)... "); - if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION)) - return die_f_("returned false", decoder); - printf("OK\n"); - - printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... "); - if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id)) - return die_f_("returned false", decoder); - printf("OK\n"); - - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &application2_; - - if(!file_decoder_test_respond_(decoder, &decoder_client_data)) - return false; - - /* done, now leave the sequence the way we found it... */ - num_expected_ = 0; - expected_metadata_sequence_[num_expected_++] = &streaminfo_; - expected_metadata_sequence_[num_expected_++] = &padding_; - expected_metadata_sequence_[num_expected_++] = &seektable_; - expected_metadata_sequence_[num_expected_++] = &application1_; - expected_metadata_sequence_[num_expected_++] = &application2_; - expected_metadata_sequence_[num_expected_++] = &vorbiscomment_; - expected_metadata_sequence_[num_expected_++] = &cuesheet_; - expected_metadata_sequence_[num_expected_++] = &unknown_; - - printf("testing FLAC__file_decoder_delete()... "); - FLAC__file_decoder_delete(decoder); - printf("OK\n"); - printf("\nPASSED!\n"); return true; @@ -2057,13 +914,16 @@ FLAC__bool test_decoders() if(!generate_file_()) return false; - if(!test_stream_decoder()) + if(!test_stream_decoder(LAYER_STREAM)) + return false; + + if(!test_stream_decoder(LAYER_SEEKABLE_STREAM)) return false; - if(!test_seekable_stream_decoder()) + if(!test_stream_decoder(LAYER_FILE)) return false; - if(!test_file_decoder()) + if(!test_stream_decoder(LAYER_FILENAME)) return false; (void) grabbag__file_remove_file(flacfilename_); |