1 /* test_libFLAC - Unit tester for libFLAC
2 * Copyright (C) 2002,2003 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.
20 #include "file_utils.h"
21 #include "metadata_utils.h"
22 #include "FLAC/assert.h"
23 #include "FLAC/file_decoder.h"
24 #include "FLAC/seekable_stream_decoder.h"
25 #include "FLAC/stream_decoder.h"
26 #include "share/grabbag.h"
34 unsigned current_metadata_number;
35 FLAC__bool ignore_errors;
36 FLAC__bool error_occurred;
37 } stream_decoder_client_data_struct;
39 typedef stream_decoder_client_data_struct seekable_stream_decoder_client_data_struct;
40 typedef stream_decoder_client_data_struct file_decoder_client_data_struct;
42 static FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_, cuesheet_, unknown_;
43 static FLAC__StreamMetadata *expected_metadata_sequence_[8];
44 static unsigned num_expected_;
45 static const char *flacfilename_ = "metadata.flac";
46 static unsigned flacfilesize_;
48 static FLAC__bool die_(const char *msg)
50 printf("ERROR: %s\n", msg);
54 static FLAC__bool die_s_(const char *msg, const FLAC__StreamDecoder *decoder)
56 FLAC__StreamDecoderState state = FLAC__stream_decoder_get_state(decoder);
59 printf("FAILED, %s", msg);
63 printf(", state = %u (%s)\n", (unsigned)state, FLAC__StreamDecoderStateString[state]);
68 static FLAC__bool die_ss_(const char *msg, const FLAC__SeekableStreamDecoder *decoder)
70 FLAC__SeekableStreamDecoderState state = FLAC__seekable_stream_decoder_get_state(decoder);
73 printf("FAILED, %s", msg);
77 printf(", state = %u (%s)\n", (unsigned)state, FLAC__SeekableStreamDecoderStateString[state]);
78 if(state == FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR) {
79 FLAC__StreamDecoderState state_ = FLAC__seekable_stream_decoder_get_stream_decoder_state(decoder);
80 printf(" stream decoder state = %u (%s)\n", (unsigned)state_, FLAC__StreamDecoderStateString[state_]);
86 static FLAC__bool die_f_(const char *msg, const FLAC__FileDecoder *decoder)
88 FLAC__FileDecoderState state = FLAC__file_decoder_get_state(decoder);
91 printf("FAILED, %s", msg);
95 printf(", state = %u (%s)\n", (unsigned)state, FLAC__FileDecoderStateString[state]);
96 if(state == FLAC__FILE_DECODER_SEEKABLE_STREAM_DECODER_ERROR) {
97 FLAC__SeekableStreamDecoderState state_ = FLAC__file_decoder_get_seekable_stream_decoder_state(decoder);
98 printf(" seekable stream decoder state = %u (%s)\n", (unsigned)state, FLAC__SeekableStreamDecoderStateString[state_]);
99 if(state_ == FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR) {
100 FLAC__StreamDecoderState state__ = FLAC__file_decoder_get_stream_decoder_state(decoder);
101 printf(" stream decoder state = %u (%s)\n", (unsigned)state__, FLAC__StreamDecoderStateString[state__]);
108 static void init_metadata_blocks_()
110 mutils__init_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);
113 static void free_metadata_blocks_()
115 mutils__free_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);
118 static FLAC__bool generate_file_()
120 printf("\n\ngenerating FLAC file for decoder tests...\n");
123 expected_metadata_sequence_[num_expected_++] = &padding_;
124 expected_metadata_sequence_[num_expected_++] = &seektable_;
125 expected_metadata_sequence_[num_expected_++] = &application1_;
126 expected_metadata_sequence_[num_expected_++] = &application2_;
127 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
128 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
129 expected_metadata_sequence_[num_expected_++] = &unknown_;
131 if(!file_utils__generate_flacfile(flacfilename_, &flacfilesize_, 512 * 1024, &streaminfo_, expected_metadata_sequence_, num_expected_))
132 return die_("creating the encoded file");
137 static FLAC__StreamDecoderReadStatus stream_decoder_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
139 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
144 printf("ERROR: client_data in read callback is NULL\n");
145 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
148 if(dcd->error_occurred)
149 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
152 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
153 else if(*bytes > 0) {
154 unsigned bytes_read = fread(buffer, 1, *bytes, dcd->file);
155 if(bytes_read == 0) {
157 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
159 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
163 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
167 return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */
170 static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
172 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
174 (void)decoder, (void)buffer;
177 printf("ERROR: client_data in write callback is NULL\n");
178 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
181 if(dcd->error_occurred)
182 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
185 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER && frame->header.number.frame_number == 0) ||
186 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER && frame->header.number.sample_number == 0)
188 printf("content... ");
192 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
195 static void stream_decoder_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
197 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
202 printf("ERROR: client_data in metadata callback is NULL\n");
206 if(dcd->error_occurred)
209 printf("%d... ", dcd->current_metadata_number);
212 if(dcd->current_metadata_number >= num_expected_) {
213 (void)die_("got more metadata blocks than expected");
214 dcd->error_occurred = true;
217 if(!mutils__compare_block(expected_metadata_sequence_[dcd->current_metadata_number], metadata)) {
218 (void)die_("metadata block mismatch");
219 dcd->error_occurred = true;
222 dcd->current_metadata_number++;
225 static void stream_decoder_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
227 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
232 printf("ERROR: client_data in error callback is NULL\n");
236 if(!dcd->ignore_errors) {
237 printf("ERROR: got error callback: err = %u (%s)\n", (unsigned)status, FLAC__StreamDecoderErrorStatusString[status]);
238 dcd->error_occurred = true;
242 static FLAC__bool stream_decoder_test_respond_(FLAC__StreamDecoder *decoder, stream_decoder_client_data_struct *dcd)
244 if(!FLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))
245 return die_s_("at FLAC__stream_decoder_set_read_callback(), returned false", decoder);
247 if(!FLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))
248 return die_s_("at FLAC__stream_decoder_set_write_callback(), returned false", decoder);
250 if(!FLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))
251 return die_s_("at FLAC__stream_decoder_set_metadata_callback(), returned false", decoder);
253 if(!FLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))
254 return die_s_("at FLAC__stream_decoder_set_error_callback(), returned false", decoder);
256 if(!FLAC__stream_decoder_set_client_data(decoder, dcd))
257 return die_s_("at FLAC__stream_decoder_set_client_data(), returned false", decoder);
259 printf("testing FLAC__stream_decoder_init()... ");
260 if(FLAC__stream_decoder_init(decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
261 return die_s_(0, decoder);
264 dcd->current_metadata_number = 0;
266 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
267 printf("FAILED rewinding input, errno = %d\n", errno);
271 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
272 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
273 return die_s_("returned false", decoder);
276 printf("testing FLAC__stream_decoder_finish()... ");
277 FLAC__stream_decoder_finish(decoder);
283 static FLAC__bool test_stream_decoder()
285 FLAC__StreamDecoder *decoder;
286 FLAC__StreamDecoderState state;
287 stream_decoder_client_data_struct decoder_client_data;
289 printf("\n+++ libFLAC unit test: FLAC__StreamDecoder\n\n");
291 printf("testing FLAC__stream_decoder_new()... ");
292 decoder = FLAC__stream_decoder_new();
294 printf("FAILED, returned NULL\n");
299 printf("testing FLAC__stream_decoder_delete()... ");
300 FLAC__stream_decoder_delete(decoder);
303 printf("testing FLAC__stream_decoder_new()... ");
304 decoder = FLAC__stream_decoder_new();
306 printf("FAILED, returned NULL\n");
311 printf("testing FLAC__stream_decoder_init()... ");
312 if(FLAC__stream_decoder_init(decoder) == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
313 return die_s_(0, decoder);
316 printf("testing FLAC__stream_decoder_delete()... ");
317 FLAC__stream_decoder_delete(decoder);
321 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
323 printf("testing FLAC__stream_decoder_new()... ");
324 decoder = FLAC__stream_decoder_new();
326 printf("FAILED, returned NULL\n");
331 printf("testing FLAC__stream_decoder_set_read_callback()... ");
332 if(!FLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))
333 return die_s_("returned false", decoder);
336 printf("testing FLAC__stream_decoder_set_write_callback()... ");
337 if(!FLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))
338 return die_s_("returned false", decoder);
341 printf("testing FLAC__stream_decoder_set_metadata_callback()... ");
342 if(!FLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))
343 return die_s_("returned false", decoder);
346 printf("testing FLAC__stream_decoder_set_error_callback()... ");
347 if(!FLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))
348 return die_s_("returned false", decoder);
351 printf("testing FLAC__stream_decoder_set_client_data()... ");
352 if(!FLAC__stream_decoder_set_client_data(decoder, &decoder_client_data))
353 return die_s_("returned false", decoder);
356 printf("testing FLAC__stream_decoder_init()... ");
357 if(FLAC__stream_decoder_init(decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
358 return die_s_(0, decoder);
361 printf("testing FLAC__stream_decoder_get_state()... ");
362 state = FLAC__stream_decoder_get_state(decoder);
363 printf("returned state = %u (%s)... OK\n", state, FLAC__StreamDecoderStateString[state]);
365 decoder_client_data.current_metadata_number = 0;
366 decoder_client_data.ignore_errors = false;
367 decoder_client_data.error_occurred = false;
369 printf("opening FLAC file... ");
370 decoder_client_data.file = fopen(flacfilename_, "rb");
371 if(0 == decoder_client_data.file) {
377 printf("testing FLAC__stream_decoder_process_until_end_of_metadata()... ");
378 if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder))
379 return die_s_("returned false", decoder);
382 printf("testing FLAC__stream_decoder_process_single()... ");
383 if(!FLAC__stream_decoder_process_single(decoder))
384 return die_s_("returned false", decoder);
387 printf("testing FLAC__stream_decoder_flush()... ");
388 if(!FLAC__stream_decoder_flush(decoder))
389 return die_s_("returned false", decoder);
392 decoder_client_data.ignore_errors = true;
393 printf("testing FLAC__stream_decoder_process_single()... ");
394 if(!FLAC__stream_decoder_process_single(decoder))
395 return die_s_("returned false", decoder);
397 decoder_client_data.ignore_errors = false;
399 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
400 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
401 return die_s_("returned false", decoder);
404 printf("testing FLAC__stream_decoder_get_channels()... ");
406 unsigned channels = FLAC__stream_decoder_get_channels(decoder);
407 if(channels != streaminfo_.data.stream_info.channels) {
408 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
414 printf("testing FLAC__stream_decoder_get_bits_per_sample()... ");
416 unsigned bits_per_sample = FLAC__stream_decoder_get_bits_per_sample(decoder);
417 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
418 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
424 printf("testing FLAC__stream_decoder_get_sample_rate()... ");
426 unsigned sample_rate = FLAC__stream_decoder_get_sample_rate(decoder);
427 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
428 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
434 printf("testing FLAC__stream_decoder_get_blocksize()... ");
436 unsigned blocksize = FLAC__stream_decoder_get_blocksize(decoder);
437 /* value could be anything since we're at the last block, so accept any answer */
438 printf("returned %u... OK\n", blocksize);
441 printf("testing FLAC__stream_decoder_get_channel_assignment()... ");
443 FLAC__ChannelAssignment ca = FLAC__stream_decoder_get_channel_assignment(decoder);
444 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
447 printf("testing FLAC__stream_decoder_reset()... ");
448 if(!FLAC__stream_decoder_reset(decoder)) {
449 state = FLAC__stream_decoder_get_state(decoder);
450 printf("FAILED, returned false, state = %u (%s)\n", state, FLAC__StreamDecoderStateString[state]);
455 decoder_client_data.current_metadata_number = 0;
457 printf("rewinding input... ");
458 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
459 printf("FAILED, errno = %d\n", errno);
464 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
465 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
466 return die_s_("returned false", decoder);
469 printf("testing FLAC__stream_decoder_finish()... ");
470 FLAC__stream_decoder_finish(decoder);
477 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
478 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
479 return die_s_("returned false", decoder);
483 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
484 expected_metadata_sequence_[num_expected_++] = &padding_;
485 expected_metadata_sequence_[num_expected_++] = &seektable_;
486 expected_metadata_sequence_[num_expected_++] = &application1_;
487 expected_metadata_sequence_[num_expected_++] = &application2_;
488 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
489 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
490 expected_metadata_sequence_[num_expected_++] = &unknown_;
492 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
499 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
500 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
501 return die_s_("returned false", decoder);
506 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
510 * respond all, ignore VORBIS_COMMENT
513 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
514 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
515 return die_s_("returned false", decoder);
518 printf("testing FLAC__stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
519 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
520 return die_s_("returned false", decoder);
524 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
525 expected_metadata_sequence_[num_expected_++] = &padding_;
526 expected_metadata_sequence_[num_expected_++] = &seektable_;
527 expected_metadata_sequence_[num_expected_++] = &application1_;
528 expected_metadata_sequence_[num_expected_++] = &application2_;
529 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
530 expected_metadata_sequence_[num_expected_++] = &unknown_;
532 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
536 * respond all, ignore APPLICATION
539 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
540 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
541 return die_s_("returned false", decoder);
544 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
545 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
546 return die_s_("returned false", decoder);
550 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
551 expected_metadata_sequence_[num_expected_++] = &padding_;
552 expected_metadata_sequence_[num_expected_++] = &seektable_;
553 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
554 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
555 expected_metadata_sequence_[num_expected_++] = &unknown_;
557 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
561 * respond all, ignore APPLICATION id of app#1
564 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
565 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
566 return die_s_("returned false", decoder);
569 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
570 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
571 return die_s_("returned false", decoder);
575 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
576 expected_metadata_sequence_[num_expected_++] = &padding_;
577 expected_metadata_sequence_[num_expected_++] = &seektable_;
578 expected_metadata_sequence_[num_expected_++] = &application2_;
579 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
580 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
581 expected_metadata_sequence_[num_expected_++] = &unknown_;
583 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
587 * respond all, ignore APPLICATION id of app#1 & app#2
590 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
591 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
592 return die_s_("returned false", decoder);
595 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
596 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
597 return die_s_("returned false", decoder);
600 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #2)... ");
601 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
602 return die_s_("returned false", decoder);
606 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
607 expected_metadata_sequence_[num_expected_++] = &padding_;
608 expected_metadata_sequence_[num_expected_++] = &seektable_;
609 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
610 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
611 expected_metadata_sequence_[num_expected_++] = &unknown_;
613 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
617 * ignore all, respond VORBIS_COMMENT
620 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
621 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
622 return die_s_("returned false", decoder);
625 printf("testing FLAC__stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
626 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
627 return die_s_("returned false", decoder);
631 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
633 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
637 * ignore all, respond APPLICATION
640 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
641 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
642 return die_s_("returned false", decoder);
645 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
646 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
647 return die_s_("returned false", decoder);
651 expected_metadata_sequence_[num_expected_++] = &application1_;
652 expected_metadata_sequence_[num_expected_++] = &application2_;
654 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
658 * ignore all, respond APPLICATION id of app#1
661 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
662 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
663 return die_s_("returned false", decoder);
666 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
667 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
668 return die_s_("returned false", decoder);
672 expected_metadata_sequence_[num_expected_++] = &application1_;
674 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
678 * ignore all, respond APPLICATION id of app#1 & app#2
681 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
682 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
683 return die_s_("returned false", decoder);
686 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
687 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
688 return die_s_("returned false", decoder);
691 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #2)... ");
692 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
693 return die_s_("returned false", decoder);
697 expected_metadata_sequence_[num_expected_++] = &application1_;
698 expected_metadata_sequence_[num_expected_++] = &application2_;
700 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
704 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
707 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
708 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
709 return die_s_("returned false", decoder);
712 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
713 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
714 return die_s_("returned false", decoder);
717 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
718 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
719 return die_s_("returned false", decoder);
723 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
724 expected_metadata_sequence_[num_expected_++] = &padding_;
725 expected_metadata_sequence_[num_expected_++] = &seektable_;
726 expected_metadata_sequence_[num_expected_++] = &application1_;
727 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
728 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
729 expected_metadata_sequence_[num_expected_++] = &unknown_;
731 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
735 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
738 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
739 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
740 return die_s_("returned false", decoder);
743 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
744 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
745 return die_s_("returned false", decoder);
748 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
749 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
750 return die_s_("returned false", decoder);
754 expected_metadata_sequence_[num_expected_++] = &application2_;
756 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
759 /* done, now leave the sequence the way we found it... */
761 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
762 expected_metadata_sequence_[num_expected_++] = &padding_;
763 expected_metadata_sequence_[num_expected_++] = &seektable_;
764 expected_metadata_sequence_[num_expected_++] = &application1_;
765 expected_metadata_sequence_[num_expected_++] = &application2_;
766 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
767 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
768 expected_metadata_sequence_[num_expected_++] = &unknown_;
770 printf("testing FLAC__stream_decoder_delete()... ");
771 FLAC__stream_decoder_delete(decoder);
774 fclose(decoder_client_data.file);
776 printf("\nPASSED!\n");
781 static FLAC__SeekableStreamDecoderReadStatus seekable_stream_decoder_read_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
784 switch(stream_decoder_read_callback_(0, buffer, bytes, client_data)) {
785 case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE:
786 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK;
787 case FLAC__STREAM_DECODER_READ_STATUS_ABORT:
788 case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM:
789 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
792 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
796 static FLAC__SeekableStreamDecoderSeekStatus seekable_stream_decoder_seek_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
798 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
803 printf("ERROR: client_data in seek callback is NULL\n");
804 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
807 if(dcd->error_occurred)
808 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
810 if(fseek(dcd->file, (long)absolute_byte_offset, SEEK_SET) < 0) {
811 dcd->error_occurred = true;
812 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
815 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK;
818 static FLAC__SeekableStreamDecoderTellStatus seekable_stream_decoder_tell_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
820 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
826 printf("ERROR: client_data in tell callback is NULL\n");
827 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
830 if(dcd->error_occurred)
831 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
833 offset = ftell(dcd->file);
834 *absolute_byte_offset = (FLAC__uint64)offset;
837 dcd->error_occurred = true;
838 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
841 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK;
844 static FLAC__SeekableStreamDecoderLengthStatus seekable_stream_decoder_length_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
846 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
851 printf("ERROR: client_data in length callback is NULL\n");
852 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
855 if(dcd->error_occurred)
856 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
858 *stream_length = (FLAC__uint64)flacfilesize_;
859 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK;
862 static FLAC__bool seekable_stream_decoder_eof_callback_(const FLAC__SeekableStreamDecoder *decoder, void *client_data)
864 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
869 printf("ERROR: client_data in eof callback is NULL\n");
873 if(dcd->error_occurred)
876 return feof(dcd->file);
879 static FLAC__StreamDecoderWriteStatus seekable_stream_decoder_write_callback_(const FLAC__SeekableStreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
882 return stream_decoder_write_callback_(0, frame, buffer, client_data);
885 static void seekable_stream_decoder_metadata_callback_(const FLAC__SeekableStreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
888 stream_decoder_metadata_callback_(0, metadata, client_data);
891 static void seekable_stream_decoder_error_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
894 stream_decoder_error_callback_(0, status, client_data);
897 static FLAC__bool seekable_stream_decoder_test_respond_(FLAC__SeekableStreamDecoder *decoder, seekable_stream_decoder_client_data_struct *dcd)
899 if(!FLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_))
900 return die_ss_("at FLAC__seekable_stream_decoder_set_read_callback(), returned false", decoder);
902 if(!FLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_))
903 return die_ss_("at FLAC__seekable_stream_decoder_set_seek_callback(), returned false", decoder);
905 if(!FLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_))
906 return die_ss_("at FLAC__seekable_stream_decoder_set_tell_callback(), returned false", decoder);
908 if(!FLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_))
909 return die_ss_("at FLAC__seekable_stream_decoder_set_length_callback(), returned false", decoder);
911 if(!FLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_))
912 return die_ss_("at FLAC__seekable_stream_decoder_set_eof_callback(), returned false", decoder);
914 if(!FLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_))
915 return die_ss_("at FLAC__seekable_stream_decoder_set_write_callback(), returned false", decoder);
917 if(!FLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_))
918 return die_ss_("at FLAC__seekable_stream_decoder_set_metadata_callback(), returned false", decoder);
920 if(!FLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_))
921 return die_ss_("at FLAC__seekable_stream_decoder_set_error_callback(), returned false", decoder);
923 if(!FLAC__seekable_stream_decoder_set_client_data(decoder, dcd))
924 return die_ss_("at FLAC__seekable_stream_decoder_set_client_data(), returned false", decoder);
926 if(!FLAC__seekable_stream_decoder_set_md5_checking(decoder, true))
927 return die_ss_("at FLAC__seekable_stream_decoder_set_md5_checking(), returned false", decoder);
929 printf("testing FLAC__seekable_stream_decoder_init()... ");
930 if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK)
931 return die_ss_(0, decoder);
934 dcd->current_metadata_number = 0;
936 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
937 printf("FAILED rewinding input, errno = %d\n", errno);
941 printf("testing FLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
942 if(!FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
943 return die_ss_("returned false", decoder);
946 printf("testing FLAC__seekable_stream_decoder_finish()... ");
947 (void) FLAC__seekable_stream_decoder_finish(decoder);
953 static FLAC__bool test_seekable_stream_decoder()
955 FLAC__SeekableStreamDecoder *decoder;
956 FLAC__SeekableStreamDecoderState state;
957 FLAC__StreamDecoderState sstate;
958 seekable_stream_decoder_client_data_struct decoder_client_data;
960 printf("\n+++ libFLAC unit test: FLAC__SeekableStreamDecoder\n\n");
962 printf("testing FLAC__seekable_stream_decoder_new()... ");
963 decoder = FLAC__seekable_stream_decoder_new();
965 printf("FAILED, returned NULL\n");
970 printf("testing FLAC__seekable_stream_decoder_delete()... ");
971 FLAC__seekable_stream_decoder_delete(decoder);
974 printf("testing FLAC__seekable_stream_decoder_new()... ");
975 decoder = FLAC__seekable_stream_decoder_new();
977 printf("FAILED, returned NULL\n");
982 printf("testing FLAC__seekable_stream_decoder_init()... ");
983 if(FLAC__seekable_stream_decoder_init(decoder) == FLAC__SEEKABLE_STREAM_DECODER_OK)
984 return die_ss_(0, decoder);
987 printf("testing FLAC__seekable_stream_decoder_delete()... ");
988 FLAC__seekable_stream_decoder_delete(decoder);
992 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
994 printf("testing FLAC__seekable_stream_decoder_new()... ");
995 decoder = FLAC__seekable_stream_decoder_new();
997 printf("FAILED, returned NULL\n");
1002 printf("testing FLAC__seekable_stream_decoder_set_read_callback()... ");
1003 if(!FLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_))
1004 return die_ss_("returned false", decoder);
1007 printf("testing FLAC__seekable_stream_decoder_set_seek_callback()... ");
1008 if(!FLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_))
1009 return die_ss_("returned false", decoder);
1012 printf("testing FLAC__seekable_stream_decoder_set_tell_callback()... ");
1013 if(!FLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_))
1014 return die_ss_("returned false", decoder);
1017 printf("testing FLAC__seekable_stream_decoder_set_length_callback()... ");
1018 if(!FLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_))
1019 return die_ss_("returned false", decoder);
1022 printf("testing FLAC__seekable_stream_decoder_set_eof_callback()... ");
1023 if(!FLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_))
1024 return die_ss_("returned false", decoder);
1027 printf("testing FLAC__seekable_stream_decoder_set_write_callback()... ");
1028 if(!FLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_))
1029 return die_ss_("returned false", decoder);
1032 printf("testing FLAC__seekable_stream_decoder_set_metadata_callback()... ");
1033 if(!FLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_))
1034 return die_ss_("returned false", decoder);
1037 printf("testing FLAC__seekable_stream_decoder_set_error_callback()... ");
1038 if(!FLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_))
1039 return die_ss_("returned false", decoder);
1042 printf("testing FLAC__seekable_stream_decoder_set_client_data()... ");
1043 if(!FLAC__seekable_stream_decoder_set_client_data(decoder, &decoder_client_data))
1044 return die_ss_("returned false", decoder);
1047 printf("testing FLAC__seekable_stream_decoder_set_md5_checking()... ");
1048 if(!FLAC__seekable_stream_decoder_set_md5_checking(decoder, true))
1049 return die_ss_("returned false", decoder);
1052 printf("testing FLAC__seekable_stream_decoder_init()... ");
1053 if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK)
1054 return die_ss_(0, decoder);
1057 printf("testing FLAC__seekable_stream_decoder_get_state()... ");
1058 state = FLAC__seekable_stream_decoder_get_state(decoder);
1059 printf("returned state = %u (%s)... OK\n", state, FLAC__SeekableStreamDecoderStateString[state]);
1061 printf("testing FLAC__seekable_stream_decoder_get_stream_decoder_state()... ");
1062 sstate = FLAC__seekable_stream_decoder_get_stream_decoder_state(decoder);
1063 printf("returned state = %u (%s)... OK\n", sstate, FLAC__StreamDecoderStateString[sstate]);
1065 decoder_client_data.current_metadata_number = 0;
1066 decoder_client_data.ignore_errors = false;
1067 decoder_client_data.error_occurred = false;
1069 printf("opening FLAC file... ");
1070 decoder_client_data.file = fopen(flacfilename_, "rb");
1071 if(0 == decoder_client_data.file) {
1077 printf("testing FLAC__seekable_stream_decoder_get_md5_checking()... ");
1078 if(!FLAC__seekable_stream_decoder_get_md5_checking(decoder)) {
1079 printf("FAILED, returned false, expected true\n");
1084 printf("testing FLAC__seekable_stream_decoder_process_until_end_of_metadata()... ");
1085 if(!FLAC__seekable_stream_decoder_process_until_end_of_metadata(decoder))
1086 return die_ss_("returned false", decoder);
1089 printf("testing FLAC__seekable_stream_decoder_process_single()... ");
1090 if(!FLAC__seekable_stream_decoder_process_single(decoder))
1091 return die_ss_("returned false", decoder);
1094 printf("testing FLAC__seekable_stream_decoder_flush()... ");
1095 if(!FLAC__seekable_stream_decoder_flush(decoder))
1096 return die_ss_("returned false", decoder);
1099 decoder_client_data.ignore_errors = true;
1100 printf("testing FLAC__seekable_stream_decoder_process_single()... ");
1101 if(!FLAC__seekable_stream_decoder_process_single(decoder))
1102 return die_ss_("returned false", decoder);
1104 decoder_client_data.ignore_errors = false;
1106 printf("testing FLAC__seekable_stream_decoder_seek_absolute()... ");
1107 if(!FLAC__seekable_stream_decoder_seek_absolute(decoder, 0))
1108 return die_ss_("returned false", decoder);
1111 printf("testing FLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
1112 if(!FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
1113 return die_ss_("returned false", decoder);
1116 printf("testing FLAC__seekable_stream_decoder_get_channels()... ");
1118 unsigned channels = FLAC__seekable_stream_decoder_get_channels(decoder);
1119 if(channels != streaminfo_.data.stream_info.channels) {
1120 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
1126 printf("testing FLAC__seekable_stream_decoder_get_bits_per_sample()... ");
1128 unsigned bits_per_sample = FLAC__seekable_stream_decoder_get_bits_per_sample(decoder);
1129 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
1130 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
1136 printf("testing FLAC__seekable_stream_decoder_get_sample_rate()... ");
1138 unsigned sample_rate = FLAC__seekable_stream_decoder_get_sample_rate(decoder);
1139 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
1140 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
1146 printf("testing FLAC__seekable_stream_decoder_get_blocksize()... ");
1148 unsigned blocksize = FLAC__seekable_stream_decoder_get_blocksize(decoder);
1149 /* value could be anything since we're at the last block, so accept any answer */
1150 printf("returned %u... OK\n", blocksize);
1153 printf("testing FLAC__seekable_stream_decoder_get_channel_assignment()... ");
1155 FLAC__ChannelAssignment ca = FLAC__seekable_stream_decoder_get_channel_assignment(decoder);
1156 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1159 printf("testing FLAC__seekable_stream_decoder_reset()... ");
1160 if(!FLAC__seekable_stream_decoder_reset(decoder))
1161 return die_ss_("returned false", decoder);
1164 decoder_client_data.current_metadata_number = 0;
1166 printf("rewinding input... ");
1167 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
1168 printf("FAILED, errno = %d\n", errno);
1173 printf("testing FLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
1174 if(!FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
1175 return die_ss_("returned false", decoder);
1178 printf("testing FLAC__seekable_stream_decoder_finish()... ");
1179 (void) FLAC__seekable_stream_decoder_finish(decoder);
1186 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1187 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1188 return die_ss_("returned false", decoder);
1192 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1193 expected_metadata_sequence_[num_expected_++] = &padding_;
1194 expected_metadata_sequence_[num_expected_++] = &seektable_;
1195 expected_metadata_sequence_[num_expected_++] = &application1_;
1196 expected_metadata_sequence_[num_expected_++] = &application2_;
1197 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1198 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1199 expected_metadata_sequence_[num_expected_++] = &unknown_;
1201 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1208 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1209 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1210 return die_ss_("returned false", decoder);
1215 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1219 * respond all, ignore VORBIS_COMMENT
1222 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1223 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1224 return die_ss_("returned false", decoder);
1227 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
1228 if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1229 return die_ss_("returned false", decoder);
1233 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1234 expected_metadata_sequence_[num_expected_++] = &padding_;
1235 expected_metadata_sequence_[num_expected_++] = &seektable_;
1236 expected_metadata_sequence_[num_expected_++] = &application1_;
1237 expected_metadata_sequence_[num_expected_++] = &application2_;
1238 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1239 expected_metadata_sequence_[num_expected_++] = &unknown_;
1241 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1245 * respond all, ignore APPLICATION
1248 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1249 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1250 return die_ss_("returned false", decoder);
1253 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... ");
1254 if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1255 return die_ss_("returned false", decoder);
1259 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1260 expected_metadata_sequence_[num_expected_++] = &padding_;
1261 expected_metadata_sequence_[num_expected_++] = &seektable_;
1262 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1263 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1264 expected_metadata_sequence_[num_expected_++] = &unknown_;
1266 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1270 * respond all, ignore APPLICATION id of app#1
1273 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1274 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1275 return die_ss_("returned false", decoder);
1278 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1279 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1280 return die_ss_("returned false", decoder);
1284 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1285 expected_metadata_sequence_[num_expected_++] = &padding_;
1286 expected_metadata_sequence_[num_expected_++] = &seektable_;
1287 expected_metadata_sequence_[num_expected_++] = &application2_;
1288 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1289 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1290 expected_metadata_sequence_[num_expected_++] = &unknown_;
1292 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1296 * respond all, ignore APPLICATION id of app#1 & app#2
1299 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1300 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1301 return die_ss_("returned false", decoder);
1304 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1305 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1306 return die_ss_("returned false", decoder);
1309 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #2)... ");
1310 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
1311 return die_ss_("returned false", decoder);
1315 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1316 expected_metadata_sequence_[num_expected_++] = &padding_;
1317 expected_metadata_sequence_[num_expected_++] = &seektable_;
1318 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1319 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1320 expected_metadata_sequence_[num_expected_++] = &unknown_;
1322 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1326 * ignore all, respond VORBIS_COMMENT
1329 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1330 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1331 return die_ss_("returned false", decoder);
1334 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
1335 if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1336 return die_ss_("returned false", decoder);
1340 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1342 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1346 * ignore all, respond APPLICATION
1349 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1350 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1351 return die_ss_("returned false", decoder);
1354 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... ");
1355 if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1356 return die_ss_("returned false", decoder);
1360 expected_metadata_sequence_[num_expected_++] = &application1_;
1361 expected_metadata_sequence_[num_expected_++] = &application2_;
1363 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1367 * ignore all, respond APPLICATION id of app#1
1370 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1371 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1372 return die_ss_("returned false", decoder);
1375 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1376 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1377 return die_ss_("returned false", decoder);
1381 expected_metadata_sequence_[num_expected_++] = &application1_;
1383 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1387 * ignore all, respond APPLICATION id of app#1 & app#2
1390 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1391 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1392 return die_ss_("returned false", decoder);
1395 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1396 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1397 return die_ss_("returned false", decoder);
1400 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #2)... ");
1401 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
1402 return die_ss_("returned false", decoder);
1406 expected_metadata_sequence_[num_expected_++] = &application1_;
1407 expected_metadata_sequence_[num_expected_++] = &application2_;
1409 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1413 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
1416 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1417 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1418 return die_ss_("returned false", decoder);
1421 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... ");
1422 if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1423 return die_ss_("returned false", decoder);
1426 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1427 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1428 return die_ss_("returned false", decoder);
1432 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1433 expected_metadata_sequence_[num_expected_++] = &padding_;
1434 expected_metadata_sequence_[num_expected_++] = &seektable_;
1435 expected_metadata_sequence_[num_expected_++] = &application1_;
1436 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1437 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1438 expected_metadata_sequence_[num_expected_++] = &unknown_;
1440 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1444 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
1447 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1448 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1449 return die_ss_("returned false", decoder);
1452 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... ");
1453 if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1454 return die_ss_("returned false", decoder);
1457 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1458 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1459 return die_ss_("returned false", decoder);
1463 expected_metadata_sequence_[num_expected_++] = &application2_;
1465 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1468 /* done, now leave the sequence the way we found it... */
1470 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1471 expected_metadata_sequence_[num_expected_++] = &padding_;
1472 expected_metadata_sequence_[num_expected_++] = &seektable_;
1473 expected_metadata_sequence_[num_expected_++] = &application1_;
1474 expected_metadata_sequence_[num_expected_++] = &application2_;
1475 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1476 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1477 expected_metadata_sequence_[num_expected_++] = &unknown_;
1479 printf("testing FLAC__seekable_stream_decoder_delete()... ");
1480 FLAC__seekable_stream_decoder_delete(decoder);
1483 fclose(decoder_client_data.file);
1485 printf("\nPASSED!\n");
1490 static FLAC__StreamDecoderWriteStatus file_decoder_write_callback_(const FLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
1493 return stream_decoder_write_callback_(0, frame, buffer, client_data);
1496 static void file_decoder_metadata_callback_(const FLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
1499 stream_decoder_metadata_callback_(0, metadata, client_data);
1502 static void file_decoder_error_callback_(const FLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
1505 stream_decoder_error_callback_(0, status, client_data);
1508 static FLAC__bool file_decoder_test_respond_(FLAC__FileDecoder *decoder, file_decoder_client_data_struct *dcd)
1510 if(!FLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
1511 return die_f_("at FLAC__file_decoder_set_write_callback(), returned false", decoder);
1513 if(!FLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
1514 return die_f_("at FLAC__file_decoder_set_metadata_callback(), returned false", decoder);
1516 if(!FLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
1517 return die_f_("at FLAC__file_decoder_set_error_callback(), returned false", decoder);
1519 if(!FLAC__file_decoder_set_client_data(decoder, dcd))
1520 return die_f_("at FLAC__file_decoder_set_client_data(), returned false", decoder);
1522 if(!FLAC__file_decoder_set_filename(decoder, flacfilename_))
1523 return die_f_("at FLAC__file_decoder_set_filename(), returned false", decoder);
1525 if(!FLAC__file_decoder_set_md5_checking(decoder, true))
1526 return die_f_("at FLAC__file_decoder_set_md5_checking(), returned false", decoder);
1528 printf("testing FLAC__file_decoder_init()... ");
1529 if(FLAC__file_decoder_init(decoder) != FLAC__FILE_DECODER_OK)
1530 return die_f_(0, decoder);
1533 dcd->current_metadata_number = 0;
1535 printf("testing FLAC__file_decoder_process_until_end_of_file()... ");
1536 if(!FLAC__file_decoder_process_until_end_of_file(decoder))
1537 return die_f_("returned false", decoder);
1540 printf("testing FLAC__file_decoder_finish()... ");
1541 (void) FLAC__file_decoder_finish(decoder);
1547 static FLAC__bool test_file_decoder()
1549 FLAC__FileDecoder *decoder;
1550 FLAC__FileDecoderState state;
1551 FLAC__SeekableStreamDecoderState ssstate;
1552 FLAC__StreamDecoderState sstate;
1553 seekable_stream_decoder_client_data_struct decoder_client_data;
1555 printf("\n+++ libFLAC unit test: FLAC__FileDecoder\n\n");
1557 printf("testing FLAC__file_decoder_new()... ");
1558 decoder = FLAC__file_decoder_new();
1560 printf("FAILED, returned NULL\n");
1565 printf("testing FLAC__file_decoder_delete()... ");
1566 FLAC__file_decoder_delete(decoder);
1569 printf("testing FLAC__file_decoder_new()... ");
1570 decoder = FLAC__file_decoder_new();
1572 printf("FAILED, returned NULL\n");
1577 printf("testing FLAC__file_decoder_init()... ");
1578 if(FLAC__file_decoder_init(decoder) == FLAC__FILE_DECODER_OK)
1579 return die_f_(0, decoder);
1582 printf("testing FLAC__file_decoder_delete()... ");
1583 FLAC__file_decoder_delete(decoder);
1587 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1589 printf("testing FLAC__file_decoder_new()... ");
1590 decoder = FLAC__file_decoder_new();
1592 printf("FAILED, returned NULL\n");
1597 printf("testing FLAC__file_decoder_set_write_callback()... ");
1598 if(!FLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
1599 return die_f_("returned false", decoder);
1602 printf("testing FLAC__file_decoder_set_metadata_callback()... ");
1603 if(!FLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
1604 return die_f_("returned false", decoder);
1607 printf("testing FLAC__file_decoder_set_error_callback()... ");
1608 if(!FLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
1609 return die_f_("returned false", decoder);
1612 printf("testing FLAC__file_decoder_set_client_data()... ");
1613 if(!FLAC__file_decoder_set_client_data(decoder, &decoder_client_data))
1614 return die_f_("returned false", decoder);
1617 printf("testing FLAC__file_decoder_set_filename()... ");
1618 if(!FLAC__file_decoder_set_filename(decoder, flacfilename_))
1619 return die_f_("returned false", decoder);
1622 printf("testing FLAC__file_decoder_set_md5_checking()... ");
1623 if(!FLAC__file_decoder_set_md5_checking(decoder, true))
1624 return die_f_("returned false", decoder);
1627 printf("testing FLAC__file_decoder_init()... ");
1628 if(FLAC__file_decoder_init(decoder) != FLAC__FILE_DECODER_OK)
1629 return die_f_(0, decoder);
1632 printf("testing FLAC__file_decoder_get_state()... ");
1633 state = FLAC__file_decoder_get_state(decoder);
1634 printf("returned state = %u (%s)... OK\n", state, FLAC__FileDecoderStateString[state]);
1636 printf("testing FLAC__file_decoder_get_seekable_stream_decoder_state()... ");
1637 ssstate = FLAC__file_decoder_get_seekable_stream_decoder_state(decoder);
1638 printf("returned state = %u (%s)... OK\n", ssstate, FLAC__SeekableStreamDecoderStateString[ssstate]);
1640 printf("testing FLAC__file_decoder_get_stream_decoder_state()... ");
1641 sstate = FLAC__file_decoder_get_stream_decoder_state(decoder);
1642 printf("returned state = %u (%s)... OK\n", sstate, FLAC__StreamDecoderStateString[sstate]);
1644 decoder_client_data.current_metadata_number = 0;
1645 decoder_client_data.ignore_errors = false;
1646 decoder_client_data.error_occurred = false;
1648 printf("testing FLAC__file_decoder_get_md5_checking()... ");
1649 if(!FLAC__file_decoder_get_md5_checking(decoder)) {
1650 printf("FAILED, returned false, expected true\n");
1655 printf("testing FLAC__file_decoder_process_until_end_of_metadata()... ");
1656 if(!FLAC__file_decoder_process_until_end_of_metadata(decoder))
1657 return die_f_("returned false", decoder);
1660 printf("testing FLAC__file_decoder_process_single()... ");
1661 if(!FLAC__file_decoder_process_single(decoder))
1662 return die_f_("returned false", decoder);
1665 printf("testing FLAC__file_decoder_seek_absolute()... ");
1666 if(!FLAC__file_decoder_seek_absolute(decoder, 0))
1667 return die_f_("returned false", decoder);
1670 printf("testing FLAC__file_decoder_process_until_end_of_file()... ");
1671 if(!FLAC__file_decoder_process_until_end_of_file(decoder))
1672 return die_f_("returned false", decoder);
1675 printf("testing FLAC__file_decoder_get_channels()... ");
1677 unsigned channels = FLAC__file_decoder_get_channels(decoder);
1678 if(channels != streaminfo_.data.stream_info.channels) {
1679 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
1685 printf("testing FLAC__file_decoder_get_bits_per_sample()... ");
1687 unsigned bits_per_sample = FLAC__file_decoder_get_bits_per_sample(decoder);
1688 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
1689 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
1695 printf("testing FLAC__file_decoder_get_sample_rate()... ");
1697 unsigned sample_rate = FLAC__file_decoder_get_sample_rate(decoder);
1698 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
1699 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
1705 printf("testing FLAC__file_decoder_get_blocksize()... ");
1707 unsigned blocksize = FLAC__file_decoder_get_blocksize(decoder);
1708 /* value could be anything since we're at the last block, so accept any answer */
1709 printf("returned %u... OK\n", blocksize);
1712 printf("testing FLAC__file_decoder_get_channel_assignment()... ");
1714 FLAC__ChannelAssignment ca = FLAC__file_decoder_get_channel_assignment(decoder);
1715 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1718 printf("testing FLAC__file_decoder_finish()... ");
1719 (void) FLAC__file_decoder_finish(decoder);
1726 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1727 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1728 return die_f_("returned false", decoder);
1732 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1733 expected_metadata_sequence_[num_expected_++] = &padding_;
1734 expected_metadata_sequence_[num_expected_++] = &seektable_;
1735 expected_metadata_sequence_[num_expected_++] = &application1_;
1736 expected_metadata_sequence_[num_expected_++] = &application2_;
1737 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1738 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1739 expected_metadata_sequence_[num_expected_++] = &unknown_;
1741 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1748 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1749 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1750 return die_f_("returned false", decoder);
1755 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1759 * respond all, ignore VORBIS_COMMENT
1762 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1763 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1764 return die_f_("returned false", decoder);
1767 printf("testing FLAC__file_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
1768 if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1769 return die_f_("returned false", decoder);
1773 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1774 expected_metadata_sequence_[num_expected_++] = &padding_;
1775 expected_metadata_sequence_[num_expected_++] = &seektable_;
1776 expected_metadata_sequence_[num_expected_++] = &application1_;
1777 expected_metadata_sequence_[num_expected_++] = &application2_;
1778 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1779 expected_metadata_sequence_[num_expected_++] = &unknown_;
1781 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1785 * respond all, ignore APPLICATION
1788 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1789 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1790 return die_f_("returned false", decoder);
1793 printf("testing FLAC__file_decoder_set_metadata_ignore(APPLICATION)... ");
1794 if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1795 return die_f_("returned false", decoder);
1799 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1800 expected_metadata_sequence_[num_expected_++] = &padding_;
1801 expected_metadata_sequence_[num_expected_++] = &seektable_;
1802 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1803 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1804 expected_metadata_sequence_[num_expected_++] = &unknown_;
1806 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1810 * respond all, ignore APPLICATION id of app#1
1813 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1814 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1815 return die_f_("returned false", decoder);
1818 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1819 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1820 return die_f_("returned false", decoder);
1824 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1825 expected_metadata_sequence_[num_expected_++] = &padding_;
1826 expected_metadata_sequence_[num_expected_++] = &seektable_;
1827 expected_metadata_sequence_[num_expected_++] = &application2_;
1828 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1829 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1830 expected_metadata_sequence_[num_expected_++] = &unknown_;
1832 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1836 * respond all, ignore APPLICATION id of app#1 & app#2
1839 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1840 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1841 return die_f_("returned false", decoder);
1844 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1845 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1846 return die_f_("returned false", decoder);
1849 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #2)... ");
1850 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
1851 return die_f_("returned false", decoder);
1855 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1856 expected_metadata_sequence_[num_expected_++] = &padding_;
1857 expected_metadata_sequence_[num_expected_++] = &seektable_;
1858 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1859 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1860 expected_metadata_sequence_[num_expected_++] = &unknown_;
1862 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1866 * ignore all, respond VORBIS_COMMENT
1869 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1870 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1871 return die_f_("returned false", decoder);
1874 printf("testing FLAC__file_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
1875 if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1876 return die_f_("returned false", decoder);
1880 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1882 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1886 * ignore all, respond APPLICATION
1889 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1890 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1891 return die_f_("returned false", decoder);
1894 printf("testing FLAC__file_decoder_set_metadata_respond(APPLICATION)... ");
1895 if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1896 return die_f_("returned false", decoder);
1900 expected_metadata_sequence_[num_expected_++] = &application1_;
1901 expected_metadata_sequence_[num_expected_++] = &application2_;
1903 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1907 * ignore all, respond APPLICATION id of app#1
1910 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1911 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1912 return die_f_("returned false", decoder);
1915 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1916 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1917 return die_f_("returned false", decoder);
1921 expected_metadata_sequence_[num_expected_++] = &application1_;
1923 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1927 * ignore all, respond APPLICATION id of app#1 & app#2
1930 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1931 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1932 return die_f_("returned false", decoder);
1935 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1936 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1937 return die_f_("returned false", decoder);
1940 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #2)... ");
1941 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
1942 return die_f_("returned false", decoder);
1946 expected_metadata_sequence_[num_expected_++] = &application1_;
1947 expected_metadata_sequence_[num_expected_++] = &application2_;
1949 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1953 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
1956 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1957 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1958 return die_f_("returned false", decoder);
1961 printf("testing FLAC__file_decoder_set_metadata_ignore(APPLICATION)... ");
1962 if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1963 return die_f_("returned false", decoder);
1966 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1967 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1968 return die_f_("returned false", decoder);
1972 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1973 expected_metadata_sequence_[num_expected_++] = &padding_;
1974 expected_metadata_sequence_[num_expected_++] = &seektable_;
1975 expected_metadata_sequence_[num_expected_++] = &application1_;
1976 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1977 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1978 expected_metadata_sequence_[num_expected_++] = &unknown_;
1980 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1984 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
1987 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1988 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1989 return die_f_("returned false", decoder);
1992 printf("testing FLAC__file_decoder_set_metadata_respond(APPLICATION)... ");
1993 if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1994 return die_f_("returned false", decoder);
1997 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1998 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1999 return die_f_("returned false", decoder);
2003 expected_metadata_sequence_[num_expected_++] = &application2_;
2005 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2008 /* done, now leave the sequence the way we found it... */
2010 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
2011 expected_metadata_sequence_[num_expected_++] = &padding_;
2012 expected_metadata_sequence_[num_expected_++] = &seektable_;
2013 expected_metadata_sequence_[num_expected_++] = &application1_;
2014 expected_metadata_sequence_[num_expected_++] = &application2_;
2015 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
2016 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
2017 expected_metadata_sequence_[num_expected_++] = &unknown_;
2019 printf("testing FLAC__file_decoder_delete()... ");
2020 FLAC__file_decoder_delete(decoder);
2023 printf("\nPASSED!\n");
2028 FLAC__bool test_decoders()
2030 init_metadata_blocks_();
2031 if(!generate_file_())
2034 if(!test_stream_decoder())
2037 if(!test_seekable_stream_decoder())
2040 if(!test_file_decoder())
2043 (void) grabbag__file_remove_file(flacfilename_);
2044 free_metadata_blocks_();