1 /* test_libFLAC - Unit tester for libFLAC
2 * Copyright (C) 2002,2003,2004 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;
140 const unsigned requested_bytes = *bytes;
145 printf("ERROR: client_data in read callback is NULL\n");
146 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
149 if(dcd->error_occurred)
150 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
152 if(feof(dcd->file)) {
154 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
156 else if(requested_bytes > 0) {
157 *bytes = fread(buffer, 1, requested_bytes, dcd->file);
160 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
162 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
165 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
169 return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */
172 static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
174 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
176 (void)decoder, (void)buffer;
179 printf("ERROR: client_data in write callback is NULL\n");
180 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
183 if(dcd->error_occurred)
184 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
187 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER && frame->header.number.frame_number == 0) ||
188 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER && frame->header.number.sample_number == 0)
190 printf("content... ");
194 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
197 static void stream_decoder_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
199 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
204 printf("ERROR: client_data in metadata callback is NULL\n");
208 if(dcd->error_occurred)
211 printf("%d... ", dcd->current_metadata_number);
214 if(dcd->current_metadata_number >= num_expected_) {
215 (void)die_("got more metadata blocks than expected");
216 dcd->error_occurred = true;
219 if(!mutils__compare_block(expected_metadata_sequence_[dcd->current_metadata_number], metadata)) {
220 (void)die_("metadata block mismatch");
221 dcd->error_occurred = true;
224 dcd->current_metadata_number++;
227 static void stream_decoder_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
229 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
234 printf("ERROR: client_data in error callback is NULL\n");
238 if(!dcd->ignore_errors) {
239 printf("ERROR: got error callback: err = %u (%s)\n", (unsigned)status, FLAC__StreamDecoderErrorStatusString[status]);
240 dcd->error_occurred = true;
244 static FLAC__bool stream_decoder_test_respond_(FLAC__StreamDecoder *decoder, stream_decoder_client_data_struct *dcd)
246 if(!FLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))
247 return die_s_("at FLAC__stream_decoder_set_read_callback(), returned false", decoder);
249 if(!FLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))
250 return die_s_("at FLAC__stream_decoder_set_write_callback(), returned false", decoder);
252 if(!FLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))
253 return die_s_("at FLAC__stream_decoder_set_metadata_callback(), returned false", decoder);
255 if(!FLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))
256 return die_s_("at FLAC__stream_decoder_set_error_callback(), returned false", decoder);
258 if(!FLAC__stream_decoder_set_client_data(decoder, dcd))
259 return die_s_("at FLAC__stream_decoder_set_client_data(), returned false", decoder);
261 printf("testing FLAC__stream_decoder_init()... ");
262 if(FLAC__stream_decoder_init(decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
263 return die_s_(0, decoder);
266 dcd->current_metadata_number = 0;
268 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
269 printf("FAILED rewinding input, errno = %d\n", errno);
273 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
274 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
275 return die_s_("returned false", decoder);
278 printf("testing FLAC__stream_decoder_finish()... ");
279 FLAC__stream_decoder_finish(decoder);
285 static FLAC__bool test_stream_decoder()
287 FLAC__StreamDecoder *decoder;
288 FLAC__StreamDecoderState state;
289 stream_decoder_client_data_struct decoder_client_data;
291 printf("\n+++ libFLAC unit test: FLAC__StreamDecoder\n\n");
293 printf("testing FLAC__stream_decoder_new()... ");
294 decoder = FLAC__stream_decoder_new();
296 printf("FAILED, returned NULL\n");
301 printf("testing FLAC__stream_decoder_delete()... ");
302 FLAC__stream_decoder_delete(decoder);
305 printf("testing FLAC__stream_decoder_new()... ");
306 decoder = FLAC__stream_decoder_new();
308 printf("FAILED, returned NULL\n");
313 printf("testing FLAC__stream_decoder_init()... ");
314 if(FLAC__stream_decoder_init(decoder) == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
315 return die_s_(0, decoder);
318 printf("testing FLAC__stream_decoder_delete()... ");
319 FLAC__stream_decoder_delete(decoder);
323 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
325 printf("testing FLAC__stream_decoder_new()... ");
326 decoder = FLAC__stream_decoder_new();
328 printf("FAILED, returned NULL\n");
333 printf("testing FLAC__stream_decoder_set_read_callback()... ");
334 if(!FLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))
335 return die_s_("returned false", decoder);
338 printf("testing FLAC__stream_decoder_set_write_callback()... ");
339 if(!FLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))
340 return die_s_("returned false", decoder);
343 printf("testing FLAC__stream_decoder_set_metadata_callback()... ");
344 if(!FLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))
345 return die_s_("returned false", decoder);
348 printf("testing FLAC__stream_decoder_set_error_callback()... ");
349 if(!FLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))
350 return die_s_("returned false", decoder);
353 printf("testing FLAC__stream_decoder_set_client_data()... ");
354 if(!FLAC__stream_decoder_set_client_data(decoder, &decoder_client_data))
355 return die_s_("returned false", decoder);
358 printf("testing FLAC__stream_decoder_init()... ");
359 if(FLAC__stream_decoder_init(decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
360 return die_s_(0, decoder);
363 printf("testing FLAC__stream_decoder_get_state()... ");
364 state = FLAC__stream_decoder_get_state(decoder);
365 printf("returned state = %u (%s)... OK\n", state, FLAC__StreamDecoderStateString[state]);
367 decoder_client_data.current_metadata_number = 0;
368 decoder_client_data.ignore_errors = false;
369 decoder_client_data.error_occurred = false;
371 printf("opening FLAC file... ");
372 decoder_client_data.file = fopen(flacfilename_, "rb");
373 if(0 == decoder_client_data.file) {
379 printf("testing FLAC__stream_decoder_process_until_end_of_metadata()... ");
380 if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder))
381 return die_s_("returned false", decoder);
384 printf("testing FLAC__stream_decoder_process_single()... ");
385 if(!FLAC__stream_decoder_process_single(decoder))
386 return die_s_("returned false", decoder);
389 printf("testing FLAC__stream_decoder_skip_single_frame()... ");
390 if(!FLAC__stream_decoder_skip_single_frame(decoder))
391 return die_s_("returned false", decoder);
394 printf("testing FLAC__stream_decoder_flush()... ");
395 if(!FLAC__stream_decoder_flush(decoder))
396 return die_s_("returned false", decoder);
399 decoder_client_data.ignore_errors = true;
400 printf("testing FLAC__stream_decoder_process_single()... ");
401 if(!FLAC__stream_decoder_process_single(decoder))
402 return die_s_("returned false", decoder);
404 decoder_client_data.ignore_errors = false;
406 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
407 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
408 return die_s_("returned false", decoder);
411 printf("testing FLAC__stream_decoder_get_channels()... ");
413 unsigned channels = FLAC__stream_decoder_get_channels(decoder);
414 if(channels != streaminfo_.data.stream_info.channels) {
415 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
421 printf("testing FLAC__stream_decoder_get_bits_per_sample()... ");
423 unsigned bits_per_sample = FLAC__stream_decoder_get_bits_per_sample(decoder);
424 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
425 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
431 printf("testing FLAC__stream_decoder_get_sample_rate()... ");
433 unsigned sample_rate = FLAC__stream_decoder_get_sample_rate(decoder);
434 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
435 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
441 printf("testing FLAC__stream_decoder_get_blocksize()... ");
443 unsigned blocksize = FLAC__stream_decoder_get_blocksize(decoder);
444 /* value could be anything since we're at the last block, so accept any answer */
445 printf("returned %u... OK\n", blocksize);
448 printf("testing FLAC__stream_decoder_get_channel_assignment()... ");
450 FLAC__ChannelAssignment ca = FLAC__stream_decoder_get_channel_assignment(decoder);
451 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
454 printf("testing FLAC__stream_decoder_reset()... ");
455 if(!FLAC__stream_decoder_reset(decoder)) {
456 state = FLAC__stream_decoder_get_state(decoder);
457 printf("FAILED, returned false, state = %u (%s)\n", state, FLAC__StreamDecoderStateString[state]);
462 decoder_client_data.current_metadata_number = 0;
464 printf("rewinding input... ");
465 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
466 printf("FAILED, errno = %d\n", errno);
471 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
472 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
473 return die_s_("returned false", decoder);
476 printf("testing FLAC__stream_decoder_finish()... ");
477 FLAC__stream_decoder_finish(decoder);
484 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
485 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
486 return die_s_("returned false", decoder);
490 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
491 expected_metadata_sequence_[num_expected_++] = &padding_;
492 expected_metadata_sequence_[num_expected_++] = &seektable_;
493 expected_metadata_sequence_[num_expected_++] = &application1_;
494 expected_metadata_sequence_[num_expected_++] = &application2_;
495 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
496 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
497 expected_metadata_sequence_[num_expected_++] = &unknown_;
499 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
506 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
507 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
508 return die_s_("returned false", decoder);
513 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
517 * respond all, ignore VORBIS_COMMENT
520 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
521 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
522 return die_s_("returned false", decoder);
525 printf("testing FLAC__stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
526 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
527 return die_s_("returned false", decoder);
531 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
532 expected_metadata_sequence_[num_expected_++] = &padding_;
533 expected_metadata_sequence_[num_expected_++] = &seektable_;
534 expected_metadata_sequence_[num_expected_++] = &application1_;
535 expected_metadata_sequence_[num_expected_++] = &application2_;
536 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
537 expected_metadata_sequence_[num_expected_++] = &unknown_;
539 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
543 * respond all, ignore APPLICATION
546 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
547 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
548 return die_s_("returned false", decoder);
551 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
552 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
553 return die_s_("returned false", decoder);
557 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
558 expected_metadata_sequence_[num_expected_++] = &padding_;
559 expected_metadata_sequence_[num_expected_++] = &seektable_;
560 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
561 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
562 expected_metadata_sequence_[num_expected_++] = &unknown_;
564 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
568 * respond all, ignore APPLICATION id of app#1
571 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
572 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
573 return die_s_("returned false", decoder);
576 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
577 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
578 return die_s_("returned false", decoder);
582 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
583 expected_metadata_sequence_[num_expected_++] = &padding_;
584 expected_metadata_sequence_[num_expected_++] = &seektable_;
585 expected_metadata_sequence_[num_expected_++] = &application2_;
586 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
587 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
588 expected_metadata_sequence_[num_expected_++] = &unknown_;
590 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
594 * respond all, ignore APPLICATION id of app#1 & app#2
597 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
598 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
599 return die_s_("returned false", decoder);
602 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
603 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
604 return die_s_("returned false", decoder);
607 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #2)... ");
608 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
609 return die_s_("returned false", decoder);
613 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
614 expected_metadata_sequence_[num_expected_++] = &padding_;
615 expected_metadata_sequence_[num_expected_++] = &seektable_;
616 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
617 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
618 expected_metadata_sequence_[num_expected_++] = &unknown_;
620 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
624 * ignore all, respond VORBIS_COMMENT
627 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
628 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
629 return die_s_("returned false", decoder);
632 printf("testing FLAC__stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
633 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
634 return die_s_("returned false", decoder);
638 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
640 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
644 * ignore all, respond APPLICATION
647 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
648 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
649 return die_s_("returned false", decoder);
652 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
653 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
654 return die_s_("returned false", decoder);
658 expected_metadata_sequence_[num_expected_++] = &application1_;
659 expected_metadata_sequence_[num_expected_++] = &application2_;
661 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
665 * ignore all, respond APPLICATION id of app#1
668 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
669 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
670 return die_s_("returned false", decoder);
673 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
674 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
675 return die_s_("returned false", decoder);
679 expected_metadata_sequence_[num_expected_++] = &application1_;
681 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
685 * ignore all, respond APPLICATION id of app#1 & app#2
688 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
689 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
690 return die_s_("returned false", decoder);
693 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
694 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
695 return die_s_("returned false", decoder);
698 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #2)... ");
699 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
700 return die_s_("returned false", decoder);
704 expected_metadata_sequence_[num_expected_++] = &application1_;
705 expected_metadata_sequence_[num_expected_++] = &application2_;
707 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
711 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
714 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
715 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
716 return die_s_("returned false", decoder);
719 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
720 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
721 return die_s_("returned false", decoder);
724 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
725 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
726 return die_s_("returned false", decoder);
730 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
731 expected_metadata_sequence_[num_expected_++] = &padding_;
732 expected_metadata_sequence_[num_expected_++] = &seektable_;
733 expected_metadata_sequence_[num_expected_++] = &application1_;
734 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
735 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
736 expected_metadata_sequence_[num_expected_++] = &unknown_;
738 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
742 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
745 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
746 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
747 return die_s_("returned false", decoder);
750 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
751 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
752 return die_s_("returned false", decoder);
755 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
756 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
757 return die_s_("returned false", decoder);
761 expected_metadata_sequence_[num_expected_++] = &application2_;
763 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
766 /* done, now leave the sequence the way we found it... */
768 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
769 expected_metadata_sequence_[num_expected_++] = &padding_;
770 expected_metadata_sequence_[num_expected_++] = &seektable_;
771 expected_metadata_sequence_[num_expected_++] = &application1_;
772 expected_metadata_sequence_[num_expected_++] = &application2_;
773 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
774 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
775 expected_metadata_sequence_[num_expected_++] = &unknown_;
777 printf("testing FLAC__stream_decoder_delete()... ");
778 FLAC__stream_decoder_delete(decoder);
781 fclose(decoder_client_data.file);
783 printf("\nPASSED!\n");
788 static FLAC__SeekableStreamDecoderReadStatus seekable_stream_decoder_read_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
791 switch(stream_decoder_read_callback_(0, buffer, bytes, client_data)) {
792 case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE:
793 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK;
794 case FLAC__STREAM_DECODER_READ_STATUS_ABORT:
795 case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM:
796 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
799 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
803 static FLAC__SeekableStreamDecoderSeekStatus seekable_stream_decoder_seek_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
805 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
810 printf("ERROR: client_data in seek callback is NULL\n");
811 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
814 if(dcd->error_occurred)
815 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
817 if(fseek(dcd->file, (long)absolute_byte_offset, SEEK_SET) < 0) {
818 dcd->error_occurred = true;
819 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
822 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK;
825 static FLAC__SeekableStreamDecoderTellStatus seekable_stream_decoder_tell_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
827 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
833 printf("ERROR: client_data in tell callback is NULL\n");
834 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
837 if(dcd->error_occurred)
838 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
840 offset = ftell(dcd->file);
841 *absolute_byte_offset = (FLAC__uint64)offset;
844 dcd->error_occurred = true;
845 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
848 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK;
851 static FLAC__SeekableStreamDecoderLengthStatus seekable_stream_decoder_length_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
853 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
858 printf("ERROR: client_data in length callback is NULL\n");
859 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
862 if(dcd->error_occurred)
863 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
865 *stream_length = (FLAC__uint64)flacfilesize_;
866 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK;
869 static FLAC__bool seekable_stream_decoder_eof_callback_(const FLAC__SeekableStreamDecoder *decoder, void *client_data)
871 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
876 printf("ERROR: client_data in eof callback is NULL\n");
880 if(dcd->error_occurred)
883 return feof(dcd->file);
886 static FLAC__StreamDecoderWriteStatus seekable_stream_decoder_write_callback_(const FLAC__SeekableStreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
889 return stream_decoder_write_callback_(0, frame, buffer, client_data);
892 static void seekable_stream_decoder_metadata_callback_(const FLAC__SeekableStreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
895 stream_decoder_metadata_callback_(0, metadata, client_data);
898 static void seekable_stream_decoder_error_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
901 stream_decoder_error_callback_(0, status, client_data);
904 static FLAC__bool seekable_stream_decoder_test_respond_(FLAC__SeekableStreamDecoder *decoder, seekable_stream_decoder_client_data_struct *dcd)
906 if(!FLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_))
907 return die_ss_("at FLAC__seekable_stream_decoder_set_read_callback(), returned false", decoder);
909 if(!FLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_))
910 return die_ss_("at FLAC__seekable_stream_decoder_set_seek_callback(), returned false", decoder);
912 if(!FLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_))
913 return die_ss_("at FLAC__seekable_stream_decoder_set_tell_callback(), returned false", decoder);
915 if(!FLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_))
916 return die_ss_("at FLAC__seekable_stream_decoder_set_length_callback(), returned false", decoder);
918 if(!FLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_))
919 return die_ss_("at FLAC__seekable_stream_decoder_set_eof_callback(), returned false", decoder);
921 if(!FLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_))
922 return die_ss_("at FLAC__seekable_stream_decoder_set_write_callback(), returned false", decoder);
924 if(!FLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_))
925 return die_ss_("at FLAC__seekable_stream_decoder_set_metadata_callback(), returned false", decoder);
927 if(!FLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_))
928 return die_ss_("at FLAC__seekable_stream_decoder_set_error_callback(), returned false", decoder);
930 if(!FLAC__seekable_stream_decoder_set_client_data(decoder, dcd))
931 return die_ss_("at FLAC__seekable_stream_decoder_set_client_data(), returned false", decoder);
933 if(!FLAC__seekable_stream_decoder_set_md5_checking(decoder, true))
934 return die_ss_("at FLAC__seekable_stream_decoder_set_md5_checking(), returned false", decoder);
936 printf("testing FLAC__seekable_stream_decoder_init()... ");
937 if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK)
938 return die_ss_(0, decoder);
941 dcd->current_metadata_number = 0;
943 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
944 printf("FAILED rewinding input, errno = %d\n", errno);
948 printf("testing FLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
949 if(!FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
950 return die_ss_("returned false", decoder);
953 printf("testing FLAC__seekable_stream_decoder_finish()... ");
954 (void) FLAC__seekable_stream_decoder_finish(decoder);
960 static FLAC__bool test_seekable_stream_decoder()
962 FLAC__SeekableStreamDecoder *decoder;
963 FLAC__SeekableStreamDecoderState state;
964 FLAC__StreamDecoderState sstate;
965 seekable_stream_decoder_client_data_struct decoder_client_data;
967 printf("\n+++ libFLAC unit test: FLAC__SeekableStreamDecoder\n\n");
969 printf("testing FLAC__seekable_stream_decoder_new()... ");
970 decoder = FLAC__seekable_stream_decoder_new();
972 printf("FAILED, returned NULL\n");
977 printf("testing FLAC__seekable_stream_decoder_delete()... ");
978 FLAC__seekable_stream_decoder_delete(decoder);
981 printf("testing FLAC__seekable_stream_decoder_new()... ");
982 decoder = FLAC__seekable_stream_decoder_new();
984 printf("FAILED, returned NULL\n");
989 printf("testing FLAC__seekable_stream_decoder_init()... ");
990 if(FLAC__seekable_stream_decoder_init(decoder) == FLAC__SEEKABLE_STREAM_DECODER_OK)
991 return die_ss_(0, decoder);
994 printf("testing FLAC__seekable_stream_decoder_delete()... ");
995 FLAC__seekable_stream_decoder_delete(decoder);
999 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1001 printf("testing FLAC__seekable_stream_decoder_new()... ");
1002 decoder = FLAC__seekable_stream_decoder_new();
1004 printf("FAILED, returned NULL\n");
1009 printf("testing FLAC__seekable_stream_decoder_set_read_callback()... ");
1010 if(!FLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_))
1011 return die_ss_("returned false", decoder);
1014 printf("testing FLAC__seekable_stream_decoder_set_seek_callback()... ");
1015 if(!FLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_))
1016 return die_ss_("returned false", decoder);
1019 printf("testing FLAC__seekable_stream_decoder_set_tell_callback()... ");
1020 if(!FLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_))
1021 return die_ss_("returned false", decoder);
1024 printf("testing FLAC__seekable_stream_decoder_set_length_callback()... ");
1025 if(!FLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_))
1026 return die_ss_("returned false", decoder);
1029 printf("testing FLAC__seekable_stream_decoder_set_eof_callback()... ");
1030 if(!FLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_))
1031 return die_ss_("returned false", decoder);
1034 printf("testing FLAC__seekable_stream_decoder_set_write_callback()... ");
1035 if(!FLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_))
1036 return die_ss_("returned false", decoder);
1039 printf("testing FLAC__seekable_stream_decoder_set_metadata_callback()... ");
1040 if(!FLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_))
1041 return die_ss_("returned false", decoder);
1044 printf("testing FLAC__seekable_stream_decoder_set_error_callback()... ");
1045 if(!FLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_))
1046 return die_ss_("returned false", decoder);
1049 printf("testing FLAC__seekable_stream_decoder_set_client_data()... ");
1050 if(!FLAC__seekable_stream_decoder_set_client_data(decoder, &decoder_client_data))
1051 return die_ss_("returned false", decoder);
1054 printf("testing FLAC__seekable_stream_decoder_set_md5_checking()... ");
1055 if(!FLAC__seekable_stream_decoder_set_md5_checking(decoder, true))
1056 return die_ss_("returned false", decoder);
1059 printf("testing FLAC__seekable_stream_decoder_init()... ");
1060 if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK)
1061 return die_ss_(0, decoder);
1064 printf("testing FLAC__seekable_stream_decoder_get_state()... ");
1065 state = FLAC__seekable_stream_decoder_get_state(decoder);
1066 printf("returned state = %u (%s)... OK\n", state, FLAC__SeekableStreamDecoderStateString[state]);
1068 printf("testing FLAC__seekable_stream_decoder_get_stream_decoder_state()... ");
1069 sstate = FLAC__seekable_stream_decoder_get_stream_decoder_state(decoder);
1070 printf("returned state = %u (%s)... OK\n", sstate, FLAC__StreamDecoderStateString[sstate]);
1072 decoder_client_data.current_metadata_number = 0;
1073 decoder_client_data.ignore_errors = false;
1074 decoder_client_data.error_occurred = false;
1076 printf("opening FLAC file... ");
1077 decoder_client_data.file = fopen(flacfilename_, "rb");
1078 if(0 == decoder_client_data.file) {
1084 printf("testing FLAC__seekable_stream_decoder_get_md5_checking()... ");
1085 if(!FLAC__seekable_stream_decoder_get_md5_checking(decoder)) {
1086 printf("FAILED, returned false, expected true\n");
1091 printf("testing FLAC__seekable_stream_decoder_process_until_end_of_metadata()... ");
1092 if(!FLAC__seekable_stream_decoder_process_until_end_of_metadata(decoder))
1093 return die_ss_("returned false", decoder);
1096 printf("testing FLAC__seekable_stream_decoder_process_single()... ");
1097 if(!FLAC__seekable_stream_decoder_process_single(decoder))
1098 return die_ss_("returned false", decoder);
1101 printf("testing FLAC__seekable_stream_decoder_skip_single_frame()... ");
1102 if(!FLAC__seekable_stream_decoder_skip_single_frame(decoder))
1103 return die_ss_("returned false", decoder);
1106 printf("testing FLAC__seekable_stream_decoder_flush()... ");
1107 if(!FLAC__seekable_stream_decoder_flush(decoder))
1108 return die_ss_("returned false", decoder);
1111 decoder_client_data.ignore_errors = true;
1112 printf("testing FLAC__seekable_stream_decoder_process_single()... ");
1113 if(!FLAC__seekable_stream_decoder_process_single(decoder))
1114 return die_ss_("returned false", decoder);
1116 decoder_client_data.ignore_errors = false;
1118 printf("testing FLAC__seekable_stream_decoder_seek_absolute()... ");
1119 if(!FLAC__seekable_stream_decoder_seek_absolute(decoder, 0))
1120 return die_ss_("returned false", decoder);
1123 printf("testing FLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
1124 if(!FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
1125 return die_ss_("returned false", decoder);
1128 printf("testing FLAC__seekable_stream_decoder_get_channels()... ");
1130 unsigned channels = FLAC__seekable_stream_decoder_get_channels(decoder);
1131 if(channels != streaminfo_.data.stream_info.channels) {
1132 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
1138 printf("testing FLAC__seekable_stream_decoder_get_bits_per_sample()... ");
1140 unsigned bits_per_sample = FLAC__seekable_stream_decoder_get_bits_per_sample(decoder);
1141 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
1142 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
1148 printf("testing FLAC__seekable_stream_decoder_get_sample_rate()... ");
1150 unsigned sample_rate = FLAC__seekable_stream_decoder_get_sample_rate(decoder);
1151 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
1152 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
1158 printf("testing FLAC__seekable_stream_decoder_get_blocksize()... ");
1160 unsigned blocksize = FLAC__seekable_stream_decoder_get_blocksize(decoder);
1161 /* value could be anything since we're at the last block, so accept any answer */
1162 printf("returned %u... OK\n", blocksize);
1165 printf("testing FLAC__seekable_stream_decoder_get_channel_assignment()... ");
1167 FLAC__ChannelAssignment ca = FLAC__seekable_stream_decoder_get_channel_assignment(decoder);
1168 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1171 printf("testing FLAC__seekable_stream_decoder_reset()... ");
1172 if(!FLAC__seekable_stream_decoder_reset(decoder))
1173 return die_ss_("returned false", decoder);
1176 decoder_client_data.current_metadata_number = 0;
1178 printf("rewinding input... ");
1179 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
1180 printf("FAILED, errno = %d\n", errno);
1185 printf("testing FLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
1186 if(!FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
1187 return die_ss_("returned false", decoder);
1190 printf("testing FLAC__seekable_stream_decoder_finish()... ");
1191 (void) FLAC__seekable_stream_decoder_finish(decoder);
1198 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1199 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1200 return die_ss_("returned false", decoder);
1204 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1205 expected_metadata_sequence_[num_expected_++] = &padding_;
1206 expected_metadata_sequence_[num_expected_++] = &seektable_;
1207 expected_metadata_sequence_[num_expected_++] = &application1_;
1208 expected_metadata_sequence_[num_expected_++] = &application2_;
1209 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1210 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1211 expected_metadata_sequence_[num_expected_++] = &unknown_;
1213 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1220 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1221 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1222 return die_ss_("returned false", decoder);
1227 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1231 * respond all, ignore VORBIS_COMMENT
1234 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1235 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1236 return die_ss_("returned false", decoder);
1239 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
1240 if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1241 return die_ss_("returned false", decoder);
1245 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1246 expected_metadata_sequence_[num_expected_++] = &padding_;
1247 expected_metadata_sequence_[num_expected_++] = &seektable_;
1248 expected_metadata_sequence_[num_expected_++] = &application1_;
1249 expected_metadata_sequence_[num_expected_++] = &application2_;
1250 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1251 expected_metadata_sequence_[num_expected_++] = &unknown_;
1253 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1257 * respond all, ignore APPLICATION
1260 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1261 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1262 return die_ss_("returned false", decoder);
1265 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... ");
1266 if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1267 return die_ss_("returned false", decoder);
1271 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1272 expected_metadata_sequence_[num_expected_++] = &padding_;
1273 expected_metadata_sequence_[num_expected_++] = &seektable_;
1274 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1275 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1276 expected_metadata_sequence_[num_expected_++] = &unknown_;
1278 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1282 * respond all, ignore APPLICATION id of app#1
1285 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1286 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1287 return die_ss_("returned false", decoder);
1290 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1291 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1292 return die_ss_("returned false", decoder);
1296 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1297 expected_metadata_sequence_[num_expected_++] = &padding_;
1298 expected_metadata_sequence_[num_expected_++] = &seektable_;
1299 expected_metadata_sequence_[num_expected_++] = &application2_;
1300 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1301 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1302 expected_metadata_sequence_[num_expected_++] = &unknown_;
1304 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1308 * respond all, ignore APPLICATION id of app#1 & app#2
1311 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1312 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1313 return die_ss_("returned false", decoder);
1316 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1317 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1318 return die_ss_("returned false", decoder);
1321 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #2)... ");
1322 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
1323 return die_ss_("returned false", decoder);
1327 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1328 expected_metadata_sequence_[num_expected_++] = &padding_;
1329 expected_metadata_sequence_[num_expected_++] = &seektable_;
1330 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1331 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1332 expected_metadata_sequence_[num_expected_++] = &unknown_;
1334 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1338 * ignore all, respond VORBIS_COMMENT
1341 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1342 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1343 return die_ss_("returned false", decoder);
1346 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
1347 if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1348 return die_ss_("returned false", decoder);
1352 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1354 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1358 * ignore all, respond APPLICATION
1361 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1362 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1363 return die_ss_("returned false", decoder);
1366 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... ");
1367 if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1368 return die_ss_("returned false", decoder);
1372 expected_metadata_sequence_[num_expected_++] = &application1_;
1373 expected_metadata_sequence_[num_expected_++] = &application2_;
1375 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1379 * ignore all, respond APPLICATION id of app#1
1382 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1383 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1384 return die_ss_("returned false", decoder);
1387 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1388 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1389 return die_ss_("returned false", decoder);
1393 expected_metadata_sequence_[num_expected_++] = &application1_;
1395 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1399 * ignore all, respond APPLICATION id of app#1 & app#2
1402 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1403 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1404 return die_ss_("returned false", decoder);
1407 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1408 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1409 return die_ss_("returned false", decoder);
1412 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #2)... ");
1413 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
1414 return die_ss_("returned false", decoder);
1418 expected_metadata_sequence_[num_expected_++] = &application1_;
1419 expected_metadata_sequence_[num_expected_++] = &application2_;
1421 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1425 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
1428 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1429 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1430 return die_ss_("returned false", decoder);
1433 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... ");
1434 if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1435 return die_ss_("returned false", decoder);
1438 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1439 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1440 return die_ss_("returned false", decoder);
1444 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1445 expected_metadata_sequence_[num_expected_++] = &padding_;
1446 expected_metadata_sequence_[num_expected_++] = &seektable_;
1447 expected_metadata_sequence_[num_expected_++] = &application1_;
1448 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1449 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1450 expected_metadata_sequence_[num_expected_++] = &unknown_;
1452 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1456 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
1459 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1460 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1461 return die_ss_("returned false", decoder);
1464 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... ");
1465 if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1466 return die_ss_("returned false", decoder);
1469 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1470 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1471 return die_ss_("returned false", decoder);
1475 expected_metadata_sequence_[num_expected_++] = &application2_;
1477 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1480 /* done, now leave the sequence the way we found it... */
1482 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1483 expected_metadata_sequence_[num_expected_++] = &padding_;
1484 expected_metadata_sequence_[num_expected_++] = &seektable_;
1485 expected_metadata_sequence_[num_expected_++] = &application1_;
1486 expected_metadata_sequence_[num_expected_++] = &application2_;
1487 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1488 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1489 expected_metadata_sequence_[num_expected_++] = &unknown_;
1491 printf("testing FLAC__seekable_stream_decoder_delete()... ");
1492 FLAC__seekable_stream_decoder_delete(decoder);
1495 fclose(decoder_client_data.file);
1497 printf("\nPASSED!\n");
1502 static FLAC__StreamDecoderWriteStatus file_decoder_write_callback_(const FLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
1505 return stream_decoder_write_callback_(0, frame, buffer, client_data);
1508 static void file_decoder_metadata_callback_(const FLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
1511 stream_decoder_metadata_callback_(0, metadata, client_data);
1514 static void file_decoder_error_callback_(const FLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
1517 stream_decoder_error_callback_(0, status, client_data);
1520 static FLAC__bool file_decoder_test_respond_(FLAC__FileDecoder *decoder, file_decoder_client_data_struct *dcd)
1522 if(!FLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
1523 return die_f_("at FLAC__file_decoder_set_write_callback(), returned false", decoder);
1525 if(!FLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
1526 return die_f_("at FLAC__file_decoder_set_metadata_callback(), returned false", decoder);
1528 if(!FLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
1529 return die_f_("at FLAC__file_decoder_set_error_callback(), returned false", decoder);
1531 if(!FLAC__file_decoder_set_client_data(decoder, dcd))
1532 return die_f_("at FLAC__file_decoder_set_client_data(), returned false", decoder);
1534 if(!FLAC__file_decoder_set_filename(decoder, flacfilename_))
1535 return die_f_("at FLAC__file_decoder_set_filename(), returned false", decoder);
1537 if(!FLAC__file_decoder_set_md5_checking(decoder, true))
1538 return die_f_("at FLAC__file_decoder_set_md5_checking(), returned false", decoder);
1540 printf("testing FLAC__file_decoder_init()... ");
1541 if(FLAC__file_decoder_init(decoder) != FLAC__FILE_DECODER_OK)
1542 return die_f_(0, decoder);
1545 dcd->current_metadata_number = 0;
1547 printf("testing FLAC__file_decoder_process_until_end_of_file()... ");
1548 if(!FLAC__file_decoder_process_until_end_of_file(decoder))
1549 return die_f_("returned false", decoder);
1552 printf("testing FLAC__file_decoder_finish()... ");
1553 (void) FLAC__file_decoder_finish(decoder);
1559 static FLAC__bool test_file_decoder()
1561 FLAC__FileDecoder *decoder;
1562 FLAC__FileDecoderState state;
1563 FLAC__SeekableStreamDecoderState ssstate;
1564 FLAC__StreamDecoderState sstate;
1565 seekable_stream_decoder_client_data_struct decoder_client_data;
1567 printf("\n+++ libFLAC unit test: FLAC__FileDecoder\n\n");
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_delete()... ");
1578 FLAC__file_decoder_delete(decoder);
1581 printf("testing FLAC__file_decoder_new()... ");
1582 decoder = FLAC__file_decoder_new();
1584 printf("FAILED, returned NULL\n");
1589 printf("testing FLAC__file_decoder_init()... ");
1590 if(FLAC__file_decoder_init(decoder) == FLAC__FILE_DECODER_OK)
1591 return die_f_(0, decoder);
1594 printf("testing FLAC__file_decoder_delete()... ");
1595 FLAC__file_decoder_delete(decoder);
1599 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1601 printf("testing FLAC__file_decoder_new()... ");
1602 decoder = FLAC__file_decoder_new();
1604 printf("FAILED, returned NULL\n");
1609 printf("testing FLAC__file_decoder_set_write_callback()... ");
1610 if(!FLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
1611 return die_f_("returned false", decoder);
1614 printf("testing FLAC__file_decoder_set_metadata_callback()... ");
1615 if(!FLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
1616 return die_f_("returned false", decoder);
1619 printf("testing FLAC__file_decoder_set_error_callback()... ");
1620 if(!FLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
1621 return die_f_("returned false", decoder);
1624 printf("testing FLAC__file_decoder_set_client_data()... ");
1625 if(!FLAC__file_decoder_set_client_data(decoder, &decoder_client_data))
1626 return die_f_("returned false", decoder);
1629 printf("testing FLAC__file_decoder_set_filename()... ");
1630 if(!FLAC__file_decoder_set_filename(decoder, flacfilename_))
1631 return die_f_("returned false", decoder);
1634 printf("testing FLAC__file_decoder_set_md5_checking()... ");
1635 if(!FLAC__file_decoder_set_md5_checking(decoder, true))
1636 return die_f_("returned false", decoder);
1639 printf("testing FLAC__file_decoder_init()... ");
1640 if(FLAC__file_decoder_init(decoder) != FLAC__FILE_DECODER_OK)
1641 return die_f_(0, decoder);
1644 printf("testing FLAC__file_decoder_get_state()... ");
1645 state = FLAC__file_decoder_get_state(decoder);
1646 printf("returned state = %u (%s)... OK\n", state, FLAC__FileDecoderStateString[state]);
1648 printf("testing FLAC__file_decoder_get_seekable_stream_decoder_state()... ");
1649 ssstate = FLAC__file_decoder_get_seekable_stream_decoder_state(decoder);
1650 printf("returned state = %u (%s)... OK\n", ssstate, FLAC__SeekableStreamDecoderStateString[ssstate]);
1652 printf("testing FLAC__file_decoder_get_stream_decoder_state()... ");
1653 sstate = FLAC__file_decoder_get_stream_decoder_state(decoder);
1654 printf("returned state = %u (%s)... OK\n", sstate, FLAC__StreamDecoderStateString[sstate]);
1656 decoder_client_data.current_metadata_number = 0;
1657 decoder_client_data.ignore_errors = false;
1658 decoder_client_data.error_occurred = false;
1660 printf("testing FLAC__file_decoder_get_md5_checking()... ");
1661 if(!FLAC__file_decoder_get_md5_checking(decoder)) {
1662 printf("FAILED, returned false, expected true\n");
1667 printf("testing FLAC__file_decoder_process_until_end_of_metadata()... ");
1668 if(!FLAC__file_decoder_process_until_end_of_metadata(decoder))
1669 return die_f_("returned false", decoder);
1672 printf("testing FLAC__file_decoder_process_single()... ");
1673 if(!FLAC__file_decoder_process_single(decoder))
1674 return die_f_("returned false", decoder);
1677 printf("testing FLAC__file_decoder_skip_single_frame()... ");
1678 if(!FLAC__file_decoder_skip_single_frame(decoder))
1679 return die_f_("returned false", decoder);
1682 printf("testing FLAC__file_decoder_seek_absolute()... ");
1683 if(!FLAC__file_decoder_seek_absolute(decoder, 0))
1684 return die_f_("returned false", decoder);
1687 printf("testing FLAC__file_decoder_process_until_end_of_file()... ");
1688 if(!FLAC__file_decoder_process_until_end_of_file(decoder))
1689 return die_f_("returned false", decoder);
1692 printf("testing FLAC__file_decoder_get_channels()... ");
1694 unsigned channels = FLAC__file_decoder_get_channels(decoder);
1695 if(channels != streaminfo_.data.stream_info.channels) {
1696 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
1702 printf("testing FLAC__file_decoder_get_bits_per_sample()... ");
1704 unsigned bits_per_sample = FLAC__file_decoder_get_bits_per_sample(decoder);
1705 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
1706 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
1712 printf("testing FLAC__file_decoder_get_sample_rate()... ");
1714 unsigned sample_rate = FLAC__file_decoder_get_sample_rate(decoder);
1715 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
1716 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
1722 printf("testing FLAC__file_decoder_get_blocksize()... ");
1724 unsigned blocksize = FLAC__file_decoder_get_blocksize(decoder);
1725 /* value could be anything since we're at the last block, so accept any answer */
1726 printf("returned %u... OK\n", blocksize);
1729 printf("testing FLAC__file_decoder_get_channel_assignment()... ");
1731 FLAC__ChannelAssignment ca = FLAC__file_decoder_get_channel_assignment(decoder);
1732 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1735 printf("testing FLAC__file_decoder_finish()... ");
1736 (void) FLAC__file_decoder_finish(decoder);
1743 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1744 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1745 return die_f_("returned false", decoder);
1749 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1750 expected_metadata_sequence_[num_expected_++] = &padding_;
1751 expected_metadata_sequence_[num_expected_++] = &seektable_;
1752 expected_metadata_sequence_[num_expected_++] = &application1_;
1753 expected_metadata_sequence_[num_expected_++] = &application2_;
1754 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1755 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1756 expected_metadata_sequence_[num_expected_++] = &unknown_;
1758 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1765 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1766 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1767 return die_f_("returned false", decoder);
1772 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1776 * respond all, ignore VORBIS_COMMENT
1779 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1780 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1781 return die_f_("returned false", decoder);
1784 printf("testing FLAC__file_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
1785 if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1786 return die_f_("returned false", decoder);
1790 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1791 expected_metadata_sequence_[num_expected_++] = &padding_;
1792 expected_metadata_sequence_[num_expected_++] = &seektable_;
1793 expected_metadata_sequence_[num_expected_++] = &application1_;
1794 expected_metadata_sequence_[num_expected_++] = &application2_;
1795 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1796 expected_metadata_sequence_[num_expected_++] = &unknown_;
1798 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1802 * respond all, ignore APPLICATION
1805 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1806 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1807 return die_f_("returned false", decoder);
1810 printf("testing FLAC__file_decoder_set_metadata_ignore(APPLICATION)... ");
1811 if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1812 return die_f_("returned false", decoder);
1816 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1817 expected_metadata_sequence_[num_expected_++] = &padding_;
1818 expected_metadata_sequence_[num_expected_++] = &seektable_;
1819 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1820 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1821 expected_metadata_sequence_[num_expected_++] = &unknown_;
1823 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1827 * respond all, ignore APPLICATION id of app#1
1830 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1831 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1832 return die_f_("returned false", decoder);
1835 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1836 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1837 return die_f_("returned false", decoder);
1841 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1842 expected_metadata_sequence_[num_expected_++] = &padding_;
1843 expected_metadata_sequence_[num_expected_++] = &seektable_;
1844 expected_metadata_sequence_[num_expected_++] = &application2_;
1845 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1846 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1847 expected_metadata_sequence_[num_expected_++] = &unknown_;
1849 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1853 * respond all, ignore APPLICATION id of app#1 & app#2
1856 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1857 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1858 return die_f_("returned false", decoder);
1861 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1862 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1863 return die_f_("returned false", decoder);
1866 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #2)... ");
1867 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
1868 return die_f_("returned false", decoder);
1872 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1873 expected_metadata_sequence_[num_expected_++] = &padding_;
1874 expected_metadata_sequence_[num_expected_++] = &seektable_;
1875 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1876 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1877 expected_metadata_sequence_[num_expected_++] = &unknown_;
1879 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1883 * ignore all, respond VORBIS_COMMENT
1886 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1887 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1888 return die_f_("returned false", decoder);
1891 printf("testing FLAC__file_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
1892 if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1893 return die_f_("returned false", decoder);
1897 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1899 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1903 * ignore all, respond APPLICATION
1906 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1907 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1908 return die_f_("returned false", decoder);
1911 printf("testing FLAC__file_decoder_set_metadata_respond(APPLICATION)... ");
1912 if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1913 return die_f_("returned false", decoder);
1917 expected_metadata_sequence_[num_expected_++] = &application1_;
1918 expected_metadata_sequence_[num_expected_++] = &application2_;
1920 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1924 * ignore all, respond APPLICATION id of app#1
1927 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1928 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1929 return die_f_("returned false", decoder);
1932 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1933 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1934 return die_f_("returned false", decoder);
1938 expected_metadata_sequence_[num_expected_++] = &application1_;
1940 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1944 * ignore all, respond APPLICATION id of app#1 & app#2
1947 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1948 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1949 return die_f_("returned false", decoder);
1952 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1953 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1954 return die_f_("returned false", decoder);
1957 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #2)... ");
1958 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
1959 return die_f_("returned false", decoder);
1963 expected_metadata_sequence_[num_expected_++] = &application1_;
1964 expected_metadata_sequence_[num_expected_++] = &application2_;
1966 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1970 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
1973 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1974 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1975 return die_f_("returned false", decoder);
1978 printf("testing FLAC__file_decoder_set_metadata_ignore(APPLICATION)... ");
1979 if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1980 return die_f_("returned false", decoder);
1983 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1984 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1985 return die_f_("returned false", decoder);
1989 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1990 expected_metadata_sequence_[num_expected_++] = &padding_;
1991 expected_metadata_sequence_[num_expected_++] = &seektable_;
1992 expected_metadata_sequence_[num_expected_++] = &application1_;
1993 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1994 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1995 expected_metadata_sequence_[num_expected_++] = &unknown_;
1997 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2001 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
2004 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
2005 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
2006 return die_f_("returned false", decoder);
2009 printf("testing FLAC__file_decoder_set_metadata_respond(APPLICATION)... ");
2010 if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
2011 return die_f_("returned false", decoder);
2014 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
2015 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
2016 return die_f_("returned false", decoder);
2020 expected_metadata_sequence_[num_expected_++] = &application2_;
2022 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2025 /* done, now leave the sequence the way we found it... */
2027 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
2028 expected_metadata_sequence_[num_expected_++] = &padding_;
2029 expected_metadata_sequence_[num_expected_++] = &seektable_;
2030 expected_metadata_sequence_[num_expected_++] = &application1_;
2031 expected_metadata_sequence_[num_expected_++] = &application2_;
2032 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
2033 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
2034 expected_metadata_sequence_[num_expected_++] = &unknown_;
2036 printf("testing FLAC__file_decoder_delete()... ");
2037 FLAC__file_decoder_delete(decoder);
2040 printf("\nPASSED!\n");
2045 FLAC__bool test_decoders()
2047 init_metadata_blocks_();
2048 if(!generate_file_())
2051 if(!test_stream_decoder())
2054 if(!test_seekable_stream_decoder())
2057 if(!test_file_decoder())
2060 (void) grabbag__file_remove_file(flacfilename_);
2061 free_metadata_blocks_();