update copyright to 2004
[platform/upstream/flac.git] / src / test_libOggFLAC / encoders.c
1 /* test_libOggFLAC - Unit tester for libOggFLAC
2  * Copyright (C) 2002,2003,2004  Josh Coalson
3  *
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 "encoders.h"
20 #include "file_utils.h"
21 #include "metadata_utils.h"
22 #include "FLAC/assert.h"
23 #include "OggFLAC/file_encoder.h"
24 #include "OggFLAC/seekable_stream_encoder.h"
25 #include "OggFLAC/stream_encoder.h"
26 #include "share/grabbag.h"
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30
31 static FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_, cuesheet_, unknown_;
32 static FLAC__StreamMetadata *metadata_sequence_[] = { &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_ };
33 static const unsigned num_metadata_ = sizeof(metadata_sequence_) / sizeof(metadata_sequence_[0]);
34 static const char *oggflacfilename_ = "metadata.ogg";
35
36 static FLAC__bool die_s_(const char *msg, const OggFLAC__StreamEncoder *encoder)
37 {
38         OggFLAC__StreamEncoderState state = OggFLAC__stream_encoder_get_state(encoder);
39
40         if(msg)
41                 printf("FAILED, %s", msg);
42         else
43                 printf("FAILED");
44
45         printf(", state = %u (%s)\n", (unsigned)state, OggFLAC__StreamEncoderStateString[state]);
46         if(state == OggFLAC__STREAM_ENCODER_FLAC_STREAM_ENCODER_ERROR) {
47                 FLAC__StreamEncoderState state_ = OggFLAC__stream_encoder_get_FLAC_stream_encoder_state(encoder);
48                 printf("      FLAC stream encoder state = %u (%s)\n", (unsigned)state_, FLAC__StreamEncoderStateString[state_]);
49                 if(state_ == FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) {
50                         FLAC__StreamDecoderState dstate = OggFLAC__stream_encoder_get_verify_decoder_state(encoder);
51                         printf("      verify decoder state = %u (%s)\n", (unsigned)dstate, FLAC__StreamDecoderStateString[dstate]);
52                 }
53         }
54
55         return false;
56 }
57
58 static FLAC__bool die_ss_(const char *msg, const OggFLAC__SeekableStreamEncoder *encoder)
59 {
60         OggFLAC__SeekableStreamEncoderState state = OggFLAC__seekable_stream_encoder_get_state(encoder);
61
62         if(msg)
63                 printf("FAILED, %s", msg);
64         else
65                 printf("FAILED");
66
67         printf(", state = %u (%s)\n", (unsigned)state, OggFLAC__SeekableStreamEncoderStateString[state]);
68         if(state == OggFLAC__SEEKABLE_STREAM_ENCODER_FLAC_STREAM_ENCODER_ERROR) {
69                 FLAC__StreamEncoderState state_ = OggFLAC__seekable_stream_encoder_get_FLAC_stream_encoder_state(encoder);
70                 printf("      FLAC stream encoder state = %u (%s)\n", (unsigned)state_, FLAC__StreamEncoderStateString[state_]);
71                 if(state_ == FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) {
72                         FLAC__StreamDecoderState dstate = OggFLAC__seekable_stream_encoder_get_verify_decoder_state(encoder);
73                         printf("      verify decoder state = %u (%s)\n", (unsigned)dstate, FLAC__StreamDecoderStateString[dstate]);
74                 }
75         }
76
77         return false;
78 }
79
80 static FLAC__bool die_f_(const char *msg, const OggFLAC__FileEncoder *encoder)
81 {
82         OggFLAC__FileEncoderState state = OggFLAC__file_encoder_get_state(encoder);
83
84         if(msg)
85                 printf("FAILED, %s", msg);
86         else
87                 printf("FAILED");
88
89         printf(", state = %u (%s)\n", (unsigned)state, OggFLAC__SeekableStreamEncoderStateString[state]);
90         if(state == OggFLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR) {
91                 OggFLAC__SeekableStreamEncoderState state_ = OggFLAC__file_encoder_get_seekable_stream_encoder_state(encoder);
92                 printf("      seekable stream encoder state = %u (%s)\n", (unsigned)state_, OggFLAC__SeekableStreamEncoderStateString[state_]);
93                 if(state_ == OggFLAC__SEEKABLE_STREAM_ENCODER_FLAC_STREAM_ENCODER_ERROR) {
94                         FLAC__StreamEncoderState state__ = OggFLAC__file_encoder_get_FLAC_stream_encoder_state(encoder);
95                         printf("      FLAC stream encoder state = %u (%s)\n", (unsigned)state__, FLAC__StreamEncoderStateString[state__]);
96                         if(state__ == FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) {
97                                 FLAC__StreamDecoderState dstate = OggFLAC__file_encoder_get_verify_decoder_state(encoder);
98                                 printf("      verify decoder state = %u (%s)\n", (unsigned)dstate, FLAC__StreamDecoderStateString[dstate]);
99                         }
100                 }
101         }
102
103         return false;
104 }
105
106 static void init_metadata_blocks_()
107 {
108         mutils__init_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);
109 }
110
111 static void free_metadata_blocks_()
112 {
113         mutils__free_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);
114 }
115
116 static FLAC__StreamEncoderWriteStatus stream_encoder_write_callback_(const OggFLAC__StreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data)
117 {
118         (void)encoder, (void)buffer, (void)bytes, (void)samples, (void)current_frame, (void)client_data;
119         return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
120 }
121
122 static void stream_encoder_metadata_callback_(const OggFLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data)
123 {
124         (void)encoder, (void)metadata, (void)client_data;
125 }
126
127
128 static FLAC__bool test_stream_encoder()
129 {
130         OggFLAC__StreamEncoder *encoder;
131         OggFLAC__StreamEncoderState state;
132         FLAC__StreamEncoderState fstate;
133         FLAC__StreamDecoderState dstate;
134         FLAC__int32 samples[1024];
135         FLAC__int32 *samples_array[1];
136         unsigned i;
137
138         samples_array[0] = samples;
139
140         printf("\n+++ libOggFLAC unit test: OggFLAC__StreamEncoder\n\n");
141
142         printf("testing OggFLAC__stream_encoder_new()... ");
143         encoder = OggFLAC__stream_encoder_new();
144         if(0 == encoder) {
145                 printf("FAILED, returned NULL\n");
146                 return false;
147         }
148         printf("OK\n");
149
150         printf("testing OggFLAC__stream_encoder_set_serial_number()... ");
151         if(!OggFLAC__stream_encoder_set_serial_number(encoder, file_utils__serial_number))
152                 return die_s_("returned false", encoder);
153         printf("OK\n");
154
155         printf("testing OggFLAC__stream_encoder_set_verify()... ");
156         if(!OggFLAC__stream_encoder_set_verify(encoder, true))
157                 return die_s_("returned false", encoder);
158         printf("OK\n");
159
160         printf("testing OggFLAC__stream_encoder_set_streamable_subset()... ");
161         if(!OggFLAC__stream_encoder_set_streamable_subset(encoder, true))
162                 return die_s_("returned false", encoder);
163         printf("OK\n");
164
165         printf("testing OggFLAC__stream_encoder_set_do_mid_side_stereo()... ");
166         if(!OggFLAC__stream_encoder_set_do_mid_side_stereo(encoder, false))
167                 return die_s_("returned false", encoder);
168         printf("OK\n");
169
170         printf("testing OggFLAC__stream_encoder_set_loose_mid_side_stereo()... ");
171         if(!OggFLAC__stream_encoder_set_loose_mid_side_stereo(encoder, false))
172                 return die_s_("returned false", encoder);
173         printf("OK\n");
174
175         printf("testing OggFLAC__stream_encoder_set_channels()... ");
176         if(!OggFLAC__stream_encoder_set_channels(encoder, streaminfo_.data.stream_info.channels))
177                 return die_s_("returned false", encoder);
178         printf("OK\n");
179
180         printf("testing OggFLAC__stream_encoder_set_bits_per_sample()... ");
181         if(!OggFLAC__stream_encoder_set_bits_per_sample(encoder, streaminfo_.data.stream_info.bits_per_sample))
182                 return die_s_("returned false", encoder);
183         printf("OK\n");
184
185         printf("testing OggFLAC__stream_encoder_set_sample_rate()... ");
186         if(!OggFLAC__stream_encoder_set_sample_rate(encoder, streaminfo_.data.stream_info.sample_rate))
187                 return die_s_("returned false", encoder);
188         printf("OK\n");
189
190         printf("testing OggFLAC__stream_encoder_set_blocksize()... ");
191         if(!OggFLAC__stream_encoder_set_blocksize(encoder, streaminfo_.data.stream_info.min_blocksize))
192                 return die_s_("returned false", encoder);
193         printf("OK\n");
194
195         printf("testing OggFLAC__stream_encoder_set_max_lpc_order()... ");
196         if(!OggFLAC__stream_encoder_set_max_lpc_order(encoder, 0))
197                 return die_s_("returned false", encoder);
198         printf("OK\n");
199
200         printf("testing OggFLAC__stream_encoder_set_qlp_coeff_precision()... ");
201         if(!OggFLAC__stream_encoder_set_qlp_coeff_precision(encoder, 0))
202                 return die_s_("returned false", encoder);
203         printf("OK\n");
204
205         printf("testing OggFLAC__stream_encoder_set_do_qlp_coeff_prec_search()... ");
206         if(!OggFLAC__stream_encoder_set_do_qlp_coeff_prec_search(encoder, false))
207                 return die_s_("returned false", encoder);
208         printf("OK\n");
209
210         printf("testing OggFLAC__stream_encoder_set_do_escape_coding()... ");
211         if(!OggFLAC__stream_encoder_set_do_escape_coding(encoder, false))
212                 return die_s_("returned false", encoder);
213         printf("OK\n");
214
215         printf("testing OggFLAC__stream_encoder_set_do_exhaustive_model_search()... ");
216         if(!OggFLAC__stream_encoder_set_do_exhaustive_model_search(encoder, false))
217                 return die_s_("returned false", encoder);
218         printf("OK\n");
219
220         printf("testing OggFLAC__stream_encoder_set_min_residual_partition_order()... ");
221         if(!OggFLAC__stream_encoder_set_min_residual_partition_order(encoder, 0))
222                 return die_s_("returned false", encoder);
223         printf("OK\n");
224
225         printf("testing OggFLAC__stream_encoder_set_max_residual_partition_order()... ");
226         if(!OggFLAC__stream_encoder_set_max_residual_partition_order(encoder, 0))
227                 return die_s_("returned false", encoder);
228         printf("OK\n");
229
230         printf("testing OggFLAC__stream_encoder_set_rice_parameter_search_dist()... ");
231         if(!OggFLAC__stream_encoder_set_rice_parameter_search_dist(encoder, 0))
232                 return die_s_("returned false", encoder);
233         printf("OK\n");
234
235         printf("testing OggFLAC__stream_encoder_set_total_samples_estimate()... ");
236         if(!OggFLAC__stream_encoder_set_total_samples_estimate(encoder, streaminfo_.data.stream_info.total_samples))
237                 return die_s_("returned false", encoder);
238         printf("OK\n");
239
240         printf("testing OggFLAC__stream_encoder_set_metadata()... ");
241         if(!OggFLAC__stream_encoder_set_metadata(encoder, metadata_sequence_, num_metadata_))
242                 return die_s_("returned false", encoder);
243         printf("OK\n");
244
245         printf("testing OggFLAC__stream_encoder_set_write_callback()... ");
246         if(!OggFLAC__stream_encoder_set_write_callback(encoder, stream_encoder_write_callback_))
247                 return die_s_("returned false", encoder);
248         printf("OK\n");
249
250         printf("testing OggFLAC__stream_encoder_set_metadata_callback()... ");
251         if(!OggFLAC__stream_encoder_set_metadata_callback(encoder, stream_encoder_metadata_callback_))
252                 return die_s_("returned false", encoder);
253         printf("OK\n");
254
255         printf("testing OggFLAC__stream_encoder_set_client_data()... ");
256         if(!OggFLAC__stream_encoder_set_client_data(encoder, 0))
257                 return die_s_("returned false", encoder);
258         printf("OK\n");
259
260         printf("testing OggFLAC__stream_encoder_init()... ");
261         if(OggFLAC__stream_encoder_init(encoder) != FLAC__STREAM_ENCODER_OK)
262                 return die_s_(0, encoder);
263         printf("OK\n");
264
265         printf("testing OggFLAC__stream_encoder_get_state()... ");
266         state = OggFLAC__stream_encoder_get_state(encoder);
267         printf("returned state = %u (%s)... OK\n", (unsigned)state, OggFLAC__StreamEncoderStateString[state]);
268
269         printf("testing OggFLAC__stream_encoder_get_FLAC_stream_encoder_state()... ");
270         fstate = OggFLAC__stream_encoder_get_FLAC_stream_encoder_state(encoder);
271         printf("returned state = %u (%s)... OK\n", (unsigned)fstate, FLAC__StreamEncoderStateString[fstate]);
272
273         printf("testing OggFLAC__stream_encoder_get_verify_decoder_state()... ");
274         dstate = OggFLAC__stream_encoder_get_verify_decoder_state(encoder);
275         printf("returned state = %u (%s)... OK\n", (unsigned)dstate, FLAC__StreamDecoderStateString[dstate]);
276
277         {
278                 FLAC__uint64 absolute_sample;
279                 unsigned frame_number;
280                 unsigned channel;
281                 unsigned sample;
282                 FLAC__int32 expected;
283                 FLAC__int32 got;
284
285                 printf("testing OggFLAC__stream_encoder_get_verify_decoder_error_stats()... ");
286                 OggFLAC__stream_encoder_get_verify_decoder_error_stats(encoder, &absolute_sample, &frame_number, &channel, &sample, &expected, &got);
287                 printf("OK\n");
288         }
289
290         printf("testing OggFLAC__stream_encoder_get_verify()... ");
291         if(OggFLAC__stream_encoder_get_verify(encoder) != true) {
292                 printf("FAILED, expected true, got false\n");
293                 return false;
294         }
295         printf("OK\n");
296
297         printf("testing OggFLAC__stream_encoder_get_streamable_subset()... ");
298         if(OggFLAC__stream_encoder_get_streamable_subset(encoder) != true) {
299                 printf("FAILED, expected true, got false\n");
300                 return false;
301         }
302         printf("OK\n");
303
304         printf("testing OggFLAC__stream_encoder_get_do_mid_side_stereo()... ");
305         if(OggFLAC__stream_encoder_get_do_mid_side_stereo(encoder) != false) {
306                 printf("FAILED, expected false, got true\n");
307                 return false;
308         }
309         printf("OK\n");
310
311         printf("testing OggFLAC__stream_encoder_get_loose_mid_side_stereo()... ");
312         if(OggFLAC__stream_encoder_get_loose_mid_side_stereo(encoder) != false) {
313                 printf("FAILED, expected false, got true\n");
314                 return false;
315         }
316         printf("OK\n");
317
318         printf("testing OggFLAC__stream_encoder_get_channels()... ");
319         if(OggFLAC__stream_encoder_get_channels(encoder) != streaminfo_.data.stream_info.channels) {
320                 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.channels, OggFLAC__stream_encoder_get_channels(encoder));
321                 return false;
322         }
323         printf("OK\n");
324
325         printf("testing OggFLAC__stream_encoder_get_bits_per_sample()... ");
326         if(OggFLAC__stream_encoder_get_bits_per_sample(encoder) != streaminfo_.data.stream_info.bits_per_sample) {
327                 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.bits_per_sample, OggFLAC__stream_encoder_get_bits_per_sample(encoder));
328                 return false;
329         }
330         printf("OK\n");
331
332         printf("testing OggFLAC__stream_encoder_get_sample_rate()... ");
333         if(OggFLAC__stream_encoder_get_sample_rate(encoder) != streaminfo_.data.stream_info.sample_rate) {
334                 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.sample_rate, OggFLAC__stream_encoder_get_sample_rate(encoder));
335                 return false;
336         }
337         printf("OK\n");
338
339         printf("testing OggFLAC__stream_encoder_get_blocksize()... ");
340         if(OggFLAC__stream_encoder_get_blocksize(encoder) != streaminfo_.data.stream_info.min_blocksize) {
341                 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.min_blocksize, OggFLAC__stream_encoder_get_blocksize(encoder));
342                 return false;
343         }
344         printf("OK\n");
345
346         printf("testing OggFLAC__stream_encoder_get_max_lpc_order()... ");
347         if(OggFLAC__stream_encoder_get_max_lpc_order(encoder) != 0) {
348                 printf("FAILED, expected %u, got %u\n", 0, OggFLAC__stream_encoder_get_max_lpc_order(encoder));
349                 return false;
350         }
351         printf("OK\n");
352
353         printf("testing OggFLAC__stream_encoder_get_qlp_coeff_precision()... ");
354         (void)OggFLAC__stream_encoder_get_qlp_coeff_precision(encoder);
355         /* we asked the encoder to auto select this so we accept anything */
356         printf("OK\n");
357
358         printf("testing OggFLAC__stream_encoder_get_do_qlp_coeff_prec_search()... ");
359         if(OggFLAC__stream_encoder_get_do_qlp_coeff_prec_search(encoder) != false) {
360                 printf("FAILED, expected false, got true\n");
361                 return false;
362         }
363         printf("OK\n");
364
365         printf("testing OggFLAC__stream_encoder_get_do_escape_coding()... ");
366         if(OggFLAC__stream_encoder_get_do_escape_coding(encoder) != false) {
367                 printf("FAILED, expected false, got true\n");
368                 return false;
369         }
370         printf("OK\n");
371
372         printf("testing OggFLAC__stream_encoder_get_do_exhaustive_model_search()... ");
373         if(OggFLAC__stream_encoder_get_do_exhaustive_model_search(encoder) != false) {
374                 printf("FAILED, expected false, got true\n");
375                 return false;
376         }
377         printf("OK\n");
378
379         printf("testing OggFLAC__stream_encoder_get_min_residual_partition_order()... ");
380         if(OggFLAC__stream_encoder_get_min_residual_partition_order(encoder) != 0) {
381                 printf("FAILED, expected %u, got %u\n", 0, OggFLAC__stream_encoder_get_min_residual_partition_order(encoder));
382                 return false;
383         }
384         printf("OK\n");
385
386         printf("testing OggFLAC__stream_encoder_get_max_residual_partition_order()... ");
387         if(OggFLAC__stream_encoder_get_max_residual_partition_order(encoder) != 0) {
388                 printf("FAILED, expected %u, got %u\n", 0, OggFLAC__stream_encoder_get_max_residual_partition_order(encoder));
389                 return false;
390         }
391         printf("OK\n");
392
393         printf("testing OggFLAC__stream_encoder_get_rice_parameter_search_dist()... ");
394         if(OggFLAC__stream_encoder_get_rice_parameter_search_dist(encoder) != 0) {
395                 printf("FAILED, expected %u, got %u\n", 0, OggFLAC__stream_encoder_get_rice_parameter_search_dist(encoder));
396                 return false;
397         }
398         printf("OK\n");
399
400         printf("testing OggFLAC__stream_encoder_get_total_samples_estimate()... ");
401         if(OggFLAC__stream_encoder_get_total_samples_estimate(encoder) != streaminfo_.data.stream_info.total_samples) {
402                 printf("FAILED, expected %llu, got %llu\n", streaminfo_.data.stream_info.total_samples, OggFLAC__stream_encoder_get_total_samples_estimate(encoder));
403                 return false;
404         }
405         printf("OK\n");
406
407         /* init the dummy sample buffer */
408         for(i = 0; i < sizeof(samples) / sizeof(FLAC__int32); i++)
409                 samples[i] = i & 7;
410
411         printf("testing OggFLAC__stream_encoder_process()... ");
412         if(!OggFLAC__stream_encoder_process(encoder, (const FLAC__int32 * const *)samples_array, sizeof(samples) / sizeof(FLAC__int32)))
413                 return die_s_("returned false", encoder);
414         printf("OK\n");
415
416         printf("testing OggFLAC__stream_encoder_process_interleaved()... ");
417         if(!OggFLAC__stream_encoder_process_interleaved(encoder, samples, sizeof(samples) / sizeof(FLAC__int32)))
418                 return die_s_("returned false", encoder);
419         printf("OK\n");
420
421         printf("testing OggFLAC__stream_encoder_finish()... ");
422         OggFLAC__stream_encoder_finish(encoder);
423         printf("OK\n");
424
425         printf("testing OggFLAC__stream_encoder_delete()... ");
426         OggFLAC__stream_encoder_delete(encoder);
427         printf("OK\n");
428
429         printf("\nPASSED!\n");
430
431         return true;
432 }
433
434 OggFLAC__SeekableStreamEncoderReadStatus seekable_stream_encoder_read_callback_(const OggFLAC__SeekableStreamEncoder *encoder, FLAC__byte buffer[], unsigned *bytes, void *client_data)
435 {
436         (void)encoder, (void)buffer, (void)bytes, (void)client_data;
437         return OggFLAC__SEEKABLE_STREAM_ENCODER_READ_STATUS_CONTINUE;
438 }
439
440 FLAC__SeekableStreamEncoderSeekStatus seekable_stream_encoder_seek_callback_(const OggFLAC__SeekableStreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data)
441 {
442         (void)encoder, (void)absolute_byte_offset, (void)client_data;
443         return FLAC__SEEKABLE_STREAM_ENCODER_SEEK_STATUS_OK;
444 }
445
446 FLAC__SeekableStreamEncoderTellStatus seekable_stream_encoder_tell_callback_(const OggFLAC__SeekableStreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
447 {
448         (void)encoder, (void)client_data;
449         *absolute_byte_offset = 0;
450         return FLAC__SEEKABLE_STREAM_ENCODER_TELL_STATUS_OK;
451 }
452
453 FLAC__StreamEncoderWriteStatus seekable_stream_encoder_write_callback_(const OggFLAC__SeekableStreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data)
454 {
455         (void)encoder, (void)buffer, (void)bytes, (void)samples, (void)current_frame, (void)client_data;
456         return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
457 }
458
459 static FLAC__bool test_seekable_stream_encoder()
460 {
461         OggFLAC__SeekableStreamEncoder *encoder;
462         OggFLAC__SeekableStreamEncoderState state;
463         FLAC__StreamEncoderState fstate;
464         FLAC__StreamDecoderState dstate;
465         FLAC__int32 samples[1024];
466         FLAC__int32 *samples_array[1];
467         unsigned i;
468
469         samples_array[0] = samples;
470
471         printf("\n+++ libOggFLAC unit test: OggFLAC__SeekableStreamEncoder\n\n");
472
473         printf("testing OggFLAC__seekable_stream_encoder_new()... ");
474         encoder = OggFLAC__seekable_stream_encoder_new();
475         if(0 == encoder) {
476                 printf("FAILED, returned NULL\n");
477                 return false;
478         }
479         printf("OK\n");
480
481         printf("testing OggFLAC__seekable_stream_encoder_set_serial_number()... ");
482         if(!OggFLAC__seekable_stream_encoder_set_serial_number(encoder, file_utils__serial_number))
483                 return die_ss_("returned false", encoder);
484         printf("OK\n");
485
486         printf("testing OggFLAC__seekable_stream_encoder_set_verify()... ");
487         if(!OggFLAC__seekable_stream_encoder_set_verify(encoder, true))
488                 return die_ss_("returned false", encoder);
489         printf("OK\n");
490
491         printf("testing OggFLAC__seekable_stream_encoder_set_streamable_subset()... ");
492         if(!OggFLAC__seekable_stream_encoder_set_streamable_subset(encoder, true))
493                 return die_ss_("returned false", encoder);
494         printf("OK\n");
495
496         printf("testing OggFLAC__seekable_stream_encoder_set_do_mid_side_stereo()... ");
497         if(!OggFLAC__seekable_stream_encoder_set_do_mid_side_stereo(encoder, false))
498                 return die_ss_("returned false", encoder);
499         printf("OK\n");
500
501         printf("testing OggFLAC__seekable_stream_encoder_set_loose_mid_side_stereo()... ");
502         if(!OggFLAC__seekable_stream_encoder_set_loose_mid_side_stereo(encoder, false))
503                 return die_ss_("returned false", encoder);
504         printf("OK\n");
505
506         printf("testing OggFLAC__seekable_stream_encoder_set_channels()... ");
507         if(!OggFLAC__seekable_stream_encoder_set_channels(encoder, streaminfo_.data.stream_info.channels))
508                 return die_ss_("returned false", encoder);
509         printf("OK\n");
510
511         printf("testing OggFLAC__seekable_stream_encoder_set_bits_per_sample()... ");
512         if(!OggFLAC__seekable_stream_encoder_set_bits_per_sample(encoder, streaminfo_.data.stream_info.bits_per_sample))
513                 return die_ss_("returned false", encoder);
514         printf("OK\n");
515
516         printf("testing OggFLAC__seekable_stream_encoder_set_sample_rate()... ");
517         if(!OggFLAC__seekable_stream_encoder_set_sample_rate(encoder, streaminfo_.data.stream_info.sample_rate))
518                 return die_ss_("returned false", encoder);
519         printf("OK\n");
520
521         printf("testing OggFLAC__seekable_stream_encoder_set_blocksize()... ");
522         if(!OggFLAC__seekable_stream_encoder_set_blocksize(encoder, streaminfo_.data.stream_info.min_blocksize))
523                 return die_ss_("returned false", encoder);
524         printf("OK\n");
525
526         printf("testing OggFLAC__seekable_stream_encoder_set_max_lpc_order()... ");
527         if(!OggFLAC__seekable_stream_encoder_set_max_lpc_order(encoder, 0))
528                 return die_ss_("returned false", encoder);
529         printf("OK\n");
530
531         printf("testing OggFLAC__seekable_stream_encoder_set_qlp_coeff_precision()... ");
532         if(!OggFLAC__seekable_stream_encoder_set_qlp_coeff_precision(encoder, 0))
533                 return die_ss_("returned false", encoder);
534         printf("OK\n");
535
536         printf("testing OggFLAC__seekable_stream_encoder_set_do_qlp_coeff_prec_search()... ");
537         if(!OggFLAC__seekable_stream_encoder_set_do_qlp_coeff_prec_search(encoder, false))
538                 return die_ss_("returned false", encoder);
539         printf("OK\n");
540
541         printf("testing OggFLAC__seekable_stream_encoder_set_do_escape_coding()... ");
542         if(!OggFLAC__seekable_stream_encoder_set_do_escape_coding(encoder, false))
543                 return die_ss_("returned false", encoder);
544         printf("OK\n");
545
546         printf("testing OggFLAC__seekable_stream_encoder_set_do_exhaustive_model_search()... ");
547         if(!OggFLAC__seekable_stream_encoder_set_do_exhaustive_model_search(encoder, false))
548                 return die_ss_("returned false", encoder);
549         printf("OK\n");
550
551         printf("testing OggFLAC__seekable_stream_encoder_set_min_residual_partition_order()... ");
552         if(!OggFLAC__seekable_stream_encoder_set_min_residual_partition_order(encoder, 0))
553                 return die_ss_("returned false", encoder);
554         printf("OK\n");
555
556         printf("testing OggFLAC__seekable_stream_encoder_set_max_residual_partition_order()... ");
557         if(!OggFLAC__seekable_stream_encoder_set_max_residual_partition_order(encoder, 0))
558                 return die_ss_("returned false", encoder);
559         printf("OK\n");
560
561         printf("testing OggFLAC__seekable_stream_encoder_set_rice_parameter_search_dist()... ");
562         if(!OggFLAC__seekable_stream_encoder_set_rice_parameter_search_dist(encoder, 0))
563                 return die_ss_("returned false", encoder);
564         printf("OK\n");
565
566         printf("testing OggFLAC__seekable_stream_encoder_set_total_samples_estimate()... ");
567         if(!OggFLAC__seekable_stream_encoder_set_total_samples_estimate(encoder, streaminfo_.data.stream_info.total_samples))
568                 return die_ss_("returned false", encoder);
569         printf("OK\n");
570
571         printf("testing OggFLAC__seekable_stream_encoder_set_metadata()... ");
572         if(!OggFLAC__seekable_stream_encoder_set_metadata(encoder, metadata_sequence_, num_metadata_))
573                 return die_ss_("returned false", encoder);
574         printf("OK\n");
575
576         printf("testing OggFLAC__seekable_stream_encoder_set_read_callback()... ");
577         if(!OggFLAC__seekable_stream_encoder_set_read_callback(encoder, seekable_stream_encoder_read_callback_))
578                 return die_ss_("returned false", encoder);
579         printf("OK\n");
580
581         printf("testing OggFLAC__seekable_stream_encoder_set_seek_callback()... ");
582         if(!OggFLAC__seekable_stream_encoder_set_seek_callback(encoder, seekable_stream_encoder_seek_callback_))
583                 return die_ss_("returned false", encoder);
584         printf("OK\n");
585
586         printf("testing OggFLAC__seekable_stream_encoder_set_tell_callback()... ");
587         if(!OggFLAC__seekable_stream_encoder_set_tell_callback(encoder, seekable_stream_encoder_tell_callback_))
588                 return die_ss_("returned false", encoder);
589         printf("OK\n");
590
591         printf("testing OggFLAC__seekable_stream_encoder_set_write_callback()... ");
592         if(!OggFLAC__seekable_stream_encoder_set_write_callback(encoder, seekable_stream_encoder_write_callback_))
593                 return die_ss_("returned false", encoder);
594         printf("OK\n");
595
596         printf("testing OggFLAC__seekable_stream_encoder_set_client_data()... ");
597         if(!OggFLAC__seekable_stream_encoder_set_client_data(encoder, 0))
598                 return die_ss_("returned false", encoder);
599         printf("OK\n");
600
601         printf("testing OggFLAC__seekable_stream_encoder_init()... ");
602         if(OggFLAC__seekable_stream_encoder_init(encoder) != OggFLAC__SEEKABLE_STREAM_ENCODER_OK)
603                 return die_ss_(0, encoder);
604         printf("OK\n");
605
606         printf("testing OggFLAC__seekable_stream_encoder_get_state()... ");
607         state = OggFLAC__seekable_stream_encoder_get_state(encoder);
608         printf("returned state = %u (%s)... OK\n", (unsigned)state, OggFLAC__SeekableStreamEncoderStateString[state]);
609
610         printf("testing OggFLAC__seekable_stream_encoder_get_FLAC_stream_encoder_state()... ");
611         fstate = OggFLAC__seekable_stream_encoder_get_FLAC_stream_encoder_state(encoder);
612         printf("returned state = %u (%s)... OK\n", (unsigned)fstate, FLAC__StreamEncoderStateString[fstate]);
613
614         printf("testing OggFLAC__seekable_stream_encoder_get_verify_decoder_state()... ");
615         dstate = OggFLAC__seekable_stream_encoder_get_verify_decoder_state(encoder);
616         printf("returned state = %u (%s)... OK\n", (unsigned)dstate, FLAC__StreamDecoderStateString[dstate]);
617
618         {
619                 FLAC__uint64 absolute_sample;
620                 unsigned frame_number;
621                 unsigned channel;
622                 unsigned sample;
623                 FLAC__int32 expected;
624                 FLAC__int32 got;
625
626                 printf("testing OggFLAC__seekable_stream_encoder_get_verify_decoder_error_stats()... ");
627                 OggFLAC__seekable_stream_encoder_get_verify_decoder_error_stats(encoder, &absolute_sample, &frame_number, &channel, &sample, &expected, &got);
628                 printf("OK\n");
629         }
630
631         printf("testing OggFLAC__seekable_stream_encoder_get_verify()... ");
632         if(OggFLAC__seekable_stream_encoder_get_verify(encoder) != true) {
633                 printf("FAILED, expected true, got false\n");
634                 return false;
635         }
636         printf("OK\n");
637
638         printf("testing OggFLAC__seekable_stream_encoder_get_streamable_subset()... ");
639         if(OggFLAC__seekable_stream_encoder_get_streamable_subset(encoder) != true) {
640                 printf("FAILED, expected true, got false\n");
641                 return false;
642         }
643         printf("OK\n");
644
645         printf("testing OggFLAC__seekable_stream_encoder_get_do_mid_side_stereo()... ");
646         if(OggFLAC__seekable_stream_encoder_get_do_mid_side_stereo(encoder) != false) {
647                 printf("FAILED, expected false, got true\n");
648                 return false;
649         }
650         printf("OK\n");
651
652         printf("testing OggFLAC__seekable_stream_encoder_get_loose_mid_side_stereo()... ");
653         if(OggFLAC__seekable_stream_encoder_get_loose_mid_side_stereo(encoder) != false) {
654                 printf("FAILED, expected false, got true\n");
655                 return false;
656         }
657         printf("OK\n");
658
659         printf("testing OggFLAC__seekable_stream_encoder_get_channels()... ");
660         if(OggFLAC__seekable_stream_encoder_get_channels(encoder) != streaminfo_.data.stream_info.channels) {
661                 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.channels, OggFLAC__seekable_stream_encoder_get_channels(encoder));
662                 return false;
663         }
664         printf("OK\n");
665
666         printf("testing OggFLAC__seekable_stream_encoder_get_bits_per_sample()... ");
667         if(OggFLAC__seekable_stream_encoder_get_bits_per_sample(encoder) != streaminfo_.data.stream_info.bits_per_sample) {
668                 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.bits_per_sample, OggFLAC__seekable_stream_encoder_get_bits_per_sample(encoder));
669                 return false;
670         }
671         printf("OK\n");
672
673         printf("testing OggFLAC__seekable_stream_encoder_get_sample_rate()... ");
674         if(OggFLAC__seekable_stream_encoder_get_sample_rate(encoder) != streaminfo_.data.stream_info.sample_rate) {
675                 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.sample_rate, OggFLAC__seekable_stream_encoder_get_sample_rate(encoder));
676                 return false;
677         }
678         printf("OK\n");
679
680         printf("testing OggFLAC__seekable_stream_encoder_get_blocksize()... ");
681         if(OggFLAC__seekable_stream_encoder_get_blocksize(encoder) != streaminfo_.data.stream_info.min_blocksize) {
682                 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.min_blocksize, OggFLAC__seekable_stream_encoder_get_blocksize(encoder));
683                 return false;
684         }
685         printf("OK\n");
686
687         printf("testing OggFLAC__seekable_stream_encoder_get_max_lpc_order()... ");
688         if(OggFLAC__seekable_stream_encoder_get_max_lpc_order(encoder) != 0) {
689                 printf("FAILED, expected %u, got %u\n", 0, OggFLAC__seekable_stream_encoder_get_max_lpc_order(encoder));
690                 return false;
691         }
692         printf("OK\n");
693
694         printf("testing OggFLAC__seekable_stream_encoder_get_qlp_coeff_precision()... ");
695         (void)OggFLAC__seekable_stream_encoder_get_qlp_coeff_precision(encoder);
696         /* we asked the encoder to auto select this so we accept anything */
697         printf("OK\n");
698
699         printf("testing OggFLAC__seekable_stream_encoder_get_do_qlp_coeff_prec_search()... ");
700         if(OggFLAC__seekable_stream_encoder_get_do_qlp_coeff_prec_search(encoder) != false) {
701                 printf("FAILED, expected false, got true\n");
702                 return false;
703         }
704         printf("OK\n");
705
706         printf("testing OggFLAC__seekable_stream_encoder_get_do_escape_coding()... ");
707         if(OggFLAC__seekable_stream_encoder_get_do_escape_coding(encoder) != false) {
708                 printf("FAILED, expected false, got true\n");
709                 return false;
710         }
711         printf("OK\n");
712
713         printf("testing OggFLAC__seekable_stream_encoder_get_do_exhaustive_model_search()... ");
714         if(OggFLAC__seekable_stream_encoder_get_do_exhaustive_model_search(encoder) != false) {
715                 printf("FAILED, expected false, got true\n");
716                 return false;
717         }
718         printf("OK\n");
719
720         printf("testing OggFLAC__seekable_stream_encoder_get_min_residual_partition_order()... ");
721         if(OggFLAC__seekable_stream_encoder_get_min_residual_partition_order(encoder) != 0) {
722                 printf("FAILED, expected %u, got %u\n", 0, OggFLAC__seekable_stream_encoder_get_min_residual_partition_order(encoder));
723                 return false;
724         }
725         printf("OK\n");
726
727         printf("testing OggFLAC__seekable_stream_encoder_get_max_residual_partition_order()... ");
728         if(OggFLAC__seekable_stream_encoder_get_max_residual_partition_order(encoder) != 0) {
729                 printf("FAILED, expected %u, got %u\n", 0, OggFLAC__seekable_stream_encoder_get_max_residual_partition_order(encoder));
730                 return false;
731         }
732         printf("OK\n");
733
734         printf("testing OggFLAC__seekable_stream_encoder_get_rice_parameter_search_dist()... ");
735         if(OggFLAC__seekable_stream_encoder_get_rice_parameter_search_dist(encoder) != 0) {
736                 printf("FAILED, expected %u, got %u\n", 0, OggFLAC__seekable_stream_encoder_get_rice_parameter_search_dist(encoder));
737                 return false;
738         }
739         printf("OK\n");
740
741         printf("testing OggFLAC__seekable_stream_encoder_get_total_samples_estimate()... ");
742         if(OggFLAC__seekable_stream_encoder_get_total_samples_estimate(encoder) != streaminfo_.data.stream_info.total_samples) {
743                 printf("FAILED, expected %llu, got %llu\n", streaminfo_.data.stream_info.total_samples, OggFLAC__seekable_stream_encoder_get_total_samples_estimate(encoder));
744                 return false;
745         }
746         printf("OK\n");
747
748         /* init the dummy sample buffer */
749         for(i = 0; i < sizeof(samples) / sizeof(FLAC__int32); i++)
750                 samples[i] = i & 7;
751
752         printf("testing OggFLAC__seekable_stream_encoder_process()... ");
753         if(!OggFLAC__seekable_stream_encoder_process(encoder, (const FLAC__int32 * const *)samples_array, sizeof(samples) / sizeof(FLAC__int32)))
754                 return die_ss_("returned false", encoder);
755         printf("OK\n");
756
757         printf("testing OggFLAC__seekable_stream_encoder_process_interleaved()... ");
758         if(!OggFLAC__seekable_stream_encoder_process_interleaved(encoder, samples, sizeof(samples) / sizeof(FLAC__int32)))
759                 return die_ss_("returned false", encoder);
760         printf("OK\n");
761
762         printf("testing OggFLAC__seekable_stream_encoder_finish()... ");
763         OggFLAC__seekable_stream_encoder_finish(encoder);
764         printf("OK\n");
765
766         printf("testing OggFLAC__seekable_stream_encoder_delete()... ");
767         OggFLAC__seekable_stream_encoder_delete(encoder);
768         printf("OK\n");
769
770         printf("\nPASSED!\n");
771
772         return true;
773 }
774
775 static void file_encoder_progress_callback_(const OggFLAC__FileEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data)
776 {
777         (void)encoder, (void)bytes_written, (void)samples_written, (void)frames_written, (void)total_frames_estimate, (void)client_data;
778 }
779
780 static FLAC__bool test_file_encoder()
781 {
782         OggFLAC__FileEncoder *encoder;
783         OggFLAC__FileEncoderState state;
784         OggFLAC__SeekableStreamEncoderState sstate;
785         FLAC__StreamEncoderState fstate;
786         FLAC__StreamDecoderState dstate;
787         FLAC__int32 samples[1024];
788         FLAC__int32 *samples_array[1];
789         unsigned i;
790
791         samples_array[0] = samples;
792
793         printf("\n+++ libOggFLAC unit test: OggFLAC__FileEncoder\n\n");
794
795         printf("testing OggFLAC__file_encoder_new()... ");
796         encoder = OggFLAC__file_encoder_new();
797         if(0 == encoder) {
798                 printf("FAILED, returned NULL\n");
799                 return false;
800         }
801         printf("OK\n");
802
803         printf("testing OggFLAC__file_encoder_set_serial_number()... ");
804         if(!OggFLAC__file_encoder_set_serial_number(encoder, file_utils__serial_number))
805                 return die_f_("returned false", encoder);
806         printf("OK\n");
807
808         printf("testing OggFLAC__file_encoder_set_verify()... ");
809         if(!OggFLAC__file_encoder_set_verify(encoder, true))
810                 return die_f_("returned false", encoder);
811         printf("OK\n");
812
813         printf("testing OggFLAC__file_encoder_set_streamable_subset()... ");
814         if(!OggFLAC__file_encoder_set_streamable_subset(encoder, true))
815                 return die_f_("returned false", encoder);
816         printf("OK\n");
817
818         printf("testing OggFLAC__file_encoder_set_do_mid_side_stereo()... ");
819         if(!OggFLAC__file_encoder_set_do_mid_side_stereo(encoder, false))
820                 return die_f_("returned false", encoder);
821         printf("OK\n");
822
823         printf("testing OggFLAC__file_encoder_set_loose_mid_side_stereo()... ");
824         if(!OggFLAC__file_encoder_set_loose_mid_side_stereo(encoder, false))
825                 return die_f_("returned false", encoder);
826         printf("OK\n");
827
828         printf("testing OggFLAC__file_encoder_set_channels()... ");
829         if(!OggFLAC__file_encoder_set_channels(encoder, streaminfo_.data.stream_info.channels))
830                 return die_f_("returned false", encoder);
831         printf("OK\n");
832
833         printf("testing OggFLAC__file_encoder_set_bits_per_sample()... ");
834         if(!OggFLAC__file_encoder_set_bits_per_sample(encoder, streaminfo_.data.stream_info.bits_per_sample))
835                 return die_f_("returned false", encoder);
836         printf("OK\n");
837
838         printf("testing OggFLAC__file_encoder_set_sample_rate()... ");
839         if(!OggFLAC__file_encoder_set_sample_rate(encoder, streaminfo_.data.stream_info.sample_rate))
840                 return die_f_("returned false", encoder);
841         printf("OK\n");
842
843         printf("testing OggFLAC__file_encoder_set_blocksize()... ");
844         if(!OggFLAC__file_encoder_set_blocksize(encoder, streaminfo_.data.stream_info.min_blocksize))
845                 return die_f_("returned false", encoder);
846         printf("OK\n");
847
848         printf("testing OggFLAC__file_encoder_set_max_lpc_order()... ");
849         if(!OggFLAC__file_encoder_set_max_lpc_order(encoder, 0))
850                 return die_f_("returned false", encoder);
851         printf("OK\n");
852
853         printf("testing OggFLAC__file_encoder_set_qlp_coeff_precision()... ");
854         if(!OggFLAC__file_encoder_set_qlp_coeff_precision(encoder, 0))
855                 return die_f_("returned false", encoder);
856         printf("OK\n");
857
858         printf("testing OggFLAC__file_encoder_set_do_qlp_coeff_prec_search()... ");
859         if(!OggFLAC__file_encoder_set_do_qlp_coeff_prec_search(encoder, false))
860                 return die_f_("returned false", encoder);
861         printf("OK\n");
862
863         printf("testing OggFLAC__file_encoder_set_do_escape_coding()... ");
864         if(!OggFLAC__file_encoder_set_do_escape_coding(encoder, false))
865                 return die_f_("returned false", encoder);
866         printf("OK\n");
867
868         printf("testing OggFLAC__file_encoder_set_do_exhaustive_model_search()... ");
869         if(!OggFLAC__file_encoder_set_do_exhaustive_model_search(encoder, false))
870                 return die_f_("returned false", encoder);
871         printf("OK\n");
872
873         printf("testing OggFLAC__file_encoder_set_min_residual_partition_order()... ");
874         if(!OggFLAC__file_encoder_set_min_residual_partition_order(encoder, 0))
875                 return die_f_("returned false", encoder);
876         printf("OK\n");
877
878         printf("testing OggFLAC__file_encoder_set_max_residual_partition_order()... ");
879         if(!OggFLAC__file_encoder_set_max_residual_partition_order(encoder, 0))
880                 return die_f_("returned false", encoder);
881         printf("OK\n");
882
883         printf("testing OggFLAC__file_encoder_set_rice_parameter_search_dist()... ");
884         if(!OggFLAC__file_encoder_set_rice_parameter_search_dist(encoder, 0))
885                 return die_f_("returned false", encoder);
886         printf("OK\n");
887
888         printf("testing OggFLAC__file_encoder_set_total_samples_estimate()... ");
889         if(!OggFLAC__file_encoder_set_total_samples_estimate(encoder, streaminfo_.data.stream_info.total_samples))
890                 return die_f_("returned false", encoder);
891         printf("OK\n");
892
893         printf("testing OggFLAC__file_encoder_set_metadata()... ");
894         if(!OggFLAC__file_encoder_set_metadata(encoder, metadata_sequence_, num_metadata_))
895                 return die_f_("returned false", encoder);
896         printf("OK\n");
897
898         printf("testing OggFLAC__file_encoder_set_filename()... ");
899         if(!OggFLAC__file_encoder_set_filename(encoder, oggflacfilename_))
900                 return die_f_("returned false", encoder);
901         printf("OK\n");
902
903         printf("testing OggFLAC__file_encoder_set_progress_callback()... ");
904         if(!OggFLAC__file_encoder_set_progress_callback(encoder, file_encoder_progress_callback_))
905                 return die_f_("returned false", encoder);
906         printf("OK\n");
907
908         printf("testing OggFLAC__file_encoder_set_client_data()... ");
909         if(!OggFLAC__file_encoder_set_client_data(encoder, 0))
910                 return die_f_("returned false", encoder);
911         printf("OK\n");
912
913         printf("testing OggFLAC__file_encoder_init()... ");
914         if(OggFLAC__file_encoder_init(encoder) != OggFLAC__FILE_ENCODER_OK)
915                 return die_f_(0, encoder);
916         printf("OK\n");
917
918         printf("testing OggFLAC__file_encoder_get_state()... ");
919         state = OggFLAC__file_encoder_get_state(encoder);
920         printf("returned state = %u (%s)... OK\n", (unsigned)state, OggFLAC__FileEncoderStateString[state]);
921
922         printf("testing OggFLAC__file_encoder_get_seekable_stream_encoder_state()... ");
923         sstate = OggFLAC__file_encoder_get_seekable_stream_encoder_state(encoder);
924         printf("returned state = %u (%s)... OK\n", (unsigned)sstate, OggFLAC__SeekableStreamEncoderStateString[sstate]);
925
926         printf("testing OggFLAC__file_encoder_get_FLAC_stream_encoder_state()... ");
927         fstate = OggFLAC__file_encoder_get_FLAC_stream_encoder_state(encoder);
928         printf("returned state = %u (%s)... OK\n", (unsigned)fstate, FLAC__StreamEncoderStateString[fstate]);
929
930         printf("testing OggFLAC__file_encoder_get_verify_decoder_state()... ");
931         dstate = OggFLAC__file_encoder_get_verify_decoder_state(encoder);
932         printf("returned state = %u (%s)... OK\n", (unsigned)dstate, FLAC__StreamDecoderStateString[dstate]);
933
934         {
935                 FLAC__uint64 absolute_sample;
936                 unsigned frame_number;
937                 unsigned channel;
938                 unsigned sample;
939                 FLAC__int32 expected;
940                 FLAC__int32 got;
941
942                 printf("testing OggFLAC__file_encoder_get_verify_decoder_error_stats()... ");
943                 OggFLAC__file_encoder_get_verify_decoder_error_stats(encoder, &absolute_sample, &frame_number, &channel, &sample, &expected, &got);
944                 printf("OK\n");
945         }
946
947         printf("testing OggFLAC__file_encoder_get_verify()... ");
948         if(OggFLAC__file_encoder_get_verify(encoder) != true) {
949                 printf("FAILED, expected true, got false\n");
950                 return false;
951         }
952         printf("OK\n");
953
954         printf("testing OggFLAC__file_encoder_get_streamable_subset()... ");
955         if(OggFLAC__file_encoder_get_streamable_subset(encoder) != true) {
956                 printf("FAILED, expected true, got false\n");
957                 return false;
958         }
959         printf("OK\n");
960
961         printf("testing OggFLAC__file_encoder_get_do_mid_side_stereo()... ");
962         if(OggFLAC__file_encoder_get_do_mid_side_stereo(encoder) != false) {
963                 printf("FAILED, expected false, got true\n");
964                 return false;
965         }
966         printf("OK\n");
967
968         printf("testing OggFLAC__file_encoder_get_loose_mid_side_stereo()... ");
969         if(OggFLAC__file_encoder_get_loose_mid_side_stereo(encoder) != false) {
970                 printf("FAILED, expected false, got true\n");
971                 return false;
972         }
973         printf("OK\n");
974
975         printf("testing OggFLAC__file_encoder_get_channels()... ");
976         if(OggFLAC__file_encoder_get_channels(encoder) != streaminfo_.data.stream_info.channels) {
977                 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.channels, OggFLAC__file_encoder_get_channels(encoder));
978                 return false;
979         }
980         printf("OK\n");
981
982         printf("testing OggFLAC__file_encoder_get_bits_per_sample()... ");
983         if(OggFLAC__file_encoder_get_bits_per_sample(encoder) != streaminfo_.data.stream_info.bits_per_sample) {
984                 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.bits_per_sample, OggFLAC__file_encoder_get_bits_per_sample(encoder));
985                 return false;
986         }
987         printf("OK\n");
988
989         printf("testing OggFLAC__file_encoder_get_sample_rate()... ");
990         if(OggFLAC__file_encoder_get_sample_rate(encoder) != streaminfo_.data.stream_info.sample_rate) {
991                 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.sample_rate, OggFLAC__file_encoder_get_sample_rate(encoder));
992                 return false;
993         }
994         printf("OK\n");
995
996         printf("testing OggFLAC__file_encoder_get_blocksize()... ");
997         if(OggFLAC__file_encoder_get_blocksize(encoder) != streaminfo_.data.stream_info.min_blocksize) {
998                 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.min_blocksize, OggFLAC__file_encoder_get_blocksize(encoder));
999                 return false;
1000         }
1001         printf("OK\n");
1002
1003         printf("testing OggFLAC__file_encoder_get_max_lpc_order()... ");
1004         if(OggFLAC__file_encoder_get_max_lpc_order(encoder) != 0) {
1005                 printf("FAILED, expected %u, got %u\n", 0, OggFLAC__file_encoder_get_max_lpc_order(encoder));
1006                 return false;
1007         }
1008         printf("OK\n");
1009
1010         printf("testing OggFLAC__file_encoder_get_qlp_coeff_precision()... ");
1011         (void)OggFLAC__file_encoder_get_qlp_coeff_precision(encoder);
1012         /* we asked the encoder to auto select this so we accept anything */
1013         printf("OK\n");
1014
1015         printf("testing OggFLAC__file_encoder_get_do_qlp_coeff_prec_search()... ");
1016         if(OggFLAC__file_encoder_get_do_qlp_coeff_prec_search(encoder) != false) {
1017                 printf("FAILED, expected false, got true\n");
1018                 return false;
1019         }
1020         printf("OK\n");
1021
1022         printf("testing OggFLAC__file_encoder_get_do_escape_coding()... ");
1023         if(OggFLAC__file_encoder_get_do_escape_coding(encoder) != false) {
1024                 printf("FAILED, expected false, got true\n");
1025                 return false;
1026         }
1027         printf("OK\n");
1028
1029         printf("testing OggFLAC__file_encoder_get_do_exhaustive_model_search()... ");
1030         if(OggFLAC__file_encoder_get_do_exhaustive_model_search(encoder) != false) {
1031                 printf("FAILED, expected false, got true\n");
1032                 return false;
1033         }
1034         printf("OK\n");
1035
1036         printf("testing OggFLAC__file_encoder_get_min_residual_partition_order()... ");
1037         if(OggFLAC__file_encoder_get_min_residual_partition_order(encoder) != 0) {
1038                 printf("FAILED, expected %u, got %u\n", 0, OggFLAC__file_encoder_get_min_residual_partition_order(encoder));
1039                 return false;
1040         }
1041         printf("OK\n");
1042
1043         printf("testing OggFLAC__file_encoder_get_max_residual_partition_order()... ");
1044         if(OggFLAC__file_encoder_get_max_residual_partition_order(encoder) != 0) {
1045                 printf("FAILED, expected %u, got %u\n", 0, OggFLAC__file_encoder_get_max_residual_partition_order(encoder));
1046                 return false;
1047         }
1048         printf("OK\n");
1049
1050         printf("testing OggFLAC__file_encoder_get_rice_parameter_search_dist()... ");
1051         if(OggFLAC__file_encoder_get_rice_parameter_search_dist(encoder) != 0) {
1052                 printf("FAILED, expected %u, got %u\n", 0, OggFLAC__file_encoder_get_rice_parameter_search_dist(encoder));
1053                 return false;
1054         }
1055         printf("OK\n");
1056
1057         printf("testing OggFLAC__file_encoder_get_total_samples_estimate()... ");
1058         if(OggFLAC__file_encoder_get_total_samples_estimate(encoder) != streaminfo_.data.stream_info.total_samples) {
1059                 printf("FAILED, expected %llu, got %llu\n", streaminfo_.data.stream_info.total_samples, OggFLAC__file_encoder_get_total_samples_estimate(encoder));
1060                 return false;
1061         }
1062         printf("OK\n");
1063
1064         /* init the dummy sample buffer */
1065         for(i = 0; i < sizeof(samples) / sizeof(FLAC__int32); i++)
1066                 samples[i] = i & 7;
1067
1068         printf("testing OggFLAC__file_encoder_process()... ");
1069         if(!OggFLAC__file_encoder_process(encoder, (const FLAC__int32 * const *)samples_array, sizeof(samples) / sizeof(FLAC__int32)))
1070                 return die_f_("returned false", encoder);
1071         printf("OK\n");
1072
1073         printf("testing OggFLAC__file_encoder_process_interleaved()... ");
1074         if(!OggFLAC__file_encoder_process_interleaved(encoder, samples, sizeof(samples) / sizeof(FLAC__int32)))
1075                 return die_f_("returned false", encoder);
1076         printf("OK\n");
1077
1078         printf("testing OggFLAC__file_encoder_finish()... ");
1079         OggFLAC__file_encoder_finish(encoder);
1080         printf("OK\n");
1081
1082         printf("testing OggFLAC__file_encoder_delete()... ");
1083         OggFLAC__file_encoder_delete(encoder);
1084         printf("OK\n");
1085
1086         printf("\nPASSED!\n");
1087
1088         return true;
1089 }
1090
1091 FLAC__bool test_encoders()
1092 {
1093         init_metadata_blocks_();
1094
1095         if(!test_stream_encoder())
1096                 return false;
1097
1098         if(!test_seekable_stream_encoder())
1099                 return false;
1100
1101         if(!test_file_encoder())
1102                 return false;
1103
1104         (void) grabbag__file_remove_file(oggflacfilename_);
1105         free_metadata_blocks_();
1106
1107         return true;
1108 }