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_STREAM_DECODER_ERROR) {
83 OggFLAC__StreamDecoderState state_ = OggFLAC__seekable_stream_decoder_get_stream_decoder_state(decoder);
84 printf(" stream decoder state = %u (%s)\n", (unsigned)state_, OggFLAC__StreamDecoderStateString[state_]);
85 if(state_ == OggFLAC__STREAM_DECODER_FLAC_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_STREAM_DECODER_ERROR) {
108 OggFLAC__StreamDecoderState state__ = OggFLAC__file_decoder_get_stream_decoder_state(decoder);
109 printf(" stream decoder state = %u (%s)\n", (unsigned)state__, OggFLAC__StreamDecoderStateString[state__]);
110 if(state__ == OggFLAC__STREAM_DECODER_FLAC_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_;
142 /* WATCHOUT: the encoder should move the VORBIS_COMMENT block to the front, right after STREAMINFO */
144 if(!file_utils__generate_oggflacfile(oggflacfilename_, &oggflacfilesize_, 512 * 1024, &streaminfo_, expected_metadata_sequence_, num_expected_))
145 return die_("creating the encoded file");
150 static FLAC__StreamDecoderReadStatus stream_decoder_read_callback_(const OggFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
152 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
157 printf("ERROR: client_data in read callback is NULL\n");
158 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
161 if(dcd->error_occurred)
162 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
164 if(feof(dcd->file)) {
166 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
168 else if(*bytes > 0) {
169 *bytes = fread(buffer, 1, *bytes, dcd->file);
172 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
174 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
177 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
181 return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */
184 static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const OggFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
186 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
188 (void)decoder, (void)buffer;
191 printf("ERROR: client_data in write callback is NULL\n");
192 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
195 if(dcd->error_occurred)
196 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
199 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER && frame->header.number.frame_number == 0) ||
200 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER && frame->header.number.sample_number == 0)
202 printf("content... ");
206 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
209 static void stream_decoder_metadata_callback_(const OggFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
211 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
216 printf("ERROR: client_data in metadata callback is NULL\n");
220 if(dcd->error_occurred)
223 printf("%d... ", dcd->current_metadata_number);
226 if(dcd->current_metadata_number >= num_expected_) {
227 (void)die_("got more metadata blocks than expected");
228 dcd->error_occurred = true;
231 if(!mutils__compare_block(expected_metadata_sequence_[dcd->current_metadata_number], metadata)) {
232 (void)die_("metadata block mismatch");
233 dcd->error_occurred = true;
236 dcd->current_metadata_number++;
239 static void stream_decoder_error_callback_(const OggFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
241 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
246 printf("ERROR: client_data in error callback is NULL\n");
250 if(!dcd->ignore_errors) {
251 printf("ERROR: got error callback: err = %u (%s)\n", (unsigned)status, FLAC__StreamDecoderErrorStatusString[status]);
252 dcd->error_occurred = true;
256 static FLAC__bool stream_decoder_test_respond_(OggFLAC__StreamDecoder *decoder, stream_decoder_client_data_struct *dcd)
258 if(!OggFLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))
259 return die_s_("at OggFLAC__stream_decoder_set_read_callback(), returned false", decoder);
261 if(!OggFLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))
262 return die_s_("at OggFLAC__stream_decoder_set_write_callback(), returned false", decoder);
264 if(!OggFLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))
265 return die_s_("at OggFLAC__stream_decoder_set_metadata_callback(), returned false", decoder);
267 if(!OggFLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))
268 return die_s_("at OggFLAC__stream_decoder_set_error_callback(), returned false", decoder);
270 if(!OggFLAC__stream_decoder_set_client_data(decoder, dcd))
271 return die_s_("at OggFLAC__stream_decoder_set_client_data(), returned false", decoder);
273 printf("testing OggFLAC__stream_decoder_init()... ");
274 if(OggFLAC__stream_decoder_init(decoder) != OggFLAC__STREAM_DECODER_OK)
275 return die_s_(0, decoder);
278 dcd->current_metadata_number = 0;
280 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
281 printf("FAILED rewinding input, errno = %d\n", errno);
285 printf("testing OggFLAC__stream_decoder_process_until_end_of_stream()... ");
286 if(!OggFLAC__stream_decoder_process_until_end_of_stream(decoder))
287 return die_s_("returned false", decoder);
290 printf("testing OggFLAC__stream_decoder_finish()... ");
291 OggFLAC__stream_decoder_finish(decoder);
297 static FLAC__bool test_stream_decoder()
299 OggFLAC__StreamDecoder *decoder;
300 OggFLAC__StreamDecoderState state;
301 FLAC__StreamDecoderState fstate;
302 stream_decoder_client_data_struct decoder_client_data;
304 printf("\n+++ libOggFLAC unit test: OggFLAC__StreamDecoder\n\n");
306 printf("testing OggFLAC__stream_decoder_new()... ");
307 decoder = OggFLAC__stream_decoder_new();
309 printf("FAILED, returned NULL\n");
314 printf("testing OggFLAC__stream_decoder_delete()... ");
315 OggFLAC__stream_decoder_delete(decoder);
318 printf("testing OggFLAC__stream_decoder_new()... ");
319 decoder = OggFLAC__stream_decoder_new();
321 printf("FAILED, returned NULL\n");
326 printf("testing OggFLAC__stream_decoder_init()... ");
327 if(OggFLAC__stream_decoder_init(decoder) == OggFLAC__STREAM_DECODER_OK)
328 return die_s_(0, decoder);
331 printf("testing OggFLAC__stream_decoder_delete()... ");
332 OggFLAC__stream_decoder_delete(decoder);
336 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
338 printf("testing OggFLAC__stream_decoder_new()... ");
339 decoder = OggFLAC__stream_decoder_new();
341 printf("FAILED, returned NULL\n");
346 printf("testing OggFLAC__stream_decoder_set_serial_number()... ");
347 if(!OggFLAC__stream_decoder_set_serial_number(decoder, file_utils__serial_number))
348 return die_s_("returned false", decoder);
351 printf("testing OggFLAC__stream_decoder_set_read_callback()... ");
352 if(!OggFLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))
353 return die_s_("returned false", decoder);
356 printf("testing OggFLAC__stream_decoder_set_write_callback()... ");
357 if(!OggFLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))
358 return die_s_("returned false", decoder);
361 printf("testing OggFLAC__stream_decoder_set_metadata_callback()... ");
362 if(!OggFLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))
363 return die_s_("returned false", decoder);
366 printf("testing OggFLAC__stream_decoder_set_error_callback()... ");
367 if(!OggFLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))
368 return die_s_("returned false", decoder);
371 printf("testing OggFLAC__stream_decoder_set_client_data()... ");
372 if(!OggFLAC__stream_decoder_set_client_data(decoder, &decoder_client_data))
373 return die_s_("returned false", decoder);
376 printf("testing OggFLAC__stream_decoder_init()... ");
377 if(OggFLAC__stream_decoder_init(decoder) != OggFLAC__STREAM_DECODER_OK)
378 return die_s_(0, decoder);
381 printf("testing OggFLAC__stream_decoder_get_state()... ");
382 state = OggFLAC__stream_decoder_get_state(decoder);
383 printf("returned state = %u (%s)... OK\n", state, OggFLAC__StreamDecoderStateString[state]);
385 printf("testing OggFLAC__stream_decoder_get_FLAC_stream_decoder_state()... ");
386 fstate = OggFLAC__stream_decoder_get_FLAC_stream_decoder_state(decoder);
387 printf("returned state = %u (%s)... OK\n", fstate, FLAC__StreamDecoderStateString[fstate]);
389 decoder_client_data.current_metadata_number = 0;
390 decoder_client_data.ignore_errors = false;
391 decoder_client_data.error_occurred = false;
393 printf("opening Ogg FLAC file... ");
394 decoder_client_data.file = fopen(oggflacfilename_, "rb");
395 if(0 == decoder_client_data.file) {
401 printf("testing OggFLAC__stream_decoder_process_until_end_of_metadata()... ");
402 if(!OggFLAC__stream_decoder_process_until_end_of_metadata(decoder))
403 return die_s_("returned false", decoder);
406 printf("testing OggFLAC__stream_decoder_process_single()... ");
407 if(!OggFLAC__stream_decoder_process_single(decoder))
408 return die_s_("returned false", decoder);
411 printf("testing OggFLAC__stream_decoder_flush()... ");
412 if(!OggFLAC__stream_decoder_flush(decoder))
413 return die_s_("returned false", decoder);
416 decoder_client_data.ignore_errors = true;
417 printf("testing OggFLAC__stream_decoder_process_single()... ");
418 if(!OggFLAC__stream_decoder_process_single(decoder))
419 return die_s_("returned false", decoder);
421 decoder_client_data.ignore_errors = false;
423 printf("testing OggFLAC__stream_decoder_process_until_end_of_stream()... ");
424 if(!OggFLAC__stream_decoder_process_until_end_of_stream(decoder))
425 return die_s_("returned false", decoder);
428 printf("testing OggFLAC__stream_decoder_get_channels()... ");
430 unsigned channels = OggFLAC__stream_decoder_get_channels(decoder);
431 if(channels != streaminfo_.data.stream_info.channels) {
432 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
438 printf("testing OggFLAC__stream_decoder_get_bits_per_sample()... ");
440 unsigned bits_per_sample = OggFLAC__stream_decoder_get_bits_per_sample(decoder);
441 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
442 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
448 printf("testing OggFLAC__stream_decoder_get_sample_rate()... ");
450 unsigned sample_rate = OggFLAC__stream_decoder_get_sample_rate(decoder);
451 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
452 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
458 printf("testing OggFLAC__stream_decoder_get_blocksize()... ");
460 unsigned blocksize = OggFLAC__stream_decoder_get_blocksize(decoder);
461 /* value could be anything since we're at the last block, so accept any answer */
462 printf("returned %u... OK\n", blocksize);
465 printf("testing OggFLAC__stream_decoder_get_channel_assignment()... ");
467 FLAC__ChannelAssignment ca = OggFLAC__stream_decoder_get_channel_assignment(decoder);
468 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
471 printf("testing OggFLAC__stream_decoder_reset()... ");
472 if(!OggFLAC__stream_decoder_reset(decoder)) {
473 state = OggFLAC__stream_decoder_get_state(decoder);
474 printf("FAILED, returned false, state = %u (%s)\n", state, FLAC__StreamDecoderStateString[state]);
479 decoder_client_data.current_metadata_number = 0;
481 printf("rewinding input... ");
482 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
483 printf("FAILED, errno = %d\n", errno);
488 printf("testing OggFLAC__stream_decoder_process_until_end_of_stream()... ");
489 if(!OggFLAC__stream_decoder_process_until_end_of_stream(decoder))
490 return die_s_("returned false", decoder);
493 printf("testing OggFLAC__stream_decoder_finish()... ");
494 OggFLAC__stream_decoder_finish(decoder);
501 printf("testing OggFLAC__stream_decoder_set_metadata_respond_all()... ");
502 if(!OggFLAC__stream_decoder_set_metadata_respond_all(decoder))
503 return die_s_("returned false", decoder);
507 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
508 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
509 expected_metadata_sequence_[num_expected_++] = &padding_;
510 expected_metadata_sequence_[num_expected_++] = &seektable_;
511 expected_metadata_sequence_[num_expected_++] = &application1_;
512 expected_metadata_sequence_[num_expected_++] = &application2_;
513 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
514 expected_metadata_sequence_[num_expected_++] = &unknown_;
516 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
523 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_all()... ");
524 if(!OggFLAC__stream_decoder_set_metadata_ignore_all(decoder))
525 return die_s_("returned false", decoder);
530 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
534 * respond all, ignore VORBIS_COMMENT
537 printf("testing OggFLAC__stream_decoder_set_metadata_respond_all()... ");
538 if(!OggFLAC__stream_decoder_set_metadata_respond_all(decoder))
539 return die_s_("returned false", decoder);
542 printf("testing OggFLAC__stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
543 if(!OggFLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
544 return die_s_("returned false", decoder);
548 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
549 expected_metadata_sequence_[num_expected_++] = &padding_;
550 expected_metadata_sequence_[num_expected_++] = &seektable_;
551 expected_metadata_sequence_[num_expected_++] = &application1_;
552 expected_metadata_sequence_[num_expected_++] = &application2_;
553 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
554 expected_metadata_sequence_[num_expected_++] = &unknown_;
556 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
560 * respond all, ignore APPLICATION
563 printf("testing OggFLAC__stream_decoder_set_metadata_respond_all()... ");
564 if(!OggFLAC__stream_decoder_set_metadata_respond_all(decoder))
565 return die_s_("returned false", decoder);
568 printf("testing OggFLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
569 if(!OggFLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
570 return die_s_("returned false", decoder);
574 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
575 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
576 expected_metadata_sequence_[num_expected_++] = &padding_;
577 expected_metadata_sequence_[num_expected_++] = &seektable_;
578 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
579 expected_metadata_sequence_[num_expected_++] = &unknown_;
581 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
585 * respond all, ignore APPLICATION id of app#1
588 printf("testing OggFLAC__stream_decoder_set_metadata_respond_all()... ");
589 if(!OggFLAC__stream_decoder_set_metadata_respond_all(decoder))
590 return die_s_("returned false", decoder);
593 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
594 if(!OggFLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
595 return die_s_("returned false", decoder);
599 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
600 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
601 expected_metadata_sequence_[num_expected_++] = &padding_;
602 expected_metadata_sequence_[num_expected_++] = &seektable_;
603 expected_metadata_sequence_[num_expected_++] = &application2_;
604 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
605 expected_metadata_sequence_[num_expected_++] = &unknown_;
607 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
611 * respond all, ignore APPLICATION id of app#1 & app#2
614 printf("testing OggFLAC__stream_decoder_set_metadata_respond_all()... ");
615 if(!OggFLAC__stream_decoder_set_metadata_respond_all(decoder))
616 return die_s_("returned false", decoder);
619 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
620 if(!OggFLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
621 return die_s_("returned false", decoder);
624 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_application(of app block #2)... ");
625 if(!OggFLAC__stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
626 return die_s_("returned false", decoder);
630 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
631 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
632 expected_metadata_sequence_[num_expected_++] = &padding_;
633 expected_metadata_sequence_[num_expected_++] = &seektable_;
634 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
635 expected_metadata_sequence_[num_expected_++] = &unknown_;
637 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
641 * ignore all, respond VORBIS_COMMENT
644 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_all()... ");
645 if(!OggFLAC__stream_decoder_set_metadata_ignore_all(decoder))
646 return die_s_("returned false", decoder);
649 printf("testing OggFLAC__stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
650 if(!OggFLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
651 return die_s_("returned false", decoder);
655 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
657 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
661 * ignore all, respond APPLICATION
664 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_all()... ");
665 if(!OggFLAC__stream_decoder_set_metadata_ignore_all(decoder))
666 return die_s_("returned false", decoder);
669 printf("testing OggFLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
670 if(!OggFLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
671 return die_s_("returned false", decoder);
675 expected_metadata_sequence_[num_expected_++] = &application1_;
676 expected_metadata_sequence_[num_expected_++] = &application2_;
678 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
682 * ignore all, respond APPLICATION id of app#1
685 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_all()... ");
686 if(!OggFLAC__stream_decoder_set_metadata_ignore_all(decoder))
687 return die_s_("returned false", decoder);
690 printf("testing OggFLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
691 if(!OggFLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
692 return die_s_("returned false", decoder);
696 expected_metadata_sequence_[num_expected_++] = &application1_;
698 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
702 * ignore all, respond APPLICATION id of app#1 & app#2
705 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_all()... ");
706 if(!OggFLAC__stream_decoder_set_metadata_ignore_all(decoder))
707 return die_s_("returned false", decoder);
710 printf("testing OggFLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
711 if(!OggFLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
712 return die_s_("returned false", decoder);
715 printf("testing OggFLAC__stream_decoder_set_metadata_respond_application(of app block #2)... ");
716 if(!OggFLAC__stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
717 return die_s_("returned false", decoder);
721 expected_metadata_sequence_[num_expected_++] = &application1_;
722 expected_metadata_sequence_[num_expected_++] = &application2_;
724 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
728 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
731 printf("testing OggFLAC__stream_decoder_set_metadata_respond_all()... ");
732 if(!OggFLAC__stream_decoder_set_metadata_respond_all(decoder))
733 return die_s_("returned false", decoder);
736 printf("testing OggFLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
737 if(!OggFLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
738 return die_s_("returned false", decoder);
741 printf("testing OggFLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
742 if(!OggFLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
743 return die_s_("returned false", decoder);
747 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
748 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
749 expected_metadata_sequence_[num_expected_++] = &padding_;
750 expected_metadata_sequence_[num_expected_++] = &seektable_;
751 expected_metadata_sequence_[num_expected_++] = &application1_;
752 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
753 expected_metadata_sequence_[num_expected_++] = &unknown_;
755 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
759 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
762 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_all()... ");
763 if(!OggFLAC__stream_decoder_set_metadata_ignore_all(decoder))
764 return die_s_("returned false", decoder);
767 printf("testing OggFLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
768 if(!OggFLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
769 return die_s_("returned false", decoder);
772 printf("testing OggFLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
773 if(!OggFLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
774 return die_s_("returned false", decoder);
778 expected_metadata_sequence_[num_expected_++] = &application2_;
780 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
783 /* done, now leave the sequence the way we found it... */
785 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
786 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
787 expected_metadata_sequence_[num_expected_++] = &padding_;
788 expected_metadata_sequence_[num_expected_++] = &seektable_;
789 expected_metadata_sequence_[num_expected_++] = &application1_;
790 expected_metadata_sequence_[num_expected_++] = &application2_;
791 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
792 expected_metadata_sequence_[num_expected_++] = &unknown_;
794 printf("testing OggFLAC__stream_decoder_delete()... ");
795 OggFLAC__stream_decoder_delete(decoder);
798 fclose(decoder_client_data.file);
800 printf("\nPASSED!\n");
805 static OggFLAC__SeekableStreamDecoderReadStatus seekable_stream_decoder_read_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
808 switch(stream_decoder_read_callback_(0, buffer, bytes, client_data)) {
809 case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE:
810 case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM:
811 return OggFLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK;
812 case FLAC__STREAM_DECODER_READ_STATUS_ABORT:
813 return OggFLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
816 return OggFLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
820 static OggFLAC__SeekableStreamDecoderSeekStatus seekable_stream_decoder_seek_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
822 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
827 printf("ERROR: client_data in seek callback is NULL\n");
828 return OggFLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
831 if(dcd->error_occurred)
832 return OggFLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
834 if(fseek(dcd->file, (long)absolute_byte_offset, SEEK_SET) < 0) {
835 dcd->error_occurred = true;
836 return OggFLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
839 return OggFLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK;
842 static OggFLAC__SeekableStreamDecoderTellStatus seekable_stream_decoder_tell_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
844 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
850 printf("ERROR: client_data in tell callback is NULL\n");
851 return OggFLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
854 if(dcd->error_occurred)
855 return OggFLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
857 offset = ftell(dcd->file);
858 *absolute_byte_offset = (FLAC__uint64)offset;
861 dcd->error_occurred = true;
862 return OggFLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
865 return OggFLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK;
868 static OggFLAC__SeekableStreamDecoderLengthStatus seekable_stream_decoder_length_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
870 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
875 printf("ERROR: client_data in length callback is NULL\n");
876 return OggFLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
879 if(dcd->error_occurred)
880 return OggFLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
882 *stream_length = (FLAC__uint64)oggflacfilesize_;
883 return OggFLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK;
886 static FLAC__bool seekable_stream_decoder_eof_callback_(const OggFLAC__SeekableStreamDecoder *decoder, void *client_data)
888 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
893 printf("ERROR: client_data in eof callback is NULL\n");
897 if(dcd->error_occurred)
900 return feof(dcd->file);
903 static FLAC__StreamDecoderWriteStatus seekable_stream_decoder_write_callback_(const OggFLAC__SeekableStreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
906 return stream_decoder_write_callback_(0, frame, buffer, client_data);
909 static void seekable_stream_decoder_metadata_callback_(const OggFLAC__SeekableStreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
912 stream_decoder_metadata_callback_(0, metadata, client_data);
915 static void seekable_stream_decoder_error_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
918 stream_decoder_error_callback_(0, status, client_data);
921 static FLAC__bool seekable_stream_decoder_test_respond_(OggFLAC__SeekableStreamDecoder *decoder, seekable_stream_decoder_client_data_struct *dcd)
923 if(!OggFLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_))
924 return die_ss_("at OggFLAC__seekable_stream_decoder_set_read_callback(), returned false", decoder);
926 if(!OggFLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_))
927 return die_ss_("at OggFLAC__seekable_stream_decoder_set_seek_callback(), returned false", decoder);
929 if(!OggFLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_))
930 return die_ss_("at OggFLAC__seekable_stream_decoder_set_tell_callback(), returned false", decoder);
932 if(!OggFLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_))
933 return die_ss_("at OggFLAC__seekable_stream_decoder_set_length_callback(), returned false", decoder);
935 if(!OggFLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_))
936 return die_ss_("at OggFLAC__seekable_stream_decoder_set_eof_callback(), returned false", decoder);
938 if(!OggFLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_))
939 return die_ss_("at OggFLAC__seekable_stream_decoder_set_write_callback(), returned false", decoder);
941 if(!OggFLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_))
942 return die_ss_("at OggFLAC__seekable_stream_decoder_set_metadata_callback(), returned false", decoder);
944 if(!OggFLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_))
945 return die_ss_("at OggFLAC__seekable_stream_decoder_set_error_callback(), returned false", decoder);
947 if(!OggFLAC__seekable_stream_decoder_set_client_data(decoder, dcd))
948 return die_ss_("at OggFLAC__seekable_stream_decoder_set_client_data(), returned false", decoder);
950 if(!OggFLAC__seekable_stream_decoder_set_md5_checking(decoder, true))
951 return die_ss_("at OggFLAC__seekable_stream_decoder_set_md5_checking(), returned false", decoder);
953 printf("testing OggFLAC__seekable_stream_decoder_init()... ");
954 if(OggFLAC__seekable_stream_decoder_init(decoder) != OggFLAC__SEEKABLE_STREAM_DECODER_OK)
955 return die_ss_(0, decoder);
958 dcd->current_metadata_number = 0;
960 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
961 printf("FAILED rewinding input, errno = %d\n", errno);
965 printf("testing OggFLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
966 if(!OggFLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
967 return die_ss_("returned false", decoder);
970 printf("testing OggFLAC__seekable_stream_decoder_finish()... ");
971 (void) OggFLAC__seekable_stream_decoder_finish(decoder);
977 static FLAC__bool test_seekable_stream_decoder()
979 OggFLAC__SeekableStreamDecoder *decoder;
980 OggFLAC__SeekableStreamDecoderState state;
981 OggFLAC__StreamDecoderState sstate;
982 FLAC__StreamDecoderState fstate;
983 seekable_stream_decoder_client_data_struct decoder_client_data;
985 printf("\n+++ libOggFLAC unit test: OggFLAC__SeekableStreamDecoder\n\n");
987 printf("testing OggFLAC__seekable_stream_decoder_new()... ");
988 decoder = OggFLAC__seekable_stream_decoder_new();
990 printf("FAILED, returned NULL\n");
995 printf("testing OggFLAC__seekable_stream_decoder_delete()... ");
996 OggFLAC__seekable_stream_decoder_delete(decoder);
999 printf("testing OggFLAC__seekable_stream_decoder_new()... ");
1000 decoder = OggFLAC__seekable_stream_decoder_new();
1002 printf("FAILED, returned NULL\n");
1007 printf("testing OggFLAC__seekable_stream_decoder_init()... ");
1008 if(OggFLAC__seekable_stream_decoder_init(decoder) == OggFLAC__SEEKABLE_STREAM_DECODER_OK)
1009 return die_ss_(0, decoder);
1012 printf("testing OggFLAC__seekable_stream_decoder_delete()... ");
1013 OggFLAC__seekable_stream_decoder_delete(decoder);
1017 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1019 printf("testing OggFLAC__seekable_stream_decoder_new()... ");
1020 decoder = OggFLAC__seekable_stream_decoder_new();
1022 printf("FAILED, returned NULL\n");
1027 printf("testing OggFLAC__seekable_stream_decoder_set_serial_number()... ");
1028 if(!OggFLAC__seekable_stream_decoder_set_serial_number(decoder, file_utils__serial_number))
1029 return die_ss_("returned false", decoder);
1032 printf("testing OggFLAC__seekable_stream_decoder_set_read_callback()... ");
1033 if(!OggFLAC__seekable_stream_decoder_set_read_callback(decoder, seekable_stream_decoder_read_callback_))
1034 return die_ss_("returned false", decoder);
1037 printf("testing OggFLAC__seekable_stream_decoder_set_seek_callback()... ");
1038 if(!OggFLAC__seekable_stream_decoder_set_seek_callback(decoder, seekable_stream_decoder_seek_callback_))
1039 return die_ss_("returned false", decoder);
1042 printf("testing OggFLAC__seekable_stream_decoder_set_tell_callback()... ");
1043 if(!OggFLAC__seekable_stream_decoder_set_tell_callback(decoder, seekable_stream_decoder_tell_callback_))
1044 return die_ss_("returned false", decoder);
1047 printf("testing OggFLAC__seekable_stream_decoder_set_length_callback()... ");
1048 if(!OggFLAC__seekable_stream_decoder_set_length_callback(decoder, seekable_stream_decoder_length_callback_))
1049 return die_ss_("returned false", decoder);
1052 printf("testing OggFLAC__seekable_stream_decoder_set_eof_callback()... ");
1053 if(!OggFLAC__seekable_stream_decoder_set_eof_callback(decoder, seekable_stream_decoder_eof_callback_))
1054 return die_ss_("returned false", decoder);
1057 printf("testing OggFLAC__seekable_stream_decoder_set_write_callback()... ");
1058 if(!OggFLAC__seekable_stream_decoder_set_write_callback(decoder, seekable_stream_decoder_write_callback_))
1059 return die_ss_("returned false", decoder);
1062 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_callback()... ");
1063 if(!OggFLAC__seekable_stream_decoder_set_metadata_callback(decoder, seekable_stream_decoder_metadata_callback_))
1064 return die_ss_("returned false", decoder);
1067 printf("testing OggFLAC__seekable_stream_decoder_set_error_callback()... ");
1068 if(!OggFLAC__seekable_stream_decoder_set_error_callback(decoder, seekable_stream_decoder_error_callback_))
1069 return die_ss_("returned false", decoder);
1072 printf("testing OggFLAC__seekable_stream_decoder_set_client_data()... ");
1073 if(!OggFLAC__seekable_stream_decoder_set_client_data(decoder, &decoder_client_data))
1074 return die_ss_("returned false", decoder);
1077 printf("testing OggFLAC__seekable_stream_decoder_set_md5_checking()... ");
1078 if(!OggFLAC__seekable_stream_decoder_set_md5_checking(decoder, true))
1079 return die_ss_("returned false", decoder);
1082 printf("testing OggFLAC__seekable_stream_decoder_init()... ");
1083 if(OggFLAC__seekable_stream_decoder_init(decoder) != OggFLAC__SEEKABLE_STREAM_DECODER_OK)
1084 return die_ss_(0, decoder);
1087 printf("testing OggFLAC__seekable_stream_decoder_get_state()... ");
1088 state = OggFLAC__seekable_stream_decoder_get_state(decoder);
1089 printf("returned state = %u (%s)... OK\n", state, OggFLAC__SeekableStreamDecoderStateString[state]);
1091 printf("testing OggFLAC__seekable_stream_decoder_get_stream_decoder_state()... ");
1092 sstate = OggFLAC__seekable_stream_decoder_get_stream_decoder_state(decoder);
1093 printf("returned state = %u (%s)... OK\n", sstate, OggFLAC__StreamDecoderStateString[sstate]);
1095 printf("testing OggFLAC__seekable_stream_decoder_get_FLAC_stream_decoder_state()... ");
1096 fstate = OggFLAC__seekable_stream_decoder_get_FLAC_stream_decoder_state(decoder);
1097 printf("returned state = %u (%s)... OK\n", fstate, FLAC__StreamDecoderStateString[fstate]);
1099 decoder_client_data.current_metadata_number = 0;
1100 decoder_client_data.ignore_errors = false;
1101 decoder_client_data.error_occurred = false;
1103 printf("opening Ogg FLAC file... ");
1104 decoder_client_data.file = fopen(oggflacfilename_, "rb");
1105 if(0 == decoder_client_data.file) {
1111 printf("testing OggFLAC__seekable_stream_decoder_get_md5_checking()... ");
1112 if(!OggFLAC__seekable_stream_decoder_get_md5_checking(decoder)) {
1113 printf("FAILED, returned false, expected true\n");
1118 printf("testing OggFLAC__seekable_stream_decoder_process_until_end_of_metadata()... ");
1119 if(!OggFLAC__seekable_stream_decoder_process_until_end_of_metadata(decoder))
1120 return die_ss_("returned false", decoder);
1123 printf("testing OggFLAC__seekable_stream_decoder_process_single()... ");
1124 if(!OggFLAC__seekable_stream_decoder_process_single(decoder))
1125 return die_ss_("returned false", decoder);
1128 printf("testing OggFLAC__seekable_stream_decoder_flush()... ");
1129 if(!OggFLAC__seekable_stream_decoder_flush(decoder))
1130 return die_ss_("returned false", decoder);
1133 decoder_client_data.ignore_errors = true;
1134 printf("testing OggFLAC__seekable_stream_decoder_process_single()... ");
1135 if(!OggFLAC__seekable_stream_decoder_process_single(decoder))
1136 return die_ss_("returned false", decoder);
1138 decoder_client_data.ignore_errors = false;
1140 printf("testing OggFLAC__seekable_stream_decoder_seek_absolute()... ");
1141 if(!OggFLAC__seekable_stream_decoder_seek_absolute(decoder, 0))
1142 return die_ss_("returned false", decoder);
1145 printf("testing OggFLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
1146 if(!OggFLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
1147 return die_ss_("returned false", decoder);
1150 printf("testing OggFLAC__seekable_stream_decoder_get_channels()... ");
1152 unsigned channels = OggFLAC__seekable_stream_decoder_get_channels(decoder);
1153 if(channels != streaminfo_.data.stream_info.channels) {
1154 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
1160 printf("testing OggFLAC__seekable_stream_decoder_get_bits_per_sample()... ");
1162 unsigned bits_per_sample = OggFLAC__seekable_stream_decoder_get_bits_per_sample(decoder);
1163 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
1164 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
1170 printf("testing OggFLAC__seekable_stream_decoder_get_sample_rate()... ");
1172 unsigned sample_rate = OggFLAC__seekable_stream_decoder_get_sample_rate(decoder);
1173 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
1174 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
1180 printf("testing OggFLAC__seekable_stream_decoder_get_blocksize()... ");
1182 unsigned blocksize = OggFLAC__seekable_stream_decoder_get_blocksize(decoder);
1183 /* value could be anything since we're at the last block, so accept any answer */
1184 printf("returned %u... OK\n", blocksize);
1187 printf("testing OggFLAC__seekable_stream_decoder_get_channel_assignment()... ");
1189 FLAC__ChannelAssignment ca = OggFLAC__seekable_stream_decoder_get_channel_assignment(decoder);
1190 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1193 printf("testing OggFLAC__seekable_stream_decoder_reset()... ");
1194 if(!OggFLAC__seekable_stream_decoder_reset(decoder))
1195 return die_ss_("returned false", decoder);
1198 decoder_client_data.current_metadata_number = 0;
1200 printf("rewinding input... ");
1201 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
1202 printf("FAILED, errno = %d\n", errno);
1207 printf("testing OggFLAC__seekable_stream_decoder_process_until_end_of_stream()... ");
1208 if(!OggFLAC__seekable_stream_decoder_process_until_end_of_stream(decoder))
1209 return die_ss_("returned false", decoder);
1212 printf("testing OggFLAC__seekable_stream_decoder_finish()... ");
1213 (void) OggFLAC__seekable_stream_decoder_finish(decoder);
1220 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1221 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1222 return die_ss_("returned false", decoder);
1226 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1227 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1228 expected_metadata_sequence_[num_expected_++] = &padding_;
1229 expected_metadata_sequence_[num_expected_++] = &seektable_;
1230 expected_metadata_sequence_[num_expected_++] = &application1_;
1231 expected_metadata_sequence_[num_expected_++] = &application2_;
1232 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1233 expected_metadata_sequence_[num_expected_++] = &unknown_;
1235 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1242 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1243 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1244 return die_ss_("returned false", decoder);
1249 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1253 * respond all, ignore VORBIS_COMMENT
1256 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1257 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1258 return die_ss_("returned false", decoder);
1261 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
1262 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1263 return die_ss_("returned false", decoder);
1267 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1268 expected_metadata_sequence_[num_expected_++] = &padding_;
1269 expected_metadata_sequence_[num_expected_++] = &seektable_;
1270 expected_metadata_sequence_[num_expected_++] = &application1_;
1271 expected_metadata_sequence_[num_expected_++] = &application2_;
1272 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1273 expected_metadata_sequence_[num_expected_++] = &unknown_;
1275 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1279 * respond all, ignore APPLICATION
1282 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1283 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1284 return die_ss_("returned false", decoder);
1287 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... ");
1288 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1289 return die_ss_("returned false", decoder);
1293 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1294 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1295 expected_metadata_sequence_[num_expected_++] = &padding_;
1296 expected_metadata_sequence_[num_expected_++] = &seektable_;
1297 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1298 expected_metadata_sequence_[num_expected_++] = &unknown_;
1300 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1304 * respond all, ignore APPLICATION id of app#1
1307 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1308 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1309 return die_ss_("returned false", decoder);
1312 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1313 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1314 return die_ss_("returned false", decoder);
1318 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1319 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1320 expected_metadata_sequence_[num_expected_++] = &padding_;
1321 expected_metadata_sequence_[num_expected_++] = &seektable_;
1322 expected_metadata_sequence_[num_expected_++] = &application2_;
1323 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1324 expected_metadata_sequence_[num_expected_++] = &unknown_;
1326 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1330 * respond all, ignore APPLICATION id of app#1 & app#2
1333 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1334 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1335 return die_ss_("returned false", decoder);
1338 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1339 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1340 return die_ss_("returned false", decoder);
1343 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #2)... ");
1344 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
1345 return die_ss_("returned false", decoder);
1349 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1350 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1351 expected_metadata_sequence_[num_expected_++] = &padding_;
1352 expected_metadata_sequence_[num_expected_++] = &seektable_;
1353 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1354 expected_metadata_sequence_[num_expected_++] = &unknown_;
1356 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1360 * ignore all, respond VORBIS_COMMENT
1363 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1364 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1365 return die_ss_("returned false", decoder);
1368 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
1369 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1370 return die_ss_("returned false", decoder);
1374 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1376 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1380 * ignore all, respond APPLICATION
1383 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1384 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1385 return die_ss_("returned false", decoder);
1388 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... ");
1389 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1390 return die_ss_("returned false", decoder);
1394 expected_metadata_sequence_[num_expected_++] = &application1_;
1395 expected_metadata_sequence_[num_expected_++] = &application2_;
1397 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1401 * ignore all, respond APPLICATION id of app#1
1404 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1405 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1406 return die_ss_("returned false", decoder);
1409 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1410 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1411 return die_ss_("returned false", decoder);
1415 expected_metadata_sequence_[num_expected_++] = &application1_;
1417 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1421 * ignore all, respond APPLICATION id of app#1 & app#2
1424 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1425 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1426 return die_ss_("returned false", decoder);
1429 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1430 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1431 return die_ss_("returned false", decoder);
1434 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #2)... ");
1435 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
1436 return die_ss_("returned false", decoder);
1440 expected_metadata_sequence_[num_expected_++] = &application1_;
1441 expected_metadata_sequence_[num_expected_++] = &application2_;
1443 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1447 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
1450 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_all()... ");
1451 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_all(decoder))
1452 return die_ss_("returned false", decoder);
1455 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore(APPLICATION)... ");
1456 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1457 return die_ss_("returned false", decoder);
1460 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond_application(of app block #1)... ");
1461 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1462 return die_ss_("returned false", decoder);
1466 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1467 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1468 expected_metadata_sequence_[num_expected_++] = &padding_;
1469 expected_metadata_sequence_[num_expected_++] = &seektable_;
1470 expected_metadata_sequence_[num_expected_++] = &application1_;
1471 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1472 expected_metadata_sequence_[num_expected_++] = &unknown_;
1474 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1478 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
1481 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_all()... ");
1482 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder))
1483 return die_ss_("returned false", decoder);
1486 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_respond(APPLICATION)... ");
1487 if(!OggFLAC__seekable_stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1488 return die_ss_("returned false", decoder);
1491 printf("testing OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(of app block #1)... ");
1492 if(!OggFLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1493 return die_ss_("returned false", decoder);
1497 expected_metadata_sequence_[num_expected_++] = &application2_;
1499 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1502 /* done, now leave the sequence the way we found it... */
1504 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1505 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1506 expected_metadata_sequence_[num_expected_++] = &padding_;
1507 expected_metadata_sequence_[num_expected_++] = &seektable_;
1508 expected_metadata_sequence_[num_expected_++] = &application1_;
1509 expected_metadata_sequence_[num_expected_++] = &application2_;
1510 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1511 expected_metadata_sequence_[num_expected_++] = &unknown_;
1513 printf("testing OggFLAC__seekable_stream_decoder_delete()... ");
1514 OggFLAC__seekable_stream_decoder_delete(decoder);
1517 fclose(decoder_client_data.file);
1519 printf("\nPASSED!\n");
1524 static FLAC__StreamDecoderWriteStatus file_decoder_write_callback_(const OggFLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
1527 return stream_decoder_write_callback_(0, frame, buffer, client_data);
1530 static void file_decoder_metadata_callback_(const OggFLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
1533 stream_decoder_metadata_callback_(0, metadata, client_data);
1536 static void file_decoder_error_callback_(const OggFLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
1539 stream_decoder_error_callback_(0, status, client_data);
1542 static FLAC__bool file_decoder_test_respond_(OggFLAC__FileDecoder *decoder, file_decoder_client_data_struct *dcd)
1544 if(!OggFLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
1545 return die_f_("at OggFLAC__file_decoder_set_write_callback(), returned false", decoder);
1547 if(!OggFLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
1548 return die_f_("at OggFLAC__file_decoder_set_metadata_callback(), returned false", decoder);
1550 if(!OggFLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
1551 return die_f_("at OggFLAC__file_decoder_set_error_callback(), returned false", decoder);
1553 if(!OggFLAC__file_decoder_set_client_data(decoder, dcd))
1554 return die_f_("at OggFLAC__file_decoder_set_client_data(), returned false", decoder);
1556 if(!OggFLAC__file_decoder_set_filename(decoder, oggflacfilename_))
1557 return die_f_("at OggFLAC__file_decoder_set_filename(), returned false", decoder);
1559 if(!OggFLAC__file_decoder_set_md5_checking(decoder, true))
1560 return die_f_("at OggFLAC__file_decoder_set_md5_checking(), returned false", decoder);
1562 printf("testing OggFLAC__file_decoder_init()... ");
1563 if(OggFLAC__file_decoder_init(decoder) != OggFLAC__FILE_DECODER_OK)
1564 return die_f_(0, decoder);
1567 dcd->current_metadata_number = 0;
1569 printf("testing OggFLAC__file_decoder_process_until_end_of_file()... ");
1570 if(!OggFLAC__file_decoder_process_until_end_of_file(decoder))
1571 return die_f_("returned false", decoder);
1574 printf("testing OggFLAC__file_decoder_finish()... ");
1575 (void) OggFLAC__file_decoder_finish(decoder);
1581 static FLAC__bool test_file_decoder()
1583 OggFLAC__FileDecoder *decoder;
1584 OggFLAC__FileDecoderState state;
1585 OggFLAC__SeekableStreamDecoderState ssstate;
1586 OggFLAC__StreamDecoderState sstate;
1587 FLAC__StreamDecoderState fstate;
1588 seekable_stream_decoder_client_data_struct decoder_client_data;
1590 printf("\n+++ libOggFLAC unit test: OggFLAC__FileDecoder\n\n");
1592 printf("testing OggFLAC__file_decoder_new()... ");
1593 decoder = OggFLAC__file_decoder_new();
1595 printf("FAILED, returned NULL\n");
1600 printf("testing OggFLAC__file_decoder_delete()... ");
1601 OggFLAC__file_decoder_delete(decoder);
1604 printf("testing OggFLAC__file_decoder_new()... ");
1605 decoder = OggFLAC__file_decoder_new();
1607 printf("FAILED, returned NULL\n");
1612 printf("testing OggFLAC__file_decoder_init()... ");
1613 if(OggFLAC__file_decoder_init(decoder) == OggFLAC__FILE_DECODER_OK)
1614 return die_f_(0, decoder);
1617 printf("testing OggFLAC__file_decoder_delete()... ");
1618 OggFLAC__file_decoder_delete(decoder);
1622 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1624 printf("testing OggFLAC__file_decoder_new()... ");
1625 decoder = OggFLAC__file_decoder_new();
1627 printf("FAILED, returned NULL\n");
1632 printf("testing OggFLAC__file_decoder_set_serial_number()... ");
1633 if(!OggFLAC__file_decoder_set_serial_number(decoder, file_utils__serial_number))
1634 return die_f_("returned false", decoder);
1637 printf("testing OggFLAC__file_decoder_set_write_callback()... ");
1638 if(!OggFLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
1639 return die_f_("returned false", decoder);
1642 printf("testing OggFLAC__file_decoder_set_metadata_callback()... ");
1643 if(!OggFLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
1644 return die_f_("returned false", decoder);
1647 printf("testing OggFLAC__file_decoder_set_error_callback()... ");
1648 if(!OggFLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
1649 return die_f_("returned false", decoder);
1652 printf("testing OggFLAC__file_decoder_set_client_data()... ");
1653 if(!OggFLAC__file_decoder_set_client_data(decoder, &decoder_client_data))
1654 return die_f_("returned false", decoder);
1657 printf("testing OggFLAC__file_decoder_set_filename()... ");
1658 if(!OggFLAC__file_decoder_set_filename(decoder, oggflacfilename_))
1659 return die_f_("returned false", decoder);
1662 printf("testing OggFLAC__file_decoder_set_md5_checking()... ");
1663 if(!OggFLAC__file_decoder_set_md5_checking(decoder, true))
1664 return die_f_("returned false", decoder);
1667 printf("testing OggFLAC__file_decoder_init()... ");
1668 if(OggFLAC__file_decoder_init(decoder) != OggFLAC__FILE_DECODER_OK)
1669 return die_f_(0, decoder);
1672 printf("testing OggFLAC__file_decoder_get_state()... ");
1673 state = OggFLAC__file_decoder_get_state(decoder);
1674 printf("returned state = %u (%s)... OK\n", state, OggFLAC__FileDecoderStateString[state]);
1676 printf("testing OggFLAC__file_decoder_get_seekable_stream_decoder_state()... ");
1677 ssstate = OggFLAC__file_decoder_get_seekable_stream_decoder_state(decoder);
1678 printf("returned state = %u (%s)... OK\n", ssstate, OggFLAC__SeekableStreamDecoderStateString[ssstate]);
1680 printf("testing OggFLAC__file_decoder_get_stream_decoder_state()... ");
1681 sstate = OggFLAC__file_decoder_get_stream_decoder_state(decoder);
1682 printf("returned state = %u (%s)... OK\n", sstate, OggFLAC__StreamDecoderStateString[sstate]);
1684 printf("testing OggFLAC__file_decoder_get_FLAC_stream_decoder_state()... ");
1685 fstate = OggFLAC__file_decoder_get_FLAC_stream_decoder_state(decoder);
1686 printf("returned state = %u (%s)... OK\n", fstate, FLAC__StreamDecoderStateString[fstate]);
1688 decoder_client_data.current_metadata_number = 0;
1689 decoder_client_data.ignore_errors = false;
1690 decoder_client_data.error_occurred = false;
1692 printf("testing OggFLAC__file_decoder_get_md5_checking()... ");
1693 if(!OggFLAC__file_decoder_get_md5_checking(decoder)) {
1694 printf("FAILED, returned false, expected true\n");
1699 printf("testing OggFLAC__file_decoder_process_until_end_of_metadata()... ");
1700 if(!OggFLAC__file_decoder_process_until_end_of_metadata(decoder))
1701 return die_f_("returned false", decoder);
1704 printf("testing OggFLAC__file_decoder_process_single()... ");
1705 if(!OggFLAC__file_decoder_process_single(decoder))
1706 return die_f_("returned false", decoder);
1709 printf("testing OggFLAC__file_decoder_seek_absolute()... ");
1710 if(!OggFLAC__file_decoder_seek_absolute(decoder, 0))
1711 return die_f_("returned false", decoder);
1714 printf("testing OggFLAC__file_decoder_process_until_end_of_file()... ");
1715 if(!OggFLAC__file_decoder_process_until_end_of_file(decoder))
1716 return die_f_("returned false", decoder);
1719 printf("testing OggFLAC__file_decoder_get_channels()... ");
1721 unsigned channels = OggFLAC__file_decoder_get_channels(decoder);
1722 if(channels != streaminfo_.data.stream_info.channels) {
1723 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
1729 printf("testing OggFLAC__file_decoder_get_bits_per_sample()... ");
1731 unsigned bits_per_sample = OggFLAC__file_decoder_get_bits_per_sample(decoder);
1732 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
1733 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
1739 printf("testing OggFLAC__file_decoder_get_sample_rate()... ");
1741 unsigned sample_rate = OggFLAC__file_decoder_get_sample_rate(decoder);
1742 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
1743 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
1749 printf("testing OggFLAC__file_decoder_get_blocksize()... ");
1751 unsigned blocksize = OggFLAC__file_decoder_get_blocksize(decoder);
1752 /* value could be anything since we're at the last block, so accept any answer */
1753 printf("returned %u... OK\n", blocksize);
1756 printf("testing OggFLAC__file_decoder_get_channel_assignment()... ");
1758 FLAC__ChannelAssignment ca = OggFLAC__file_decoder_get_channel_assignment(decoder);
1759 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1762 printf("testing OggFLAC__file_decoder_finish()... ");
1763 (void) OggFLAC__file_decoder_finish(decoder);
1770 printf("testing OggFLAC__file_decoder_set_metadata_respond_all()... ");
1771 if(!OggFLAC__file_decoder_set_metadata_respond_all(decoder))
1772 return die_f_("returned false", decoder);
1776 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1777 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1778 expected_metadata_sequence_[num_expected_++] = &padding_;
1779 expected_metadata_sequence_[num_expected_++] = &seektable_;
1780 expected_metadata_sequence_[num_expected_++] = &application1_;
1781 expected_metadata_sequence_[num_expected_++] = &application2_;
1782 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1783 expected_metadata_sequence_[num_expected_++] = &unknown_;
1785 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1792 printf("testing OggFLAC__file_decoder_set_metadata_ignore_all()... ");
1793 if(!OggFLAC__file_decoder_set_metadata_ignore_all(decoder))
1794 return die_f_("returned false", decoder);
1799 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1803 * respond all, ignore VORBIS_COMMENT
1806 printf("testing OggFLAC__file_decoder_set_metadata_respond_all()... ");
1807 if(!OggFLAC__file_decoder_set_metadata_respond_all(decoder))
1808 return die_f_("returned false", decoder);
1811 printf("testing OggFLAC__file_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
1812 if(!OggFLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1813 return die_f_("returned false", decoder);
1817 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1818 expected_metadata_sequence_[num_expected_++] = &padding_;
1819 expected_metadata_sequence_[num_expected_++] = &seektable_;
1820 expected_metadata_sequence_[num_expected_++] = &application1_;
1821 expected_metadata_sequence_[num_expected_++] = &application2_;
1822 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1823 expected_metadata_sequence_[num_expected_++] = &unknown_;
1825 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1829 * respond all, ignore APPLICATION
1832 printf("testing OggFLAC__file_decoder_set_metadata_respond_all()... ");
1833 if(!OggFLAC__file_decoder_set_metadata_respond_all(decoder))
1834 return die_f_("returned false", decoder);
1837 printf("testing OggFLAC__file_decoder_set_metadata_ignore(APPLICATION)... ");
1838 if(!OggFLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
1839 return die_f_("returned false", decoder);
1843 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1844 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1845 expected_metadata_sequence_[num_expected_++] = &padding_;
1846 expected_metadata_sequence_[num_expected_++] = &seektable_;
1847 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1848 expected_metadata_sequence_[num_expected_++] = &unknown_;
1850 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1854 * respond all, ignore APPLICATION id of app#1
1857 printf("testing OggFLAC__file_decoder_set_metadata_respond_all()... ");
1858 if(!OggFLAC__file_decoder_set_metadata_respond_all(decoder))
1859 return die_f_("returned false", decoder);
1862 printf("testing OggFLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1863 if(!OggFLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1864 return die_f_("returned false", decoder);
1868 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1869 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1870 expected_metadata_sequence_[num_expected_++] = &padding_;
1871 expected_metadata_sequence_[num_expected_++] = &seektable_;
1872 expected_metadata_sequence_[num_expected_++] = &application2_;
1873 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1874 expected_metadata_sequence_[num_expected_++] = &unknown_;
1876 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1880 * respond all, ignore APPLICATION id of app#1 & app#2
1883 printf("testing OggFLAC__file_decoder_set_metadata_respond_all()... ");
1884 if(!OggFLAC__file_decoder_set_metadata_respond_all(decoder))
1885 return die_f_("returned false", decoder);
1888 printf("testing OggFLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
1889 if(!OggFLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
1890 return die_f_("returned false", decoder);
1893 printf("testing OggFLAC__file_decoder_set_metadata_ignore_application(of app block #2)... ");
1894 if(!OggFLAC__file_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
1895 return die_f_("returned false", decoder);
1899 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1900 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1901 expected_metadata_sequence_[num_expected_++] = &padding_;
1902 expected_metadata_sequence_[num_expected_++] = &seektable_;
1903 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1904 expected_metadata_sequence_[num_expected_++] = &unknown_;
1906 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1910 * ignore all, respond VORBIS_COMMENT
1913 printf("testing OggFLAC__file_decoder_set_metadata_ignore_all()... ");
1914 if(!OggFLAC__file_decoder_set_metadata_ignore_all(decoder))
1915 return die_f_("returned false", decoder);
1918 printf("testing OggFLAC__file_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
1919 if(!OggFLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
1920 return die_f_("returned false", decoder);
1924 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1926 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1930 * ignore all, respond APPLICATION
1933 printf("testing OggFLAC__file_decoder_set_metadata_ignore_all()... ");
1934 if(!OggFLAC__file_decoder_set_metadata_ignore_all(decoder))
1935 return die_f_("returned false", decoder);
1938 printf("testing OggFLAC__file_decoder_set_metadata_respond(APPLICATION)... ");
1939 if(!OggFLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
1940 return die_f_("returned false", decoder);
1944 expected_metadata_sequence_[num_expected_++] = &application1_;
1945 expected_metadata_sequence_[num_expected_++] = &application2_;
1947 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1951 * ignore all, respond APPLICATION id of app#1
1954 printf("testing OggFLAC__file_decoder_set_metadata_ignore_all()... ");
1955 if(!OggFLAC__file_decoder_set_metadata_ignore_all(decoder))
1956 return die_f_("returned false", decoder);
1959 printf("testing OggFLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1960 if(!OggFLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1961 return die_f_("returned false", decoder);
1965 expected_metadata_sequence_[num_expected_++] = &application1_;
1967 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1971 * ignore all, respond APPLICATION id of app#1 & app#2
1974 printf("testing OggFLAC__file_decoder_set_metadata_ignore_all()... ");
1975 if(!OggFLAC__file_decoder_set_metadata_ignore_all(decoder))
1976 return die_f_("returned false", decoder);
1979 printf("testing OggFLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
1980 if(!OggFLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
1981 return die_f_("returned false", decoder);
1984 printf("testing OggFLAC__file_decoder_set_metadata_respond_application(of app block #2)... ");
1985 if(!OggFLAC__file_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
1986 return die_f_("returned false", decoder);
1990 expected_metadata_sequence_[num_expected_++] = &application1_;
1991 expected_metadata_sequence_[num_expected_++] = &application2_;
1993 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1997 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
2000 printf("testing OggFLAC__file_decoder_set_metadata_respond_all()... ");
2001 if(!OggFLAC__file_decoder_set_metadata_respond_all(decoder))
2002 return die_f_("returned false", decoder);
2005 printf("testing OggFLAC__file_decoder_set_metadata_ignore(APPLICATION)... ");
2006 if(!OggFLAC__file_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
2007 return die_f_("returned false", decoder);
2010 printf("testing OggFLAC__file_decoder_set_metadata_respond_application(of app block #1)... ");
2011 if(!OggFLAC__file_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
2012 return die_f_("returned false", decoder);
2016 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
2017 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
2018 expected_metadata_sequence_[num_expected_++] = &padding_;
2019 expected_metadata_sequence_[num_expected_++] = &seektable_;
2020 expected_metadata_sequence_[num_expected_++] = &application1_;
2021 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
2022 expected_metadata_sequence_[num_expected_++] = &unknown_;
2024 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2028 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
2031 printf("testing OggFLAC__file_decoder_set_metadata_ignore_all()... ");
2032 if(!OggFLAC__file_decoder_set_metadata_ignore_all(decoder))
2033 return die_f_("returned false", decoder);
2036 printf("testing OggFLAC__file_decoder_set_metadata_respond(APPLICATION)... ");
2037 if(!OggFLAC__file_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
2038 return die_f_("returned false", decoder);
2041 printf("testing OggFLAC__file_decoder_set_metadata_ignore_application(of app block #1)... ");
2042 if(!OggFLAC__file_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
2043 return die_f_("returned false", decoder);
2047 expected_metadata_sequence_[num_expected_++] = &application2_;
2049 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2052 /* done, now leave the sequence the way we found it... */
2054 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
2055 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
2056 expected_metadata_sequence_[num_expected_++] = &padding_;
2057 expected_metadata_sequence_[num_expected_++] = &seektable_;
2058 expected_metadata_sequence_[num_expected_++] = &application1_;
2059 expected_metadata_sequence_[num_expected_++] = &application2_;
2060 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
2061 expected_metadata_sequence_[num_expected_++] = &unknown_;
2063 printf("testing OggFLAC__file_decoder_delete()... ");
2064 OggFLAC__file_decoder_delete(decoder);
2067 printf("\nPASSED!\n");
2072 FLAC__bool test_decoders()
2074 init_metadata_blocks_();
2075 if(!generate_file_())
2078 if(!test_stream_decoder())
2081 if(!test_seekable_stream_decoder())
2084 if(!test_file_decoder())
2087 (void) grabbag__file_remove_file(oggflacfilename_);
2088 free_metadata_blocks_();