1 /* test_libFLAC - Unit tester for libFLAC
2 * Copyright (C) 2002 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"
33 unsigned current_metadata_number;
34 FLAC__bool ignore_errors;
35 FLAC__bool error_occurred;
36 } stream_decoder_client_data_struct;
38 typedef stream_decoder_client_data_struct seekable_stream_decoder_client_data_struct;
39 typedef stream_decoder_client_data_struct file_decoder_client_data_struct;
41 static FLAC__StreamMetaData streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_;
42 static FLAC__StreamMetaData *expected_metadata_sequence_[6];
43 static unsigned num_expected_;
44 static const char *flacfilename_ = "metadata.flac";
45 static unsigned flacfilesize_;
47 static FLAC__bool die_(const char *msg)
49 printf("ERROR: %s\n", msg);
53 static FLAC__bool die_s_(const char *msg, const FLAC__StreamDecoder *decoder)
55 FLAC__StreamDecoderState state = FLAC__stream_decoder_get_state(decoder);
58 printf("FAILED, %s, state = %u (%s)\n", msg, (unsigned)state, FLAC__StreamDecoderStateString[state]);
60 printf("FAILED, state = %u (%s)\n", (unsigned)state, FLAC__StreamDecoderStateString[state]);
65 static FLAC__bool die_ss_(const char *msg, const FLAC__SeekableStreamDecoder *decoder)
67 FLAC__SeekableStreamDecoderState state = FLAC__seekable_stream_decoder_get_state(decoder);
70 printf("FAILED, %s, state = %u (%s)\n", msg, (unsigned)state, FLAC__SeekableStreamDecoderStateString[state]);
72 printf("FAILED, state = %u (%s)\n", (unsigned)state, FLAC__SeekableStreamDecoderStateString[state]);
77 static FLAC__bool die_f_(const char *msg, const FLAC__FileDecoder *decoder)
79 FLAC__FileDecoderState state = FLAC__file_decoder_get_state(decoder);
82 printf("FAILED, %s, state = %u (%s)\n", msg, (unsigned)state, FLAC__FileDecoderStateString[state]);
84 printf("FAILED, state = %u (%s)\n", (unsigned)state, FLAC__FileDecoderStateString[state]);
89 static void *malloc_or_die_(size_t size)
91 void *x = malloc(size);
93 fprintf(stderr, "ERROR: out of memory allocating %u bytes\n", (unsigned)size);
99 static void init_metadata_blocks_()
102 most of the actual numbers and data in the blocks don't matter,
103 we just want to make sure the decoder parses them correctly
105 remember, the metadata interface gets tested after the decoders,
106 so we do all the metadata manipulation here without it.
109 /* min/max_framesize and md5sum don't get written at first, so we have to leave them 0 */
110 streaminfo_.is_last = false;
111 streaminfo_.type = FLAC__METADATA_TYPE_STREAMINFO;
112 streaminfo_.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
113 streaminfo_.data.stream_info.min_blocksize = 576;
114 streaminfo_.data.stream_info.max_blocksize = 576;
115 streaminfo_.data.stream_info.min_framesize = 0;
116 streaminfo_.data.stream_info.max_framesize = 0;
117 streaminfo_.data.stream_info.sample_rate = 44100;
118 streaminfo_.data.stream_info.channels = 1;
119 streaminfo_.data.stream_info.bits_per_sample = 8;
120 streaminfo_.data.stream_info.total_samples = 0;
121 memset(streaminfo_.data.stream_info.md5sum, 0, 16);
123 padding_.is_last = false;
124 padding_.type = FLAC__METADATA_TYPE_PADDING;
125 padding_.length = 1234;
127 seektable_.is_last = false;
128 seektable_.type = FLAC__METADATA_TYPE_SEEKTABLE;
129 seektable_.data.seek_table.num_points = 2;
130 seektable_.length = seektable_.data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH;
131 seektable_.data.seek_table.points = malloc_or_die_(seektable_.data.seek_table.num_points * sizeof(FLAC__StreamMetaData_SeekPoint));
132 seektable_.data.seek_table.points[0].sample_number = 0;
133 seektable_.data.seek_table.points[0].stream_offset = 0;
134 seektable_.data.seek_table.points[0].frame_samples = streaminfo_.data.stream_info.min_blocksize;
135 seektable_.data.seek_table.points[1].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER;
136 seektable_.data.seek_table.points[1].stream_offset = 1000;
137 seektable_.data.seek_table.points[1].frame_samples = streaminfo_.data.stream_info.min_blocksize;
139 application1_.is_last = false;
140 application1_.type = FLAC__METADATA_TYPE_APPLICATION;
141 application1_.length = 8;
142 memcpy(application1_.data.application.id, "\xfe\xdc\xba\x98", 4);
143 application1_.data.application.data = malloc_or_die_(4);
144 memcpy(application1_.data.application.data, "\xf0\xe1\xd2\xc3", 4);
146 application2_.is_last = false;
147 application2_.type = FLAC__METADATA_TYPE_APPLICATION;
148 application2_.length = 4;
149 memcpy(application2_.data.application.id, "\x76\x54\x32\x10", 4);
150 application2_.data.application.data = 0;
152 vorbiscomment_.is_last = true;
153 vorbiscomment_.type = FLAC__METADATA_TYPE_VORBIS_COMMENT;
154 vorbiscomment_.length = (4 + 8) + 4 + (4 + 5) + (4 + 0);
155 vorbiscomment_.data.vorbis_comment.vendor_string.length = 8;
156 vorbiscomment_.data.vorbis_comment.vendor_string.entry = malloc_or_die_(8);
157 memcpy(vorbiscomment_.data.vorbis_comment.vendor_string.entry, "flac 1.x", 8);
158 vorbiscomment_.data.vorbis_comment.num_comments = 2;
159 vorbiscomment_.data.vorbis_comment.comments = malloc_or_die_(vorbiscomment_.data.vorbis_comment.num_comments * sizeof(FLAC__StreamMetaData_VorbisComment_Entry));
160 vorbiscomment_.data.vorbis_comment.comments[0].length = 5;
161 vorbiscomment_.data.vorbis_comment.comments[0].entry = malloc_or_die_(5);
162 memcpy(vorbiscomment_.data.vorbis_comment.comments[0].entry, "ab=cd", 5);
163 vorbiscomment_.data.vorbis_comment.comments[1].length = 0;
164 vorbiscomment_.data.vorbis_comment.comments[1].entry = 0;
167 static void free_metadata_blocks_()
169 free(seektable_.data.seek_table.points);
170 free(application1_.data.application.data);
171 free(vorbiscomment_.data.vorbis_comment.vendor_string.entry);
172 free(vorbiscomment_.data.vorbis_comment.comments[0].entry);
173 free(vorbiscomment_.data.vorbis_comment.comments);
176 static FLAC__bool generate_file_()
178 printf("\n\ngenerating FLAC file for decoder tests...\n");
180 expected_metadata_sequence_[0] = &padding_;
181 expected_metadata_sequence_[1] = &seektable_;
182 expected_metadata_sequence_[2] = &application1_;
183 expected_metadata_sequence_[3] = &application2_;
184 expected_metadata_sequence_[4] = &vorbiscomment_;
187 if(!file_utils__generate_flacfile(flacfilename_, &flacfilesize_, 512 * 1024, &streaminfo_, expected_metadata_sequence_, num_expected_))
188 return die_("creating the encoded file");
193 static FLAC__StreamDecoderReadStatus stream_decoder_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
195 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
200 printf("ERROR: client_data in read callback is NULL\n");
201 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
204 if(dcd->error_occurred)
205 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
208 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
209 else if(*bytes > 0) {
210 unsigned bytes_read = fread(buffer, 1, *bytes, dcd->file);
211 if(bytes_read == 0) {
213 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
215 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
219 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
223 return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */
226 static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
228 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
230 (void)decoder, (void)buffer;
233 printf("ERROR: client_data in write callback is NULL\n");
234 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
237 if(dcd->error_occurred)
238 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
241 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER && frame->header.number.frame_number == 0) ||
242 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER && frame->header.number.sample_number == 0)
244 printf("content... ");
248 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
251 static void stream_decoder_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetaData *metadata, void *client_data)
253 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
258 printf("ERROR: client_data in metadata callback is NULL\n");
262 if(dcd->error_occurred)
265 printf("%d... ", dcd->current_metadata_number);
268 if(dcd->current_metadata_number >= num_expected_) {
269 (void)die_("got more metadata blocks than expected");
270 dcd->error_occurred = true;
273 if(!compare_block_(expected_metadata_sequence_[dcd->current_metadata_number], metadata)) {
274 (void)die_("metadata block mismatch");
275 dcd->error_occurred = true;
278 dcd->current_metadata_number++;
281 static void stream_decoder_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
283 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
288 printf("ERROR: client_data in error callback is NULL\n");
292 if(!dcd->ignore_errors) {
293 printf("ERROR: got error callback: err = %u (%s)\n", (unsigned)status, FLAC__StreamDecoderErrorStatusString[status]);
294 dcd->error_occurred = true;
298 static FLAC__bool stream_decoder_test_respond_(FLAC__StreamDecoder *decoder, stream_decoder_client_data_struct *dcd)
300 if(!FLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))
301 return die_s_("at FLAC__stream_decoder_set_read_callback(), returned false", decoder);
303 if(!FLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))
304 return die_s_("at FLAC__stream_decoder_set_write_callback(), returned false", decoder);
306 if(!FLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))
307 return die_s_("at FLAC__stream_decoder_set_metadata_callback(), returned false", decoder);
309 if(!FLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))
310 return die_s_("at FLAC__stream_decoder_set_error_callback(), returned false", decoder);
312 if(!FLAC__stream_decoder_set_client_data(decoder, dcd))
313 return die_s_("at FLAC__stream_decoder_set_client_data(), returned false", decoder);
315 printf("testing FLAC__stream_decoder_init()... ");
316 if(FLAC__stream_decoder_init(decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
317 return die_s_(0, decoder);
320 dcd->current_metadata_number = 0;
322 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
323 printf("FAILED rewinding input, errno = %d\n", errno);
327 printf("testing FLAC__stream_decoder_process_whole_stream()... ");
328 if(!FLAC__stream_decoder_process_whole_stream(decoder))
329 return die_s_("returned false", decoder);
332 printf("testing FLAC__stream_decoder_finish()... ");
333 FLAC__stream_decoder_finish(decoder);
339 static FLAC__bool test_stream_decoder()
341 FLAC__StreamDecoder *decoder;
342 FLAC__StreamDecoderState state;
343 stream_decoder_client_data_struct decoder_client_data;
345 printf("\n+++ unit test: FLAC__StreamDecoder\n\n");
348 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
350 printf("testing FLAC__stream_decoder_new()... ");
351 decoder = FLAC__stream_decoder_new();
353 printf("FAILED, returned NULL\n");
358 printf("testing FLAC__stream_decoder_set_read_callback()... ");
359 if(!FLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))
360 return die_s_("returned false", decoder);
363 printf("testing FLAC__stream_decoder_set_write_callback()... ");
364 if(!FLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))
365 return die_s_("returned false", decoder);
368 printf("testing FLAC__stream_decoder_set_metadata_callback()... ");
369 if(!FLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))
370 return die_s_("returned false", decoder);
373 printf("testing FLAC__stream_decoder_set_error_callback()... ");
374 if(!FLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))
375 return die_s_("returned false", decoder);
378 printf("testing FLAC__stream_decoder_set_client_data()... ");
379 if(!FLAC__stream_decoder_set_client_data(decoder, &decoder_client_data))
380 return die_s_("returned false", decoder);
383 printf("testing FLAC__stream_decoder_init()... ");
384 if(FLAC__stream_decoder_init(decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
385 return die_s_(0, decoder);
388 printf("testing FLAC__stream_decoder_get_state()... ");
389 state = FLAC__stream_decoder_get_state(decoder);
390 printf("returned state = %u (%s)... OK\n", state, FLAC__StreamDecoderStateString[state]);
392 decoder_client_data.current_metadata_number = 0;
393 decoder_client_data.ignore_errors = false;
394 decoder_client_data.error_occurred = false;
396 printf("opening FLAC file... ");
397 decoder_client_data.file = fopen(flacfilename_, "rb");
398 if(0 == decoder_client_data.file) {
404 printf("testing FLAC__stream_decoder_process_metadata()... ");
405 if(!FLAC__stream_decoder_process_metadata(decoder))
406 return die_s_("returned false", decoder);
409 printf("testing FLAC__stream_decoder_process_one_frame()... ");
410 if(!FLAC__stream_decoder_process_one_frame(decoder))
411 return die_s_("returned false", decoder);
414 printf("testing FLAC__stream_decoder_flush()... ");
415 if(!FLAC__stream_decoder_flush(decoder))
416 return die_s_("returned false", decoder);
419 decoder_client_data.ignore_errors = true;
420 printf("testing FLAC__stream_decoder_process_one_frame()... ");
421 if(!FLAC__stream_decoder_process_one_frame(decoder))
422 return die_s_("returned false", decoder);
424 decoder_client_data.ignore_errors = false;
426 printf("testing FLAC__stream_decoder_process_remaining_frames()... ");
427 if(!FLAC__stream_decoder_process_remaining_frames(decoder))
428 return die_s_("returned false", decoder);
431 printf("testing FLAC__stream_decoder_get_channels()... ");
433 unsigned channels = FLAC__stream_decoder_get_channels(decoder);
434 if(channels != streaminfo_.data.stream_info.channels) {
435 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
441 printf("testing FLAC__stream_decoder_get_bits_per_sample()... ");
443 unsigned bits_per_sample = FLAC__stream_decoder_get_bits_per_sample(decoder);
444 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
445 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
451 printf("testing FLAC__stream_decoder_get_sample_rate()... ");
453 unsigned sample_rate = FLAC__stream_decoder_get_sample_rate(decoder);
454 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
455 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
461 printf("testing FLAC__stream_decoder_get_blocksize()... ");
463 unsigned blocksize = FLAC__stream_decoder_get_blocksize(decoder);
464 /* value could be anything since we're at the last block, so accept any answer */
465 printf("returned %u... OK\n", blocksize);
468 printf("testing FLAC__stream_decoder_get_channel_assignment()... ");
470 FLAC__ChannelAssignment ca = FLAC__stream_decoder_get_channel_assignment(decoder);
471 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
474 printf("testing FLAC__stream_decoder_reset()... ");
475 if(!FLAC__stream_decoder_reset(decoder)) {
476 state = FLAC__stream_decoder_get_state(decoder);
477 printf("FAILED, returned false, state = %u (%s)\n", state, FLAC__StreamDecoderStateString[state]);
482 decoder_client_data.current_metadata_number = 0;
484 printf("rewinding input... ");
485 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
486 printf("FAILED, errno = %d\n", errno);
491 printf("testing FLAC__stream_decoder_process_whole_stream()... ");
492 if(!FLAC__stream_decoder_process_whole_stream(decoder))
493 return die_s_("returned false", decoder);
496 printf("testing FLAC__stream_decoder_finish()... ");
497 FLAC__stream_decoder_finish(decoder);
504 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
505 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
506 return die_s_("returned false", decoder);
510 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
511 expected_metadata_sequence_[num_expected_++] = &padding_;
512 expected_metadata_sequence_[num_expected_++] = &seektable_;
513 expected_metadata_sequence_[num_expected_++] = &application1_;
514 expected_metadata_sequence_[num_expected_++] = &application2_;
515 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
517 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
524 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
525 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
526 return die_s_("returned false", decoder);
531 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
535 * respond all, ignore VORBIS_COMMENT
538 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
539 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
540 return die_s_("returned false", decoder);
543 printf("testing FLAC__stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
544 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
545 return die_s_("returned false", decoder);
549 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
550 expected_metadata_sequence_[num_expected_++] = &padding_;
551 expected_metadata_sequence_[num_expected_++] = &seektable_;
552 expected_metadata_sequence_[num_expected_++] = &application1_;
553 expected_metadata_sequence_[num_expected_++] = &application2_;
555 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
559 * respond all, ignore APPLICATION
562 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
563 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
564 return die_s_("returned false", decoder);
567 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
568 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
569 return die_s_("returned false", decoder);
573 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
574 expected_metadata_sequence_[num_expected_++] = &padding_;
575 expected_metadata_sequence_[num_expected_++] = &seektable_;
576 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
578 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
582 * respond all, ignore APPLICATION id of app#1
585 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
586 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
587 return die_s_("returned false", decoder);
590 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
591 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
592 return die_s_("returned false", decoder);
596 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
597 expected_metadata_sequence_[num_expected_++] = &padding_;
598 expected_metadata_sequence_[num_expected_++] = &seektable_;
599 expected_metadata_sequence_[num_expected_++] = &application2_;
600 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
602 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
606 * respond all, ignore APPLICATION id of app#1 & app#2
609 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
610 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
611 return die_s_("returned false", decoder);
614 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
615 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
616 return die_s_("returned false", decoder);
619 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #2)... ");
620 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
621 return die_s_("returned false", decoder);
625 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
626 expected_metadata_sequence_[num_expected_++] = &padding_;
627 expected_metadata_sequence_[num_expected_++] = &seektable_;
628 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
630 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
634 * ignore all, respond VORBIS_COMMENT
637 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
638 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
639 return die_s_("returned false", decoder);
642 printf("testing FLAC__stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
643 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
644 return die_s_("returned false", decoder);
648 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
650 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
654 * ignore all, respond APPLICATION
657 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
658 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
659 return die_s_("returned false", decoder);
662 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
663 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
664 return die_s_("returned false", decoder);
668 expected_metadata_sequence_[num_expected_++] = &application1_;
669 expected_metadata_sequence_[num_expected_++] = &application2_;
671 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
675 * ignore all, respond APPLICATION id of app#1
678 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
679 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
680 return die_s_("returned false", decoder);
683 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
684 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
685 return die_s_("returned false", decoder);
689 expected_metadata_sequence_[num_expected_++] = &application1_;
691 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
695 * ignore all, respond APPLICATION id of app#1 & app#2
698 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
699 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
700 return die_s_("returned false", decoder);
703 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
704 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
705 return die_s_("returned false", decoder);
708 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #2)... ");
709 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
710 return die_s_("returned false", decoder);
714 expected_metadata_sequence_[num_expected_++] = &application1_;
715 expected_metadata_sequence_[num_expected_++] = &application2_;
717 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
721 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
724 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
725 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
726 return die_s_("returned false", decoder);
729 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
730 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
731 return die_s_("returned false", decoder);
734 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
735 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
736 return die_s_("returned false", decoder);
740 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
741 expected_metadata_sequence_[num_expected_++] = &padding_;
742 expected_metadata_sequence_[num_expected_++] = &seektable_;
743 expected_metadata_sequence_[num_expected_++] = &application1_;
744 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
746 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
750 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
753 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
754 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
755 return die_s_("returned false", decoder);
758 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
759 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
760 return die_s_("returned false", decoder);
763 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
764 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
765 return die_s_("returned false", decoder);
769 expected_metadata_sequence_[num_expected_++] = &application2_;
771 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
774 /* done, now leave the sequence the way we found it... */
776 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
777 expected_metadata_sequence_[num_expected_++] = &padding_;
778 expected_metadata_sequence_[num_expected_++] = &seektable_;
779 expected_metadata_sequence_[num_expected_++] = &application1_;
780 expected_metadata_sequence_[num_expected_++] = &application2_;
781 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
783 printf("testing FLAC__stream_decoder_delete()... ");
784 FLAC__stream_decoder_delete(decoder);
787 fclose(decoder_client_data.file);
789 printf("\nPASSED!\n");
794 static FLAC__SeekableStreamDecoderReadStatus seekable_stream_decoder_read_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
797 switch(stream_decoder_read_callback_(0, buffer, bytes, client_data)) {
798 case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE:
799 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK;
800 case FLAC__STREAM_DECODER_READ_STATUS_ABORT:
801 case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM:
802 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
805 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
809 static FLAC__SeekableStreamDecoderSeekStatus seekable_stream_decoder_seek_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
811 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
816 printf("ERROR: client_data in seek callback is NULL\n");
817 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
820 if(dcd->error_occurred)
821 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
823 if(fseek(dcd->file, absolute_byte_offset, SEEK_SET) < 0) {
824 dcd->error_occurred = true;
825 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
828 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK;
831 static FLAC__SeekableStreamDecoderTellStatus seekable_stream_decoder_tell_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
833 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
839 printf("ERROR: client_data in tell callback is NULL\n");
840 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
843 if(dcd->error_occurred)
844 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
846 offset = ftell(dcd->file);
847 *absolute_byte_offset = (FLAC__uint64)offset;
850 dcd->error_occurred = true;
851 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
854 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK;
857 static FLAC__SeekableStreamDecoderLengthStatus seekable_stream_decoder_length_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
859 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
864 printf("ERROR: client_data in length callback is NULL\n");
865 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
868 if(dcd->error_occurred)
869 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
871 *stream_length = (FLAC__uint64)flacfilesize_;
872 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK;
875 static FLAC__bool seekable_stream_decoder_eof_callback_(const FLAC__SeekableStreamDecoder *decoder, void *client_data)
877 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
882 printf("ERROR: client_data in eof callback is NULL\n");
886 if(dcd->error_occurred)
889 return feof(dcd->file);
892 static FLAC__StreamDecoderWriteStatus seekable_stream_decoder_write_callback_(const FLAC__SeekableStreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
895 return stream_decoder_write_callback_(0, frame, buffer, client_data);
898 static void seekable_stream_decoder_metadata_callback_(const FLAC__SeekableStreamDecoder *decoder, const FLAC__StreamMetaData *metadata, void *client_data)
901 stream_decoder_metadata_callback_(0, metadata, client_data);
904 static void seekable_stream_decoder_error_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
907 stream_decoder_error_callback_(0, status, client_data);
910 static FLAC__bool seekable_stream_decoder_test_respond_(FLAC__SeekableStreamDecoder *decoder, seekable_stream_decoder_client_data_struct *dcd)
912 if(!FLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_))
913 return die_ss_("at FLAC__seekable_stream_decoder_set_read_callback(), returned false", decoder);
915 if(!FLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_))
916 return die_ss_("at FLAC__seekable_stream_decoder_set_seek_callback(), returned false", decoder);
918 if(!FLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_))
919 return die_ss_("at FLAC__seekable_stream_decoder_set_tell_callback(), returned false", decoder);
921 if(!FLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_))
922 return die_ss_("at FLAC__seekable_stream_decoder_set_length_callback(), returned false", decoder);
924 if(!FLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_))
925 return die_ss_("at FLAC__seekable_stream_decoder_set_eof_callback(), returned false", decoder);
927 if(!FLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_))
928 return die_ss_("at FLAC__seekable_stream_decoder_set_write_callback(), returned false", decoder);
930 if(!FLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_))
931 return die_ss_("at FLAC__seekable_stream_decoder_set_metadata_callback(), returned false", decoder);
933 if(!FLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_))
934 return die_ss_("at FLAC__seekable_stream_decoder_set_error_callback(), returned false", decoder);
936 if(!FLAC__seekable_stream_decoder_set_client_data(decoder, dcd))
937 return die_ss_("at FLAC__seekable_stream_decoder_set_client_data(), returned false", decoder);
939 if(!FLAC__seekable_stream_decoder_set_md5_checking(decoder, true))
940 return die_ss_("at FLAC__seekable_stream_decoder_set_md5_checking(), returned false", decoder);
942 printf("testing FLAC__seekable_stream_decoder_init()... ");
943 if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK)
944 return die_ss_(0, decoder);
947 dcd->current_metadata_number = 0;
949 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
950 printf("FAILED rewinding input, errno = %d\n", errno);
954 printf("testing FLAC__seekable_stream_decoder_process_whole_stream()... ");
955 if(!FLAC__seekable_stream_decoder_process_whole_stream(decoder))
956 return die_ss_("returned false", decoder);
959 printf("testing FLAC__seekable_stream_decoder_finish()... ");
960 (void) FLAC__seekable_stream_decoder_finish(decoder);
966 static FLAC__bool test_seekable_stream_decoder()
968 FLAC__SeekableStreamDecoder *decoder;
969 FLAC__SeekableStreamDecoderState state;
970 seekable_stream_decoder_client_data_struct decoder_client_data;
972 printf("\n+++ unit test: FLAC__SeekableStreamDecoder\n\n");
975 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
977 printf("testing FLAC__seekable_stream_decoder_new()... ");
978 decoder = FLAC__seekable_stream_decoder_new();
980 printf("FAILED, returned NULL\n");
985 printf("testing FLAC__seekable_stream_decoder_set_read_callback()... ");
986 if(!FLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_))
987 return die_ss_("returned false", decoder);
990 printf("testing FLAC__seekable_stream_decoder_set_seek_callback()... ");
991 if(!FLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_))
992 return die_ss_("returned false", decoder);
995 printf("testing FLAC__seekable_stream_decoder_set_tell_callback()... ");
996 if(!FLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_))
997 return die_ss_("returned false", decoder);
1000 printf("testing FLAC__seekable_stream_decoder_set_length_callback()... ");
1001 if(!FLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_))
1002 return die_ss_("returned false", decoder);
1005 printf("testing FLAC__seekable_stream_decoder_set_eof_callback()... ");
1006 if(!FLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_))
1007 return die_ss_("returned false", decoder);
1010 printf("testing FLAC__seekable_stream_decoder_set_write_callback()... ");
1011 if(!FLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_))
1012 return die_ss_("returned false", decoder);
1015 printf("testing FLAC__seekable_stream_decoder_set_metadata_callback()... ");
1016 if(!FLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_))
1017 return die_ss_("returned false", decoder);
1020 printf("testing FLAC__seekable_stream_decoder_set_error_callback()... ");
1021 if(!FLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_))
1022 return die_ss_("returned false", decoder);
1025 printf("testing FLAC__seekable_stream_decoder_set_client_data()... ");
1026 if(!FLAC__seekable_stream_decoder_set_client_data(decoder, &decoder_client_data))
1027 return die_ss_("returned false", decoder);
1030 printf("testing FLAC__seekable_stream_decoder_set_md5_checking()... ");
1031 if(!FLAC__seekable_stream_decoder_set_md5_checking(decoder, true))
1032 return die_ss_("returned false", decoder);
1035 printf("testing FLAC__seekable_stream_decoder_init()... ");
1036 if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK)
1037 return die_ss_(0, decoder);
1040 printf("testing FLAC__seekable_stream_decoder_get_state()... ");
1041 state = FLAC__seekable_stream_decoder_get_state(decoder);
1042 printf("returned state = %u (%s)... OK\n", state, FLAC__SeekableStreamDecoderStateString[state]);
1044 decoder_client_data.current_metadata_number = 0;
1045 decoder_client_data.ignore_errors = false;
1046 decoder_client_data.error_occurred = false;
1048 printf("opening FLAC file... ");
1049 decoder_client_data.file = fopen(flacfilename_, "rb");
1050 if(0 == decoder_client_data.file) {
1056 printf("testing FLAC__seekable_stream_decoder_get_md5_checking()... ");
1057 if(!FLAC__seekable_stream_decoder_get_md5_checking(decoder)) {
1058 printf("FAILED, returned false, expected true\n");
1063 printf("testing FLAC__seekable_stream_decoder_process_metadata()... ");
1064 if(!FLAC__seekable_stream_decoder_process_metadata(decoder))
1065 return die_ss_("returned false", decoder);
1068 printf("testing FLAC__seekable_stream_decoder_process_one_frame()... ");
1069 if(!FLAC__seekable_stream_decoder_process_one_frame(decoder))
1070 return die_ss_("returned false", decoder);
1073 printf("testing FLAC__seekable_stream_decoder_flush()... ");
1074 if(!FLAC__seekable_stream_decoder_flush(decoder))
1075 return die_ss_("returned false", decoder);
1078 decoder_client_data.ignore_errors = true;
1079 printf("testing FLAC__seekable_stream_decoder_process_one_frame()... ");
1080 if(!FLAC__seekable_stream_decoder_process_one_frame(decoder))
1081 return die_ss_("returned false", decoder);
1083 decoder_client_data.ignore_errors = false;
1085 printf("testing FLAC__seekable_stream_decoder_seek_absolute()... ");
1086 if(!FLAC__seekable_stream_decoder_seek_absolute(decoder, 0))
1087 return die_ss_("returned false", decoder);
1090 printf("testing FLAC__seekable_stream_decoder_process_remaining_frames()... ");
1091 if(!FLAC__seekable_stream_decoder_process_remaining_frames(decoder))
1092 return die_ss_("returned false", decoder);
1095 printf("testing FLAC__seekable_stream_decoder_get_channels()... ");
1097 unsigned channels = FLAC__seekable_stream_decoder_get_channels(decoder);
1098 if(channels != streaminfo_.data.stream_info.channels) {
1099 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
1105 printf("testing FLAC__seekable_stream_decoder_get_bits_per_sample()... ");
1107 unsigned bits_per_sample = FLAC__seekable_stream_decoder_get_bits_per_sample(decoder);
1108 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
1109 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
1115 printf("testing FLAC__seekable_stream_decoder_get_sample_rate()... ");
1117 unsigned sample_rate = FLAC__seekable_stream_decoder_get_sample_rate(decoder);
1118 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
1119 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
1125 printf("testing FLAC__seekable_stream_decoder_get_blocksize()... ");
1127 unsigned blocksize = FLAC__seekable_stream_decoder_get_blocksize(decoder);
1128 /* value could be anything since we're at the last block, so accept any answer */
1129 printf("returned %u... OK\n", blocksize);
1132 printf("testing FLAC__seekable_stream_decoder_get_channel_assignment()... ");
1134 FLAC__ChannelAssignment ca = FLAC__seekable_stream_decoder_get_channel_assignment(decoder);
1135 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1138 printf("testing FLAC__seekable_stream_decoder_reset()... ");
1139 if(!FLAC__seekable_stream_decoder_reset(decoder))
1140 return die_ss_("returned false", decoder);
1143 decoder_client_data.current_metadata_number = 0;
1145 printf("rewinding input... ");
1146 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
1147 printf("FAILED, errno = %d\n", errno);
1152 printf("testing FLAC__seekable_stream_decoder_process_whole_stream()... ");
1153 if(!FLAC__seekable_stream_decoder_process_whole_stream(decoder))
1154 return die_ss_("returned false", decoder);
1157 printf("testing FLAC__seekable_stream_decoder_finish()... ");
1158 (void) FLAC__seekable_stream_decoder_finish(decoder);
1165 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1166 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1167 return die_ss_("returned false", decoder);
1171 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1172 expected_metadata_sequence_[num_expected_++] = &padding_;
1173 expected_metadata_sequence_[num_expected_++] = &seektable_;
1174 expected_metadata_sequence_[num_expected_++] = &application1_;
1175 expected_metadata_sequence_[num_expected_++] = &application2_;
1176 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1178 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1185 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1186 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1187 return die_ss_("returned false", decoder);
1192 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1196 * respond all, ignore VORBIS_COMMENT
1199 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1200 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1201 return die_ss_("returned false", decoder);
1204 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
1205 if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1206 return die_ss_("returned false", decoder);
1210 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1211 expected_metadata_sequence_[num_expected_++] = &padding_;
1212 expected_metadata_sequence_[num_expected_++] = &seektable_;
1213 expected_metadata_sequence_[num_expected_++] = &application1_;
1214 expected_metadata_sequence_[num_expected_++] = &application2_;
1216 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1220 * respond all, ignore APPLICATION
1223 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1224 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1225 return die_ss_("returned false", decoder);
1228 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... ");
1229 if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1230 return die_ss_("returned false", decoder);
1234 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1235 expected_metadata_sequence_[num_expected_++] = &padding_;
1236 expected_metadata_sequence_[num_expected_++] = &seektable_;
1237 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1239 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1243 * respond all, ignore APPLICATION id of app#1
1246 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1247 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1248 return die_ss_("returned false", decoder);
1251 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1252 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1253 return die_ss_("returned false", decoder);
1257 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1258 expected_metadata_sequence_[num_expected_++] = &padding_;
1259 expected_metadata_sequence_[num_expected_++] = &seektable_;
1260 expected_metadata_sequence_[num_expected_++] = &application2_;
1261 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1263 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1267 * respond all, ignore APPLICATION id of app#1 & app#2
1270 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1271 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1272 return die_ss_("returned false", decoder);
1275 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1276 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1277 return die_ss_("returned false", decoder);
1280 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #2)... ");
1281 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
1282 return die_ss_("returned false", decoder);
1286 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1287 expected_metadata_sequence_[num_expected_++] = &padding_;
1288 expected_metadata_sequence_[num_expected_++] = &seektable_;
1289 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1291 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1295 * ignore all, respond VORBIS_COMMENT
1298 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1299 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1300 return die_ss_("returned false", decoder);
1303 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
1304 if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1305 return die_ss_("returned false", decoder);
1309 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1311 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1315 * ignore all, respond APPLICATION
1318 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1319 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1320 return die_ss_("returned false", decoder);
1323 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... ");
1324 if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1325 return die_ss_("returned false", decoder);
1329 expected_metadata_sequence_[num_expected_++] = &application1_;
1330 expected_metadata_sequence_[num_expected_++] = &application2_;
1332 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1336 * ignore all, respond APPLICATION id of app#1
1339 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1340 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1341 return die_ss_("returned false", decoder);
1344 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1345 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1346 return die_ss_("returned false", decoder);
1350 expected_metadata_sequence_[num_expected_++] = &application1_;
1352 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1356 * ignore all, respond APPLICATION id of app#1 & app#2
1359 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1360 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1361 return die_ss_("returned false", decoder);
1364 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1365 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1366 return die_ss_("returned false", decoder);
1369 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #2)... ");
1370 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
1371 return die_ss_("returned false", decoder);
1375 expected_metadata_sequence_[num_expected_++] = &application1_;
1376 expected_metadata_sequence_[num_expected_++] = &application2_;
1378 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1382 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
1385 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1386 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1387 return die_ss_("returned false", decoder);
1390 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... ");
1391 if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
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);
1401 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1402 expected_metadata_sequence_[num_expected_++] = &padding_;
1403 expected_metadata_sequence_[num_expected_++] = &seektable_;
1404 expected_metadata_sequence_[num_expected_++] = &application1_;
1405 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1407 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1411 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
1414 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1415 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1416 return die_ss_("returned false", decoder);
1419 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... ");
1420 if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1421 return die_ss_("returned false", decoder);
1424 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1425 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1426 return die_ss_("returned false", decoder);
1430 expected_metadata_sequence_[num_expected_++] = &application2_;
1432 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1435 /* done, now leave the sequence the way we found it... */
1437 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1438 expected_metadata_sequence_[num_expected_++] = &padding_;
1439 expected_metadata_sequence_[num_expected_++] = &seektable_;
1440 expected_metadata_sequence_[num_expected_++] = &application1_;
1441 expected_metadata_sequence_[num_expected_++] = &application2_;
1442 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1444 printf("testing FLAC__seekable_stream_decoder_delete()... ");
1445 FLAC__seekable_stream_decoder_delete(decoder);
1448 fclose(decoder_client_data.file);
1450 printf("\nPASSED!\n");
1455 static FLAC__StreamDecoderWriteStatus file_decoder_write_callback_(const FLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
1458 return stream_decoder_write_callback_(0, frame, buffer, client_data);
1461 static void file_decoder_metadata_callback_(const FLAC__FileDecoder *decoder, const FLAC__StreamMetaData *metadata, void *client_data)
1464 stream_decoder_metadata_callback_(0, metadata, client_data);
1467 static void file_decoder_error_callback_(const FLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
1470 stream_decoder_error_callback_(0, status, client_data);
1473 static FLAC__bool file_decoder_test_respond_(FLAC__FileDecoder *decoder, file_decoder_client_data_struct *dcd)
1475 if(!FLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
1476 return die_f_("at FLAC__file_decoder_set_write_callback(), returned false", decoder);
1478 if(!FLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
1479 return die_f_("at FLAC__file_decoder_set_metadata_callback(), returned false", decoder);
1481 if(!FLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
1482 return die_f_("at FLAC__file_decoder_set_error_callback(), returned false", decoder);
1484 if(!FLAC__file_decoder_set_client_data(decoder, dcd))
1485 return die_f_("at FLAC__file_decoder_set_client_data(), returned false", decoder);
1487 if(!FLAC__file_decoder_set_filename(decoder, flacfilename_))
1488 return die_f_("at FLAC__file_decoder_set_filename(), returned false", decoder);
1490 if(!FLAC__file_decoder_set_md5_checking(decoder, true))
1491 return die_f_("at FLAC__file_decoder_set_md5_checking(), returned false", decoder);
1493 printf("testing FLAC__file_decoder_init()... ");
1494 if(FLAC__file_decoder_init(decoder) != FLAC__FILE_DECODER_OK)
1495 return die_f_(0, decoder);
1498 dcd->current_metadata_number = 0;
1500 printf("testing FLAC__file_decoder_process_whole_file()... ");
1501 if(!FLAC__file_decoder_process_whole_file(decoder))
1502 return die_f_("returned false", decoder);
1505 printf("testing FLAC__file_decoder_finish()... ");
1506 (void) FLAC__file_decoder_finish(decoder);
1512 static FLAC__bool test_file_decoder()
1514 FLAC__FileDecoder *decoder;
1515 FLAC__FileDecoderState state;
1516 seekable_stream_decoder_client_data_struct decoder_client_data;
1518 printf("\n+++ unit test: FLAC__FileDecoder\n\n");
1521 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1523 printf("testing FLAC__file_decoder_new()... ");
1524 decoder = FLAC__file_decoder_new();
1526 printf("FAILED, returned NULL\n");
1531 printf("testing FLAC__file_decoder_set_write_callback()... ");
1532 if(!FLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
1533 return die_f_("returned false", decoder);
1536 printf("testing FLAC__file_decoder_set_metadata_callback()... ");
1537 if(!FLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
1538 return die_f_("returned false", decoder);
1541 printf("testing FLAC__file_decoder_set_error_callback()... ");
1542 if(!FLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
1543 return die_f_("returned false", decoder);
1546 printf("testing FLAC__file_decoder_set_client_data()... ");
1547 if(!FLAC__file_decoder_set_client_data(decoder, &decoder_client_data))
1548 return die_f_("returned false", decoder);
1551 printf("testing FLAC__file_decoder_set_filename()... ");
1552 if(!FLAC__file_decoder_set_filename(decoder, flacfilename_))
1553 return die_f_("returned false", decoder);
1556 printf("testing FLAC__file_decoder_set_md5_checking()... ");
1557 if(!FLAC__file_decoder_set_md5_checking(decoder, true))
1558 return die_f_("returned false", decoder);
1561 printf("testing FLAC__file_decoder_init()... ");
1562 if(FLAC__file_decoder_init(decoder) != FLAC__FILE_DECODER_OK)
1563 return die_f_(0, decoder);
1566 printf("testing FLAC__file_decoder_get_state()... ");
1567 state = FLAC__file_decoder_get_state(decoder);
1568 printf("returned state = %u (%s)... OK\n", state, FLAC__FileDecoderStateString[state]);
1570 decoder_client_data.current_metadata_number = 0;
1571 decoder_client_data.ignore_errors = false;
1572 decoder_client_data.error_occurred = false;
1574 printf("testing FLAC__file_decoder_get_md5_checking()... ");
1575 if(!FLAC__file_decoder_get_md5_checking(decoder)) {
1576 printf("FAILED, returned false, expected true\n");
1581 printf("testing FLAC__file_decoder_process_metadata()... ");
1582 if(!FLAC__file_decoder_process_metadata(decoder))
1583 return die_f_("returned false", decoder);
1586 printf("testing FLAC__file_decoder_process_one_frame()... ");
1587 if(!FLAC__file_decoder_process_one_frame(decoder))
1588 return die_f_("returned false", decoder);
1591 printf("testing FLAC__file_decoder_seek_absolute()... ");
1592 if(!FLAC__file_decoder_seek_absolute(decoder, 0))
1593 return die_f_("returned false", decoder);
1596 printf("testing FLAC__file_decoder_process_remaining_frames()... ");
1597 if(!FLAC__file_decoder_process_remaining_frames(decoder))
1598 return die_f_("returned false", decoder);
1601 printf("testing FLAC__file_decoder_get_channels()... ");
1603 unsigned channels = FLAC__file_decoder_get_channels(decoder);
1604 if(channels != streaminfo_.data.stream_info.channels) {
1605 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
1611 printf("testing FLAC__file_decoder_get_bits_per_sample()... ");
1613 unsigned bits_per_sample = FLAC__file_decoder_get_bits_per_sample(decoder);
1614 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
1615 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
1621 printf("testing FLAC__file_decoder_get_sample_rate()... ");
1623 unsigned sample_rate = FLAC__file_decoder_get_sample_rate(decoder);
1624 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
1625 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
1631 printf("testing FLAC__file_decoder_get_blocksize()... ");
1633 unsigned blocksize = FLAC__file_decoder_get_blocksize(decoder);
1634 /* value could be anything since we're at the last block, so accept any answer */
1635 printf("returned %u... OK\n", blocksize);
1638 printf("testing FLAC__file_decoder_get_channel_assignment()... ");
1640 FLAC__ChannelAssignment ca = FLAC__file_decoder_get_channel_assignment(decoder);
1641 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1644 printf("testing FLAC__file_decoder_finish()... ");
1645 (void) FLAC__file_decoder_finish(decoder);
1652 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1653 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1654 return die_f_("returned false", decoder);
1658 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1659 expected_metadata_sequence_[num_expected_++] = &padding_;
1660 expected_metadata_sequence_[num_expected_++] = &seektable_;
1661 expected_metadata_sequence_[num_expected_++] = &application1_;
1662 expected_metadata_sequence_[num_expected_++] = &application2_;
1663 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1665 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1672 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1673 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1674 return die_f_("returned false", decoder);
1679 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1683 * respond all, ignore VORBIS_COMMENT
1686 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1687 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1688 return die_f_("returned false", decoder);
1691 printf("testing FLAC__file_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
1692 if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1693 return die_f_("returned false", decoder);
1697 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1698 expected_metadata_sequence_[num_expected_++] = &padding_;
1699 expected_metadata_sequence_[num_expected_++] = &seektable_;
1700 expected_metadata_sequence_[num_expected_++] = &application1_;
1701 expected_metadata_sequence_[num_expected_++] = &application2_;
1703 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1707 * respond all, ignore APPLICATION
1710 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1711 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1712 return die_f_("returned false", decoder);
1715 printf("testing FLAC__file_decoder_set_metadata_ignore(APPLICATION)... ");
1716 if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1717 return die_f_("returned false", decoder);
1721 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1722 expected_metadata_sequence_[num_expected_++] = &padding_;
1723 expected_metadata_sequence_[num_expected_++] = &seektable_;
1724 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1726 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1730 * respond all, ignore APPLICATION id of app#1
1733 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1734 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1735 return die_f_("returned false", decoder);
1738 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1739 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1740 return die_f_("returned false", decoder);
1744 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1745 expected_metadata_sequence_[num_expected_++] = &padding_;
1746 expected_metadata_sequence_[num_expected_++] = &seektable_;
1747 expected_metadata_sequence_[num_expected_++] = &application2_;
1748 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1750 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1754 * respond all, ignore APPLICATION id of app#1 & app#2
1757 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1758 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1759 return die_f_("returned false", decoder);
1762 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1763 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1764 return die_f_("returned false", decoder);
1767 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #2)... ");
1768 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
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_++] = &vorbiscomment_;
1778 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1782 * ignore all, respond VORBIS_COMMENT
1785 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1786 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1787 return die_f_("returned false", decoder);
1790 printf("testing FLAC__file_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
1791 if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1792 return die_f_("returned false", decoder);
1796 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1798 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1802 * ignore all, respond APPLICATION
1805 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1806 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1807 return die_f_("returned false", decoder);
1810 printf("testing FLAC__file_decoder_set_metadata_respond(APPLICATION)... ");
1811 if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1812 return die_f_("returned false", decoder);
1816 expected_metadata_sequence_[num_expected_++] = &application1_;
1817 expected_metadata_sequence_[num_expected_++] = &application2_;
1819 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1823 * ignore all, respond APPLICATION id of app#1
1826 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1827 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1828 return die_f_("returned false", decoder);
1831 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1832 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1833 return die_f_("returned false", decoder);
1837 expected_metadata_sequence_[num_expected_++] = &application1_;
1839 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1843 * ignore all, respond APPLICATION id of app#1 & app#2
1846 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1847 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1848 return die_f_("returned false", decoder);
1851 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1852 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1853 return die_f_("returned false", decoder);
1856 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #2)... ");
1857 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
1858 return die_f_("returned false", decoder);
1862 expected_metadata_sequence_[num_expected_++] = &application1_;
1863 expected_metadata_sequence_[num_expected_++] = &application2_;
1865 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1869 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
1872 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1873 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1874 return die_f_("returned false", decoder);
1877 printf("testing FLAC__file_decoder_set_metadata_ignore(APPLICATION)... ");
1878 if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1879 return die_f_("returned false", decoder);
1882 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1883 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1884 return die_f_("returned false", decoder);
1888 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1889 expected_metadata_sequence_[num_expected_++] = &padding_;
1890 expected_metadata_sequence_[num_expected_++] = &seektable_;
1891 expected_metadata_sequence_[num_expected_++] = &application1_;
1892 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1894 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1898 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
1901 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1902 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1903 return die_f_("returned false", decoder);
1906 printf("testing FLAC__file_decoder_set_metadata_respond(APPLICATION)... ");
1907 if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1908 return die_f_("returned false", decoder);
1911 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1912 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1913 return die_f_("returned false", decoder);
1917 expected_metadata_sequence_[num_expected_++] = &application2_;
1919 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1922 /* done, now leave the sequence the way we found it... */
1924 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1925 expected_metadata_sequence_[num_expected_++] = &padding_;
1926 expected_metadata_sequence_[num_expected_++] = &seektable_;
1927 expected_metadata_sequence_[num_expected_++] = &application1_;
1928 expected_metadata_sequence_[num_expected_++] = &application2_;
1929 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1931 printf("testing FLAC__file_decoder_delete()... ");
1932 FLAC__file_decoder_delete(decoder);
1935 printf("\nPASSED!\n");
1940 FLAC__bool test_decoders()
1942 init_metadata_blocks_();
1943 if(!generate_file_())
1946 if(!test_stream_decoder())
1949 if(!test_seekable_stream_decoder())
1952 if(!test_file_decoder())
1955 (void) file_utils__remove_file(flacfilename_);
1956 free_metadata_blocks_();