64
static FLAC__bool die_f_(const char *msg, const FLAC__FileDecoder *decoder)
66
FLAC__FileDecoderState state = FLAC__file_decoder_get_state(decoder);
69
printf("FAILED, %s", msg);
73
printf(", state = %u (%s)\n", (unsigned)state, FLAC__FileDecoderStateString[state]);
74
if(state == FLAC__FILE_DECODER_SEEKABLE_STREAM_DECODER_ERROR) {
75
FLAC__SeekableStreamDecoderState state_ = FLAC__file_decoder_get_seekable_stream_decoder_state(decoder);
76
printf(" seekable stream decoder state = %u (%s)\n", (unsigned)state, FLAC__SeekableStreamDecoderStateString[state_]);
77
if(state_ == FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR) {
78
FLAC__StreamDecoderState state__ = FLAC__file_decoder_get_stream_decoder_state(decoder);
79
printf(" stream decoder state = %u (%s)\n", (unsigned)state__, FLAC__StreamDecoderStateString[state__]);
87
static FLAC__bool die_of_(const char *msg, const OggFLAC__FileDecoder *decoder)
89
OggFLAC__FileDecoderState state = OggFLAC__file_decoder_get_state(decoder);
92
printf("FAILED, %s", msg);
96
printf(", state = %u (%s)\n", (unsigned)state, OggFLAC__SeekableStreamDecoderStateString[state]);
97
if(state == OggFLAC__FILE_DECODER_SEEKABLE_STREAM_DECODER_ERROR) {
98
OggFLAC__SeekableStreamDecoderState state_ = OggFLAC__file_decoder_get_seekable_stream_decoder_state(decoder);
99
printf(" seekable stream decoder state = %u (%s)\n", (unsigned)state_, OggFLAC__SeekableStreamDecoderStateString[state_]);
100
if(state_ == OggFLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR) {
101
OggFLAC__StreamDecoderState state__ = OggFLAC__file_decoder_get_stream_decoder_state(decoder);
102
printf(" stream decoder state = %u (%s)\n", (unsigned)state__, OggFLAC__StreamDecoderStateString[state__]);
103
if(state__ == OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR) {
104
FLAC__StreamDecoderState state___ = OggFLAC__file_decoder_get_FLAC_stream_decoder_state(decoder);
105
printf(" FLAC stream decoder state = %u (%s)\n", (unsigned)state___, FLAC__StreamDecoderStateString[state___]);
62
static FLAC__bool die_s_(const char *msg, const FLAC__StreamDecoder *decoder)
64
FLAC__StreamDecoderState state = FLAC__stream_decoder_get_state(decoder);
67
printf("FAILED, %s", msg);
71
printf(", state = %u (%s)\n", (unsigned)state, FLAC__StreamDecoderStateString[state]);
114
76
static off_t get_filesize_(const char *srcpath)
191
static FLAC__bool seek_barrage_native_flac(const char *filename, off_t filesize, unsigned count)
162
* 0 - no read after seek
166
static FLAC__bool seek_barrage(FLAC__bool is_ogg, const char *filename, off_t filesize, unsigned count, FLAC__int64 total_samples, unsigned read_mode)
193
FLAC__FileDecoder *decoder;
194
decoder_client_data_struct decoder_client_data;
168
FLAC__StreamDecoder *decoder;
169
DecoderClientData decoder_client_data;
198
173
decoder_client_data.got_data = false;
199
174
decoder_client_data.total_samples = 0;
175
decoder_client_data.quiet = false;
200
176
decoder_client_data.ignore_errors = false;
201
177
decoder_client_data.error_occurred = false;
203
printf("\n+++ seek test: FLAC__FileDecoder\n\n");
179
printf("\n+++ seek test: FLAC__StreamDecoder (%s FLAC, read_mode=%u)\n\n", is_ogg? "Ogg":"native", read_mode);
205
decoder = FLAC__file_decoder_new();
181
decoder = FLAC__stream_decoder_new();
207
return die_("FLAC__file_decoder_new() FAILED, returned NULL\n");
209
if(!FLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
210
return die_f_("FLAC__file_decoder_set_write_callback() FAILED", decoder);
212
if(!FLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
213
return die_f_("FLAC__file_decoder_set_metadata_callback() FAILED", decoder);
215
if(!FLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
216
return die_f_("FLAC__file_decoder_set_error_callback() FAILED", decoder);
218
if(!FLAC__file_decoder_set_client_data(decoder, &decoder_client_data))
219
return die_f_("FLAC__file_decoder_set_client_data() FAILED", decoder);
221
if(!FLAC__file_decoder_set_filename(decoder, filename))
222
return die_f_("FLAC__file_decoder_set_filename() FAILED", decoder);
224
if(FLAC__file_decoder_init(decoder) != FLAC__FILE_DECODER_OK)
225
return die_f_("FLAC__file_decoder_init() FAILED", decoder);
227
if(!FLAC__file_decoder_process_until_end_of_metadata(decoder))
228
return die_f_("FLAC__file_decoder_process_until_end_of_metadata() FAILED", decoder);
230
printf("file's total_samples is %llu\n", decoder_client_data.total_samples);
231
#if !defined _MSC_VER && !defined __MINGW32__
183
return die_("FLAC__stream_decoder_new() FAILED, returned NULL\n");
186
if(FLAC__stream_decoder_init_ogg_file(decoder, filename, write_callback_, metadata_callback_, error_callback_, &decoder_client_data) != FLAC__STREAM_DECODER_INIT_STATUS_OK)
187
return die_s_("FLAC__stream_decoder_init_file() FAILED", decoder);
190
if(FLAC__stream_decoder_init_file(decoder, filename, write_callback_, metadata_callback_, error_callback_, &decoder_client_data) != FLAC__STREAM_DECODER_INIT_STATUS_OK)
191
return die_s_("FLAC__stream_decoder_init_file() FAILED", decoder);
194
if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder))
195
return die_s_("FLAC__stream_decoder_process_until_end_of_metadata() FAILED", decoder);
197
if(!is_ogg) { /* not necessary to do this for Ogg because of its seeking method */
198
/* process until end of stream to make sure we can still seek in that state */
199
decoder_client_data.quiet = true;
200
if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
201
return die_s_("FLAC__stream_decoder_process_until_end_of_stream() FAILED", decoder);
202
decoder_client_data.quiet = false;
204
printf("stream decoder state is %s\n", FLAC__stream_decoder_get_resolved_state_string(decoder));
205
if(FLAC__stream_decoder_get_state(decoder) != FLAC__STREAM_DECODER_END_OF_STREAM)
206
return die_s_("expected FLAC__STREAM_DECODER_END_OF_STREAM", decoder);
210
printf("file's total_samples is %I64u\n", decoder_client_data.total_samples);
212
printf("file's total_samples is %llu\n", (unsigned long long)decoder_client_data.total_samples);
214
#if !defined _MSC_VER && !defined __MINGW32__ && !defined __EMX__
232
215
if (decoder_client_data.total_samples > (FLAC__uint64)RAND_MAX) {
233
216
printf("ERROR: must be total_samples < %u\n", (unsigned)RAND_MAX);
276
printf("seek(%llu)... ", pos);
263
printf("seek(%I64u)... ", pos);
265
printf("seek(%llu)... ", (unsigned long long)pos);
278
if(!FLAC__file_decoder_seek_absolute(decoder, pos)) {
279
if(pos < (FLAC__uint64)n && decoder_client_data.total_samples != 0)
280
return die_f_("FLAC__file_decoder_seek_absolute() FAILED", decoder);
281
else if(decoder_client_data.total_samples == 0)
268
if(!FLAC__stream_decoder_seek_absolute(decoder, pos)) {
269
if(pos >= (FLAC__uint64)n)
270
printf("seek past end failed as expected... ");
271
else if(decoder_client_data.total_samples == 0 && total_samples <= 0)
282
272
printf("seek failed, assuming it was past EOF... ");
284
printf("seek past end failed as expected... ");
286
/* hack to work around a deficiency in the seek API's behavior */
287
/* seeking past EOF sets the file decoder state to non-OK and there's no ..._flush() or ..._reset() call to reset it */
288
if(!FLAC__file_decoder_finish(decoder))
289
return die_f_("FLAC__file_decoder_finish() FAILED", decoder);
291
if(!FLAC__file_decoder_set_write_callback(decoder, file_decoder_write_callback_))
292
return die_f_("FLAC__file_decoder_set_write_callback() FAILED", decoder);
294
if(!FLAC__file_decoder_set_metadata_callback(decoder, file_decoder_metadata_callback_))
295
return die_f_("FLAC__file_decoder_set_metadata_callback() FAILED", decoder);
297
if(!FLAC__file_decoder_set_error_callback(decoder, file_decoder_error_callback_))
298
return die_f_("FLAC__file_decoder_set_error_callback() FAILED", decoder);
300
if(!FLAC__file_decoder_set_client_data(decoder, &decoder_client_data))
301
return die_f_("FLAC__file_decoder_set_client_data() FAILED", decoder);
303
if(!FLAC__file_decoder_set_filename(decoder, filename))
304
return die_f_("FLAC__file_decoder_set_filename() FAILED", decoder);
306
if(FLAC__file_decoder_init(decoder) != FLAC__FILE_DECODER_OK)
307
return die_f_("FLAC__file_decoder_init() FAILED", decoder);
309
if(!FLAC__file_decoder_process_until_end_of_metadata(decoder))
310
return die_f_("FLAC__file_decoder_process_until_end_of_metadata() FAILED", decoder);
313
printf("decode_frame... ");
315
if(!FLAC__file_decoder_process_single(decoder))
316
return die_f_("FLAC__file_decoder_process_single() FAILED", decoder);
318
printf("decode_frame... ");
320
if(!FLAC__file_decoder_process_single(decoder))
321
return die_f_("FLAC__file_decoder_process_single() FAILED", decoder);
274
return die_s_("FLAC__stream_decoder_seek_absolute() FAILED", decoder);
275
if(!FLAC__stream_decoder_flush(decoder))
276
return die_s_("FLAC__stream_decoder_flush() FAILED", decoder);
278
else if(read_mode == 1) {
279
printf("decode_frame... ");
281
if(!FLAC__stream_decoder_process_single(decoder))
282
return die_s_("FLAC__stream_decoder_process_single() FAILED", decoder);
284
printf("decode_frame... ");
286
if(!FLAC__stream_decoder_process_single(decoder))
287
return die_s_("FLAC__stream_decoder_process_single() FAILED", decoder);
289
else if(read_mode == 2) {
290
printf("decode_all... ");
292
decoder_client_data.quiet = true;
293
if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
294
return die_s_("FLAC__stream_decoder_process_until_end_of_stream() FAILED", decoder);
295
decoder_client_data.quiet = false;
328
if(FLAC__file_decoder_get_state(decoder) != FLAC__FILE_DECODER_UNINITIALIZED) {
329
if(!FLAC__file_decoder_finish(decoder))
330
return die_f_("FLAC__file_decoder_finish() FAILED", decoder);
302
if(FLAC__stream_decoder_get_state(decoder) != FLAC__STREAM_DECODER_UNINITIALIZED) {
303
if(!FLAC__stream_decoder_finish(decoder))
304
return die_s_("FLAC__stream_decoder_finish() FAILED", decoder);
307
FLAC__stream_decoder_delete(decoder);
333
308
printf("\nPASSED!\n");
339
static FLAC__bool seek_barrage_ogg_flac(const char *filename, off_t filesize, unsigned count)
314
/* There's no strtoull() in MSVC6 so we just write a specialized one */
315
static FLAC__uint64 local__strtoull(const char *src)
341
OggFLAC__FileDecoder *decoder;
342
decoder_client_data_struct decoder_client_data;
346
decoder_client_data.got_data = false;
347
decoder_client_data.total_samples = 0;
348
decoder_client_data.ignore_errors = false;
349
decoder_client_data.error_occurred = false;
351
printf("\n+++ seek test: OggFLAC__FileDecoder\n\n");
353
decoder = OggFLAC__file_decoder_new();
355
return die_("OggFLAC__file_decoder_new() FAILED, returned NULL\n");
357
if(!OggFLAC__file_decoder_set_write_callback(decoder, (OggFLAC__FileDecoderWriteCallback)file_decoder_write_callback_))
358
return die_of_("OggFLAC__file_decoder_set_write_callback() FAILED", decoder);
360
if(!OggFLAC__file_decoder_set_metadata_callback(decoder, (OggFLAC__FileDecoderMetadataCallback)file_decoder_metadata_callback_))
361
return die_of_("OggFLAC__file_decoder_set_metadata_callback() FAILED", decoder);
363
if(!OggFLAC__file_decoder_set_error_callback(decoder, (OggFLAC__FileDecoderErrorCallback)file_decoder_error_callback_))
364
return die_of_("OggFLAC__file_decoder_set_error_callback() FAILED", decoder);
366
if(!OggFLAC__file_decoder_set_client_data(decoder, &decoder_client_data))
367
return die_of_("OggFLAC__file_decoder_set_client_data() FAILED", decoder);
369
if(!OggFLAC__file_decoder_set_filename(decoder, filename))
370
return die_of_("OggFLAC__file_decoder_set_filename() FAILED", decoder);
372
if(OggFLAC__file_decoder_init(decoder) != OggFLAC__FILE_DECODER_OK)
373
return die_of_("OggFLAC__file_decoder_init() FAILED", decoder);
375
if(!OggFLAC__file_decoder_process_until_end_of_metadata(decoder))
376
return die_of_("OggFLAC__file_decoder_process_until_end_of_metadata() FAILED", decoder);
378
printf("file's total_samples is %llu\n", decoder_client_data.total_samples);
379
#if !defined _MSC_VER && !defined __MINGW32__
380
if (decoder_client_data.total_samples > (FLAC__uint64)RAND_MAX) {
381
printf("ERROR: must be total_samples < %u\n", (unsigned)RAND_MAX);
385
n = (long int)decoder_client_data.total_samples;
387
/* if we don't have a total samples count, just guess based on the file size */
389
/* 8 would imply no compression, 9 guarantees that we will get some samples off the end of the stream to test that case */
390
n = 9 * filesize / (decoder_client_data.channels * decoder_client_data.bits_per_sample);
391
#if !defined _MSC_VER && !defined __MINGW32__
397
printf("Begin seek barrage, count=%u\n", count);
399
for (i = 0; !stop_signal_ && (count == 0 || i < count); i++) {
402
/* for the first 10, seek to the first 10 samples */
403
if (n >= 10 && i < 10) {
406
/* for the second 10, seek to the last 10 samples */
407
else if (n >= 10 && i < 20) {
408
pos = n - 1 - (i-10);
410
/* for the third 10, seek past the end and make sure we fail properly as expected */
415
#if !defined _MSC_VER && !defined __MINGW32__
416
pos = (FLAC__uint64)(random() % n);
418
/* RAND_MAX is only 32767 in my MSVC */
419
pos = (FLAC__uint64)((rand()<<15|rand()) % n);
423
printf("seek(%llu)... ", pos);
425
if(!OggFLAC__file_decoder_seek_absolute(decoder, pos)) {
426
if(pos < (FLAC__uint64)n && decoder_client_data.total_samples != 0)
427
return die_of_("OggFLAC__file_decoder_seek_absolute() FAILED", decoder);
428
else if(decoder_client_data.total_samples == 0)
429
printf("seek failed, assuming it was past EOF... ");
431
printf("seek past end failed as expected... ");
433
/* hack to work around a deficiency in the seek API's behavior */
434
/* seeking past EOF sets the file decoder state to non-OK and there's no ..._flush() or ..._reset() call to reset it */
435
if(!OggFLAC__file_decoder_finish(decoder))
436
return die_of_("OggFLAC__file_decoder_finish() FAILED", decoder);
438
if(!OggFLAC__file_decoder_set_write_callback(decoder, (OggFLAC__FileDecoderWriteCallback)file_decoder_write_callback_))
439
return die_of_("OggFLAC__file_decoder_set_write_callback() FAILED", decoder);
441
if(!OggFLAC__file_decoder_set_metadata_callback(decoder, (OggFLAC__FileDecoderMetadataCallback)file_decoder_metadata_callback_))
442
return die_of_("OggFLAC__file_decoder_set_metadata_callback() FAILED", decoder);
444
if(!OggFLAC__file_decoder_set_error_callback(decoder, (OggFLAC__FileDecoderErrorCallback)file_decoder_error_callback_))
445
return die_of_("OggFLAC__file_decoder_set_error_callback() FAILED", decoder);
447
if(!OggFLAC__file_decoder_set_client_data(decoder, &decoder_client_data))
448
return die_of_("OggFLAC__file_decoder_set_client_data() FAILED", decoder);
450
if(!OggFLAC__file_decoder_set_filename(decoder, filename))
451
return die_of_("OggFLAC__file_decoder_set_filename() FAILED", decoder);
453
if(OggFLAC__file_decoder_init(decoder) != OggFLAC__FILE_DECODER_OK)
454
return die_of_("OggFLAC__file_decoder_init() FAILED", decoder);
456
if(!OggFLAC__file_decoder_process_until_end_of_metadata(decoder))
457
return die_of_("OggFLAC__file_decoder_process_until_end_of_metadata() FAILED", decoder);
460
printf("decode_frame... ");
462
if(!OggFLAC__file_decoder_process_single(decoder))
463
return die_of_("OggFLAC__file_decoder_process_single() FAILED", decoder);
465
printf("decode_frame... ");
467
if(!OggFLAC__file_decoder_process_single(decoder))
468
return die_of_("OggFLAC__file_decoder_process_single() FAILED", decoder);
475
if(OggFLAC__file_decoder_get_state(decoder) != OggFLAC__FILE_DECODER_UNINITIALIZED) {
476
if(!OggFLAC__file_decoder_finish(decoder))
477
return die_of_("OggFLAC__file_decoder_finish() FAILED", decoder);
480
printf("\nPASSED!\n");
317
FLAC__uint64 ret = 0;
319
FLAC__ASSERT(0 != src);
320
while(0 != (c = *src++)) {
323
ret = (ret * 10) + c;
486
331
int main(int argc, char *argv[])
488
333
const char *filename;
334
unsigned count = 0, read_mode;
335
FLAC__int64 samples = -1;
492
static const char * const usage = "usage: test_seeking file.flac [#seeks]\n";
338
static const char * const usage = "usage: test_seeking file.flac [#seeks] [#samples-in-file.flac]\n";
494
if (argc < 1 || argc > 3) {
340
if (argc < 2 || argc > 4) {
495
341
fprintf(stderr, usage);