1 /* test_libFLAC - Unit tester for libFLAC
2 * Copyright (C) 2002,2003,2004,2005,2006 Josh Coalson
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program 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
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 #if defined _MSC_VER || defined __MINGW32__
28 //@@@ [2G limit] hacks for MSVC6
33 #include "FLAC/assert.h"
34 #include "FLAC/stream_decoder.h"
35 #include "share/grabbag.h"
36 #include "test_libs_common/file_utils_flac.h"
37 #include "test_libs_common/metadata_utils.h"
40 LAYER_STREAM = 0, /* FLAC__stream_decoder_init_stream() without seeking */
41 LAYER_SEEKABLE_STREAM, /* FLAC__stream_decoder_init_stream() with seeking */
42 LAYER_FILE, /* FLAC__stream_decoder_init_FILE() */
43 LAYER_FILENAME /* FLAC__stream_decoder_init_file() */
46 static const char * const LayerString[] = {
56 unsigned current_metadata_number;
57 FLAC__bool ignore_errors;
58 FLAC__bool error_occurred;
59 } StreamDecoderClientData;
61 static FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_, cuesheet_, unknown_;
62 static FLAC__StreamMetadata *expected_metadata_sequence_[8];
63 static unsigned num_expected_;
64 static const char *flacfilename_ = "metadata.flac";
65 static off_t flacfilesize_;
67 static FLAC__bool die_(const char *msg)
69 printf("ERROR: %s\n", msg);
73 static FLAC__bool die_s_(const char *msg, const FLAC__StreamDecoder *decoder)
75 FLAC__StreamDecoderState state = FLAC__stream_decoder_get_state(decoder);
78 printf("FAILED, %s", msg);
82 printf(", state = %u (%s)\n", (unsigned)state, FLAC__StreamDecoderStateString[state]);
87 static void init_metadata_blocks_()
89 mutils__init_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);
92 static void free_metadata_blocks_()
94 mutils__free_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);
97 static FLAC__bool generate_file_()
99 printf("\n\ngenerating FLAC file for decoder tests...\n");
102 expected_metadata_sequence_[num_expected_++] = &padding_;
103 expected_metadata_sequence_[num_expected_++] = &seektable_;
104 expected_metadata_sequence_[num_expected_++] = &application1_;
105 expected_metadata_sequence_[num_expected_++] = &application2_;
106 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
107 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
108 expected_metadata_sequence_[num_expected_++] = &unknown_;
110 if(!file_utils__generate_flacfile(flacfilename_, &flacfilesize_, 512 * 1024, &streaminfo_, expected_metadata_sequence_, num_expected_))
111 return die_("creating the encoded file");
116 static FLAC__StreamDecoderReadStatus stream_decoder_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
118 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
119 const unsigned requested_bytes = *bytes;
124 printf("ERROR: client_data in read callback is NULL\n");
125 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
128 if(dcd->error_occurred)
129 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
131 if(feof(dcd->file)) {
133 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
135 else if(requested_bytes > 0) {
136 *bytes = fread(buffer, 1, requested_bytes, dcd->file);
139 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
141 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
144 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
148 return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */
151 static FLAC__StreamDecoderSeekStatus stream_decoder_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
153 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
158 printf("ERROR: client_data in seek callback is NULL\n");
159 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
162 if(dcd->error_occurred)
163 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
165 if(fseeko(dcd->file, (off_t)absolute_byte_offset, SEEK_SET) < 0) {
166 dcd->error_occurred = true;
167 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
170 return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
173 static FLAC__StreamDecoderTellStatus stream_decoder_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
175 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
181 printf("ERROR: client_data in tell callback is NULL\n");
182 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
185 if(dcd->error_occurred)
186 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
188 offset = ftello(dcd->file);
189 *absolute_byte_offset = (FLAC__uint64)offset;
192 dcd->error_occurred = true;
193 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
196 return FLAC__STREAM_DECODER_TELL_STATUS_OK;
199 static FLAC__StreamDecoderLengthStatus stream_decoder_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
201 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
206 printf("ERROR: client_data in length callback is NULL\n");
207 return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
210 if(dcd->error_occurred)
211 return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
213 *stream_length = (FLAC__uint64)flacfilesize_;
214 return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
217 static FLAC__bool stream_decoder_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data)
219 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
224 printf("ERROR: client_data in eof callback is NULL\n");
228 if(dcd->error_occurred)
231 return feof(dcd->file);
234 static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
236 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
238 (void)decoder, (void)buffer;
241 printf("ERROR: client_data in write callback is NULL\n");
242 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
245 if(dcd->error_occurred)
246 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
249 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER && frame->header.number.frame_number == 0) ||
250 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER && frame->header.number.sample_number == 0)
252 printf("content... ");
256 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
259 static void stream_decoder_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
261 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
266 printf("ERROR: client_data in metadata callback is NULL\n");
270 if(dcd->error_occurred)
273 printf("%d... ", dcd->current_metadata_number);
276 if(dcd->current_metadata_number >= num_expected_) {
277 (void)die_("got more metadata blocks than expected");
278 dcd->error_occurred = true;
281 if(!mutils__compare_block(expected_metadata_sequence_[dcd->current_metadata_number], metadata)) {
282 (void)die_("metadata block mismatch");
283 dcd->error_occurred = true;
286 dcd->current_metadata_number++;
289 static void stream_decoder_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
291 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
296 printf("ERROR: client_data in error callback is NULL\n");
300 if(!dcd->ignore_errors) {
301 printf("ERROR: got error callback: err = %u (%s)\n", (unsigned)status, FLAC__StreamDecoderErrorStatusString[status]);
302 dcd->error_occurred = true;
306 static FLAC__bool stream_decoder_test_respond_(FLAC__StreamDecoder *decoder, StreamDecoderClientData *dcd)
308 FLAC__StreamDecoderInitStatus init_status;
310 if(!FLAC__stream_decoder_set_md5_checking(decoder, true))
311 return die_s_("at FLAC__stream_decoder_set_md5_checking(), returned false", decoder);
313 /* for FLAC__stream_encoder_init_FILE(), the FLAC__stream_encoder_finish() closes the file so we have to keep re-opening: */
314 if(dcd->layer == LAYER_FILE) {
315 printf("opening FLAC file... ");
316 dcd->file = fopen(flacfilename_, "rb");
318 printf("ERROR (%s)\n", strerror(errno));
324 printf("testing FLAC__stream_decoder_init_stream()... ");
327 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);
329 case LAYER_SEEKABLE_STREAM:
330 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);
333 init_status = FLAC__stream_decoder_init_FILE(decoder, dcd->file, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd);
336 init_status = FLAC__stream_decoder_init_file(decoder, flacfilename_, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd);
339 die_("internal error 000");
342 if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK)
343 return die_s_(0, decoder);
346 dcd->current_metadata_number = 0;
348 if(dcd->layer < LAYER_FILE && fseeko(dcd->file, 0, SEEK_SET) < 0) {
349 printf("FAILED rewinding input, errno = %d\n", errno);
353 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
354 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
355 return die_s_("returned false", decoder);
358 printf("testing FLAC__stream_decoder_finish()... ");
359 FLAC__stream_decoder_finish(decoder);
365 static FLAC__bool test_stream_decoder(Layer layer)
367 FLAC__StreamDecoder *decoder;
368 FLAC__StreamDecoderState state;
369 StreamDecoderClientData decoder_client_data;
372 decoder_client_data.layer = layer;
374 printf("\n+++ libFLAC unit test: FLAC__StreamDecoder (layer: %s)\n\n", LayerString[layer]);
376 printf("testing FLAC__stream_decoder_new()... ");
377 decoder = FLAC__stream_decoder_new();
379 printf("FAILED, returned NULL\n");
384 printf("testing FLAC__stream_decoder_delete()... ");
385 FLAC__stream_decoder_delete(decoder);
388 printf("testing FLAC__stream_decoder_new()... ");
389 decoder = FLAC__stream_decoder_new();
391 printf("FAILED, returned NULL\n");
398 case LAYER_SEEKABLE_STREAM:
399 printf("testing FLAC__stream_decoder_init_stream()... ");
400 if(FLAC__stream_decoder_init_stream(decoder, 0, 0, 0, 0, 0, 0, 0, 0, 0) != FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS)
401 return die_s_(0, decoder);
404 printf("testing FLAC__stream_decoder_init_FILE()... ");
405 if(FLAC__stream_decoder_init_FILE(decoder, stdin, 0, 0, 0, 0) != FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS)
406 return die_s_(0, decoder);
409 printf("testing FLAC__stream_decoder_init_file()... ");
410 if(FLAC__stream_decoder_init_file(decoder, flacfilename_, 0, 0, 0, 0) != FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS)
411 return die_s_(0, decoder);
414 die_("internal error 003");
419 printf("testing FLAC__stream_decoder_delete()... ");
420 FLAC__stream_decoder_delete(decoder);
424 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
426 printf("testing FLAC__stream_decoder_new()... ");
427 decoder = FLAC__stream_decoder_new();
429 printf("FAILED, returned NULL\n");
434 printf("testing FLAC__stream_decoder_set_md5_checking()... ");
435 if(!FLAC__stream_decoder_set_md5_checking(decoder, true))
436 return die_s_("returned false", decoder);
439 if(layer < LAYER_FILENAME) {
440 printf("opening FLAC file... ");
441 decoder_client_data.file = fopen(flacfilename_, "rb");
442 if(0 == decoder_client_data.file) {
443 printf("ERROR (%s)\n", strerror(errno));
451 printf("testing FLAC__stream_decoder_init_stream()... ");
452 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)
453 return die_s_(0, decoder);
455 case LAYER_SEEKABLE_STREAM:
456 printf("testing FLAC__stream_decoder_init_stream()... ");
457 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)
458 return die_s_(0, decoder);
461 printf("testing FLAC__stream_decoder_init_FILE()... ");
462 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)
463 return die_s_(0, decoder);
466 printf("testing FLAC__stream_decoder_init_file()... ");
467 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)
468 return die_s_(0, decoder);
471 die_("internal error 009");
476 printf("testing FLAC__stream_decoder_get_state()... ");
477 state = FLAC__stream_decoder_get_state(decoder);
478 printf("returned state = %u (%s)... OK\n", state, FLAC__StreamDecoderStateString[state]);
480 decoder_client_data.current_metadata_number = 0;
481 decoder_client_data.ignore_errors = false;
482 decoder_client_data.error_occurred = false;
484 printf("testing FLAC__stream_decoder_get_md5_checking()... ");
485 if(!FLAC__stream_decoder_get_md5_checking(decoder)) {
486 printf("FAILED, returned false, expected true\n");
491 printf("testing FLAC__stream_decoder_process_until_end_of_metadata()... ");
492 if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder))
493 return die_s_("returned false", decoder);
496 printf("testing FLAC__stream_decoder_process_single()... ");
497 if(!FLAC__stream_decoder_process_single(decoder))
498 return die_s_("returned false", decoder);
501 printf("testing FLAC__stream_decoder_skip_single_frame()... ");
502 if(!FLAC__stream_decoder_skip_single_frame(decoder))
503 return die_s_("returned false", decoder);
506 if(layer < LAYER_FILE) {
507 printf("testing FLAC__stream_decoder_flush()... ");
508 if(!FLAC__stream_decoder_flush(decoder))
509 return die_s_("returned false", decoder);
512 decoder_client_data.ignore_errors = true;
513 printf("testing FLAC__stream_decoder_process_single()... ");
514 if(!FLAC__stream_decoder_process_single(decoder))
515 return die_s_("returned false", decoder);
517 decoder_client_data.ignore_errors = false;
520 expect = (layer != LAYER_STREAM);
521 printf("testing FLAC__stream_decoder_seek_absolute()... ");
522 if(FLAC__stream_decoder_seek_absolute(decoder, 0) != expect)
523 return die_s_(expect? "returned false" : "returned true", decoder);
526 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
527 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
528 return die_s_("returned false", decoder);
531 expect = (layer != LAYER_STREAM);
532 printf("testing FLAC__stream_decoder_seek_absolute()... ");
533 if(FLAC__stream_decoder_seek_absolute(decoder, 0) != expect)
534 return die_s_(expect? "returned false" : "returned true", decoder);
537 printf("testing FLAC__stream_decoder_get_channels()... ");
539 unsigned channels = FLAC__stream_decoder_get_channels(decoder);
540 if(channels != streaminfo_.data.stream_info.channels) {
541 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
547 printf("testing FLAC__stream_decoder_get_bits_per_sample()... ");
549 unsigned bits_per_sample = FLAC__stream_decoder_get_bits_per_sample(decoder);
550 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
551 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
557 printf("testing FLAC__stream_decoder_get_sample_rate()... ");
559 unsigned sample_rate = FLAC__stream_decoder_get_sample_rate(decoder);
560 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
561 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
567 printf("testing FLAC__stream_decoder_get_blocksize()... ");
569 unsigned blocksize = FLAC__stream_decoder_get_blocksize(decoder);
570 /* value could be anything since we're at the last block, so accept any reasonable answer */
571 printf("returned %u... %s\n", blocksize, blocksize>0? "OK" : "FAILED");
576 printf("testing FLAC__stream_decoder_get_channel_assignment()... ");
578 FLAC__ChannelAssignment ca = FLAC__stream_decoder_get_channel_assignment(decoder);
579 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
582 if(layer < LAYER_FILE) {
583 printf("testing FLAC__stream_decoder_reset()... ");
584 if(!FLAC__stream_decoder_reset(decoder)) {
585 state = FLAC__stream_decoder_get_state(decoder);
586 printf("FAILED, returned false, state = %u (%s)\n", state, FLAC__StreamDecoderStateString[state]);
591 if(layer == LAYER_STREAM) {
592 /* after a reset() we have to rewind the input ourselves */
593 printf("rewinding input... ");
594 if(fseeko(decoder_client_data.file, 0, SEEK_SET) < 0) {
595 printf("FAILED, errno = %d\n", errno);
601 decoder_client_data.current_metadata_number = 0;
603 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
604 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
605 return die_s_("returned false", decoder);
609 printf("testing FLAC__stream_decoder_finish()... ");
610 (void) FLAC__stream_decoder_finish(decoder);
617 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
618 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
619 return die_s_("returned false", decoder);
623 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
624 expected_metadata_sequence_[num_expected_++] = &padding_;
625 expected_metadata_sequence_[num_expected_++] = &seektable_;
626 expected_metadata_sequence_[num_expected_++] = &application1_;
627 expected_metadata_sequence_[num_expected_++] = &application2_;
628 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
629 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
630 expected_metadata_sequence_[num_expected_++] = &unknown_;
632 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
639 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
640 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
641 return die_s_("returned false", decoder);
646 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
650 * respond all, ignore VORBIS_COMMENT
653 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
654 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
655 return die_s_("returned false", decoder);
658 printf("testing FLAC__stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
659 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
660 return die_s_("returned false", decoder);
664 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
665 expected_metadata_sequence_[num_expected_++] = &padding_;
666 expected_metadata_sequence_[num_expected_++] = &seektable_;
667 expected_metadata_sequence_[num_expected_++] = &application1_;
668 expected_metadata_sequence_[num_expected_++] = &application2_;
669 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
670 expected_metadata_sequence_[num_expected_++] = &unknown_;
672 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
676 * respond all, ignore APPLICATION
679 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
680 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
681 return die_s_("returned false", decoder);
684 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
685 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
686 return die_s_("returned false", decoder);
690 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
691 expected_metadata_sequence_[num_expected_++] = &padding_;
692 expected_metadata_sequence_[num_expected_++] = &seektable_;
693 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
694 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
695 expected_metadata_sequence_[num_expected_++] = &unknown_;
697 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
701 * respond all, ignore APPLICATION id of app#1
704 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
705 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
706 return die_s_("returned false", decoder);
709 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
710 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
711 return die_s_("returned false", decoder);
715 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
716 expected_metadata_sequence_[num_expected_++] = &padding_;
717 expected_metadata_sequence_[num_expected_++] = &seektable_;
718 expected_metadata_sequence_[num_expected_++] = &application2_;
719 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
720 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
721 expected_metadata_sequence_[num_expected_++] = &unknown_;
723 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
727 * respond all, ignore APPLICATION id of app#1 & app#2
730 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
731 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
732 return die_s_("returned false", decoder);
735 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
736 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
737 return die_s_("returned false", decoder);
740 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #2)... ");
741 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
742 return die_s_("returned false", decoder);
746 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
747 expected_metadata_sequence_[num_expected_++] = &padding_;
748 expected_metadata_sequence_[num_expected_++] = &seektable_;
749 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
750 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
751 expected_metadata_sequence_[num_expected_++] = &unknown_;
753 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
757 * ignore all, respond VORBIS_COMMENT
760 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
761 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
762 return die_s_("returned false", decoder);
765 printf("testing FLAC__stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
766 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
767 return die_s_("returned false", decoder);
771 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
773 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
777 * ignore all, respond APPLICATION
780 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
781 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
782 return die_s_("returned false", decoder);
785 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
786 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
787 return die_s_("returned false", decoder);
791 expected_metadata_sequence_[num_expected_++] = &application1_;
792 expected_metadata_sequence_[num_expected_++] = &application2_;
794 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
798 * ignore all, respond APPLICATION id of app#1
801 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
802 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
803 return die_s_("returned false", decoder);
806 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
807 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
808 return die_s_("returned false", decoder);
812 expected_metadata_sequence_[num_expected_++] = &application1_;
814 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
818 * ignore all, respond APPLICATION id of app#1 & app#2
821 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
822 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
823 return die_s_("returned false", decoder);
826 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
827 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
828 return die_s_("returned false", decoder);
831 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #2)... ");
832 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
833 return die_s_("returned false", decoder);
837 expected_metadata_sequence_[num_expected_++] = &application1_;
838 expected_metadata_sequence_[num_expected_++] = &application2_;
840 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
844 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
847 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
848 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
849 return die_s_("returned false", decoder);
852 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
853 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
854 return die_s_("returned false", decoder);
857 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
858 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
859 return die_s_("returned false", decoder);
863 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
864 expected_metadata_sequence_[num_expected_++] = &padding_;
865 expected_metadata_sequence_[num_expected_++] = &seektable_;
866 expected_metadata_sequence_[num_expected_++] = &application1_;
867 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
868 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
869 expected_metadata_sequence_[num_expected_++] = &unknown_;
871 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
875 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
878 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
879 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
880 return die_s_("returned false", decoder);
883 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
884 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
885 return die_s_("returned false", decoder);
888 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
889 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
890 return die_s_("returned false", decoder);
894 expected_metadata_sequence_[num_expected_++] = &application2_;
896 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
899 if(layer < LAYER_FILE) /* for LAYER_FILE, FLAC__stream_decoder_finish() closes the file */
900 fclose(decoder_client_data.file);
902 printf("testing FLAC__stream_decoder_delete()... ");
903 FLAC__stream_decoder_delete(decoder);
906 printf("\nPASSED!\n");
911 FLAC__bool test_decoders()
913 init_metadata_blocks_();
914 if(!generate_file_())
917 if(!test_stream_decoder(LAYER_STREAM))
920 if(!test_stream_decoder(LAYER_SEEKABLE_STREAM))
923 if(!test_stream_decoder(LAYER_FILE))
926 if(!test_stream_decoder(LAYER_FILENAME))
929 (void) grabbag__file_remove_file(flacfilename_);
930 free_metadata_blocks_();