1 /* test_libOggFLAC - Unit tester for libOggFLAC
2 * Copyright (C) 2002,2003,2004 Josh Coalson
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 #include "file_utils.h"
21 #include "metadata_utils.h"
22 #include "FLAC/assert.h"
23 #include "OggFLAC/file_decoder.h"
24 #include "OggFLAC/seekable_stream_decoder.h"
25 #include "OggFLAC/stream_decoder.h"
26 #include "share/grabbag.h"
34 unsigned current_metadata_number;
35 FLAC__bool ignore_errors;
36 FLAC__bool error_occurred;
37 } stream_decoder_client_data_struct;
39 typedef stream_decoder_client_data_struct seekable_stream_decoder_client_data_struct;
40 typedef stream_decoder_client_data_struct file_decoder_client_data_struct;
42 static FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_, cuesheet_, unknown_;
43 static FLAC__StreamMetadata *expected_metadata_sequence_[8];
44 static unsigned num_expected_;
45 static const char *oggflacfilename_ = "metadata.ogg";
46 static unsigned oggflacfilesize_;
48 static FLAC__bool die_(const char *msg)
50 printf("ERROR: %s\n", msg);
54 static FLAC__bool die_s_(const char *msg, const OggFLAC__StreamDecoder *decoder)
56 OggFLAC__StreamDecoderState state = OggFLAC__stream_decoder_get_state(decoder);
59 printf("FAILED, %s", msg);
63 printf(", state = %u (%s)\n", (unsigned)state, OggFLAC__StreamDecoderStateString[state]);
64 if(state == OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR) {
65 FLAC__StreamDecoderState state_ = OggFLAC__stream_decoder_get_FLAC_stream_decoder_state(decoder);
66 printf(" FLAC stream decoder state = %u (%s)\n", (unsigned)state_, FLAC__StreamDecoderStateString[state_]);
72 static FLAC__bool die_ss_(const char *msg, const OggFLAC__SeekableStreamDecoder *decoder)
74 OggFLAC__SeekableStreamDecoderState state = OggFLAC__seekable_stream_decoder_get_state(decoder);
77 printf("FAILED, %s", msg);
81 printf(", state = %u (%s)\n", (unsigned)state, OggFLAC__SeekableStreamDecoderStateString[state]);
82 if(state == OggFLAC__SEEKABLE_STREAM_DECODER_FLAC_SEEKABLE_STREAM_DECODER_ERROR) {
83 FLAC__SeekableStreamDecoderState state_ = OggFLAC__seekable_stream_decoder_get_FLAC_seekable_stream_decoder_state(decoder);
84 printf(" FLAC seekable stream decoder state = %u (%s)\n", (unsigned)state_, FLAC__SeekableStreamDecoderStateString[state_]);
85 if(state_ == FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR) {
86 FLAC__StreamDecoderState state__ = OggFLAC__seekable_stream_decoder_get_FLAC_stream_decoder_state(decoder);
87 printf(" FLAC stream decoder state = %u (%s)\n", (unsigned)state__, FLAC__StreamDecoderStateString[state__]);
94 static FLAC__bool die_f_(const char *msg, const OggFLAC__FileDecoder *decoder)
96 OggFLAC__FileDecoderState state = OggFLAC__file_decoder_get_state(decoder);
99 printf("FAILED, %s", msg);
103 printf(", state = %u (%s)\n", (unsigned)state, OggFLAC__SeekableStreamDecoderStateString[state]);
104 if(state == OggFLAC__FILE_DECODER_SEEKABLE_STREAM_DECODER_ERROR) {
105 OggFLAC__SeekableStreamDecoderState state_ = OggFLAC__file_decoder_get_seekable_stream_decoder_state(decoder);
106 printf(" seekable stream decoder state = %u (%s)\n", (unsigned)state_, OggFLAC__SeekableStreamDecoderStateString[state_]);
107 if(state_ == OggFLAC__SEEKABLE_STREAM_DECODER_FLAC_SEEKABLE_STREAM_DECODER_ERROR) {
108 FLAC__SeekableStreamDecoderState state__ = OggFLAC__file_decoder_get_FLAC_seekable_stream_decoder_state(decoder);
109 printf(" FLAC seekable stream decoder state = %u (%s)\n", (unsigned)state__, FLAC__SeekableStreamDecoderStateString[state__]);
110 if(state__ == FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR) {
111 FLAC__StreamDecoderState state___ = OggFLAC__file_decoder_get_FLAC_stream_decoder_state(decoder);
112 printf(" FLAC stream decoder state = %u (%s)\n", (unsigned)state___, FLAC__StreamDecoderStateString[state___]);
120 static void init_metadata_blocks_()
122 mutils__init_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);
125 static void free_metadata_blocks_()
127 mutils__free_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);
130 static FLAC__bool generate_file_()
132 printf("\n\ngenerating Ogg FLAC file for decoder tests...\n");
135 expected_metadata_sequence_[num_expected_++] = &padding_;
136 expected_metadata_sequence_[num_expected_++] = &seektable_;
137 expected_metadata_sequence_[num_expected_++] = &application1_;
138 expected_metadata_sequence_[num_expected_++] = &application2_;
139 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
140 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
141 expected_metadata_sequence_[num_expected_++] = &unknown_;
143 if(!file_utils__generate_oggflacfile(oggflacfilename_, &oggflacfilesize_, 512 * 1024, &streaminfo_, expected_metadata_sequence_, num_expected_))
144 return die_("creating the encoded file");
149 static FLAC__StreamDecoderReadStatus stream_decoder_read_callback_(const OggFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
151 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
156 printf("ERROR: client_data in read callback is NULL\n");
157 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
160 if(dcd->error_occurred)
161 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
163 if(feof(dcd->file)) {
165 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
167 else if(*bytes > 0) {
168 *bytes = fread(buffer, 1, *bytes, dcd->file);
171 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
173 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
176 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
180 return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */
183 static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const OggFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
185 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
187 (void)decoder, (void)buffer;
190 printf("ERROR: client_data in write callback is NULL\n");
191 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
194 if(dcd->error_occurred)
195 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
198 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER && frame->header.number.frame_number == 0) ||
199 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER && frame->header.number.sample_number == 0)
201 printf("content... ");
205 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
208 static void stream_decoder_metadata_callback_(const OggFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
210 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
215 printf("ERROR: client_data in metadata callback is NULL\n");
219 if(dcd->error_occurred)
222 printf("%d... ", dcd->current_metadata_number);
225 if(dcd->current_metadata_number >= num_expected_) {
226 (void)die_("got more metadata blocks than expected");
227 dcd->error_occurred = true;
230 if(!mutils__compare_block(expected_metadata_sequence_[dcd->current_metadata_number], metadata)) {
231 (void)die_("metadata block mismatch");
232 dcd->error_occurred = true;
235 dcd->current_metadata_number++;
238 static void stream_decoder_error_callback_(const OggFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
240 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
245 printf("ERROR: client_data in error callback is NULL\n");
249 if(!dcd->ignore_errors) {
250 printf("ERROR: got error callback: err = %u (%s)\n", (unsigned)status, FLAC__StreamDecoderErrorStatusString[status]);
251 dcd->error_occurred = true;
255 static FLAC__bool stream_decoder_test_respond_(OggFLAC__StreamDecoder *decoder, stream_decoder_client_data_struct *dcd)
257 if(!OggFLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))
258 return die_s_("at OggFLAC__stream_decoder_set_read_callback(), returned false", decoder);
260 if(!OggFLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))
261 return die_s_("at OggFLAC__stream_decoder_set_write_callback(), returned false", decoder);
263 if(!OggFLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))
264 return die_s_("at OggFLAC__stream_decoder_set_metadata_callback(), returned false", decoder);
266 if(!OggFLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))
267 return die_s_("at OggFLAC__stream_decoder_set_error_callback(), returned false", decoder);
269 if(!OggFLAC__stream_decoder_set_client_data(decoder, dcd))
270 return die_s_("at OggFLAC__stream_decoder_set_client_data(), returned false", decoder);
272 printf("testing OggFLAC__stream_decoder_init()... ");
273 if(OggFLAC__stream_decoder_init(decoder) != OggFLAC__STREAM_DECODER_OK)
274 return die_s_(0, decoder);
277 dcd->current_metadata_number = 0;
279 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
280 printf("FAILED rewinding input, errno = %d\n", errno);
284 printf("testing OggFLAC__stream_decoder_process_until_end_of_stream()... ");
285 if(!OggFLAC__stream_decoder_process_until_end_of_stream(decoder))
286 return die_s_("returned false", decoder);
289 printf("testing OggFLAC__stream_decoder_finish()... ");
290 OggFLAC__stream_decoder_finish(decoder);
296 static FLAC__bool test_stream_decoder()
298 OggFLAC__StreamDecoder *decoder;
299 OggFLAC__StreamDecoderState state;
300 FLAC__StreamDecoderState fstate;
301 stream_decoder_client_data_struct decoder_client_data;
303 printf("\n+++ libOggFLAC unit test: OggFLAC__StreamDecoder\n\n");
305 printf("testing OggFLAC__stream_decoder_new()... ");
306 decoder = OggFLAC__stream_decoder_new();
308 printf("FAILED, returned NULL\n");
313 printf("testing OggFLAC__stream_decoder_delete()... ");
314 OggFLAC__stream_decoder_delete(decoder);
317 printf("testing OggFLAC__stream_decoder_new()... ");
318 decoder = OggFLAC__stream_decoder_new();
320 printf("FAILED, returned NULL\n");
325 printf("testing OggFLAC__stream_decoder_init()... ");
326 if(OggFLAC__stream_decoder_init(decoder) == OggFLAC__STREAM_DECODER_OK)
327 return die_s_(0, decoder);
330 printf("testing OggFLAC__stream_decoder_delete()... ");
331 OggFLAC__stream_decoder_delete(decoder);
335 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
337 printf("testing OggFLAC__stream_decoder_new()... ");
338 decoder = OggFLAC__stream_decoder_new();
340 printf("FAILED, returned NULL\n");
345 printf("testing OggFLAC__stream_decoder_set_serial_number()... ");
346 if(!OggFLAC__stream_decoder_set_serial_number(decoder, file_utils__serial_number))
347 return die_s_("returned false", decoder);
350 printf("testing OggFLAC__stream_decoder_set_read_callback()... ");
351 if(!OggFLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))
352 return die_s_("returned false", decoder);
355 printf("testing OggFLAC__stream_decoder_set_write_callback()... ");
356 if(!OggFLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))
357 return die_s_("returned false", decoder);
360 printf("testing OggFLAC__stream_decoder_set_metadata_callback()... ");
361 if(!OggFLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))
362 return die_s_("returned false", decoder);
365 printf("testing OggFLAC__stream_decoder_set_error_callback()... ");
366 if(!OggFLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))
367 return die_s_("returned false", decoder);
370 printf("testing OggFLAC__stream_decoder_set_client_data()... ");
371 if(!OggFLAC__stream_decoder_set_client_data(decoder, &decoder_client_data))
372 return die_s_("returned false", decoder);
375 printf("testing OggFLAC__stream_decoder_init()... ");
376 if(OggFLAC__stream_decoder_init(decoder) != OggFLAC__STREAM_DECODER_OK)
377 return die_s_(0, decoder);
380 printf("testing OggFLAC__stream_decoder_get_state()... ");
381 state = OggFLAC__stream_decoder_get_state(decoder);
382 printf("returned state = %u (%s)... OK\n", state, OggFLAC__StreamDecoderStateString[state]);
384 printf("testing OggFLAC__stream_decoder_get_FLAC_stream_decoder_state()... ");
385 fstate = OggFLAC__stream_decoder_get_FLAC_stream_decoder_state(decoder);
386 printf("returned state = %u (%s)... OK\n", fstate, FLAC__StreamDecoderStateString[fstate]);
388 decoder_client_data.current_metadata_number = 0;
389 decoder_client_data.ignore_errors = false;
390 decoder_client_data.error_occurred = false;
392 printf("opening Ogg FLAC file... ");
393 decoder_client_data.file = fopen(oggflacfilename_, "rb");
394 if(0 == decoder_client_data.file) {
400 printf("testing OggFLAC__stream_decoder_process_until_end_of_metadata()... ");
401 if(!OggFLAC__stream_decoder_process_until_end_of_metadata(decoder))
402 return die_s_("returned false", decoder);
405 printf("testing OggFLAC__stream_decoder_process_single()... ");
406 if(!OggFLAC__stream_decoder_process_single(decoder))
407 return die_s_("returned false", decoder);
410 printf("testing OggFLAC__stream_decoder_flush()... ");
411 if(!OggFLAC__stream_decoder_flush(decoder))
412 return die_s_("returned false", decoder);
415 decoder_client_data.ignore_errors = true;
416 printf("testing OggFLAC__stream_decoder_process_single()... ");
417 if(!OggFLAC__stream_decoder_process_single(decoder))
418 return die_s_("returned false", decoder);
420 decoder_client_data.ignore_errors = false;
422 printf("testing OggFLAC__stream_decoder_process_until_end_of_stream()... ");
423 if(!OggFLAC__stream_decoder_process_until_end_of_stream(decoder))
424 return die_s_("returned false", decoder);
427 printf("testing OggFLAC__stream_decoder_get_channels()... ");
429 unsigned channels = OggFLAC__stream_decoder_get_channels(decoder);
430 if(channels != streaminfo_.data.stream_info.channels) {
431 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
437 printf("testing OggFLAC__stream_decoder_get_bits_per_sample()... ");
439 unsigned bits_per_sample = OggFLAC__stream_decoder_get_bits_per_sample(decoder);
440 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
441 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
447 printf("testing OggFLAC__stream_decoder_get_sample_rate()... ");
449 unsigned sample_rate = OggFLAC__stream_decoder_get_sample_rate(decoder);
450 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
451 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
457 printf("testing OggFLAC__stream_decoder_get_blocksize()... ");
459 unsigned blocksize = OggFLAC__stream_decoder_get_blocksize(decoder);
460 /* value could be anything since we're at the last block, so accept any answer */
461 printf("returned %u... OK\n", blocksize);
464 printf("testing OggFLAC__stream_decoder_get_channel_assignment()... ");
466 FLAC__ChannelAssignment ca = OggFLAC__stream_decoder_get_channel_assignment(decoder);
467 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
470 printf("testing OggFLAC__stream_decoder_reset()... ");
471 if(!OggFLAC__stream_decoder_reset(decoder)) {
472 state = OggFLAC__stream_decoder_get_state(decoder);
473 printf("FAILED, returned false, state = %u (%s)\n", state, FLAC__StreamDecoderStateString[state]);
478 decoder_client_data.current_metadata_number = 0;
480 printf("rewinding input... ");
481 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
482 printf("FAILED, errno = %d\n", errno);
487 printf("testing OggFLAC__stream_decoder_process_until_end_of_stream()... ");
488 if(!OggFLAC__stream_decoder_process_until_end_of_stream(decoder))
489 return die_s_("returned false", decoder);
492 printf("testing OggFLAC__stream_decoder_finish()... ");
493 OggFLAC__stream_decoder_finish(decoder);
500 printf("testing OggFLAC__stream_decoder_set_metadata_respond_all()... ");
501 if(!OggFLAC__stream_decoder_set_metadata_respond_all(decoder))
502 return die_s_("returned false", decoder);
506 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
507 expected_metadata_sequence_[num_expected_++] = &padding_;
508 expected_metadata_sequence_[num_expected_++] = &seektable_;
509 expected_metadata_sequence_[num_expected_++] = &application1_;
510 expected_metadata_sequence_[num_expected_++] = &application2_;
511 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
512 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
513 expected_metadata_sequence_[num_expected_++] = &unknown_;
515 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
522 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_all()... ");
523 if(!OggFLAC__stream_decoder_set_metadata_ignore_all(decoder))
524 return die_s_("returned false", decoder);
529 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
533 * respond all, ignore VORBIS_COMMENT
536 printf("testing OggFLAC__stream_decoder_set_metadata_respond_all()... ");
537 if(!OggFLAC__stream_decoder_set_metadata_respond_all(decoder))
538 return die_s_("returned false", decoder);
541 printf("testing OggFLAC__stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
542 if(!OggFLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
543 return die_s_("returned false", decoder);
547 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
548 expected_metadata_sequence_[num_expected_++] = &padding_;
549 expected_metadata_sequence_[num_expected_++] = &seektable_;
550 expected_metadata_sequence_[num_expected_++] = &application1_;
551 expected_metadata_sequence_[num_expected_++] = &application2_;
552 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
553 expected_metadata_sequence_[num_expected_++] = &unknown_;
555 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
559 * respond all, ignore APPLICATION
562 printf("testing OggFLAC__stream_decoder_set_metadata_respond_all()... ");
563 if(!OggFLAC__stream_decoder_set_metadata_respond_all(decoder))
564 return die_s_("returned false", decoder);
567 printf("testing OggFLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
568 if(!OggFLAC__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_;
577 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
578 expected_metadata_sequence_[num_expected_++] = &unknown_;
580 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
584 * respond all, ignore APPLICATION id of app#1
587 printf("testing OggFLAC__stream_decoder_set_metadata_respond_all()... ");
588 if(!OggFLAC__stream_decoder_set_metadata_respond_all(decoder))
589 return die_s_("returned false", decoder);
592 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
593 if(!OggFLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
594 return die_s_("returned false", decoder);
598 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
599 expected_metadata_sequence_[num_expected_++] = &padding_;
600 expected_metadata_sequence_[num_expected_++] = &seektable_;
601 expected_metadata_sequence_[num_expected_++] = &application2_;
602 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
603 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
604 expected_metadata_sequence_[num_expected_++] = &unknown_;
606 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
610 * respond all, ignore APPLICATION id of app#1 & app#2
613 printf("testing OggFLAC__stream_decoder_set_metadata_respond_all()... ");
614 if(!OggFLAC__stream_decoder_set_metadata_respond_all(decoder))
615 return die_s_("returned false", decoder);
618 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
619 if(!OggFLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
620 return die_s_("returned false", decoder);
623 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_application(of app block #2)... ");
624 if(!OggFLAC__stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
625 return die_s_("returned false", decoder);
629 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
630 expected_metadata_sequence_[num_expected_++] = &padding_;
631 expected_metadata_sequence_[num_expected_++] = &seektable_;
632 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
633 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
634 expected_metadata_sequence_[num_expected_++] = &unknown_;
636 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
640 * ignore all, respond VORBIS_COMMENT
643 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_all()... ");
644 if(!OggFLAC__stream_decoder_set_metadata_ignore_all(decoder))
645 return die_s_("returned false", decoder);
648 printf("testing OggFLAC__stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
649 if(!OggFLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
650 return die_s_("returned false", decoder);
654 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
656 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
660 * ignore all, respond APPLICATION
663 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_all()... ");
664 if(!OggFLAC__stream_decoder_set_metadata_ignore_all(decoder))
665 return die_s_("returned false", decoder);
668 printf("testing OggFLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
669 if(!OggFLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
670 return die_s_("returned false", decoder);
674 expected_metadata_sequence_[num_expected_++] = &application1_;
675 expected_metadata_sequence_[num_expected_++] = &application2_;
677 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
681 * ignore all, respond APPLICATION id of app#1
684 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_all()... ");
685 if(!OggFLAC__stream_decoder_set_metadata_ignore_all(decoder))
686 return die_s_("returned false", decoder);
689 printf("testing OggFLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
690 if(!OggFLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
691 return die_s_("returned false", decoder);
695 expected_metadata_sequence_[num_expected_++] = &application1_;
697 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
701 * ignore all, respond APPLICATION id of app#1 & app#2
704 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_all()... ");
705 if(!OggFLAC__stream_decoder_set_metadata_ignore_all(decoder))
706 return die_s_("returned false", decoder);
709 printf("testing OggFLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
710 if(!OggFLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
711 return die_s_("returned false", decoder);
714 printf("testing OggFLAC__stream_decoder_set_metadata_respond_application(of app block #2)... ");
715 if(!OggFLAC__stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
716 return die_s_("returned false", decoder);
720 expected_metadata_sequence_[num_expected_++] = &application1_;
721 expected_metadata_sequence_[num_expected_++] = &application2_;
723 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
727 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
730 printf("testing OggFLAC__stream_decoder_set_metadata_respond_all()... ");
731 if(!OggFLAC__stream_decoder_set_metadata_respond_all(decoder))
732 return die_s_("returned false", decoder);
735 printf("testing OggFLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
736 if(!OggFLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
737 return die_s_("returned false", decoder);
740 printf("testing OggFLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
741 if(!OggFLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
742 return die_s_("returned false", decoder);
746 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
747 expected_metadata_sequence_[num_expected_++] = &padding_;
748 expected_metadata_sequence_[num_expected_++] = &seektable_;
749 expected_metadata_sequence_[num_expected_++] = &application1_;
750 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
751 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
752 expected_metadata_sequence_[num_expected_++] = &unknown_;
754 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
758 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
761 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_all()... ");
762 if(!OggFLAC__stream_decoder_set_metadata_ignore_all(decoder))
763 return die_s_("returned false", decoder);
766 printf("testing OggFLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
767 if(!OggFLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
768 return die_s_("returned false", decoder);
771 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
772 if(!OggFLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
773 return die_s_("returned false", decoder);
777 expected_metadata_sequence_[num_expected_++] = &application2_;
779 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
782 /* done, now leave the sequence the way we found it... */
784 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
785 expected_metadata_sequence_[num_expected_++] = &padding_;
786 expected_metadata_sequence_[num_expected_++] = &seektable_;
787 expected_metadata_sequence_[num_expected_++] = &application1_;
788 expected_metadata_sequence_[num_expected_++] = &application2_;
789 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
790 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
791 expected_metadata_sequence_[num_expected_++] = &unknown_;
793 printf("testing OggFLAC__stream_decoder_delete()... ");
794 OggFLAC__stream_decoder_delete(decoder);
797 fclose(decoder_client_data.file);
799 printf("\nPASSED!\n");
804 static FLAC__SeekableStreamDecoderReadStatus seekable_stream_decoder_read_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
807 switch(stream_decoder_read_callback_(0, buffer, bytes, client_data)) {
808 case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE:
809 case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM:
810 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK;
811 case FLAC__STREAM_DECODER_READ_STATUS_ABORT:
812 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
815 return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
819 static FLAC__SeekableStreamDecoderSeekStatus seekable_stream_decoder_seek_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
821 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
826 printf("ERROR: client_data in seek callback is NULL\n");
827 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
830 if(dcd->error_occurred)
831 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
833 if(fseek(dcd->file, (long)absolute_byte_offset, SEEK_SET) < 0) {
834 dcd->error_occurred = true;
835 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
838 return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK;
841 static FLAC__SeekableStreamDecoderTellStatus seekable_stream_decoder_tell_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
843 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
849 printf("ERROR: client_data in tell callback is NULL\n");
850 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
853 if(dcd->error_occurred)
854 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
856 offset = ftell(dcd->file);
857 *absolute_byte_offset = (FLAC__uint64)offset;
860 dcd->error_occurred = true;
861 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
864 return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK;
867 static FLAC__SeekableStreamDecoderLengthStatus seekable_stream_decoder_length_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
869 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
874 printf("ERROR: client_data in length callback is NULL\n");
875 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
878 if(dcd->error_occurred)
879 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
881 *stream_length = (FLAC__uint64)oggflacfilesize_;
882 return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK;
885 static FLAC__bool seekable_stream_decoder_eof_callback_(const OggFLAC__SeekableStreamDecoder *decoder, void *client_data)
887 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
892 printf("ERROR: client_data in eof callback is NULL\n");
896 if(dcd->error_occurred)
899 return feof(dcd->file);
902 static FLAC__StreamDecoderWriteStatus seekable_stream_decoder_write_callback_(const OggFLAC__SeekableStreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
905 return stream_decoder_write_callback_(0, frame, buffer, client_data);
908 static void seekable_stream_decoder_metadata_callback_(const OggFLAC__SeekableStreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
911 stream_decoder_metadata_callback_(0, metadata, client_data);
914 static void seekable_stream_decoder_error_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
917 stream_decoder_error_callback_(0, status, client_data);
920 static FLAC__bool seekable_stream_decoder_test_respond_(OggFLAC__SeekableStreamDecoder *decoder, seekable_stream_decoder_client_data_struct *dcd)
922 if(!OggFLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_))
923 return die_ss_("at OggFLAC__seekable_stream_decoder_set_read_callback(), returned false", decoder);
925 if(!OggFLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_))
926 return die_ss_("at OggFLAC__seekable_stream_decoder_set_seek_callback(), returned false", decoder);
928 if(!OggFLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_))
929 return die_ss_("at OggFLAC__seekable_stream_decoder_set_tell_callback(), returned false", decoder);
931 if(!OggFLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_))
932 return die_ss_("at OggFLAC__seekable_stream_decoder_set_length_callback(), returned false", decoder);
934 if(!OggFLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_))
935 return die_ss_("at OggFLAC__seekable_stream_decoder_set_eof_callback(), returned false", decoder);
937 if(!OggFLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_))
938 return die_ss_("at OggFLAC__seekable_stream_decoder_set_write_callback(), returned false", decoder);
940 if(!OggFLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_))
941 return die_ss_("at OggFLAC__seekable_stream_decoder_set_metadata_callback(), returned false", decoder);
943 if(!OggFLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_))
944 return die_ss_("at OggFLAC__seekable_stream_decoder_set_error_callback(), returned false", decoder);
946 if(!OggFLAC__seekable_stream_decoder_set_client_data(decoder, dcd))
947 return die_ss_("at OggFLAC__seekable_stream_decoder_set_client_data(), returned false", decoder);
949 if(!OggFLAC__seekable_stream_decoder_set_md5_checking(decoder, true))
950 return die_ss_("at OggFLAC__seekable_stream_decoder_set_md5_checking(), returned false", decoder);
952 printf("testing OggFLAC__seekable_stream_decoder_init()... ");
953 if(OggFLAC__seekable_stream_decoder_init(decoder) != OggFLAC__SEEKABLE_STREAM_DECODER_OK)
954 return die_ss_(0, decoder);
957 dcd->current_metadata_number = 0;
959 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
960 printf("FAILED rewinding input, errno = %d\n", errno);
964 printf("testing OggFLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
965 if(!OggFLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
966 return die_ss_("returned false", decoder);
969 printf("testing OggFLAC__seekable_stream_decoder_finish()... ");
970 (void) OggFLAC__seekable_stream_decoder_finish(decoder);
976 static FLAC__bool test_seekable_stream_decoder()
978 OggFLAC__SeekableStreamDecoder *decoder;
979 OggFLAC__SeekableStreamDecoderState state;
980 FLAC__SeekableStreamDecoderState fsstate;
981 FLAC__StreamDecoderState fstate;
982 seekable_stream_decoder_client_data_struct decoder_client_data;
984 printf("\n+++ libOggFLAC unit test: OggFLAC__SeekableStreamDecoder\n\n");
986 printf("testing OggFLAC__seekable_stream_decoder_new()... ");
987 decoder = OggFLAC__seekable_stream_decoder_new();
989 printf("FAILED, returned NULL\n");
994 printf("testing OggFLAC__seekable_stream_decoder_delete()... ");
995 OggFLAC__seekable_stream_decoder_delete(decoder);
998 printf("testing OggFLAC__seekable_stream_decoder_new()... ");
999 decoder = OggFLAC__seekable_stream_decoder_new();
1001 printf("FAILED, returned NULL\n");
1006 printf("testing OggFLAC__seekable_stream_decoder_init()... ");
1007 if(OggFLAC__seekable_stream_decoder_init(decoder) == OggFLAC__SEEKABLE_STREAM_DECODER_OK)
1008 return die_ss_(0, decoder);
1011 printf("testing OggFLAC__seekable_stream_decoder_delete()... ");
1012 OggFLAC__seekable_stream_decoder_delete(decoder);
1016 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1018 printf("testing OggFLAC__seekable_stream_decoder_new()... ");
1019 decoder = OggFLAC__seekable_stream_decoder_new();
1021 printf("FAILED, returned NULL\n");
1026 printf("testing OggFLAC__seekable_stream_decoder_set_serial_number()... ");
1027 if(!OggFLAC__seekable_stream_decoder_set_serial_number(decoder, file_utils__serial_number))
1028 return die_ss_("returned false", decoder);
1031 printf("testing OggFLAC__seekable_stream_decoder_set_read_callback()... ");
1032 if(!OggFLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_))
1033 return die_ss_("returned false", decoder);
1036 printf("testing OggFLAC__seekable_stream_decoder_set_seek_callback()... ");
1037 if(!OggFLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_))
1038 return die_ss_("returned false", decoder);
1041 printf("testing OggFLAC__seekable_stream_decoder_set_tell_callback()... ");
1042 if(!OggFLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_))
1043 return die_ss_("returned false", decoder);
1046 printf("testing OggFLAC__seekable_stream_decoder_set_length_callback()... ");
1047 if(!OggFLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_))
1048 return die_ss_("returned false", decoder);
1051 printf("testing OggFLAC__seekable_stream_decoder_set_eof_callback()... ");
1052 if(!OggFLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_))
1053 return die_ss_("returned false", decoder);
1056 printf("testing OggFLAC__seekable_stream_decoder_set_write_callback()... ");
1057 if(!OggFLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_))
1058 return die_ss_("returned false", decoder);
1061 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_callback()... ");
1062 if(!OggFLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_))
1063 return die_ss_("returned false", decoder);
1066 printf("testing OggFLAC__seekable_stream_decoder_set_error_callback()... ");
1067 if(!OggFLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_))
1068 return die_ss_("returned false", decoder);
1071 printf("testing OggFLAC__seekable_stream_decoder_set_client_data()... ");
1072 if(!OggFLAC__seekable_stream_decoder_set_client_data(decoder, &decoder_client_data))
1073 return die_ss_("returned false", decoder);
1076 printf("testing OggFLAC__seekable_stream_decoder_set_md5_checking()... ");
1077 if(!OggFLAC__seekable_stream_decoder_set_md5_checking(decoder, true))
1078 return die_ss_("returned false", decoder);
1081 printf("testing OggFLAC__seekable_stream_decoder_init()... ");
1082 if(OggFLAC__seekable_stream_decoder_init(decoder) != OggFLAC__SEEKABLE_STREAM_DECODER_OK)
1083 return die_ss_(0, decoder);
1086 printf("testing OggFLAC__seekable_stream_decoder_get_state()... ");
1087 state = OggFLAC__seekable_stream_decoder_get_state(decoder);
1088 printf("returned state = %u (%s)... OK\n", state, OggFLAC__SeekableStreamDecoderStateString[state]);
1090 printf("testing OggFLAC__seekable_stream_decoder_get_FLAC_seekable_stream_decoder_state()... ");
1091 fsstate = OggFLAC__seekable_stream_decoder_get_FLAC_seekable_stream_decoder_state(decoder);
1092 printf("returned state = %u (%s)... OK\n", fsstate, FLAC__SeekableStreamDecoderStateString[fsstate]);
1094 printf("testing OggFLAC__seekable_stream_decoder_get_FLAC_stream_decoder_state()... ");
1095 fstate = OggFLAC__seekable_stream_decoder_get_FLAC_stream_decoder_state(decoder);
1096 printf("returned state = %u (%s)... OK\n", fstate, FLAC__StreamDecoderStateString[fstate]);
1098 decoder_client_data.current_metadata_number = 0;
1099 decoder_client_data.ignore_errors = false;
1100 decoder_client_data.error_occurred = false;
1102 printf("opening Ogg FLAC file... ");
1103 decoder_client_data.file = fopen(oggflacfilename_, "rb");
1104 if(0 == decoder_client_data.file) {
1110 printf("testing OggFLAC__seekable_stream_decoder_get_md5_checking()... ");
1111 if(!OggFLAC__seekable_stream_decoder_get_md5_checking(decoder)) {
1112 printf("FAILED, returned false, expected true\n");
1117 printf("testing OggFLAC__seekable_stream_decoder_process_until_end_of_metadata()... ");
1118 if(!OggFLAC__seekable_stream_decoder_process_until_end_of_metadata(decoder))
1119 return die_ss_("returned false", decoder);
1122 printf("testing OggFLAC__seekable_stream_decoder_process_single()... ");
1123 if(!OggFLAC__seekable_stream_decoder_process_single(decoder))
1124 return die_ss_("returned false", decoder);
1127 printf("testing OggFLAC__seekable_stream_decoder_flush()... ");
1128 if(!OggFLAC__seekable_stream_decoder_flush(decoder))
1129 return die_ss_("returned false", decoder);
1132 decoder_client_data.ignore_errors = true;
1133 printf("testing OggFLAC__seekable_stream_decoder_process_single()... ");
1134 if(!OggFLAC__seekable_stream_decoder_process_single(decoder))
1135 return die_ss_("returned false", decoder);
1137 decoder_client_data.ignore_errors = false;
1139 printf("testing OggFLAC__seekable_stream_decoder_seek_absolute()... ");
1140 if(!OggFLAC__seekable_stream_decoder_seek_absolute(decoder, 0))
1141 return die_ss_("returned false", decoder);
1144 printf("testing OggFLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
1145 if(!OggFLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
1146 return die_ss_("returned false", decoder);
1149 printf("testing OggFLAC__seekable_stream_decoder_get_channels()... ");
1151 unsigned channels = OggFLAC__seekable_stream_decoder_get_channels(decoder);
1152 if(channels != streaminfo_.data.stream_info.channels) {
1153 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
1159 printf("testing OggFLAC__seekable_stream_decoder_get_bits_per_sample()... ");
1161 unsigned bits_per_sample = OggFLAC__seekable_stream_decoder_get_bits_per_sample(decoder);
1162 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
1163 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
1169 printf("testing OggFLAC__seekable_stream_decoder_get_sample_rate()... ");
1171 unsigned sample_rate = OggFLAC__seekable_stream_decoder_get_sample_rate(decoder);
1172 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
1173 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
1179 printf("testing OggFLAC__seekable_stream_decoder_get_blocksize()... ");
1181 unsigned blocksize = OggFLAC__seekable_stream_decoder_get_blocksize(decoder);
1182 /* value could be anything since we're at the last block, so accept any answer */
1183 printf("returned %u... OK\n", blocksize);
1186 printf("testing OggFLAC__seekable_stream_decoder_get_channel_assignment()... ");
1188 FLAC__ChannelAssignment ca = OggFLAC__seekable_stream_decoder_get_channel_assignment(decoder);
1189 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1192 printf("testing OggFLAC__seekable_stream_decoder_reset()... ");
1193 if(!OggFLAC__seekable_stream_decoder_reset(decoder))
1194 return die_ss_("returned false", decoder);
1197 decoder_client_data.current_metadata_number = 0;
1199 printf("rewinding input... ");
1200 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
1201 printf("FAILED, errno = %d\n", errno);
1206 printf("testing OggFLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
1207 if(!OggFLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
1208 return die_ss_("returned false", decoder);
1211 printf("testing OggFLAC__seekable_stream_decoder_finish()... ");
1212 (void) OggFLAC__seekable_stream_decoder_finish(decoder);
1219 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1220 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1221 return die_ss_("returned false", decoder);
1225 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1226 expected_metadata_sequence_[num_expected_++] = &padding_;
1227 expected_metadata_sequence_[num_expected_++] = &seektable_;
1228 expected_metadata_sequence_[num_expected_++] = &application1_;
1229 expected_metadata_sequence_[num_expected_++] = &application2_;
1230 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1231 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1232 expected_metadata_sequence_[num_expected_++] = &unknown_;
1234 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1241 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1242 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1243 return die_ss_("returned false", decoder);
1248 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1252 * respond all, ignore VORBIS_COMMENT
1255 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1256 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1257 return die_ss_("returned false", decoder);
1260 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
1261 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1262 return die_ss_("returned false", decoder);
1266 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1267 expected_metadata_sequence_[num_expected_++] = &padding_;
1268 expected_metadata_sequence_[num_expected_++] = &seektable_;
1269 expected_metadata_sequence_[num_expected_++] = &application1_;
1270 expected_metadata_sequence_[num_expected_++] = &application2_;
1271 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1272 expected_metadata_sequence_[num_expected_++] = &unknown_;
1274 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1278 * respond all, ignore APPLICATION
1281 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1282 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1283 return die_ss_("returned false", decoder);
1286 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... ");
1287 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1288 return die_ss_("returned false", decoder);
1292 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1293 expected_metadata_sequence_[num_expected_++] = &padding_;
1294 expected_metadata_sequence_[num_expected_++] = &seektable_;
1295 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1296 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1297 expected_metadata_sequence_[num_expected_++] = &unknown_;
1299 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1303 * respond all, ignore APPLICATION id of app#1
1306 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1307 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1308 return die_ss_("returned false", decoder);
1311 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1312 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1313 return die_ss_("returned false", decoder);
1317 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1318 expected_metadata_sequence_[num_expected_++] = &padding_;
1319 expected_metadata_sequence_[num_expected_++] = &seektable_;
1320 expected_metadata_sequence_[num_expected_++] = &application2_;
1321 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1322 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1323 expected_metadata_sequence_[num_expected_++] = &unknown_;
1325 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1329 * respond all, ignore APPLICATION id of app#1 & app#2
1332 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1333 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1334 return die_ss_("returned false", decoder);
1337 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1338 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1339 return die_ss_("returned false", decoder);
1342 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #2)... ");
1343 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
1344 return die_ss_("returned false", decoder);
1348 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1349 expected_metadata_sequence_[num_expected_++] = &padding_;
1350 expected_metadata_sequence_[num_expected_++] = &seektable_;
1351 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1352 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1353 expected_metadata_sequence_[num_expected_++] = &unknown_;
1355 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1359 * ignore all, respond VORBIS_COMMENT
1362 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1363 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1364 return die_ss_("returned false", decoder);
1367 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
1368 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1369 return die_ss_("returned false", decoder);
1373 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1375 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1379 * ignore all, respond APPLICATION
1382 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1383 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1384 return die_ss_("returned false", decoder);
1387 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... ");
1388 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1389 return die_ss_("returned false", decoder);
1393 expected_metadata_sequence_[num_expected_++] = &application1_;
1394 expected_metadata_sequence_[num_expected_++] = &application2_;
1396 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1400 * ignore all, respond APPLICATION id of app#1
1403 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1404 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1405 return die_ss_("returned false", decoder);
1408 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1409 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1410 return die_ss_("returned false", decoder);
1414 expected_metadata_sequence_[num_expected_++] = &application1_;
1416 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1420 * ignore all, respond APPLICATION id of app#1 & app#2
1423 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1424 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1425 return die_ss_("returned false", decoder);
1428 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1429 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1430 return die_ss_("returned false", decoder);
1433 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #2)... ");
1434 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
1435 return die_ss_("returned false", decoder);
1439 expected_metadata_sequence_[num_expected_++] = &application1_;
1440 expected_metadata_sequence_[num_expected_++] = &application2_;
1442 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1446 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
1449 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1450 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1451 return die_ss_("returned false", decoder);
1454 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... ");
1455 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1456 return die_ss_("returned false", decoder);
1459 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1460 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1461 return die_ss_("returned false", decoder);
1465 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1466 expected_metadata_sequence_[num_expected_++] = &padding_;
1467 expected_metadata_sequence_[num_expected_++] = &seektable_;
1468 expected_metadata_sequence_[num_expected_++] = &application1_;
1469 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1470 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1471 expected_metadata_sequence_[num_expected_++] = &unknown_;
1473 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1477 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
1480 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1481 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1482 return die_ss_("returned false", decoder);
1485 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... ");
1486 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1487 return die_ss_("returned false", decoder);
1490 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1491 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1492 return die_ss_("returned false", decoder);
1496 expected_metadata_sequence_[num_expected_++] = &application2_;
1498 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1501 /* done, now leave the sequence the way we found it... */
1503 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1504 expected_metadata_sequence_[num_expected_++] = &padding_;
1505 expected_metadata_sequence_[num_expected_++] = &seektable_;
1506 expected_metadata_sequence_[num_expected_++] = &application1_;
1507 expected_metadata_sequence_[num_expected_++] = &application2_;
1508 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1509 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1510 expected_metadata_sequence_[num_expected_++] = &unknown_;
1512 printf("testing OggFLAC__seekable_stream_decoder_delete()... ");
1513 OggFLAC__seekable_stream_decoder_delete(decoder);
1516 fclose(decoder_client_data.file);
1518 printf("\nPASSED!\n");
1523 static FLAC__StreamDecoderWriteStatus file_decoder_write_callback_(const OggFLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
1526 return stream_decoder_write_callback_(0, frame, buffer, client_data);
1529 static void file_decoder_metadata_callback_(const OggFLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
1532 stream_decoder_metadata_callback_(0, metadata, client_data);
1535 static void file_decoder_error_callback_(const OggFLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
1538 stream_decoder_error_callback_(0, status, client_data);
1541 static FLAC__bool file_decoder_test_respond_(OggFLAC__FileDecoder *decoder, file_decoder_client_data_struct *dcd)
1543 if(!OggFLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
1544 return die_f_("at OggFLAC__file_decoder_set_write_callback(), returned false", decoder);
1546 if(!OggFLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
1547 return die_f_("at OggFLAC__file_decoder_set_metadata_callback(), returned false", decoder);
1549 if(!OggFLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
1550 return die_f_("at OggFLAC__file_decoder_set_error_callback(), returned false", decoder);
1552 if(!OggFLAC__file_decoder_set_client_data(decoder, dcd))
1553 return die_f_("at OggFLAC__file_decoder_set_client_data(), returned false", decoder);
1555 if(!OggFLAC__file_decoder_set_filename(decoder, oggflacfilename_))
1556 return die_f_("at OggFLAC__file_decoder_set_filename(), returned false", decoder);
1558 if(!OggFLAC__file_decoder_set_md5_checking(decoder, true))
1559 return die_f_("at OggFLAC__file_decoder_set_md5_checking(), returned false", decoder);
1561 printf("testing OggFLAC__file_decoder_init()... ");
1562 if(OggFLAC__file_decoder_init(decoder) != OggFLAC__FILE_DECODER_OK)
1563 return die_f_(0, decoder);
1566 dcd->current_metadata_number = 0;
1568 printf("testing OggFLAC__file_decoder_process_until_end_of_file()... ");
1569 if(!OggFLAC__file_decoder_process_until_end_of_file(decoder))
1570 return die_f_("returned false", decoder);
1573 printf("testing OggFLAC__file_decoder_finish()... ");
1574 (void) OggFLAC__file_decoder_finish(decoder);
1580 static FLAC__bool test_file_decoder()
1582 OggFLAC__FileDecoder *decoder;
1583 OggFLAC__FileDecoderState state;
1584 OggFLAC__SeekableStreamDecoderState sstate;
1585 FLAC__SeekableStreamDecoderState fsstate;
1586 FLAC__StreamDecoderState fstate;
1587 seekable_stream_decoder_client_data_struct decoder_client_data;
1589 printf("\n+++ libOggFLAC unit test: OggFLAC__FileDecoder\n\n");
1591 printf("testing OggFLAC__file_decoder_new()... ");
1592 decoder = OggFLAC__file_decoder_new();
1594 printf("FAILED, returned NULL\n");
1599 printf("testing OggFLAC__file_decoder_delete()... ");
1600 OggFLAC__file_decoder_delete(decoder);
1603 printf("testing OggFLAC__file_decoder_new()... ");
1604 decoder = OggFLAC__file_decoder_new();
1606 printf("FAILED, returned NULL\n");
1611 printf("testing OggFLAC__file_decoder_init()... ");
1612 if(OggFLAC__file_decoder_init(decoder) == OggFLAC__FILE_DECODER_OK)
1613 return die_f_(0, decoder);
1616 printf("testing OggFLAC__file_decoder_delete()... ");
1617 OggFLAC__file_decoder_delete(decoder);
1621 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1623 printf("testing OggFLAC__file_decoder_new()... ");
1624 decoder = OggFLAC__file_decoder_new();
1626 printf("FAILED, returned NULL\n");
1631 printf("testing OggFLAC__file_decoder_set_serial_number()... ");
1632 if(!OggFLAC__file_decoder_set_serial_number(decoder, file_utils__serial_number))
1633 return die_f_("returned false", decoder);
1636 printf("testing OggFLAC__file_decoder_set_write_callback()... ");
1637 if(!OggFLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
1638 return die_f_("returned false", decoder);
1641 printf("testing OggFLAC__file_decoder_set_metadata_callback()... ");
1642 if(!OggFLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
1643 return die_f_("returned false", decoder);
1646 printf("testing OggFLAC__file_decoder_set_error_callback()... ");
1647 if(!OggFLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
1648 return die_f_("returned false", decoder);
1651 printf("testing OggFLAC__file_decoder_set_client_data()... ");
1652 if(!OggFLAC__file_decoder_set_client_data(decoder, &decoder_client_data))
1653 return die_f_("returned false", decoder);
1656 printf("testing OggFLAC__file_decoder_set_filename()... ");
1657 if(!OggFLAC__file_decoder_set_filename(decoder, oggflacfilename_))
1658 return die_f_("returned false", decoder);
1661 printf("testing OggFLAC__file_decoder_set_md5_checking()... ");
1662 if(!OggFLAC__file_decoder_set_md5_checking(decoder, true))
1663 return die_f_("returned false", decoder);
1666 printf("testing OggFLAC__file_decoder_init()... ");
1667 if(OggFLAC__file_decoder_init(decoder) != OggFLAC__FILE_DECODER_OK)
1668 return die_f_(0, decoder);
1671 printf("testing OggFLAC__file_decoder_get_state()... ");
1672 state = OggFLAC__file_decoder_get_state(decoder);
1673 printf("returned state = %u (%s)... OK\n", state, OggFLAC__FileDecoderStateString[state]);
1675 printf("testing OggFLAC__file_decoder_get_seekable_stream_decoder_state()... ");
1676 sstate = OggFLAC__file_decoder_get_seekable_stream_decoder_state(decoder);
1677 printf("returned state = %u (%s)... OK\n", sstate, OggFLAC__SeekableStreamDecoderStateString[sstate]);
1679 printf("testing OggFLAC__file_decoder_get_FLAC_seekable_stream_decoder_state()... ");
1680 fsstate = OggFLAC__file_decoder_get_FLAC_seekable_stream_decoder_state(decoder);
1681 printf("returned state = %u (%s)... OK\n", fsstate, FLAC__SeekableStreamDecoderStateString[fsstate]);
1683 printf("testing OggFLAC__file_decoder_get_FLAC_stream_decoder_state()... ");
1684 fstate = OggFLAC__file_decoder_get_FLAC_stream_decoder_state(decoder);
1685 printf("returned state = %u (%s)... OK\n", fstate, FLAC__StreamDecoderStateString[fstate]);
1687 decoder_client_data.current_metadata_number = 0;
1688 decoder_client_data.ignore_errors = false;
1689 decoder_client_data.error_occurred = false;
1691 printf("testing OggFLAC__file_decoder_get_md5_checking()... ");
1692 if(!OggFLAC__file_decoder_get_md5_checking(decoder)) {
1693 printf("FAILED, returned false, expected true\n");
1698 printf("testing OggFLAC__file_decoder_process_until_end_of_metadata()... ");
1699 if(!OggFLAC__file_decoder_process_until_end_of_metadata(decoder))
1700 return die_f_("returned false", decoder);
1703 printf("testing OggFLAC__file_decoder_process_single()... ");
1704 if(!OggFLAC__file_decoder_process_single(decoder))
1705 return die_f_("returned false", decoder);
1708 printf("testing OggFLAC__file_decoder_seek_absolute()... ");
1709 if(!OggFLAC__file_decoder_seek_absolute(decoder, 0))
1710 return die_f_("returned false", decoder);
1713 printf("testing OggFLAC__file_decoder_process_until_end_of_file()... ");
1714 if(!OggFLAC__file_decoder_process_until_end_of_file(decoder))
1715 return die_f_("returned false", decoder);
1718 printf("testing OggFLAC__file_decoder_get_channels()... ");
1720 unsigned channels = OggFLAC__file_decoder_get_channels(decoder);
1721 if(channels != streaminfo_.data.stream_info.channels) {
1722 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
1728 printf("testing OggFLAC__file_decoder_get_bits_per_sample()... ");
1730 unsigned bits_per_sample = OggFLAC__file_decoder_get_bits_per_sample(decoder);
1731 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
1732 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
1738 printf("testing OggFLAC__file_decoder_get_sample_rate()... ");
1740 unsigned sample_rate = OggFLAC__file_decoder_get_sample_rate(decoder);
1741 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
1742 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
1748 printf("testing OggFLAC__file_decoder_get_blocksize()... ");
1750 unsigned blocksize = OggFLAC__file_decoder_get_blocksize(decoder);
1751 /* value could be anything since we're at the last block, so accept any answer */
1752 printf("returned %u... OK\n", blocksize);
1755 printf("testing OggFLAC__file_decoder_get_channel_assignment()... ");
1757 FLAC__ChannelAssignment ca = OggFLAC__file_decoder_get_channel_assignment(decoder);
1758 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1761 printf("testing OggFLAC__file_decoder_finish()... ");
1762 (void) OggFLAC__file_decoder_finish(decoder);
1769 printf("testing OggFLAC__file_decoder_set_metadata_respond_all()... ");
1770 if(!OggFLAC__file_decoder_set_metadata_respond_all(decoder))
1771 return die_f_("returned false", decoder);
1775 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1776 expected_metadata_sequence_[num_expected_++] = &padding_;
1777 expected_metadata_sequence_[num_expected_++] = &seektable_;
1778 expected_metadata_sequence_[num_expected_++] = &application1_;
1779 expected_metadata_sequence_[num_expected_++] = &application2_;
1780 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1781 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1782 expected_metadata_sequence_[num_expected_++] = &unknown_;
1784 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1791 printf("testing OggFLAC__file_decoder_set_metadata_ignore_all()... ");
1792 if(!OggFLAC__file_decoder_set_metadata_ignore_all(decoder))
1793 return die_f_("returned false", decoder);
1798 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1802 * respond all, ignore VORBIS_COMMENT
1805 printf("testing OggFLAC__file_decoder_set_metadata_respond_all()... ");
1806 if(!OggFLAC__file_decoder_set_metadata_respond_all(decoder))
1807 return die_f_("returned false", decoder);
1810 printf("testing OggFLAC__file_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
1811 if(!OggFLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1812 return die_f_("returned false", decoder);
1816 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1817 expected_metadata_sequence_[num_expected_++] = &padding_;
1818 expected_metadata_sequence_[num_expected_++] = &seektable_;
1819 expected_metadata_sequence_[num_expected_++] = &application1_;
1820 expected_metadata_sequence_[num_expected_++] = &application2_;
1821 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1822 expected_metadata_sequence_[num_expected_++] = &unknown_;
1824 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1828 * respond all, ignore APPLICATION
1831 printf("testing OggFLAC__file_decoder_set_metadata_respond_all()... ");
1832 if(!OggFLAC__file_decoder_set_metadata_respond_all(decoder))
1833 return die_f_("returned false", decoder);
1836 printf("testing OggFLAC__file_decoder_set_metadata_ignore(APPLICATION)... ");
1837 if(!OggFLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1838 return die_f_("returned false", decoder);
1842 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1843 expected_metadata_sequence_[num_expected_++] = &padding_;
1844 expected_metadata_sequence_[num_expected_++] = &seektable_;
1845 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1846 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1847 expected_metadata_sequence_[num_expected_++] = &unknown_;
1849 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1853 * respond all, ignore APPLICATION id of app#1
1856 printf("testing OggFLAC__file_decoder_set_metadata_respond_all()... ");
1857 if(!OggFLAC__file_decoder_set_metadata_respond_all(decoder))
1858 return die_f_("returned false", decoder);
1861 printf("testing OggFLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1862 if(!OggFLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1863 return die_f_("returned false", decoder);
1867 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1868 expected_metadata_sequence_[num_expected_++] = &padding_;
1869 expected_metadata_sequence_[num_expected_++] = &seektable_;
1870 expected_metadata_sequence_[num_expected_++] = &application2_;
1871 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1872 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1873 expected_metadata_sequence_[num_expected_++] = &unknown_;
1875 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1879 * respond all, ignore APPLICATION id of app#1 & app#2
1882 printf("testing OggFLAC__file_decoder_set_metadata_respond_all()... ");
1883 if(!OggFLAC__file_decoder_set_metadata_respond_all(decoder))
1884 return die_f_("returned false", decoder);
1887 printf("testing OggFLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1888 if(!OggFLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1889 return die_f_("returned false", decoder);
1892 printf("testing OggFLAC__file_decoder_set_metadata_ignore_application(of app block #2)... ");
1893 if(!OggFLAC__file_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
1894 return die_f_("returned false", decoder);
1898 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1899 expected_metadata_sequence_[num_expected_++] = &padding_;
1900 expected_metadata_sequence_[num_expected_++] = &seektable_;
1901 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1902 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1903 expected_metadata_sequence_[num_expected_++] = &unknown_;
1905 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1909 * ignore all, respond VORBIS_COMMENT
1912 printf("testing OggFLAC__file_decoder_set_metadata_ignore_all()... ");
1913 if(!OggFLAC__file_decoder_set_metadata_ignore_all(decoder))
1914 return die_f_("returned false", decoder);
1917 printf("testing OggFLAC__file_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
1918 if(!OggFLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1919 return die_f_("returned false", decoder);
1923 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1925 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1929 * ignore all, respond APPLICATION
1932 printf("testing OggFLAC__file_decoder_set_metadata_ignore_all()... ");
1933 if(!OggFLAC__file_decoder_set_metadata_ignore_all(decoder))
1934 return die_f_("returned false", decoder);
1937 printf("testing OggFLAC__file_decoder_set_metadata_respond(APPLICATION)... ");
1938 if(!OggFLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1939 return die_f_("returned false", decoder);
1943 expected_metadata_sequence_[num_expected_++] = &application1_;
1944 expected_metadata_sequence_[num_expected_++] = &application2_;
1946 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1950 * ignore all, respond APPLICATION id of app#1
1953 printf("testing OggFLAC__file_decoder_set_metadata_ignore_all()... ");
1954 if(!OggFLAC__file_decoder_set_metadata_ignore_all(decoder))
1955 return die_f_("returned false", decoder);
1958 printf("testing OggFLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1959 if(!OggFLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1960 return die_f_("returned false", decoder);
1964 expected_metadata_sequence_[num_expected_++] = &application1_;
1966 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1970 * ignore all, respond APPLICATION id of app#1 & app#2
1973 printf("testing OggFLAC__file_decoder_set_metadata_ignore_all()... ");
1974 if(!OggFLAC__file_decoder_set_metadata_ignore_all(decoder))
1975 return die_f_("returned false", decoder);
1978 printf("testing OggFLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1979 if(!OggFLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1980 return die_f_("returned false", decoder);
1983 printf("testing OggFLAC__file_decoder_set_metadata_respond_application(of app block #2)... ");
1984 if(!OggFLAC__file_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
1985 return die_f_("returned false", decoder);
1989 expected_metadata_sequence_[num_expected_++] = &application1_;
1990 expected_metadata_sequence_[num_expected_++] = &application2_;
1992 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1996 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
1999 printf("testing OggFLAC__file_decoder_set_metadata_respond_all()... ");
2000 if(!OggFLAC__file_decoder_set_metadata_respond_all(decoder))
2001 return die_f_("returned false", decoder);
2004 printf("testing OggFLAC__file_decoder_set_metadata_ignore(APPLICATION)... ");
2005 if(!OggFLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
2006 return die_f_("returned false", decoder);
2009 printf("testing OggFLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
2010 if(!OggFLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
2011 return die_f_("returned false", decoder);
2015 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
2016 expected_metadata_sequence_[num_expected_++] = &padding_;
2017 expected_metadata_sequence_[num_expected_++] = &seektable_;
2018 expected_metadata_sequence_[num_expected_++] = &application1_;
2019 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
2020 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
2021 expected_metadata_sequence_[num_expected_++] = &unknown_;
2023 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2027 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
2030 printf("testing OggFLAC__file_decoder_set_metadata_ignore_all()... ");
2031 if(!OggFLAC__file_decoder_set_metadata_ignore_all(decoder))
2032 return die_f_("returned false", decoder);
2035 printf("testing OggFLAC__file_decoder_set_metadata_respond(APPLICATION)... ");
2036 if(!OggFLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
2037 return die_f_("returned false", decoder);
2040 printf("testing OggFLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
2041 if(!OggFLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
2042 return die_f_("returned false", decoder);
2046 expected_metadata_sequence_[num_expected_++] = &application2_;
2048 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2051 /* done, now leave the sequence the way we found it... */
2053 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
2054 expected_metadata_sequence_[num_expected_++] = &padding_;
2055 expected_metadata_sequence_[num_expected_++] = &seektable_;
2056 expected_metadata_sequence_[num_expected_++] = &application1_;
2057 expected_metadata_sequence_[num_expected_++] = &application2_;
2058 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
2059 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
2060 expected_metadata_sequence_[num_expected_++] = &unknown_;
2062 printf("testing OggFLAC__file_decoder_delete()... ");
2063 OggFLAC__file_decoder_delete(decoder);
2066 printf("\nPASSED!\n");
2071 FLAC__bool test_decoders()
2073 init_metadata_blocks_();
2074 if(!generate_file_())
2077 if(!test_stream_decoder())
2080 if(!test_seekable_stream_decoder())
2083 if(!test_file_decoder())
2086 (void) grabbag__file_remove_file(oggflacfilename_);
2087 free_metadata_blocks_();