1 /* test_libFLAC - Unit tester for libFLAC
2 * Copyright (C) 2002,2003 Josh Coalson
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 #include "file_utils.h"
21 #include "metadata_utils.h"
22 #include "FLAC/assert.h"
23 #include "FLAC/file_decoder.h"
24 #include "FLAC/seekable_stream_decoder.h"
25 #include "FLAC/stream_decoder.h"
26 #include "share/grabbag.h"
34 unsigned current_metadata_number;
35 FLAC__bool ignore_errors;
36 FLAC__bool error_occurred;
37 } stream_decoder_client_data_struct;
39 typedef stream_decoder_client_data_struct seekable_stream_decoder_client_data_struct;
40 typedef stream_decoder_client_data_struct file_decoder_client_data_struct;
42 static FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_, cuesheet_;
43 static FLAC__StreamMetadata *expected_metadata_sequence_[7];
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 *malloc_or_die_(size_t size)
110 void *x = malloc(size);
112 fprintf(stderr, "ERROR: out of memory allocating %u bytes\n", (unsigned)size);
118 static void *calloc_or_die_(size_t n, size_t size)
120 void *x = calloc(n, size);
122 fprintf(stderr, "ERROR: out of memory allocating %u bytes\n", (unsigned)n * (unsigned)size);
128 static void init_metadata_blocks_()
131 most of the actual numbers and data in the blocks don't matter,
132 we just want to make sure the decoder parses them correctly
134 remember, the metadata interface gets tested after the decoders,
135 so we do all the metadata manipulation here without it.
138 /* min/max_framesize and md5sum don't get written at first, so we have to leave them 0 */
139 streaminfo_.is_last = false;
140 streaminfo_.type = FLAC__METADATA_TYPE_STREAMINFO;
141 streaminfo_.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
142 streaminfo_.data.stream_info.min_blocksize = 576;
143 streaminfo_.data.stream_info.max_blocksize = 576;
144 streaminfo_.data.stream_info.min_framesize = 0;
145 streaminfo_.data.stream_info.max_framesize = 0;
146 streaminfo_.data.stream_info.sample_rate = 44100;
147 streaminfo_.data.stream_info.channels = 1;
148 streaminfo_.data.stream_info.bits_per_sample = 8;
149 streaminfo_.data.stream_info.total_samples = 0;
150 memset(streaminfo_.data.stream_info.md5sum, 0, 16);
152 padding_.is_last = false;
153 padding_.type = FLAC__METADATA_TYPE_PADDING;
154 padding_.length = 1234;
156 seektable_.is_last = false;
157 seektable_.type = FLAC__METADATA_TYPE_SEEKTABLE;
158 seektable_.data.seek_table.num_points = 2;
159 seektable_.length = seektable_.data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH;
160 seektable_.data.seek_table.points = malloc_or_die_(seektable_.data.seek_table.num_points * sizeof(FLAC__StreamMetadata_SeekPoint));
161 seektable_.data.seek_table.points[0].sample_number = 0;
162 seektable_.data.seek_table.points[0].stream_offset = 0;
163 seektable_.data.seek_table.points[0].frame_samples = streaminfo_.data.stream_info.min_blocksize;
164 seektable_.data.seek_table.points[1].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER;
165 seektable_.data.seek_table.points[1].stream_offset = 1000;
166 seektable_.data.seek_table.points[1].frame_samples = streaminfo_.data.stream_info.min_blocksize;
168 application1_.is_last = false;
169 application1_.type = FLAC__METADATA_TYPE_APPLICATION;
170 application1_.length = 8;
171 memcpy(application1_.data.application.id, "\xfe\xdc\xba\x98", 4);
172 application1_.data.application.data = malloc_or_die_(4);
173 memcpy(application1_.data.application.data, "\xf0\xe1\xd2\xc3", 4);
175 application2_.is_last = false;
176 application2_.type = FLAC__METADATA_TYPE_APPLICATION;
177 application2_.length = 4;
178 memcpy(application2_.data.application.id, "\x76\x54\x32\x10", 4);
179 application2_.data.application.data = 0;
182 const unsigned vendor_string_length = (unsigned)strlen(FLAC__VENDOR_STRING);
183 vorbiscomment_.is_last = true;
184 vorbiscomment_.type = FLAC__METADATA_TYPE_VORBIS_COMMENT;
185 vorbiscomment_.length = (4 + vendor_string_length) + 4 + (4 + 5) + (4 + 0);
186 vorbiscomment_.data.vorbis_comment.vendor_string.length = vendor_string_length;
187 vorbiscomment_.data.vorbis_comment.vendor_string.entry = malloc_or_die_(vendor_string_length);
188 memcpy(vorbiscomment_.data.vorbis_comment.vendor_string.entry, FLAC__VENDOR_STRING, vendor_string_length);
189 vorbiscomment_.data.vorbis_comment.num_comments = 2;
190 vorbiscomment_.data.vorbis_comment.comments = malloc_or_die_(vorbiscomment_.data.vorbis_comment.num_comments * sizeof(FLAC__StreamMetadata_VorbisComment_Entry));
191 vorbiscomment_.data.vorbis_comment.comments[0].length = 5;
192 vorbiscomment_.data.vorbis_comment.comments[0].entry = malloc_or_die_(5);
193 memcpy(vorbiscomment_.data.vorbis_comment.comments[0].entry, "ab=cd", 5);
194 vorbiscomment_.data.vorbis_comment.comments[1].length = 0;
195 vorbiscomment_.data.vorbis_comment.comments[1].entry = 0;
198 cuesheet_.is_last = true;
199 cuesheet_.type = FLAC__METADATA_TYPE_CUESHEET;
203 FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN +
204 FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN +
205 FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN +
206 FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN +
207 FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN
211 FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN +
212 FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN +
213 FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN +
214 FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN +
215 FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN +
216 FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN +
217 FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN
221 FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN +
222 FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN +
223 FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN
226 memset(cuesheet_.data.cue_sheet.media_catalog_number, 0, sizeof(cuesheet_.data.cue_sheet.media_catalog_number));
227 cuesheet_.data.cue_sheet.media_catalog_number[0] = 'j';
228 cuesheet_.data.cue_sheet.media_catalog_number[1] = 'C';
229 cuesheet_.data.cue_sheet.lead_in = 2 * 44100;
230 cuesheet_.data.cue_sheet.is_cd = true;
231 cuesheet_.data.cue_sheet.num_tracks = 3;
232 cuesheet_.data.cue_sheet.tracks = calloc_or_die_(cuesheet_.data.cue_sheet.num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track));
233 cuesheet_.data.cue_sheet.tracks[0].offset = 0;
234 cuesheet_.data.cue_sheet.tracks[0].number = 1;
235 memcpy(cuesheet_.data.cue_sheet.tracks[0].isrc, "ACBDE1234567", sizeof(cuesheet_.data.cue_sheet.tracks[0].isrc));
236 cuesheet_.data.cue_sheet.tracks[0].type = 0;
237 cuesheet_.data.cue_sheet.tracks[0].pre_emphasis = 1;
238 cuesheet_.data.cue_sheet.tracks[0].num_indices = 2;
239 cuesheet_.data.cue_sheet.tracks[0].indices = malloc_or_die_(cuesheet_.data.cue_sheet.tracks[0].num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index));
240 cuesheet_.data.cue_sheet.tracks[0].indices[0].offset = 0;
241 cuesheet_.data.cue_sheet.tracks[0].indices[0].number = 0;
242 cuesheet_.data.cue_sheet.tracks[0].indices[1].offset = 123 * 588;
243 cuesheet_.data.cue_sheet.tracks[0].indices[1].number = 1;
244 cuesheet_.data.cue_sheet.tracks[1].offset = 1234 * 588;
245 cuesheet_.data.cue_sheet.tracks[1].number = 2;
246 memcpy(cuesheet_.data.cue_sheet.tracks[1].isrc, "ACBDE7654321", sizeof(cuesheet_.data.cue_sheet.tracks[1].isrc));
247 cuesheet_.data.cue_sheet.tracks[1].type = 1;
248 cuesheet_.data.cue_sheet.tracks[1].pre_emphasis = 0;
249 cuesheet_.data.cue_sheet.tracks[1].num_indices = 1;
250 cuesheet_.data.cue_sheet.tracks[1].indices = malloc_or_die_(cuesheet_.data.cue_sheet.tracks[1].num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index));
251 cuesheet_.data.cue_sheet.tracks[1].indices[0].offset = 0;
252 cuesheet_.data.cue_sheet.tracks[1].indices[0].number = 1;
253 cuesheet_.data.cue_sheet.tracks[2].offset = 12345 * 588;
254 cuesheet_.data.cue_sheet.tracks[2].number = 170;
255 cuesheet_.data.cue_sheet.tracks[2].num_indices = 0;
258 static void free_metadata_blocks_()
260 free(seektable_.data.seek_table.points);
261 free(application1_.data.application.data);
262 free(vorbiscomment_.data.vorbis_comment.vendor_string.entry);
263 free(vorbiscomment_.data.vorbis_comment.comments[0].entry);
264 free(vorbiscomment_.data.vorbis_comment.comments);
265 free(cuesheet_.data.cue_sheet.tracks[0].indices);
266 free(cuesheet_.data.cue_sheet.tracks[1].indices);
267 free(cuesheet_.data.cue_sheet.tracks);
270 static FLAC__bool generate_file_()
272 printf("\n\ngenerating FLAC file for decoder tests...\n");
274 expected_metadata_sequence_[0] = &padding_;
275 expected_metadata_sequence_[1] = &seektable_;
276 expected_metadata_sequence_[2] = &application1_;
277 expected_metadata_sequence_[3] = &application2_;
278 expected_metadata_sequence_[4] = &vorbiscomment_;
279 expected_metadata_sequence_[5] = &cuesheet_;
282 if(!file_utils__generate_flacfile(flacfilename_, &flacfilesize_, 512 * 1024, &streaminfo_, expected_metadata_sequence_, num_expected_))
283 return die_("creating the encoded file");
288 static FLAC__StreamDecoderReadStatus stream_decoder_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
290 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
295 printf("ERROR: client_data in read callback is NULL\n");
296 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
299 if(dcd->error_occurred)
300 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
303 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
304 else if(*bytes > 0) {
305 unsigned bytes_read = fread(buffer, 1, *bytes, dcd->file);
306 if(bytes_read == 0) {
308 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
310 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
314 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
318 return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */
321 static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
323 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
325 (void)decoder, (void)buffer;
328 printf("ERROR: client_data in write callback is NULL\n");
329 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
332 if(dcd->error_occurred)
333 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
336 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER && frame->header.number.frame_number == 0) ||
337 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER && frame->header.number.sample_number == 0)
339 printf("content... ");
343 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
346 static void stream_decoder_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
348 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
353 printf("ERROR: client_data in metadata callback is NULL\n");
357 if(dcd->error_occurred)
360 printf("%d... ", dcd->current_metadata_number);
363 if(dcd->current_metadata_number >= num_expected_) {
364 (void)die_("got more metadata blocks than expected");
365 dcd->error_occurred = true;
368 if(!compare_block_(expected_metadata_sequence_[dcd->current_metadata_number], metadata)) {
369 (void)die_("metadata block mismatch");
370 dcd->error_occurred = true;
373 dcd->current_metadata_number++;
376 static void stream_decoder_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
378 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
383 printf("ERROR: client_data in error callback is NULL\n");
387 if(!dcd->ignore_errors) {
388 printf("ERROR: got error callback: err = %u (%s)\n", (unsigned)status, FLAC__StreamDecoderErrorStatusString[status]);
389 dcd->error_occurred = true;
393 static FLAC__bool stream_decoder_test_respond_(FLAC__StreamDecoder *decoder, stream_decoder_client_data_struct *dcd)
395 if(!FLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))
396 return die_s_("at FLAC__stream_decoder_set_read_callback(), returned false", decoder);
398 if(!FLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))
399 return die_s_("at FLAC__stream_decoder_set_write_callback(), returned false", decoder);
401 if(!FLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))
402 return die_s_("at FLAC__stream_decoder_set_metadata_callback(), returned false", decoder);
404 if(!FLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))
405 return die_s_("at FLAC__stream_decoder_set_error_callback(), returned false", decoder);
407 if(!FLAC__stream_decoder_set_client_data(decoder, dcd))
408 return die_s_("at FLAC__stream_decoder_set_client_data(), returned false", decoder);
410 printf("testing FLAC__stream_decoder_init()... ");
411 if(FLAC__stream_decoder_init(decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
412 return die_s_(0, decoder);
415 dcd->current_metadata_number = 0;
417 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
418 printf("FAILED rewinding input, errno = %d\n", errno);
422 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
423 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
424 return die_s_("returned false", decoder);
427 printf("testing FLAC__stream_decoder_finish()... ");
428 FLAC__stream_decoder_finish(decoder);
434 static FLAC__bool test_stream_decoder()
436 FLAC__StreamDecoder *decoder;
437 FLAC__StreamDecoderState state;
438 stream_decoder_client_data_struct decoder_client_data;
440 printf("\n+++ libFLAC unit test: FLAC__StreamDecoder\n\n");
442 printf("testing FLAC__stream_decoder_new()... ");
443 decoder = FLAC__stream_decoder_new();
445 printf("FAILED, returned NULL\n");
450 printf("testing FLAC__stream_decoder_delete()... ");
451 FLAC__stream_decoder_delete(decoder);
454 printf("testing FLAC__stream_decoder_new()... ");
455 decoder = FLAC__stream_decoder_new();
457 printf("FAILED, returned NULL\n");
462 printf("testing FLAC__stream_decoder_init()... ");
463 if(FLAC__stream_decoder_init(decoder) == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
464 return die_s_(0, decoder);
467 printf("testing FLAC__stream_decoder_delete()... ");
468 FLAC__stream_decoder_delete(decoder);
472 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
474 printf("testing FLAC__stream_decoder_new()... ");
475 decoder = FLAC__stream_decoder_new();
477 printf("FAILED, returned NULL\n");
482 printf("testing FLAC__stream_decoder_set_read_callback()... ");
483 if(!FLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))
484 return die_s_("returned false", decoder);
487 printf("testing FLAC__stream_decoder_set_write_callback()... ");
488 if(!FLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))
489 return die_s_("returned false", decoder);
492 printf("testing FLAC__stream_decoder_set_metadata_callback()... ");
493 if(!FLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))
494 return die_s_("returned false", decoder);
497 printf("testing FLAC__stream_decoder_set_error_callback()... ");
498 if(!FLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))
499 return die_s_("returned false", decoder);
502 printf("testing FLAC__stream_decoder_set_client_data()... ");
503 if(!FLAC__stream_decoder_set_client_data(decoder, &decoder_client_data))
504 return die_s_("returned false", decoder);
507 printf("testing FLAC__stream_decoder_init()... ");
508 if(FLAC__stream_decoder_init(decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)
509 return die_s_(0, decoder);
512 printf("testing FLAC__stream_decoder_get_state()... ");
513 state = FLAC__stream_decoder_get_state(decoder);
514 printf("returned state = %u (%s)... OK\n", state, FLAC__StreamDecoderStateString[state]);
516 decoder_client_data.current_metadata_number = 0;
517 decoder_client_data.ignore_errors = false;
518 decoder_client_data.error_occurred = false;
520 printf("opening FLAC file... ");
521 decoder_client_data.file = fopen(flacfilename_, "rb");
522 if(0 == decoder_client_data.file) {
528 printf("testing FLAC__stream_decoder_process_until_end_of_metadata()... ");
529 if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder))
530 return die_s_("returned false", decoder);
533 printf("testing FLAC__stream_decoder_process_single()... ");
534 if(!FLAC__stream_decoder_process_single(decoder))
535 return die_s_("returned false", decoder);
538 printf("testing FLAC__stream_decoder_flush()... ");
539 if(!FLAC__stream_decoder_flush(decoder))
540 return die_s_("returned false", decoder);
543 decoder_client_data.ignore_errors = true;
544 printf("testing FLAC__stream_decoder_process_single()... ");
545 if(!FLAC__stream_decoder_process_single(decoder))
546 return die_s_("returned false", decoder);
548 decoder_client_data.ignore_errors = false;
550 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
551 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
552 return die_s_("returned false", decoder);
555 printf("testing FLAC__stream_decoder_get_channels()... ");
557 unsigned channels = FLAC__stream_decoder_get_channels(decoder);
558 if(channels != streaminfo_.data.stream_info.channels) {
559 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
565 printf("testing FLAC__stream_decoder_get_bits_per_sample()... ");
567 unsigned bits_per_sample = FLAC__stream_decoder_get_bits_per_sample(decoder);
568 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
569 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
575 printf("testing FLAC__stream_decoder_get_sample_rate()... ");
577 unsigned sample_rate = FLAC__stream_decoder_get_sample_rate(decoder);
578 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
579 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
585 printf("testing FLAC__stream_decoder_get_blocksize()... ");
587 unsigned blocksize = FLAC__stream_decoder_get_blocksize(decoder);
588 /* value could be anything since we're at the last block, so accept any answer */
589 printf("returned %u... OK\n", blocksize);
592 printf("testing FLAC__stream_decoder_get_channel_assignment()... ");
594 FLAC__ChannelAssignment ca = FLAC__stream_decoder_get_channel_assignment(decoder);
595 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
598 printf("testing FLAC__stream_decoder_reset()... ");
599 if(!FLAC__stream_decoder_reset(decoder)) {
600 state = FLAC__stream_decoder_get_state(decoder);
601 printf("FAILED, returned false, state = %u (%s)\n", state, FLAC__StreamDecoderStateString[state]);
606 decoder_client_data.current_metadata_number = 0;
608 printf("rewinding input... ");
609 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
610 printf("FAILED, errno = %d\n", errno);
615 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
616 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
617 return die_s_("returned false", decoder);
620 printf("testing FLAC__stream_decoder_finish()... ");
621 FLAC__stream_decoder_finish(decoder);
628 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
629 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
630 return die_s_("returned false", decoder);
634 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
635 expected_metadata_sequence_[num_expected_++] = &padding_;
636 expected_metadata_sequence_[num_expected_++] = &seektable_;
637 expected_metadata_sequence_[num_expected_++] = &application1_;
638 expected_metadata_sequence_[num_expected_++] = &application2_;
639 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
640 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
642 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
649 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
650 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
651 return die_s_("returned false", decoder);
656 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
660 * respond all, ignore VORBIS_COMMENT
663 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
664 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
665 return die_s_("returned false", decoder);
668 printf("testing FLAC__stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
669 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
670 return die_s_("returned false", decoder);
674 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
675 expected_metadata_sequence_[num_expected_++] = &padding_;
676 expected_metadata_sequence_[num_expected_++] = &seektable_;
677 expected_metadata_sequence_[num_expected_++] = &application1_;
678 expected_metadata_sequence_[num_expected_++] = &application2_;
679 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
681 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
685 * respond all, ignore APPLICATION
688 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
689 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
690 return die_s_("returned false", decoder);
693 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
694 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
695 return die_s_("returned false", decoder);
699 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
700 expected_metadata_sequence_[num_expected_++] = &padding_;
701 expected_metadata_sequence_[num_expected_++] = &seektable_;
702 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
703 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
705 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
709 * respond all, ignore APPLICATION id of app#1
712 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
713 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
714 return die_s_("returned false", decoder);
717 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
718 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
719 return die_s_("returned false", decoder);
723 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
724 expected_metadata_sequence_[num_expected_++] = &padding_;
725 expected_metadata_sequence_[num_expected_++] = &seektable_;
726 expected_metadata_sequence_[num_expected_++] = &application2_;
727 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
728 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
730 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
734 * respond all, ignore APPLICATION id of app#1 & app#2
737 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
738 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
739 return die_s_("returned false", decoder);
742 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
743 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
744 return die_s_("returned false", decoder);
747 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #2)... ");
748 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
749 return die_s_("returned false", decoder);
753 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
754 expected_metadata_sequence_[num_expected_++] = &padding_;
755 expected_metadata_sequence_[num_expected_++] = &seektable_;
756 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
757 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
759 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
763 * ignore all, respond VORBIS_COMMENT
766 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
767 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
768 return die_s_("returned false", decoder);
771 printf("testing FLAC__stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
772 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
773 return die_s_("returned false", decoder);
777 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
779 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
783 * ignore all, respond APPLICATION
786 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
787 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
788 return die_s_("returned false", decoder);
791 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
792 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
793 return die_s_("returned false", decoder);
797 expected_metadata_sequence_[num_expected_++] = &application1_;
798 expected_metadata_sequence_[num_expected_++] = &application2_;
800 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
804 * ignore all, respond APPLICATION id of app#1
807 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
808 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
809 return die_s_("returned false", decoder);
812 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
813 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
814 return die_s_("returned false", decoder);
818 expected_metadata_sequence_[num_expected_++] = &application1_;
820 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
824 * ignore all, respond APPLICATION id of app#1 & app#2
827 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
828 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
829 return die_s_("returned false", decoder);
832 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
833 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
834 return die_s_("returned false", decoder);
837 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #2)... ");
838 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
839 return die_s_("returned false", decoder);
843 expected_metadata_sequence_[num_expected_++] = &application1_;
844 expected_metadata_sequence_[num_expected_++] = &application2_;
846 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
850 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
853 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
854 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
855 return die_s_("returned false", decoder);
858 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
859 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
860 return die_s_("returned false", decoder);
863 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
864 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
865 return die_s_("returned false", decoder);
869 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
870 expected_metadata_sequence_[num_expected_++] = &padding_;
871 expected_metadata_sequence_[num_expected_++] = &seektable_;
872 expected_metadata_sequence_[num_expected_++] = &application1_;
873 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
874 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
876 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
880 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
883 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
884 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
885 return die_s_("returned false", decoder);
888 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
889 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
890 return die_s_("returned false", decoder);
893 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
894 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
895 return die_s_("returned false", decoder);
899 expected_metadata_sequence_[num_expected_++] = &application2_;
901 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
904 /* done, now leave the sequence the way we found it... */
906 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
907 expected_metadata_sequence_[num_expected_++] = &padding_;
908 expected_metadata_sequence_[num_expected_++] = &seektable_;
909 expected_metadata_sequence_[num_expected_++] = &application1_;
910 expected_metadata_sequence_[num_expected_++] = &application2_;
911 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
912 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
914 printf("testing FLAC__stream_decoder_delete()... ");
915 FLAC__stream_decoder_delete(decoder);
918 fclose(decoder_client_data.file);
920 printf("\nPASSED!\n");
925 static FLAC__SeekableStreamDecoderReadStatus seekable_stream_decoder_read_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
928 switch(stream_decoder_read_callback_(0, buffer, bytes, client_data)) {
929 case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE:
930 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK;
931 case FLAC__STREAM_DECODER_READ_STATUS_ABORT:
932 case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM:
933 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
936 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
940 static FLAC__SeekableStreamDecoderSeekStatus seekable_stream_decoder_seek_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
942 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
947 printf("ERROR: client_data in seek callback is NULL\n");
948 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
951 if(dcd->error_occurred)
952 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
954 if(fseek(dcd->file, (long)absolute_byte_offset, SEEK_SET) < 0) {
955 dcd->error_occurred = true;
956 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
959 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK;
962 static FLAC__SeekableStreamDecoderTellStatus seekable_stream_decoder_tell_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
964 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
970 printf("ERROR: client_data in tell callback is NULL\n");
971 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
974 if(dcd->error_occurred)
975 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
977 offset = ftell(dcd->file);
978 *absolute_byte_offset = (FLAC__uint64)offset;
981 dcd->error_occurred = true;
982 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
985 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK;
988 static FLAC__SeekableStreamDecoderLengthStatus seekable_stream_decoder_length_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
990 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
995 printf("ERROR: client_data in length callback is NULL\n");
996 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
999 if(dcd->error_occurred)
1000 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
1002 *stream_length = (FLAC__uint64)flacfilesize_;
1003 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK;
1006 static FLAC__bool seekable_stream_decoder_eof_callback_(const FLAC__SeekableStreamDecoder *decoder, void *client_data)
1008 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
1013 printf("ERROR: client_data in eof callback is NULL\n");
1017 if(dcd->error_occurred)
1020 return feof(dcd->file);
1023 static FLAC__StreamDecoderWriteStatus seekable_stream_decoder_write_callback_(const FLAC__SeekableStreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
1026 return stream_decoder_write_callback_(0, frame, buffer, client_data);
1029 static void seekable_stream_decoder_metadata_callback_(const FLAC__SeekableStreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
1032 stream_decoder_metadata_callback_(0, metadata, client_data);
1035 static void seekable_stream_decoder_error_callback_(const FLAC__SeekableStreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
1038 stream_decoder_error_callback_(0, status, client_data);
1041 static FLAC__bool seekable_stream_decoder_test_respond_(FLAC__SeekableStreamDecoder *decoder, seekable_stream_decoder_client_data_struct *dcd)
1043 if(!FLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_))
1044 return die_ss_("at FLAC__seekable_stream_decoder_set_read_callback(), returned false", decoder);
1046 if(!FLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_))
1047 return die_ss_("at FLAC__seekable_stream_decoder_set_seek_callback(), returned false", decoder);
1049 if(!FLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_))
1050 return die_ss_("at FLAC__seekable_stream_decoder_set_tell_callback(), returned false", decoder);
1052 if(!FLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_))
1053 return die_ss_("at FLAC__seekable_stream_decoder_set_length_callback(), returned false", decoder);
1055 if(!FLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_))
1056 return die_ss_("at FLAC__seekable_stream_decoder_set_eof_callback(), returned false", decoder);
1058 if(!FLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_))
1059 return die_ss_("at FLAC__seekable_stream_decoder_set_write_callback(), returned false", decoder);
1061 if(!FLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_))
1062 return die_ss_("at FLAC__seekable_stream_decoder_set_metadata_callback(), returned false", decoder);
1064 if(!FLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_))
1065 return die_ss_("at FLAC__seekable_stream_decoder_set_error_callback(), returned false", decoder);
1067 if(!FLAC__seekable_stream_decoder_set_client_data(decoder, dcd))
1068 return die_ss_("at FLAC__seekable_stream_decoder_set_client_data(), returned false", decoder);
1070 if(!FLAC__seekable_stream_decoder_set_md5_checking(decoder, true))
1071 return die_ss_("at FLAC__seekable_stream_decoder_set_md5_checking(), returned false", decoder);
1073 printf("testing FLAC__seekable_stream_decoder_init()... ");
1074 if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK)
1075 return die_ss_(0, decoder);
1078 dcd->current_metadata_number = 0;
1080 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
1081 printf("FAILED rewinding input, errno = %d\n", errno);
1085 printf("testing FLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
1086 if(!FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
1087 return die_ss_("returned false", decoder);
1090 printf("testing FLAC__seekable_stream_decoder_finish()... ");
1091 (void) FLAC__seekable_stream_decoder_finish(decoder);
1097 static FLAC__bool test_seekable_stream_decoder()
1099 FLAC__SeekableStreamDecoder *decoder;
1100 FLAC__SeekableStreamDecoderState state;
1101 FLAC__StreamDecoderState sstate;
1102 seekable_stream_decoder_client_data_struct decoder_client_data;
1104 printf("\n+++ libFLAC unit test: FLAC__SeekableStreamDecoder\n\n");
1106 printf("testing FLAC__seekable_stream_decoder_new()... ");
1107 decoder = FLAC__seekable_stream_decoder_new();
1109 printf("FAILED, returned NULL\n");
1114 printf("testing FLAC__seekable_stream_decoder_delete()... ");
1115 FLAC__seekable_stream_decoder_delete(decoder);
1118 printf("testing FLAC__seekable_stream_decoder_new()... ");
1119 decoder = FLAC__seekable_stream_decoder_new();
1121 printf("FAILED, returned NULL\n");
1126 printf("testing FLAC__seekable_stream_decoder_init()... ");
1127 if(FLAC__seekable_stream_decoder_init(decoder) == FLAC__SEEKABLE_STREAM_DECODER_OK)
1128 return die_ss_(0, decoder);
1131 printf("testing FLAC__seekable_stream_decoder_delete()... ");
1132 FLAC__seekable_stream_decoder_delete(decoder);
1136 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1138 printf("testing FLAC__seekable_stream_decoder_new()... ");
1139 decoder = FLAC__seekable_stream_decoder_new();
1141 printf("FAILED, returned NULL\n");
1146 printf("testing FLAC__seekable_stream_decoder_set_read_callback()... ");
1147 if(!FLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_))
1148 return die_ss_("returned false", decoder);
1151 printf("testing FLAC__seekable_stream_decoder_set_seek_callback()... ");
1152 if(!FLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_))
1153 return die_ss_("returned false", decoder);
1156 printf("testing FLAC__seekable_stream_decoder_set_tell_callback()... ");
1157 if(!FLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_))
1158 return die_ss_("returned false", decoder);
1161 printf("testing FLAC__seekable_stream_decoder_set_length_callback()... ");
1162 if(!FLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_))
1163 return die_ss_("returned false", decoder);
1166 printf("testing FLAC__seekable_stream_decoder_set_eof_callback()... ");
1167 if(!FLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_))
1168 return die_ss_("returned false", decoder);
1171 printf("testing FLAC__seekable_stream_decoder_set_write_callback()... ");
1172 if(!FLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_))
1173 return die_ss_("returned false", decoder);
1176 printf("testing FLAC__seekable_stream_decoder_set_metadata_callback()... ");
1177 if(!FLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_))
1178 return die_ss_("returned false", decoder);
1181 printf("testing FLAC__seekable_stream_decoder_set_error_callback()... ");
1182 if(!FLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_))
1183 return die_ss_("returned false", decoder);
1186 printf("testing FLAC__seekable_stream_decoder_set_client_data()... ");
1187 if(!FLAC__seekable_stream_decoder_set_client_data(decoder, &decoder_client_data))
1188 return die_ss_("returned false", decoder);
1191 printf("testing FLAC__seekable_stream_decoder_set_md5_checking()... ");
1192 if(!FLAC__seekable_stream_decoder_set_md5_checking(decoder, true))
1193 return die_ss_("returned false", decoder);
1196 printf("testing FLAC__seekable_stream_decoder_init()... ");
1197 if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK)
1198 return die_ss_(0, decoder);
1201 printf("testing FLAC__seekable_stream_decoder_get_state()... ");
1202 state = FLAC__seekable_stream_decoder_get_state(decoder);
1203 printf("returned state = %u (%s)... OK\n", state, FLAC__SeekableStreamDecoderStateString[state]);
1205 printf("testing FLAC__seekable_stream_decoder_get_stream_decoder_state()... ");
1206 sstate = FLAC__seekable_stream_decoder_get_stream_decoder_state(decoder);
1207 printf("returned state = %u (%s)... OK\n", sstate, FLAC__StreamDecoderStateString[sstate]);
1209 decoder_client_data.current_metadata_number = 0;
1210 decoder_client_data.ignore_errors = false;
1211 decoder_client_data.error_occurred = false;
1213 printf("opening FLAC file... ");
1214 decoder_client_data.file = fopen(flacfilename_, "rb");
1215 if(0 == decoder_client_data.file) {
1221 printf("testing FLAC__seekable_stream_decoder_get_md5_checking()... ");
1222 if(!FLAC__seekable_stream_decoder_get_md5_checking(decoder)) {
1223 printf("FAILED, returned false, expected true\n");
1228 printf("testing FLAC__seekable_stream_decoder_process_until_end_of_metadata()... ");
1229 if(!FLAC__seekable_stream_decoder_process_until_end_of_metadata(decoder))
1230 return die_ss_("returned false", decoder);
1233 printf("testing FLAC__seekable_stream_decoder_process_single()... ");
1234 if(!FLAC__seekable_stream_decoder_process_single(decoder))
1235 return die_ss_("returned false", decoder);
1238 printf("testing FLAC__seekable_stream_decoder_flush()... ");
1239 if(!FLAC__seekable_stream_decoder_flush(decoder))
1240 return die_ss_("returned false", decoder);
1243 decoder_client_data.ignore_errors = true;
1244 printf("testing FLAC__seekable_stream_decoder_process_single()... ");
1245 if(!FLAC__seekable_stream_decoder_process_single(decoder))
1246 return die_ss_("returned false", decoder);
1248 decoder_client_data.ignore_errors = false;
1250 printf("testing FLAC__seekable_stream_decoder_seek_absolute()... ");
1251 if(!FLAC__seekable_stream_decoder_seek_absolute(decoder, 0))
1252 return die_ss_("returned false", decoder);
1255 printf("testing FLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
1256 if(!FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
1257 return die_ss_("returned false", decoder);
1260 printf("testing FLAC__seekable_stream_decoder_get_channels()... ");
1262 unsigned channels = FLAC__seekable_stream_decoder_get_channels(decoder);
1263 if(channels != streaminfo_.data.stream_info.channels) {
1264 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
1270 printf("testing FLAC__seekable_stream_decoder_get_bits_per_sample()... ");
1272 unsigned bits_per_sample = FLAC__seekable_stream_decoder_get_bits_per_sample(decoder);
1273 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
1274 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
1280 printf("testing FLAC__seekable_stream_decoder_get_sample_rate()... ");
1282 unsigned sample_rate = FLAC__seekable_stream_decoder_get_sample_rate(decoder);
1283 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
1284 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
1290 printf("testing FLAC__seekable_stream_decoder_get_blocksize()... ");
1292 unsigned blocksize = FLAC__seekable_stream_decoder_get_blocksize(decoder);
1293 /* value could be anything since we're at the last block, so accept any answer */
1294 printf("returned %u... OK\n", blocksize);
1297 printf("testing FLAC__seekable_stream_decoder_get_channel_assignment()... ");
1299 FLAC__ChannelAssignment ca = FLAC__seekable_stream_decoder_get_channel_assignment(decoder);
1300 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1303 printf("testing FLAC__seekable_stream_decoder_reset()... ");
1304 if(!FLAC__seekable_stream_decoder_reset(decoder))
1305 return die_ss_("returned false", decoder);
1308 decoder_client_data.current_metadata_number = 0;
1310 printf("rewinding input... ");
1311 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
1312 printf("FAILED, errno = %d\n", errno);
1317 printf("testing FLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
1318 if(!FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
1319 return die_ss_("returned false", decoder);
1322 printf("testing FLAC__seekable_stream_decoder_finish()... ");
1323 (void) FLAC__seekable_stream_decoder_finish(decoder);
1330 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1331 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1332 return die_ss_("returned false", decoder);
1336 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1337 expected_metadata_sequence_[num_expected_++] = &padding_;
1338 expected_metadata_sequence_[num_expected_++] = &seektable_;
1339 expected_metadata_sequence_[num_expected_++] = &application1_;
1340 expected_metadata_sequence_[num_expected_++] = &application2_;
1341 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1342 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1344 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1351 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1352 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1353 return die_ss_("returned false", decoder);
1358 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1362 * respond all, ignore VORBIS_COMMENT
1365 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1366 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1367 return die_ss_("returned false", decoder);
1370 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
1371 if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1372 return die_ss_("returned false", decoder);
1376 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1377 expected_metadata_sequence_[num_expected_++] = &padding_;
1378 expected_metadata_sequence_[num_expected_++] = &seektable_;
1379 expected_metadata_sequence_[num_expected_++] = &application1_;
1380 expected_metadata_sequence_[num_expected_++] = &application2_;
1381 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1383 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1387 * respond all, ignore APPLICATION
1390 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1391 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1392 return die_ss_("returned false", decoder);
1395 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... ");
1396 if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
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_++] = &vorbiscomment_;
1405 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1407 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1411 * respond all, ignore APPLICATION id of app#1
1414 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1415 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1416 return die_ss_("returned false", decoder);
1419 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1420 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1421 return die_ss_("returned false", decoder);
1425 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1426 expected_metadata_sequence_[num_expected_++] = &padding_;
1427 expected_metadata_sequence_[num_expected_++] = &seektable_;
1428 expected_metadata_sequence_[num_expected_++] = &application2_;
1429 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1430 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1432 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1436 * respond all, ignore APPLICATION id of app#1 & app#2
1439 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1440 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1441 return die_ss_("returned false", decoder);
1444 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1445 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1446 return die_ss_("returned false", decoder);
1449 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #2)... ");
1450 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
1451 return die_ss_("returned false", decoder);
1455 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1456 expected_metadata_sequence_[num_expected_++] = &padding_;
1457 expected_metadata_sequence_[num_expected_++] = &seektable_;
1458 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1459 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1461 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1465 * ignore all, respond VORBIS_COMMENT
1468 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1469 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1470 return die_ss_("returned false", decoder);
1473 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
1474 if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1475 return die_ss_("returned false", decoder);
1479 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1481 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1485 * ignore all, respond APPLICATION
1488 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1489 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1490 return die_ss_("returned false", decoder);
1493 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... ");
1494 if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1495 return die_ss_("returned false", decoder);
1499 expected_metadata_sequence_[num_expected_++] = &application1_;
1500 expected_metadata_sequence_[num_expected_++] = &application2_;
1502 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1506 * ignore all, respond APPLICATION id of app#1
1509 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1510 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1511 return die_ss_("returned false", decoder);
1514 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1515 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1516 return die_ss_("returned false", decoder);
1520 expected_metadata_sequence_[num_expected_++] = &application1_;
1522 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1526 * ignore all, respond APPLICATION id of app#1 & app#2
1529 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1530 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1531 return die_ss_("returned false", decoder);
1534 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1535 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1536 return die_ss_("returned false", decoder);
1539 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #2)... ");
1540 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
1541 return die_ss_("returned false", decoder);
1545 expected_metadata_sequence_[num_expected_++] = &application1_;
1546 expected_metadata_sequence_[num_expected_++] = &application2_;
1548 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1552 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
1555 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1556 if(!FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1557 return die_ss_("returned false", decoder);
1560 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... ");
1561 if(!FLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1562 return die_ss_("returned false", decoder);
1565 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1566 if(!FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1567 return die_ss_("returned false", decoder);
1571 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1572 expected_metadata_sequence_[num_expected_++] = &padding_;
1573 expected_metadata_sequence_[num_expected_++] = &seektable_;
1574 expected_metadata_sequence_[num_expected_++] = &application1_;
1575 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1576 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1578 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1582 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
1585 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1586 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1587 return die_ss_("returned false", decoder);
1590 printf("testing FLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... ");
1591 if(!FLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1592 return die_ss_("returned false", decoder);
1595 printf("testing FLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1596 if(!FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1597 return die_ss_("returned false", decoder);
1601 expected_metadata_sequence_[num_expected_++] = &application2_;
1603 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1606 /* done, now leave the sequence the way we found it... */
1608 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1609 expected_metadata_sequence_[num_expected_++] = &padding_;
1610 expected_metadata_sequence_[num_expected_++] = &seektable_;
1611 expected_metadata_sequence_[num_expected_++] = &application1_;
1612 expected_metadata_sequence_[num_expected_++] = &application2_;
1613 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1614 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1616 printf("testing FLAC__seekable_stream_decoder_delete()... ");
1617 FLAC__seekable_stream_decoder_delete(decoder);
1620 fclose(decoder_client_data.file);
1622 printf("\nPASSED!\n");
1627 static FLAC__StreamDecoderWriteStatus file_decoder_write_callback_(const FLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
1630 return stream_decoder_write_callback_(0, frame, buffer, client_data);
1633 static void file_decoder_metadata_callback_(const FLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
1636 stream_decoder_metadata_callback_(0, metadata, client_data);
1639 static void file_decoder_error_callback_(const FLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
1642 stream_decoder_error_callback_(0, status, client_data);
1645 static FLAC__bool file_decoder_test_respond_(FLAC__FileDecoder *decoder, file_decoder_client_data_struct *dcd)
1647 if(!FLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
1648 return die_f_("at FLAC__file_decoder_set_write_callback(), returned false", decoder);
1650 if(!FLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
1651 return die_f_("at FLAC__file_decoder_set_metadata_callback(), returned false", decoder);
1653 if(!FLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
1654 return die_f_("at FLAC__file_decoder_set_error_callback(), returned false", decoder);
1656 if(!FLAC__file_decoder_set_client_data(decoder, dcd))
1657 return die_f_("at FLAC__file_decoder_set_client_data(), returned false", decoder);
1659 if(!FLAC__file_decoder_set_filename(decoder, flacfilename_))
1660 return die_f_("at FLAC__file_decoder_set_filename(), returned false", decoder);
1662 if(!FLAC__file_decoder_set_md5_checking(decoder, true))
1663 return die_f_("at FLAC__file_decoder_set_md5_checking(), returned false", decoder);
1665 printf("testing FLAC__file_decoder_init()... ");
1666 if(FLAC__file_decoder_init(decoder) != FLAC__FILE_DECODER_OK)
1667 return die_f_(0, decoder);
1670 dcd->current_metadata_number = 0;
1672 printf("testing FLAC__file_decoder_process_until_end_of_file()... ");
1673 if(!FLAC__file_decoder_process_until_end_of_file(decoder))
1674 return die_f_("returned false", decoder);
1677 printf("testing FLAC__file_decoder_finish()... ");
1678 (void) FLAC__file_decoder_finish(decoder);
1684 static FLAC__bool test_file_decoder()
1686 FLAC__FileDecoder *decoder;
1687 FLAC__FileDecoderState state;
1688 FLAC__SeekableStreamDecoderState ssstate;
1689 FLAC__StreamDecoderState sstate;
1690 seekable_stream_decoder_client_data_struct decoder_client_data;
1692 printf("\n+++ libFLAC unit test: FLAC__FileDecoder\n\n");
1694 printf("testing FLAC__file_decoder_new()... ");
1695 decoder = FLAC__file_decoder_new();
1697 printf("FAILED, returned NULL\n");
1702 printf("testing FLAC__file_decoder_delete()... ");
1703 FLAC__file_decoder_delete(decoder);
1706 printf("testing FLAC__file_decoder_new()... ");
1707 decoder = FLAC__file_decoder_new();
1709 printf("FAILED, returned NULL\n");
1714 printf("testing FLAC__file_decoder_init()... ");
1715 if(FLAC__file_decoder_init(decoder) == FLAC__FILE_DECODER_OK)
1716 return die_f_(0, decoder);
1719 printf("testing FLAC__file_decoder_delete()... ");
1720 FLAC__file_decoder_delete(decoder);
1724 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1726 printf("testing FLAC__file_decoder_new()... ");
1727 decoder = FLAC__file_decoder_new();
1729 printf("FAILED, returned NULL\n");
1734 printf("testing FLAC__file_decoder_set_write_callback()... ");
1735 if(!FLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
1736 return die_f_("returned false", decoder);
1739 printf("testing FLAC__file_decoder_set_metadata_callback()... ");
1740 if(!FLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
1741 return die_f_("returned false", decoder);
1744 printf("testing FLAC__file_decoder_set_error_callback()... ");
1745 if(!FLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
1746 return die_f_("returned false", decoder);
1749 printf("testing FLAC__file_decoder_set_client_data()... ");
1750 if(!FLAC__file_decoder_set_client_data(decoder, &decoder_client_data))
1751 return die_f_("returned false", decoder);
1754 printf("testing FLAC__file_decoder_set_filename()... ");
1755 if(!FLAC__file_decoder_set_filename(decoder, flacfilename_))
1756 return die_f_("returned false", decoder);
1759 printf("testing FLAC__file_decoder_set_md5_checking()... ");
1760 if(!FLAC__file_decoder_set_md5_checking(decoder, true))
1761 return die_f_("returned false", decoder);
1764 printf("testing FLAC__file_decoder_init()... ");
1765 if(FLAC__file_decoder_init(decoder) != FLAC__FILE_DECODER_OK)
1766 return die_f_(0, decoder);
1769 printf("testing FLAC__file_decoder_get_state()... ");
1770 state = FLAC__file_decoder_get_state(decoder);
1771 printf("returned state = %u (%s)... OK\n", state, FLAC__FileDecoderStateString[state]);
1773 printf("testing FLAC__file_decoder_get_seekable_stream_decoder_state()... ");
1774 ssstate = FLAC__file_decoder_get_seekable_stream_decoder_state(decoder);
1775 printf("returned state = %u (%s)... OK\n", ssstate, FLAC__SeekableStreamDecoderStateString[ssstate]);
1777 printf("testing FLAC__file_decoder_get_stream_decoder_state()... ");
1778 sstate = FLAC__file_decoder_get_stream_decoder_state(decoder);
1779 printf("returned state = %u (%s)... OK\n", sstate, FLAC__StreamDecoderStateString[sstate]);
1781 decoder_client_data.current_metadata_number = 0;
1782 decoder_client_data.ignore_errors = false;
1783 decoder_client_data.error_occurred = false;
1785 printf("testing FLAC__file_decoder_get_md5_checking()... ");
1786 if(!FLAC__file_decoder_get_md5_checking(decoder)) {
1787 printf("FAILED, returned false, expected true\n");
1792 printf("testing FLAC__file_decoder_process_until_end_of_metadata()... ");
1793 if(!FLAC__file_decoder_process_until_end_of_metadata(decoder))
1794 return die_f_("returned false", decoder);
1797 printf("testing FLAC__file_decoder_process_single()... ");
1798 if(!FLAC__file_decoder_process_single(decoder))
1799 return die_f_("returned false", decoder);
1802 printf("testing FLAC__file_decoder_seek_absolute()... ");
1803 if(!FLAC__file_decoder_seek_absolute(decoder, 0))
1804 return die_f_("returned false", decoder);
1807 printf("testing FLAC__file_decoder_process_until_end_of_file()... ");
1808 if(!FLAC__file_decoder_process_until_end_of_file(decoder))
1809 return die_f_("returned false", decoder);
1812 printf("testing FLAC__file_decoder_get_channels()... ");
1814 unsigned channels = FLAC__file_decoder_get_channels(decoder);
1815 if(channels != streaminfo_.data.stream_info.channels) {
1816 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
1822 printf("testing FLAC__file_decoder_get_bits_per_sample()... ");
1824 unsigned bits_per_sample = FLAC__file_decoder_get_bits_per_sample(decoder);
1825 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
1826 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
1832 printf("testing FLAC__file_decoder_get_sample_rate()... ");
1834 unsigned sample_rate = FLAC__file_decoder_get_sample_rate(decoder);
1835 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
1836 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
1842 printf("testing FLAC__file_decoder_get_blocksize()... ");
1844 unsigned blocksize = FLAC__file_decoder_get_blocksize(decoder);
1845 /* value could be anything since we're at the last block, so accept any answer */
1846 printf("returned %u... OK\n", blocksize);
1849 printf("testing FLAC__file_decoder_get_channel_assignment()... ");
1851 FLAC__ChannelAssignment ca = FLAC__file_decoder_get_channel_assignment(decoder);
1852 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1855 printf("testing FLAC__file_decoder_finish()... ");
1856 (void) FLAC__file_decoder_finish(decoder);
1863 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1864 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1865 return die_f_("returned false", decoder);
1869 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1870 expected_metadata_sequence_[num_expected_++] = &padding_;
1871 expected_metadata_sequence_[num_expected_++] = &seektable_;
1872 expected_metadata_sequence_[num_expected_++] = &application1_;
1873 expected_metadata_sequence_[num_expected_++] = &application2_;
1874 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1875 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1877 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1884 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
1885 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
1886 return die_f_("returned false", decoder);
1891 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1895 * respond all, ignore VORBIS_COMMENT
1898 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1899 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1900 return die_f_("returned false", decoder);
1903 printf("testing FLAC__file_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
1904 if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1905 return die_f_("returned false", decoder);
1909 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1910 expected_metadata_sequence_[num_expected_++] = &padding_;
1911 expected_metadata_sequence_[num_expected_++] = &seektable_;
1912 expected_metadata_sequence_[num_expected_++] = &application1_;
1913 expected_metadata_sequence_[num_expected_++] = &application2_;
1914 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1916 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1920 * respond all, ignore APPLICATION
1923 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1924 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1925 return die_f_("returned false", decoder);
1928 printf("testing FLAC__file_decoder_set_metadata_ignore(APPLICATION)... ");
1929 if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1930 return die_f_("returned false", decoder);
1934 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1935 expected_metadata_sequence_[num_expected_++] = &padding_;
1936 expected_metadata_sequence_[num_expected_++] = &seektable_;
1937 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1938 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1940 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1944 * respond all, ignore APPLICATION id of app#1
1947 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1948 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1949 return die_f_("returned false", decoder);
1952 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1953 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1954 return die_f_("returned false", decoder);
1958 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1959 expected_metadata_sequence_[num_expected_++] = &padding_;
1960 expected_metadata_sequence_[num_expected_++] = &seektable_;
1961 expected_metadata_sequence_[num_expected_++] = &application2_;
1962 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1963 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1965 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1969 * respond all, ignore APPLICATION id of app#1 & app#2
1972 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
1973 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
1974 return die_f_("returned false", decoder);
1977 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1978 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1979 return die_f_("returned false", decoder);
1982 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #2)... ");
1983 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
1984 return die_f_("returned false", decoder);
1988 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1989 expected_metadata_sequence_[num_expected_++] = &padding_;
1990 expected_metadata_sequence_[num_expected_++] = &seektable_;
1991 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1992 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1994 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1998 * ignore all, respond VORBIS_COMMENT
2001 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
2002 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
2003 return die_f_("returned false", decoder);
2006 printf("testing FLAC__file_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
2007 if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
2008 return die_f_("returned false", decoder);
2012 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
2014 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2018 * ignore all, respond APPLICATION
2021 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
2022 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
2023 return die_f_("returned false", decoder);
2026 printf("testing FLAC__file_decoder_set_metadata_respond(APPLICATION)... ");
2027 if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
2028 return die_f_("returned false", decoder);
2032 expected_metadata_sequence_[num_expected_++] = &application1_;
2033 expected_metadata_sequence_[num_expected_++] = &application2_;
2035 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2039 * ignore all, respond APPLICATION id of app#1
2042 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
2043 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
2044 return die_f_("returned false", decoder);
2047 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
2048 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
2049 return die_f_("returned false", decoder);
2053 expected_metadata_sequence_[num_expected_++] = &application1_;
2055 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2059 * ignore all, respond APPLICATION id of app#1 & app#2
2062 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
2063 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
2064 return die_f_("returned false", decoder);
2067 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
2068 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
2069 return die_f_("returned false", decoder);
2072 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #2)... ");
2073 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
2074 return die_f_("returned false", decoder);
2078 expected_metadata_sequence_[num_expected_++] = &application1_;
2079 expected_metadata_sequence_[num_expected_++] = &application2_;
2081 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2085 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
2088 printf("testing FLAC__file_decoder_set_metadata_respond_all()... ");
2089 if(!FLAC__file_decoder_set_metadata_respond_all(decoder))
2090 return die_f_("returned false", decoder);
2093 printf("testing FLAC__file_decoder_set_metadata_ignore(APPLICATION)... ");
2094 if(!FLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
2095 return die_f_("returned false", decoder);
2098 printf("testing FLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
2099 if(!FLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
2100 return die_f_("returned false", decoder);
2104 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
2105 expected_metadata_sequence_[num_expected_++] = &padding_;
2106 expected_metadata_sequence_[num_expected_++] = &seektable_;
2107 expected_metadata_sequence_[num_expected_++] = &application1_;
2108 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
2109 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
2111 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2115 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
2118 printf("testing FLAC__file_decoder_set_metadata_ignore_all()... ");
2119 if(!FLAC__file_decoder_set_metadata_ignore_all(decoder))
2120 return die_f_("returned false", decoder);
2123 printf("testing FLAC__file_decoder_set_metadata_respond(APPLICATION)... ");
2124 if(!FLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
2125 return die_f_("returned false", decoder);
2128 printf("testing FLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
2129 if(!FLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
2130 return die_f_("returned false", decoder);
2134 expected_metadata_sequence_[num_expected_++] = &application2_;
2136 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2139 /* done, now leave the sequence the way we found it... */
2141 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
2142 expected_metadata_sequence_[num_expected_++] = &padding_;
2143 expected_metadata_sequence_[num_expected_++] = &seektable_;
2144 expected_metadata_sequence_[num_expected_++] = &application1_;
2145 expected_metadata_sequence_[num_expected_++] = &application2_;
2146 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
2147 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
2149 printf("testing FLAC__file_decoder_delete()... ");
2150 FLAC__file_decoder_delete(decoder);
2153 printf("\nPASSED!\n");
2158 FLAC__bool test_decoders()
2160 init_metadata_blocks_();
2161 if(!generate_file_())
2164 if(!test_stream_decoder())
2167 if(!test_seekable_stream_decoder())
2170 if(!test_file_decoder())
2173 (void) grabbag__file_remove_file(flacfilename_);
2174 free_metadata_blocks_();