blob: 6705b4e53fd1c6516b0ea4e6a86bac9c83499ab5 [file] [log] [blame]
Josh Coalsona86f8702002-08-20 04:03:24 +00001/* test_libOggFLAC - Unit tester for libOggFLAC
Josh Coalson95643902004-01-17 04:14:43 +00002 * Copyright (C) 2002,2003,2004 Josh Coalson
Josh Coalsona86f8702002-08-20 04:03:24 +00003 *
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.
8 *
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.
13 *
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.
17 */
18
19#include "decoders.h"
20#include "file_utils.h"
21#include "metadata_utils.h"
22#include "FLAC/assert.h"
Josh Coalson3c2bdf82003-09-26 01:56:01 +000023#include "OggFLAC/file_decoder.h"
24#include "OggFLAC/seekable_stream_decoder.h"
Josh Coalsona86f8702002-08-20 04:03:24 +000025#include "OggFLAC/stream_decoder.h"
Josh Coalsonb8f8a072002-11-07 05:07:30 +000026#include "share/grabbag.h"
Josh Coalsona86f8702002-08-20 04:03:24 +000027#include <errno.h>
28#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31
32typedef struct {
33 FILE *file;
34 unsigned current_metadata_number;
35 FLAC__bool ignore_errors;
36 FLAC__bool error_occurred;
37} stream_decoder_client_data_struct;
38
Josh Coalson3c2bdf82003-09-26 01:56:01 +000039typedef stream_decoder_client_data_struct seekable_stream_decoder_client_data_struct;
40typedef stream_decoder_client_data_struct file_decoder_client_data_struct;
41
Josh Coalsona47fa562003-01-10 08:15:35 +000042static FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_, cuesheet_, unknown_;
43static FLAC__StreamMetadata *expected_metadata_sequence_[8];
Josh Coalsona86f8702002-08-20 04:03:24 +000044static unsigned num_expected_;
45static const char *oggflacfilename_ = "metadata.ogg";
46static unsigned oggflacfilesize_;
47
48static FLAC__bool die_(const char *msg)
49{
50 printf("ERROR: %s\n", msg);
51 return false;
52}
53
54static FLAC__bool die_s_(const char *msg, const OggFLAC__StreamDecoder *decoder)
55{
56 OggFLAC__StreamDecoderState state = OggFLAC__stream_decoder_get_state(decoder);
57
58 if(msg)
59 printf("FAILED, %s", msg);
60 else
61 printf("FAILED");
62
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_]);
67 }
68
69 return false;
70}
71
Josh Coalson3c2bdf82003-09-26 01:56:01 +000072static FLAC__bool die_ss_(const char *msg, const OggFLAC__SeekableStreamDecoder *decoder)
73{
74 OggFLAC__SeekableStreamDecoderState state = OggFLAC__seekable_stream_decoder_get_state(decoder);
75
76 if(msg)
77 printf("FAILED, %s", msg);
78 else
79 printf("FAILED");
80
81 printf(", state = %u (%s)\n", (unsigned)state, OggFLAC__SeekableStreamDecoderStateString[state]);
Josh Coalson63f8edc2004-07-07 07:35:02 +000082 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) {
Josh Coalson3c2bdf82003-09-26 01:56:01 +000086 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__]);
88 }
89 }
90
91 return false;
92}
93
94static FLAC__bool die_f_(const char *msg, const OggFLAC__FileDecoder *decoder)
95{
96 OggFLAC__FileDecoderState state = OggFLAC__file_decoder_get_state(decoder);
97
98 if(msg)
99 printf("FAILED, %s", msg);
100 else
101 printf("FAILED");
102
103 printf(", state = %u (%s)\n", (unsigned)state, OggFLAC__SeekableStreamDecoderStateString[state]);
Josh Coalson073bd9e2003-12-31 05:38:20 +0000104 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_]);
Josh Coalson63f8edc2004-07-07 07:35:02 +0000107 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) {
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000111 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___]);
113 }
114 }
115 }
116
117 return false;
118}
119
Josh Coalsona86f8702002-08-20 04:03:24 +0000120static void init_metadata_blocks_()
121{
Josh Coalsona47fa562003-01-10 08:15:35 +0000122 mutils__init_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);
Josh Coalsona86f8702002-08-20 04:03:24 +0000123}
124
125static void free_metadata_blocks_()
126{
Josh Coalsona47fa562003-01-10 08:15:35 +0000127 mutils__free_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);
Josh Coalsona86f8702002-08-20 04:03:24 +0000128}
129
130static FLAC__bool generate_file_()
131{
132 printf("\n\ngenerating Ogg FLAC file for decoder tests...\n");
133
Josh Coalsona52a5552003-01-10 05:40:09 +0000134 num_expected_ = 0;
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_;
Josh Coalsona47fa562003-01-10 08:15:35 +0000141 expected_metadata_sequence_[num_expected_++] = &unknown_;
Josh Coalson69cfda72004-09-10 00:38:21 +0000142 /* WATCHOUT: the encoder should move the VORBIS_COMMENT block to the front, right after STREAMINFO */
Josh Coalsona86f8702002-08-20 04:03:24 +0000143
144 if(!file_utils__generate_oggflacfile(oggflacfilename_, &oggflacfilesize_, 512 * 1024, &streaminfo_, expected_metadata_sequence_, num_expected_))
Josh Coalson765ff502002-08-27 05:46:11 +0000145 return die_("creating the encoded file");
Josh Coalsona86f8702002-08-20 04:03:24 +0000146
147 return true;
148}
149
150static FLAC__StreamDecoderReadStatus stream_decoder_read_callback_(const OggFLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
151{
152 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
153
154 (void)decoder;
155
156 if(0 == dcd) {
157 printf("ERROR: client_data in read callback is NULL\n");
158 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
159 }
160
161 if(dcd->error_occurred)
162 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
163
Josh Coalson06c9c532003-12-30 03:33:43 +0000164 if(feof(dcd->file)) {
165 *bytes = 0;
Josh Coalsona86f8702002-08-20 04:03:24 +0000166 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
Josh Coalson06c9c532003-12-30 03:33:43 +0000167 }
Josh Coalson073bd9e2003-12-31 05:38:20 +0000168 else if(*bytes > 0) {
169 *bytes = fread(buffer, 1, *bytes, dcd->file);
Josh Coalson06c9c532003-12-30 03:33:43 +0000170 if(*bytes == 0) {
Josh Coalson765ff502002-08-27 05:46:11 +0000171 if(feof(dcd->file))
172 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
173 else
Josh Coalson06c9c532003-12-30 03:33:43 +0000174 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
Josh Coalson765ff502002-08-27 05:46:11 +0000175 }
176 else {
Josh Coalson765ff502002-08-27 05:46:11 +0000177 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
178 }
179 }
180 else
181 return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */
Josh Coalsona86f8702002-08-20 04:03:24 +0000182}
183
184static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const OggFLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
185{
186 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
187
188 (void)decoder, (void)buffer;
189
190 if(0 == dcd) {
191 printf("ERROR: client_data in write callback is NULL\n");
192 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
193 }
194
195 if(dcd->error_occurred)
196 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
197
Josh Coalson765ff502002-08-27 05:46:11 +0000198 if(
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)
201 ) {
202 printf("content... ");
203 fflush(stdout);
204 }
Josh Coalsona86f8702002-08-20 04:03:24 +0000205
206 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
207}
208
209static void stream_decoder_metadata_callback_(const OggFLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
210{
211 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
212
213 (void)decoder;
214
215 if(0 == dcd) {
216 printf("ERROR: client_data in metadata callback is NULL\n");
217 return;
218 }
219
220 if(dcd->error_occurred)
221 return;
222
223 printf("%d... ", dcd->current_metadata_number);
224 fflush(stdout);
225
226 if(dcd->current_metadata_number >= num_expected_) {
227 (void)die_("got more metadata blocks than expected");
228 dcd->error_occurred = true;
229 }
230 else {
Josh Coalsona52a5552003-01-10 05:40:09 +0000231 if(!mutils__compare_block(expected_metadata_sequence_[dcd->current_metadata_number], metadata)) {
Josh Coalsona86f8702002-08-20 04:03:24 +0000232 (void)die_("metadata block mismatch");
233 dcd->error_occurred = true;
234 }
235 }
236 dcd->current_metadata_number++;
237}
238
239static void stream_decoder_error_callback_(const OggFLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
240{
241 stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;
242
243 (void)decoder;
244
245 if(0 == dcd) {
246 printf("ERROR: client_data in error callback is NULL\n");
247 return;
248 }
249
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;
253 }
254}
255
256static FLAC__bool stream_decoder_test_respond_(OggFLAC__StreamDecoder *decoder, stream_decoder_client_data_struct *dcd)
257{
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);
260
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);
263
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);
266
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);
269
270 if(!OggFLAC__stream_decoder_set_client_data(decoder, dcd))
271 return die_s_("at OggFLAC__stream_decoder_set_client_data(), returned false", decoder);
272
273 printf("testing OggFLAC__stream_decoder_init()... ");
274 if(OggFLAC__stream_decoder_init(decoder) != OggFLAC__STREAM_DECODER_OK)
275 return die_s_(0, decoder);
276 printf("OK\n");
277
278 dcd->current_metadata_number = 0;
279
280 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
281 printf("FAILED rewinding input, errno = %d\n", errno);
282 return false;
283 }
284
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);
288 printf("OK\n");
289
290 printf("testing OggFLAC__stream_decoder_finish()... ");
291 OggFLAC__stream_decoder_finish(decoder);
292 printf("OK\n");
293
294 return true;
295}
296
297static FLAC__bool test_stream_decoder()
298{
299 OggFLAC__StreamDecoder *decoder;
300 OggFLAC__StreamDecoderState state;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000301 FLAC__StreamDecoderState fstate;
Josh Coalsona86f8702002-08-20 04:03:24 +0000302 stream_decoder_client_data_struct decoder_client_data;
303
304 printf("\n+++ libOggFLAC unit test: OggFLAC__StreamDecoder\n\n");
305
306 printf("testing OggFLAC__stream_decoder_new()... ");
307 decoder = OggFLAC__stream_decoder_new();
308 if(0 == decoder) {
309 printf("FAILED, returned NULL\n");
310 return false;
311 }
312 printf("OK\n");
313
314 printf("testing OggFLAC__stream_decoder_delete()... ");
315 OggFLAC__stream_decoder_delete(decoder);
316 printf("OK\n");
317
318 printf("testing OggFLAC__stream_decoder_new()... ");
319 decoder = OggFLAC__stream_decoder_new();
320 if(0 == decoder) {
321 printf("FAILED, returned NULL\n");
322 return false;
323 }
324 printf("OK\n");
325
326 printf("testing OggFLAC__stream_decoder_init()... ");
327 if(OggFLAC__stream_decoder_init(decoder) == OggFLAC__STREAM_DECODER_OK)
328 return die_s_(0, decoder);
329 printf("OK\n");
330
331 printf("testing OggFLAC__stream_decoder_delete()... ");
332 OggFLAC__stream_decoder_delete(decoder);
333 printf("OK\n");
334
335 num_expected_ = 0;
336 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
337
338 printf("testing OggFLAC__stream_decoder_new()... ");
339 decoder = OggFLAC__stream_decoder_new();
340 if(0 == decoder) {
341 printf("FAILED, returned NULL\n");
342 return false;
343 }
344 printf("OK\n");
345
Josh Coalson8304c8f2002-09-04 07:52:58 +0000346 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);
349 printf("OK\n");
350
Josh Coalsona86f8702002-08-20 04:03:24 +0000351 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);
354 printf("OK\n");
355
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);
359 printf("OK\n");
360
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);
364 printf("OK\n");
365
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);
369 printf("OK\n");
370
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);
374 printf("OK\n");
375
376 printf("testing OggFLAC__stream_decoder_init()... ");
377 if(OggFLAC__stream_decoder_init(decoder) != OggFLAC__STREAM_DECODER_OK)
378 return die_s_(0, decoder);
379 printf("OK\n");
380
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]);
384
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000385 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]);
388
Josh Coalsona86f8702002-08-20 04:03:24 +0000389 decoder_client_data.current_metadata_number = 0;
390 decoder_client_data.ignore_errors = false;
391 decoder_client_data.error_occurred = false;
392
393 printf("opening Ogg FLAC file... ");
394 decoder_client_data.file = fopen(oggflacfilename_, "rb");
395 if(0 == decoder_client_data.file) {
396 printf("ERROR\n");
397 return false;
398 }
399 printf("OK\n");
400
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);
404 printf("OK\n");
405
406 printf("testing OggFLAC__stream_decoder_process_single()... ");
407 if(!OggFLAC__stream_decoder_process_single(decoder))
408 return die_s_("returned false", decoder);
409 printf("OK\n");
410
411 printf("testing OggFLAC__stream_decoder_flush()... ");
412 if(!OggFLAC__stream_decoder_flush(decoder))
413 return die_s_("returned false", decoder);
414 printf("OK\n");
415
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);
420 printf("OK\n");
421 decoder_client_data.ignore_errors = false;
422
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);
426 printf("OK\n");
427
428 printf("testing OggFLAC__stream_decoder_get_channels()... ");
429 {
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);
433 return false;
434 }
435 }
436 printf("OK\n");
437
438 printf("testing OggFLAC__stream_decoder_get_bits_per_sample()... ");
439 {
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);
443 return false;
444 }
445 }
446 printf("OK\n");
447
448 printf("testing OggFLAC__stream_decoder_get_sample_rate()... ");
449 {
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);
453 return false;
454 }
455 }
456 printf("OK\n");
457
458 printf("testing OggFLAC__stream_decoder_get_blocksize()... ");
459 {
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);
463 }
464
465 printf("testing OggFLAC__stream_decoder_get_channel_assignment()... ");
466 {
467 FLAC__ChannelAssignment ca = OggFLAC__stream_decoder_get_channel_assignment(decoder);
468 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
469 }
470
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]);
475 return false;
476 }
477 printf("OK\n");
478
479 decoder_client_data.current_metadata_number = 0;
480
481 printf("rewinding input... ");
482 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
483 printf("FAILED, errno = %d\n", errno);
484 return false;
485 }
486 printf("OK\n");
487
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);
491 printf("OK\n");
492
493 printf("testing OggFLAC__stream_decoder_finish()... ");
494 OggFLAC__stream_decoder_finish(decoder);
495 printf("OK\n");
496
497 /*
498 * respond all
499 */
500
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);
504 printf("OK\n");
505
506 num_expected_ = 0;
507 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +0000508 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000509 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_;
Josh Coalsona52a5552003-01-10 05:40:09 +0000513 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
Josh Coalsona47fa562003-01-10 08:15:35 +0000514 expected_metadata_sequence_[num_expected_++] = &unknown_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000515
516 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
517 return false;
518
519 /*
520 * ignore all
521 */
522
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);
526 printf("OK\n");
527
528 num_expected_ = 0;
529
530 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
531 return false;
532
533 /*
534 * respond all, ignore VORBIS_COMMENT
535 */
536
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);
540 printf("OK\n");
541
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);
545 printf("OK\n");
546
547 num_expected_ = 0;
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_;
Josh Coalsona52a5552003-01-10 05:40:09 +0000553 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
Josh Coalsona47fa562003-01-10 08:15:35 +0000554 expected_metadata_sequence_[num_expected_++] = &unknown_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000555
556 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
557 return false;
558
559 /*
560 * respond all, ignore APPLICATION
561 */
562
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);
566 printf("OK\n");
567
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);
571 printf("OK\n");
572
573 num_expected_ = 0;
574 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +0000575 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000576 expected_metadata_sequence_[num_expected_++] = &padding_;
577 expected_metadata_sequence_[num_expected_++] = &seektable_;
Josh Coalsona52a5552003-01-10 05:40:09 +0000578 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
Josh Coalsona47fa562003-01-10 08:15:35 +0000579 expected_metadata_sequence_[num_expected_++] = &unknown_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000580
581 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
582 return false;
583
584 /*
585 * respond all, ignore APPLICATION id of app#1
586 */
587
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);
591 printf("OK\n");
592
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);
596 printf("OK\n");
597
598 num_expected_ = 0;
599 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +0000600 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000601 expected_metadata_sequence_[num_expected_++] = &padding_;
602 expected_metadata_sequence_[num_expected_++] = &seektable_;
603 expected_metadata_sequence_[num_expected_++] = &application2_;
Josh Coalsona52a5552003-01-10 05:40:09 +0000604 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
Josh Coalsona47fa562003-01-10 08:15:35 +0000605 expected_metadata_sequence_[num_expected_++] = &unknown_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000606
607 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
608 return false;
609
610 /*
611 * respond all, ignore APPLICATION id of app#1 & app#2
612 */
613
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);
617 printf("OK\n");
618
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);
622 printf("OK\n");
623
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);
627 printf("OK\n");
628
629 num_expected_ = 0;
630 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +0000631 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000632 expected_metadata_sequence_[num_expected_++] = &padding_;
633 expected_metadata_sequence_[num_expected_++] = &seektable_;
Josh Coalsona52a5552003-01-10 05:40:09 +0000634 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
Josh Coalsona47fa562003-01-10 08:15:35 +0000635 expected_metadata_sequence_[num_expected_++] = &unknown_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000636
637 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
638 return false;
639
640 /*
641 * ignore all, respond VORBIS_COMMENT
642 */
643
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);
647 printf("OK\n");
648
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);
652 printf("OK\n");
653
654 num_expected_ = 0;
655 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
656
657 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
658 return false;
659
660 /*
661 * ignore all, respond APPLICATION
662 */
663
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);
667 printf("OK\n");
668
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);
672 printf("OK\n");
673
674 num_expected_ = 0;
675 expected_metadata_sequence_[num_expected_++] = &application1_;
676 expected_metadata_sequence_[num_expected_++] = &application2_;
677
678 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
679 return false;
680
681 /*
682 * ignore all, respond APPLICATION id of app#1
683 */
684
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);
688 printf("OK\n");
689
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);
693 printf("OK\n");
694
695 num_expected_ = 0;
696 expected_metadata_sequence_[num_expected_++] = &application1_;
697
698 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
699 return false;
700
701 /*
702 * ignore all, respond APPLICATION id of app#1 & app#2
703 */
704
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);
708 printf("OK\n");
709
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);
713 printf("OK\n");
714
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);
718 printf("OK\n");
719
720 num_expected_ = 0;
721 expected_metadata_sequence_[num_expected_++] = &application1_;
722 expected_metadata_sequence_[num_expected_++] = &application2_;
723
724 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
725 return false;
726
727 /*
728 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
729 */
730
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);
734 printf("OK\n");
735
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);
739 printf("OK\n");
740
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);
744 printf("OK\n");
745
746 num_expected_ = 0;
747 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +0000748 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000749 expected_metadata_sequence_[num_expected_++] = &padding_;
750 expected_metadata_sequence_[num_expected_++] = &seektable_;
751 expected_metadata_sequence_[num_expected_++] = &application1_;
Josh Coalsona52a5552003-01-10 05:40:09 +0000752 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
Josh Coalsona47fa562003-01-10 08:15:35 +0000753 expected_metadata_sequence_[num_expected_++] = &unknown_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000754
755 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
756 return false;
757
758 /*
759 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
760 */
761
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);
765 printf("OK\n");
766
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);
770 printf("OK\n");
771
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);
775 printf("OK\n");
776
777 num_expected_ = 0;
778 expected_metadata_sequence_[num_expected_++] = &application2_;
779
780 if(!stream_decoder_test_respond_(decoder, &decoder_client_data))
781 return false;
782
783 /* done, now leave the sequence the way we found it... */
784 num_expected_ = 0;
785 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +0000786 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000787 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_;
Josh Coalsona52a5552003-01-10 05:40:09 +0000791 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
Josh Coalsona47fa562003-01-10 08:15:35 +0000792 expected_metadata_sequence_[num_expected_++] = &unknown_;
Josh Coalsona86f8702002-08-20 04:03:24 +0000793
794 printf("testing OggFLAC__stream_decoder_delete()... ");
795 OggFLAC__stream_decoder_delete(decoder);
796 printf("OK\n");
797
798 fclose(decoder_client_data.file);
799
800 printf("\nPASSED!\n");
801
802 return true;
803}
804
Josh Coalson63f8edc2004-07-07 07:35:02 +0000805static OggFLAC__SeekableStreamDecoderReadStatus seekable_stream_decoder_read_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000806{
807 (void)decoder;
808 switch(stream_decoder_read_callback_(0, buffer, bytes, client_data)) {
809 case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE:
Josh Coalson06c9c532003-12-30 03:33:43 +0000810 case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM:
Josh Coalson63f8edc2004-07-07 07:35:02 +0000811 return OggFLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000812 case FLAC__STREAM_DECODER_READ_STATUS_ABORT:
Josh Coalson63f8edc2004-07-07 07:35:02 +0000813 return OggFLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000814 default:
815 FLAC__ASSERT(0);
Josh Coalson63f8edc2004-07-07 07:35:02 +0000816 return OggFLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000817 }
818}
819
Josh Coalson63f8edc2004-07-07 07:35:02 +0000820static OggFLAC__SeekableStreamDecoderSeekStatus seekable_stream_decoder_seek_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000821{
822 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
823
824 (void)decoder;
825
826 if(0 == dcd) {
827 printf("ERROR: client_data in seek callback is NULL\n");
Josh Coalson63f8edc2004-07-07 07:35:02 +0000828 return OggFLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000829 }
830
831 if(dcd->error_occurred)
Josh Coalson63f8edc2004-07-07 07:35:02 +0000832 return OggFLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000833
834 if(fseek(dcd->file, (long)absolute_byte_offset, SEEK_SET) < 0) {
835 dcd->error_occurred = true;
Josh Coalson63f8edc2004-07-07 07:35:02 +0000836 return OggFLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000837 }
838
Josh Coalson63f8edc2004-07-07 07:35:02 +0000839 return OggFLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000840}
841
Josh Coalson63f8edc2004-07-07 07:35:02 +0000842static OggFLAC__SeekableStreamDecoderTellStatus seekable_stream_decoder_tell_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000843{
844 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
845 long offset;
846
847 (void)decoder;
848
849 if(0 == dcd) {
850 printf("ERROR: client_data in tell callback is NULL\n");
Josh Coalson63f8edc2004-07-07 07:35:02 +0000851 return OggFLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000852 }
853
854 if(dcd->error_occurred)
Josh Coalson63f8edc2004-07-07 07:35:02 +0000855 return OggFLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000856
857 offset = ftell(dcd->file);
858 *absolute_byte_offset = (FLAC__uint64)offset;
859
860 if(offset < 0) {
861 dcd->error_occurred = true;
Josh Coalson63f8edc2004-07-07 07:35:02 +0000862 return OggFLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000863 }
864
Josh Coalson63f8edc2004-07-07 07:35:02 +0000865 return OggFLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000866}
867
Josh Coalson63f8edc2004-07-07 07:35:02 +0000868static OggFLAC__SeekableStreamDecoderLengthStatus seekable_stream_decoder_length_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000869{
870 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
871
872 (void)decoder;
873
874 if(0 == dcd) {
875 printf("ERROR: client_data in length callback is NULL\n");
Josh Coalson63f8edc2004-07-07 07:35:02 +0000876 return OggFLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000877 }
878
879 if(dcd->error_occurred)
Josh Coalson63f8edc2004-07-07 07:35:02 +0000880 return OggFLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000881
882 *stream_length = (FLAC__uint64)oggflacfilesize_;
Josh Coalson63f8edc2004-07-07 07:35:02 +0000883 return OggFLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000884}
885
886static FLAC__bool seekable_stream_decoder_eof_callback_(const OggFLAC__SeekableStreamDecoder *decoder, void *client_data)
887{
888 seekable_stream_decoder_client_data_struct *dcd = (seekable_stream_decoder_client_data_struct*)client_data;
889
890 (void)decoder;
891
892 if(0 == dcd) {
893 printf("ERROR: client_data in eof callback is NULL\n");
894 return true;
895 }
896
897 if(dcd->error_occurred)
898 return true;
899
900 return feof(dcd->file);
901}
902
903static FLAC__StreamDecoderWriteStatus seekable_stream_decoder_write_callback_(const OggFLAC__SeekableStreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
904{
905 (void)decoder;
906 return stream_decoder_write_callback_(0, frame, buffer, client_data);
907}
908
909static void seekable_stream_decoder_metadata_callback_(const OggFLAC__SeekableStreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
910{
911 (void)decoder;
912 stream_decoder_metadata_callback_(0, metadata, client_data);
913}
914
915static void seekable_stream_decoder_error_callback_(const OggFLAC__SeekableStreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
916{
917 (void)decoder;
918 stream_decoder_error_callback_(0, status, client_data);
919}
920
921static FLAC__bool seekable_stream_decoder_test_respond_(OggFLAC__SeekableStreamDecoder *decoder, seekable_stream_decoder_client_data_struct *dcd)
922{
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);
925
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);
928
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);
931
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);
934
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);
937
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);
940
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);
943
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);
946
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);
949
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);
952
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);
956 printf("OK\n");
957
958 dcd->current_metadata_number = 0;
959
960 if(fseek(dcd->file, 0, SEEK_SET) < 0) {
961 printf("FAILED rewinding input, errno = %d\n", errno);
962 return false;
963 }
964
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);
968 printf("OK\n");
969
970 printf("testing OggFLAC__seekable_stream_decoder_finish()... ");
971 (void) OggFLAC__seekable_stream_decoder_finish(decoder);
972 printf("OK\n");
973
974 return true;
975}
976
977static FLAC__bool test_seekable_stream_decoder()
978{
979 OggFLAC__SeekableStreamDecoder *decoder;
980 OggFLAC__SeekableStreamDecoderState state;
Josh Coalson63f8edc2004-07-07 07:35:02 +0000981 OggFLAC__StreamDecoderState sstate;
Josh Coalson3c2bdf82003-09-26 01:56:01 +0000982 FLAC__StreamDecoderState fstate;
983 seekable_stream_decoder_client_data_struct decoder_client_data;
984
985 printf("\n+++ libOggFLAC unit test: OggFLAC__SeekableStreamDecoder\n\n");
986
987 printf("testing OggFLAC__seekable_stream_decoder_new()... ");
988 decoder = OggFLAC__seekable_stream_decoder_new();
989 if(0 == decoder) {
990 printf("FAILED, returned NULL\n");
991 return false;
992 }
993 printf("OK\n");
994
995 printf("testing OggFLAC__seekable_stream_decoder_delete()... ");
996 OggFLAC__seekable_stream_decoder_delete(decoder);
997 printf("OK\n");
998
999 printf("testing OggFLAC__seekable_stream_decoder_new()... ");
1000 decoder = OggFLAC__seekable_stream_decoder_new();
1001 if(0 == decoder) {
1002 printf("FAILED, returned NULL\n");
1003 return false;
1004 }
1005 printf("OK\n");
1006
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);
1010 printf("OK\n");
1011
1012 printf("testing OggFLAC__seekable_stream_decoder_delete()... ");
1013 OggFLAC__seekable_stream_decoder_delete(decoder);
1014 printf("OK\n");
1015
1016 num_expected_ = 0;
1017 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1018
1019 printf("testing OggFLAC__seekable_stream_decoder_new()... ");
1020 decoder = OggFLAC__seekable_stream_decoder_new();
1021 if(0 == decoder) {
1022 printf("FAILED, returned NULL\n");
1023 return false;
1024 }
1025 printf("OK\n");
1026
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);
1030 printf("OK\n");
1031
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);
1035 printf("OK\n");
1036
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);
1040 printf("OK\n");
1041
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);
1045 printf("OK\n");
1046
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);
1050 printf("OK\n");
1051
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);
1055 printf("OK\n");
1056
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);
1060 printf("OK\n");
1061
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);
1065 printf("OK\n");
1066
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);
1070 printf("OK\n");
1071
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);
1075 printf("OK\n");
1076
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);
1080 printf("OK\n");
1081
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);
1085 printf("OK\n");
1086
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]);
1090
Josh Coalson63f8edc2004-07-07 07:35:02 +00001091 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]);
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001094
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]);
1098
1099 decoder_client_data.current_metadata_number = 0;
1100 decoder_client_data.ignore_errors = false;
1101 decoder_client_data.error_occurred = false;
1102
1103 printf("opening Ogg FLAC file... ");
1104 decoder_client_data.file = fopen(oggflacfilename_, "rb");
1105 if(0 == decoder_client_data.file) {
1106 printf("ERROR\n");
1107 return false;
1108 }
1109 printf("OK\n");
1110
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");
1114 return false;
1115 }
1116 printf("OK\n");
1117
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);
1121 printf("OK\n");
1122
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);
1126 printf("OK\n");
1127
1128 printf("testing OggFLAC__seekable_stream_decoder_flush()... ");
1129 if(!OggFLAC__seekable_stream_decoder_flush(decoder))
1130 return die_ss_("returned false", decoder);
1131 printf("OK\n");
1132
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);
1137 printf("OK\n");
1138 decoder_client_data.ignore_errors = false;
1139
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);
1143 printf("OK\n");
1144
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);
1148 printf("OK\n");
1149
1150 printf("testing OggFLAC__seekable_stream_decoder_get_channels()... ");
1151 {
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);
1155 return false;
1156 }
1157 }
1158 printf("OK\n");
1159
1160 printf("testing OggFLAC__seekable_stream_decoder_get_bits_per_sample()... ");
1161 {
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);
1165 return false;
1166 }
1167 }
1168 printf("OK\n");
1169
1170 printf("testing OggFLAC__seekable_stream_decoder_get_sample_rate()... ");
1171 {
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);
1175 return false;
1176 }
1177 }
1178 printf("OK\n");
1179
1180 printf("testing OggFLAC__seekable_stream_decoder_get_blocksize()... ");
1181 {
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);
1185 }
1186
1187 printf("testing OggFLAC__seekable_stream_decoder_get_channel_assignment()... ");
1188 {
1189 FLAC__ChannelAssignment ca = OggFLAC__seekable_stream_decoder_get_channel_assignment(decoder);
1190 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1191 }
1192
1193 printf("testing OggFLAC__seekable_stream_decoder_reset()... ");
1194 if(!OggFLAC__seekable_stream_decoder_reset(decoder))
1195 return die_ss_("returned false", decoder);
1196 printf("OK\n");
1197
1198 decoder_client_data.current_metadata_number = 0;
1199
1200 printf("rewinding input... ");
1201 if(fseek(decoder_client_data.file, 0, SEEK_SET) < 0) {
1202 printf("FAILED, errno = %d\n", errno);
1203 return false;
1204 }
1205 printf("OK\n");
1206
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);
1210 printf("OK\n");
1211
1212 printf("testing OggFLAC__seekable_stream_decoder_finish()... ");
1213 (void) OggFLAC__seekable_stream_decoder_finish(decoder);
1214 printf("OK\n");
1215
1216 /*
1217 * respond all
1218 */
1219
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);
1223 printf("OK\n");
1224
1225 num_expected_ = 0;
1226 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +00001227 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001228 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_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001232 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1233 expected_metadata_sequence_[num_expected_++] = &unknown_;
1234
1235 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1236 return false;
1237
1238 /*
1239 * ignore all
1240 */
1241
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);
1245 printf("OK\n");
1246
1247 num_expected_ = 0;
1248
1249 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1250 return false;
1251
1252 /*
1253 * respond all, ignore VORBIS_COMMENT
1254 */
1255
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);
1259 printf("OK\n");
1260
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);
1264 printf("OK\n");
1265
1266 num_expected_ = 0;
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_;
1274
1275 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1276 return false;
1277
1278 /*
1279 * respond all, ignore APPLICATION
1280 */
1281
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);
1285 printf("OK\n");
1286
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);
1290 printf("OK\n");
1291
1292 num_expected_ = 0;
1293 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +00001294 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001295 expected_metadata_sequence_[num_expected_++] = &padding_;
1296 expected_metadata_sequence_[num_expected_++] = &seektable_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001297 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1298 expected_metadata_sequence_[num_expected_++] = &unknown_;
1299
1300 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1301 return false;
1302
1303 /*
1304 * respond all, ignore APPLICATION id of app#1
1305 */
1306
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);
1310 printf("OK\n");
1311
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);
1315 printf("OK\n");
1316
1317 num_expected_ = 0;
1318 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +00001319 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001320 expected_metadata_sequence_[num_expected_++] = &padding_;
1321 expected_metadata_sequence_[num_expected_++] = &seektable_;
1322 expected_metadata_sequence_[num_expected_++] = &application2_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001323 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1324 expected_metadata_sequence_[num_expected_++] = &unknown_;
1325
1326 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1327 return false;
1328
1329 /*
1330 * respond all, ignore APPLICATION id of app#1 & app#2
1331 */
1332
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);
1336 printf("OK\n");
1337
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);
1341 printf("OK\n");
1342
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);
1346 printf("OK\n");
1347
1348 num_expected_ = 0;
1349 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +00001350 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001351 expected_metadata_sequence_[num_expected_++] = &padding_;
1352 expected_metadata_sequence_[num_expected_++] = &seektable_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001353 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1354 expected_metadata_sequence_[num_expected_++] = &unknown_;
1355
1356 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1357 return false;
1358
1359 /*
1360 * ignore all, respond VORBIS_COMMENT
1361 */
1362
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);
1366 printf("OK\n");
1367
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);
1371 printf("OK\n");
1372
1373 num_expected_ = 0;
1374 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1375
1376 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1377 return false;
1378
1379 /*
1380 * ignore all, respond APPLICATION
1381 */
1382
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);
1386 printf("OK\n");
1387
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);
1391 printf("OK\n");
1392
1393 num_expected_ = 0;
1394 expected_metadata_sequence_[num_expected_++] = &application1_;
1395 expected_metadata_sequence_[num_expected_++] = &application2_;
1396
1397 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1398 return false;
1399
1400 /*
1401 * ignore all, respond APPLICATION id of app#1
1402 */
1403
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);
1407 printf("OK\n");
1408
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);
1412 printf("OK\n");
1413
1414 num_expected_ = 0;
1415 expected_metadata_sequence_[num_expected_++] = &application1_;
1416
1417 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1418 return false;
1419
1420 /*
1421 * ignore all, respond APPLICATION id of app#1 & app#2
1422 */
1423
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);
1427 printf("OK\n");
1428
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);
1432 printf("OK\n");
1433
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);
1437 printf("OK\n");
1438
1439 num_expected_ = 0;
1440 expected_metadata_sequence_[num_expected_++] = &application1_;
1441 expected_metadata_sequence_[num_expected_++] = &application2_;
1442
1443 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1444 return false;
1445
1446 /*
1447 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
1448 */
1449
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);
1453 printf("OK\n");
1454
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);
1458 printf("OK\n");
1459
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);
1463 printf("OK\n");
1464
1465 num_expected_ = 0;
1466 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +00001467 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001468 expected_metadata_sequence_[num_expected_++] = &padding_;
1469 expected_metadata_sequence_[num_expected_++] = &seektable_;
1470 expected_metadata_sequence_[num_expected_++] = &application1_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001471 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1472 expected_metadata_sequence_[num_expected_++] = &unknown_;
1473
1474 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1475 return false;
1476
1477 /*
1478 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
1479 */
1480
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);
1484 printf("OK\n");
1485
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);
1489 printf("OK\n");
1490
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);
1494 printf("OK\n");
1495
1496 num_expected_ = 0;
1497 expected_metadata_sequence_[num_expected_++] = &application2_;
1498
1499 if(!seekable_stream_decoder_test_respond_(decoder, &decoder_client_data))
1500 return false;
1501
1502 /* done, now leave the sequence the way we found it... */
1503 num_expected_ = 0;
1504 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +00001505 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001506 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_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001510 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1511 expected_metadata_sequence_[num_expected_++] = &unknown_;
1512
1513 printf("testing OggFLAC__seekable_stream_decoder_delete()... ");
1514 OggFLAC__seekable_stream_decoder_delete(decoder);
1515 printf("OK\n");
1516
1517 fclose(decoder_client_data.file);
1518
1519 printf("\nPASSED!\n");
1520
1521 return true;
1522}
1523
1524static FLAC__StreamDecoderWriteStatus file_decoder_write_callback_(const OggFLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
1525{
1526 (void)decoder;
1527 return stream_decoder_write_callback_(0, frame, buffer, client_data);
1528}
1529
1530static void file_decoder_metadata_callback_(const OggFLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
1531{
1532 (void)decoder;
1533 stream_decoder_metadata_callback_(0, metadata, client_data);
1534}
1535
1536static void file_decoder_error_callback_(const OggFLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
1537{
1538 (void)decoder;
1539 stream_decoder_error_callback_(0, status, client_data);
1540}
1541
1542static FLAC__bool file_decoder_test_respond_(OggFLAC__FileDecoder *decoder, file_decoder_client_data_struct *dcd)
1543{
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);
1546
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);
1549
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);
1552
1553 if(!OggFLAC__file_decoder_set_client_data(decoder, dcd))
1554 return die_f_("at OggFLAC__file_decoder_set_client_data(), returned false", decoder);
1555
1556 if(!OggFLAC__file_decoder_set_filename(decoder, oggflacfilename_))
1557 return die_f_("at OggFLAC__file_decoder_set_filename(), returned false", decoder);
1558
1559 if(!OggFLAC__file_decoder_set_md5_checking(decoder, true))
1560 return die_f_("at OggFLAC__file_decoder_set_md5_checking(), returned false", decoder);
1561
1562 printf("testing OggFLAC__file_decoder_init()... ");
1563 if(OggFLAC__file_decoder_init(decoder) != OggFLAC__FILE_DECODER_OK)
1564 return die_f_(0, decoder);
1565 printf("OK\n");
1566
1567 dcd->current_metadata_number = 0;
1568
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);
1572 printf("OK\n");
1573
1574 printf("testing OggFLAC__file_decoder_finish()... ");
1575 (void) OggFLAC__file_decoder_finish(decoder);
1576 printf("OK\n");
1577
1578 return true;
1579}
1580
1581static FLAC__bool test_file_decoder()
1582{
1583 OggFLAC__FileDecoder *decoder;
1584 OggFLAC__FileDecoderState state;
Josh Coalson63f8edc2004-07-07 07:35:02 +00001585 OggFLAC__SeekableStreamDecoderState ssstate;
1586 OggFLAC__StreamDecoderState sstate;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001587 FLAC__StreamDecoderState fstate;
1588 seekable_stream_decoder_client_data_struct decoder_client_data;
1589
1590 printf("\n+++ libOggFLAC unit test: OggFLAC__FileDecoder\n\n");
1591
1592 printf("testing OggFLAC__file_decoder_new()... ");
1593 decoder = OggFLAC__file_decoder_new();
1594 if(0 == decoder) {
1595 printf("FAILED, returned NULL\n");
1596 return false;
1597 }
1598 printf("OK\n");
1599
1600 printf("testing OggFLAC__file_decoder_delete()... ");
1601 OggFLAC__file_decoder_delete(decoder);
1602 printf("OK\n");
1603
1604 printf("testing OggFLAC__file_decoder_new()... ");
1605 decoder = OggFLAC__file_decoder_new();
1606 if(0 == decoder) {
1607 printf("FAILED, returned NULL\n");
1608 return false;
1609 }
1610 printf("OK\n");
1611
1612 printf("testing OggFLAC__file_decoder_init()... ");
1613 if(OggFLAC__file_decoder_init(decoder) == OggFLAC__FILE_DECODER_OK)
1614 return die_f_(0, decoder);
1615 printf("OK\n");
1616
1617 printf("testing OggFLAC__file_decoder_delete()... ");
1618 OggFLAC__file_decoder_delete(decoder);
1619 printf("OK\n");
1620
1621 num_expected_ = 0;
1622 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
1623
1624 printf("testing OggFLAC__file_decoder_new()... ");
1625 decoder = OggFLAC__file_decoder_new();
1626 if(0 == decoder) {
1627 printf("FAILED, returned NULL\n");
1628 return false;
1629 }
1630 printf("OK\n");
1631
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);
1635 printf("OK\n");
1636
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);
1640 printf("OK\n");
1641
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);
1645 printf("OK\n");
1646
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);
1650 printf("OK\n");
1651
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);
1655 printf("OK\n");
1656
1657 printf("testing OggFLAC__file_decoder_set_filename()... ");
1658 if(!OggFLAC__file_decoder_set_filename(decoder, oggflacfilename_))
1659 return die_f_("returned false", decoder);
1660 printf("OK\n");
1661
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);
1665 printf("OK\n");
1666
1667 printf("testing OggFLAC__file_decoder_init()... ");
1668 if(OggFLAC__file_decoder_init(decoder) != OggFLAC__FILE_DECODER_OK)
1669 return die_f_(0, decoder);
1670 printf("OK\n");
1671
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]);
1675
Josh Coalson073bd9e2003-12-31 05:38:20 +00001676 printf("testing OggFLAC__file_decoder_get_seekable_stream_decoder_state()... ");
Josh Coalson63f8edc2004-07-07 07:35:02 +00001677 ssstate = OggFLAC__file_decoder_get_seekable_stream_decoder_state(decoder);
1678 printf("returned state = %u (%s)... OK\n", ssstate, OggFLAC__SeekableStreamDecoderStateString[ssstate]);
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001679
Josh Coalson63f8edc2004-07-07 07:35:02 +00001680 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]);
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001683
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]);
1687
1688 decoder_client_data.current_metadata_number = 0;
1689 decoder_client_data.ignore_errors = false;
1690 decoder_client_data.error_occurred = false;
1691
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");
1695 return false;
1696 }
1697 printf("OK\n");
1698
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);
1702 printf("OK\n");
1703
1704 printf("testing OggFLAC__file_decoder_process_single()... ");
1705 if(!OggFLAC__file_decoder_process_single(decoder))
1706 return die_f_("returned false", decoder);
1707 printf("OK\n");
1708
1709 printf("testing OggFLAC__file_decoder_seek_absolute()... ");
1710 if(!OggFLAC__file_decoder_seek_absolute(decoder, 0))
1711 return die_f_("returned false", decoder);
1712 printf("OK\n");
1713
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);
1717 printf("OK\n");
1718
1719 printf("testing OggFLAC__file_decoder_get_channels()... ");
1720 {
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);
1724 return false;
1725 }
1726 }
1727 printf("OK\n");
1728
1729 printf("testing OggFLAC__file_decoder_get_bits_per_sample()... ");
1730 {
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);
1734 return false;
1735 }
1736 }
1737 printf("OK\n");
1738
1739 printf("testing OggFLAC__file_decoder_get_sample_rate()... ");
1740 {
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);
1744 return false;
1745 }
1746 }
1747 printf("OK\n");
1748
1749 printf("testing OggFLAC__file_decoder_get_blocksize()... ");
1750 {
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);
1754 }
1755
1756 printf("testing OggFLAC__file_decoder_get_channel_assignment()... ");
1757 {
1758 FLAC__ChannelAssignment ca = OggFLAC__file_decoder_get_channel_assignment(decoder);
1759 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
1760 }
1761
1762 printf("testing OggFLAC__file_decoder_finish()... ");
1763 (void) OggFLAC__file_decoder_finish(decoder);
1764 printf("OK\n");
1765
1766 /*
1767 * respond all
1768 */
1769
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);
1773 printf("OK\n");
1774
1775 num_expected_ = 0;
1776 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +00001777 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001778 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_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001782 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1783 expected_metadata_sequence_[num_expected_++] = &unknown_;
1784
1785 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1786 return false;
1787
1788 /*
1789 * ignore all
1790 */
1791
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);
1795 printf("OK\n");
1796
1797 num_expected_ = 0;
1798
1799 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1800 return false;
1801
1802 /*
1803 * respond all, ignore VORBIS_COMMENT
1804 */
1805
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);
1809 printf("OK\n");
1810
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);
1814 printf("OK\n");
1815
1816 num_expected_ = 0;
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_;
1824
1825 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1826 return false;
1827
1828 /*
1829 * respond all, ignore APPLICATION
1830 */
1831
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);
1835 printf("OK\n");
1836
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);
1840 printf("OK\n");
1841
1842 num_expected_ = 0;
1843 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +00001844 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001845 expected_metadata_sequence_[num_expected_++] = &padding_;
1846 expected_metadata_sequence_[num_expected_++] = &seektable_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001847 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1848 expected_metadata_sequence_[num_expected_++] = &unknown_;
1849
1850 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1851 return false;
1852
1853 /*
1854 * respond all, ignore APPLICATION id of app#1
1855 */
1856
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);
1860 printf("OK\n");
1861
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);
1865 printf("OK\n");
1866
1867 num_expected_ = 0;
1868 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +00001869 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001870 expected_metadata_sequence_[num_expected_++] = &padding_;
1871 expected_metadata_sequence_[num_expected_++] = &seektable_;
1872 expected_metadata_sequence_[num_expected_++] = &application2_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001873 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1874 expected_metadata_sequence_[num_expected_++] = &unknown_;
1875
1876 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1877 return false;
1878
1879 /*
1880 * respond all, ignore APPLICATION id of app#1 & app#2
1881 */
1882
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);
1886 printf("OK\n");
1887
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);
1891 printf("OK\n");
1892
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);
1896 printf("OK\n");
1897
1898 num_expected_ = 0;
1899 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +00001900 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001901 expected_metadata_sequence_[num_expected_++] = &padding_;
1902 expected_metadata_sequence_[num_expected_++] = &seektable_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00001903 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
1904 expected_metadata_sequence_[num_expected_++] = &unknown_;
1905
1906 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1907 return false;
1908
1909 /*
1910 * ignore all, respond VORBIS_COMMENT
1911 */
1912
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);
1916 printf("OK\n");
1917
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);
1921 printf("OK\n");
1922
1923 num_expected_ = 0;
1924 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
1925
1926 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1927 return false;
1928
1929 /*
1930 * ignore all, respond APPLICATION
1931 */
1932
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);
1936 printf("OK\n");
1937
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);
1941 printf("OK\n");
1942
1943 num_expected_ = 0;
1944 expected_metadata_sequence_[num_expected_++] = &application1_;
1945 expected_metadata_sequence_[num_expected_++] = &application2_;
1946
1947 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1948 return false;
1949
1950 /*
1951 * ignore all, respond APPLICATION id of app#1
1952 */
1953
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);
1957 printf("OK\n");
1958
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);
1962 printf("OK\n");
1963
1964 num_expected_ = 0;
1965 expected_metadata_sequence_[num_expected_++] = &application1_;
1966
1967 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1968 return false;
1969
1970 /*
1971 * ignore all, respond APPLICATION id of app#1 & app#2
1972 */
1973
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);
1977 printf("OK\n");
1978
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);
1982 printf("OK\n");
1983
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);
1987 printf("OK\n");
1988
1989 num_expected_ = 0;
1990 expected_metadata_sequence_[num_expected_++] = &application1_;
1991 expected_metadata_sequence_[num_expected_++] = &application2_;
1992
1993 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
1994 return false;
1995
1996 /*
1997 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
1998 */
1999
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);
2003 printf("OK\n");
2004
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);
2008 printf("OK\n");
2009
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);
2013 printf("OK\n");
2014
2015 num_expected_ = 0;
2016 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +00002017 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00002018 expected_metadata_sequence_[num_expected_++] = &padding_;
2019 expected_metadata_sequence_[num_expected_++] = &seektable_;
2020 expected_metadata_sequence_[num_expected_++] = &application1_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00002021 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
2022 expected_metadata_sequence_[num_expected_++] = &unknown_;
2023
2024 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2025 return false;
2026
2027 /*
2028 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
2029 */
2030
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);
2034 printf("OK\n");
2035
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);
2039 printf("OK\n");
2040
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);
2044 printf("OK\n");
2045
2046 num_expected_ = 0;
2047 expected_metadata_sequence_[num_expected_++] = &application2_;
2048
2049 if(!file_decoder_test_respond_(decoder, &decoder_client_data))
2050 return false;
2051
2052 /* done, now leave the sequence the way we found it... */
2053 num_expected_ = 0;
2054 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
Josh Coalson69cfda72004-09-10 00:38:21 +00002055 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00002056 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_;
Josh Coalson3c2bdf82003-09-26 01:56:01 +00002060 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
2061 expected_metadata_sequence_[num_expected_++] = &unknown_;
2062
2063 printf("testing OggFLAC__file_decoder_delete()... ");
2064 OggFLAC__file_decoder_delete(decoder);
2065 printf("OK\n");
2066
2067 printf("\nPASSED!\n");
2068
2069 return true;
2070}
2071
Josh Coalsona86f8702002-08-20 04:03:24 +00002072FLAC__bool test_decoders()
2073{
2074 init_metadata_blocks_();
2075 if(!generate_file_())
2076 return false;
2077
2078 if(!test_stream_decoder())
2079 return false;
2080
Josh Coalson3c2bdf82003-09-26 01:56:01 +00002081 if(!test_seekable_stream_decoder())
2082 return false;
2083
2084 if(!test_file_decoder())
2085 return false;
2086
Josh Coalsonb8f8a072002-11-07 05:07:30 +00002087 (void) grabbag__file_remove_file(oggflacfilename_);
Josh Coalsona86f8702002-08-20 04:03:24 +00002088 free_metadata_blocks_();
2089
2090 return true;
2091}