LICENSE, MINES
[Faustine.git] / interpreter / lib / src / libsndfile-1.0.25 / tests / pcm_test.c
1 /*
2 ** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
3 **
4 ** This program is free software; you can redistribute it and/or modify
5 ** it under the terms of the GNU General Public License as published by
6 ** the Free Software Foundation; either version 2 of the License, or
7 ** (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 "sfconfig.h"
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <math.h>
25
26 #if HAVE_UNISTD_H
27 #include <unistd.h>
28 #endif
29
30 #include <sndfile.h>
31
32 #include "utils.h"
33
34 #define BUFFER_SIZE (1<<12)
35
36 static void lrintf_test (void) ;
37
38 static void pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash) ;
39 static void pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash) ;
40 static void pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash) ;
41 static void pcm_test_bits_32 (const char *filename, int filetype, uint64_t hash) ;
42
43 static void pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float) ;
44 static void pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float) ;
45
46 typedef union
47 { double d [BUFFER_SIZE + 1] ;
48 float f [BUFFER_SIZE + 1] ;
49 int i [BUFFER_SIZE + 1] ;
50 short s [BUFFER_SIZE + 1] ;
51 } BUFFER ;
52
53 /* Data written to the file. */
54 static BUFFER data_out ;
55
56 /* Data read back from the file. */
57 static BUFFER data_in ;
58
59 int
60 main (void)
61 {
62 lrintf_test () ;
63
64 pcm_test_bits_8 ("pcm-s8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_S8, 0x1cda335091249dbfLL) ;
65 pcm_test_bits_8 ("pcm-u8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_U8, 0x7f748c433d695f3fLL) ;
66
67 pcm_test_bits_16 ("le-pcm16.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0x3a2b956c881ebf08LL) ;
68 pcm_test_bits_16 ("be-pcm16.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0xd9e2f840c55750f8LL) ;
69
70 pcm_test_bits_24 ("le-pcm24.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0x933b6a759ab496f8LL) ;
71 pcm_test_bits_24 ("be-pcm24.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xbb1f3eaf9c30b6f8LL) ;
72
73 pcm_test_bits_32 ("le-pcm32.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0xa77aece1c1c17f08LL) ;
74 pcm_test_bits_32 ("be-pcm32.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0x3099ddf142d0b0f8LL) ;
75
76 /* Lite remove start */
77 pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x3c2ad04f7554267aLL, SF_FALSE) ;
78 pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x074de3e248fa9186LL, SF_FALSE) ;
79
80 pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xc682726f958f669cLL, SF_FALSE) ;
81 pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xd9a3583f8ee51164LL, SF_FALSE) ;
82
83 pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x3c2ad04f7554267aLL, SF_TRUE) ;
84 pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x074de3e248fa9186LL, SF_TRUE) ;
85
86 pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xc682726f958f669cLL, SF_TRUE) ;
87 pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xd9a3583f8ee51164LL, SF_TRUE) ;
88 /* Lite remove end */
89
90 return 0 ;
91 } /* main */
92
93 /*============================================================================================
94 ** Here are the test functions.
95 */
96
97 static void
98 lrintf_test (void)
99 { int k, items ;
100 float *float_data ;
101 int *int_data ;
102
103 print_test_name ("lrintf_test", "") ;
104
105 items = 1024 ;
106
107 float_data = data_out.f ;
108 int_data = data_in.i ;
109
110 for (k = 0 ; k < items ; k++)
111 float_data [k] = (k * ((k % 2) ? 333333.0 : -333333.0)) ;
112
113 for (k = 0 ; k < items ; k++)
114 int_data [k] = lrintf (float_data [k]) ;
115
116 for (k = 0 ; k < items ; k++)
117 if (fabs (int_data [k] - float_data [k]) > 1.0)
118 { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %d).\n", __LINE__, k, float_data [k], int_data [k]) ;
119 exit (1) ;
120 } ;
121
122 printf ("ok\n") ;
123 } /* lrintf_test */
124
125 static void
126 pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash)
127 { SNDFILE *file ;
128 SF_INFO sfinfo ;
129 int k, items, zero_count ;
130 short *short_out, *short_in ;
131 int *int_out, *int_in ;
132 /* Lite remove start */
133 float *float_out, *float_in ;
134 double *double_out, *double_in ;
135 /* Lite remove end */
136
137 print_test_name ("pcm_test_bits_8", filename) ;
138
139 items = 127 ;
140
141 short_out = data_out.s ;
142 short_in = data_in.s ;
143
144 zero_count = 0 ;
145 for (k = 0 ; k < items ; k++)
146 { short_out [k] = ((k * ((k % 2) ? 1 : -1)) << 8) ;
147 zero_count = short_out [k] ? zero_count : zero_count + 1 ;
148 } ;
149
150 if (zero_count > items / 4)
151 { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ;
152 exit (1) ;
153 } ;
154
155 sfinfo.samplerate = 44100 ;
156 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
157 sfinfo.channels = 1 ;
158 sfinfo.format = filetype ;
159
160 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
161
162 test_write_short_or_die (file, 0, short_out, items, __LINE__) ;
163
164 sf_close (file) ;
165
166 memset (short_in, 0, items * sizeof (short)) ;
167
168 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
169
170 if (sfinfo.format != filetype)
171 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
172 exit (1) ;
173 } ;
174
175 if (sfinfo.frames != items)
176 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
177 exit (1) ;
178 } ;
179
180 if (sfinfo.channels != 1)
181 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
182 exit (1) ;
183 } ;
184
185 check_log_buffer_or_die (file, __LINE__) ;
186
187 test_read_short_or_die (file, 0, short_in, items, __LINE__) ;
188
189 for (k = 0 ; k < items ; k++)
190 if (short_out [k] != short_in [k])
191 { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ;
192 exit (1) ;
193 } ;
194
195 sf_close (file) ;
196
197 /* Finally, check the file hash. */
198 check_file_hash_or_die (filename, hash, __LINE__) ;
199
200 /*--------------------------------------------------------------------------
201 ** Test sf_read/write_int ()
202 */
203 zero_count = 0 ;
204
205 int_out = data_out.i ;
206 int_in = data_in.i ;
207 for (k = 0 ; k < items ; k++)
208 { int_out [k] = ((k * ((k % 2) ? 1 : -1)) << 24) ;
209 zero_count = int_out [k] ? zero_count : zero_count + 1 ;
210 } ;
211
212 if (zero_count > items / 4)
213 { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ;
214 exit (1) ;
215 } ;
216
217 sfinfo.samplerate = 44100 ;
218 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
219 sfinfo.channels = 1 ;
220 sfinfo.format = filetype ;
221
222 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
223
224 test_write_int_or_die (file, 0, int_out, items, __LINE__) ;
225
226 sf_close (file) ;
227
228 memset (int_in, 0, items * sizeof (int)) ;
229
230 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
231
232 if (sfinfo.format != filetype)
233 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
234 exit (1) ;
235 } ;
236
237 if (sfinfo.frames != items)
238 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
239 exit (1) ;
240 } ;
241
242 if (sfinfo.channels != 1)
243 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
244 exit (1) ;
245 } ;
246
247 check_log_buffer_or_die (file, __LINE__) ;
248
249 test_read_int_or_die (file, 0, int_in, items, __LINE__) ;
250
251 for (k = 0 ; k < items ; k++)
252 if (int_out [k] != int_in [k])
253 { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ;
254 exit (1) ;
255 } ;
256
257 sf_close (file) ;
258
259 /* Lite remove start */
260 /*--------------------------------------------------------------------------
261 ** Test sf_read/write_float ()
262 */
263 zero_count = 0 ;
264
265 float_out = data_out.f ;
266 float_in = data_in.f ;
267 for (k = 0 ; k < items ; k++)
268 { float_out [k] = (k * ((k % 2) ? 1 : -1)) ;
269 zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
270 } ;
271
272 if (zero_count > items / 4)
273 { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ;
274 exit (1) ;
275 } ;
276
277 sfinfo.samplerate = 44100 ;
278 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
279 sfinfo.channels = 1 ;
280 sfinfo.format = filetype ;
281
282 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
283
284 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
285
286 test_write_float_or_die (file, 0, float_out, items, __LINE__) ;
287
288 sf_close (file) ;
289
290 memset (float_in, 0, items * sizeof (float)) ;
291
292 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
293
294 if (sfinfo.format != filetype)
295 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
296 exit (1) ;
297 } ;
298
299 if (sfinfo.frames != items)
300 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
301 exit (1) ;
302 } ;
303
304 if (sfinfo.channels != 1)
305 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
306 exit (1) ;
307 } ;
308
309 check_log_buffer_or_die (file, __LINE__) ;
310
311 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
312
313 test_read_float_or_die (file, 0, float_in, items, __LINE__) ;
314
315 for (k = 0 ; k < items ; k++)
316 if (fabs (float_out [k] - float_in [k]) > 1e-10)
317 { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ;
318 exit (1) ;
319 } ;
320
321 sf_close (file) ;
322
323 /*--------------------------------------------------------------------------
324 ** Test sf_read/write_double ()
325 */
326 zero_count = 0 ;
327
328 double_out = data_out.d ;
329 double_in = data_in.d ;
330 for (k = 0 ; k < items ; k++)
331 { double_out [k] = (k * ((k % 2) ? 1 : -1)) ;
332 zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
333 } ;
334
335 if (zero_count > items / 4)
336 { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ;
337 exit (1) ;
338 } ;
339
340 sfinfo.samplerate = 44100 ;
341 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
342 sfinfo.channels = 1 ;
343 sfinfo.format = filetype ;
344
345 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
346
347 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
348
349 test_write_double_or_die (file, 0, double_out, items, __LINE__) ;
350
351 sf_close (file) ;
352
353 memset (double_in, 0, items * sizeof (double)) ;
354
355 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
356
357 if (sfinfo.format != filetype)
358 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
359 exit (1) ;
360 } ;
361
362 if (sfinfo.frames != items)
363 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
364 exit (1) ;
365 } ;
366
367 if (sfinfo.channels != 1)
368 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
369 exit (1) ;
370 } ;
371
372 check_log_buffer_or_die (file, __LINE__) ;
373
374 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
375
376 test_read_double_or_die (file, 0, double_in, items, __LINE__) ;
377
378 for (k = 0 ; k < items ; k++)
379 if (fabs (double_out [k] - double_in [k]) > 1e-10)
380 { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ;
381 exit (1) ;
382 } ;
383
384 sf_close (file) ;
385 /* Lite remove end */
386 unlink (filename) ;
387
388 puts ("ok") ;
389 } /* pcm_test_bits_8 */
390
391 static void
392 pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash)
393 { SNDFILE *file ;
394 SF_INFO sfinfo ;
395 int k, items, zero_count ;
396 short *short_out, *short_in ;
397 int *int_out, *int_in ;
398 /* Lite remove start */
399 float *float_out, *float_in ;
400 double *double_out, *double_in ;
401 /* Lite remove end */
402
403 print_test_name ("pcm_test_bits_16", filename) ;
404
405 items = 1024 ;
406
407 short_out = data_out.s ;
408 short_in = data_in.s ;
409
410 zero_count = 0 ;
411 for (k = 0 ; k < items ; k++)
412 { short_out [k] = (k * ((k % 2) ? 3 : -3)) ;
413 zero_count = short_out [k] ? zero_count : zero_count + 1 ;
414 } ;
415
416 if (zero_count > items / 4)
417 { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ;
418 exit (1) ;
419 } ;
420
421 sfinfo.samplerate = 44100 ;
422 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
423 sfinfo.channels = 1 ;
424 sfinfo.format = filetype ;
425
426 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
427
428 test_write_short_or_die (file, 0, short_out, items, __LINE__) ;
429
430 sf_close (file) ;
431
432 memset (short_in, 0, items * sizeof (short)) ;
433
434 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
435
436 if (sfinfo.format != filetype)
437 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
438 exit (1) ;
439 } ;
440
441 if (sfinfo.frames != items)
442 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
443 exit (1) ;
444 } ;
445
446 if (sfinfo.channels != 1)
447 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
448 exit (1) ;
449 } ;
450
451 check_log_buffer_or_die (file, __LINE__) ;
452
453 test_read_short_or_die (file, 0, short_in, items, __LINE__) ;
454
455 for (k = 0 ; k < items ; k++)
456 if (short_out [k] != short_in [k])
457 { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ;
458 exit (1) ;
459 } ;
460
461 sf_close (file) ;
462
463 /* Finally, check the file hash. */
464 check_file_hash_or_die (filename, hash, __LINE__) ;
465
466 /*--------------------------------------------------------------------------
467 ** Test sf_read/write_int ()
468 */
469 zero_count = 0 ;
470
471 int_out = data_out.i ;
472 int_in = data_in.i ;
473 for (k = 0 ; k < items ; k++)
474 { int_out [k] = ((k * ((k % 2) ? 3 : -3)) << 16) ;
475 zero_count = int_out [k] ? zero_count : zero_count + 1 ;
476 } ;
477
478 if (zero_count > items / 4)
479 { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ;
480 exit (1) ;
481 } ;
482
483 sfinfo.samplerate = 44100 ;
484 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
485 sfinfo.channels = 1 ;
486 sfinfo.format = filetype ;
487
488 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
489
490 test_write_int_or_die (file, 0, int_out, items, __LINE__) ;
491
492 sf_close (file) ;
493
494 memset (int_in, 0, items * sizeof (int)) ;
495
496 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
497
498 if (sfinfo.format != filetype)
499 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
500 exit (1) ;
501 } ;
502
503 if (sfinfo.frames != items)
504 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
505 exit (1) ;
506 } ;
507
508 if (sfinfo.channels != 1)
509 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
510 exit (1) ;
511 } ;
512
513 check_log_buffer_or_die (file, __LINE__) ;
514
515 test_read_int_or_die (file, 0, int_in, items, __LINE__) ;
516
517 for (k = 0 ; k < items ; k++)
518 if (int_out [k] != int_in [k])
519 { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ;
520 exit (1) ;
521 } ;
522
523 sf_close (file) ;
524
525 /* Lite remove start */
526 /*--------------------------------------------------------------------------
527 ** Test sf_read/write_float ()
528 */
529 zero_count = 0 ;
530
531 float_out = data_out.f ;
532 float_in = data_in.f ;
533 for (k = 0 ; k < items ; k++)
534 { float_out [k] = (k * ((k % 2) ? 3 : -3)) ;
535 zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
536 } ;
537
538 if (zero_count > items / 4)
539 { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ;
540 exit (1) ;
541 } ;
542
543 sfinfo.samplerate = 44100 ;
544 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
545 sfinfo.channels = 1 ;
546 sfinfo.format = filetype ;
547
548 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
549
550 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
551
552 test_write_float_or_die (file, 0, float_out, items, __LINE__) ;
553
554 sf_close (file) ;
555
556 memset (float_in, 0, items * sizeof (float)) ;
557
558 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
559
560 if (sfinfo.format != filetype)
561 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
562 exit (1) ;
563 } ;
564
565 if (sfinfo.frames != items)
566 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
567 exit (1) ;
568 } ;
569
570 if (sfinfo.channels != 1)
571 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
572 exit (1) ;
573 } ;
574
575 check_log_buffer_or_die (file, __LINE__) ;
576
577 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
578
579 test_read_float_or_die (file, 0, float_in, items, __LINE__) ;
580
581 for (k = 0 ; k < items ; k++)
582 if (fabs (float_out [k] - float_in [k]) > 1e-10)
583 { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ;
584 exit (1) ;
585 } ;
586
587 sf_close (file) ;
588
589 /*--------------------------------------------------------------------------
590 ** Test sf_read/write_double ()
591 */
592 zero_count = 0 ;
593
594 double_out = data_out.d ;
595 double_in = data_in.d ;
596 for (k = 0 ; k < items ; k++)
597 { double_out [k] = (k * ((k % 2) ? 3 : -3)) ;
598 zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
599 } ;
600
601 if (zero_count > items / 4)
602 { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ;
603 exit (1) ;
604 } ;
605
606 sfinfo.samplerate = 44100 ;
607 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
608 sfinfo.channels = 1 ;
609 sfinfo.format = filetype ;
610
611 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
612
613 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
614
615 test_write_double_or_die (file, 0, double_out, items, __LINE__) ;
616
617 sf_close (file) ;
618
619 memset (double_in, 0, items * sizeof (double)) ;
620
621 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
622
623 if (sfinfo.format != filetype)
624 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
625 exit (1) ;
626 } ;
627
628 if (sfinfo.frames != items)
629 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
630 exit (1) ;
631 } ;
632
633 if (sfinfo.channels != 1)
634 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
635 exit (1) ;
636 } ;
637
638 check_log_buffer_or_die (file, __LINE__) ;
639
640 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
641
642 test_read_double_or_die (file, 0, double_in, items, __LINE__) ;
643
644 for (k = 0 ; k < items ; k++)
645 if (fabs (double_out [k] - double_in [k]) > 1e-10)
646 { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ;
647 exit (1) ;
648 } ;
649
650 sf_close (file) ;
651 /* Lite remove end */
652 unlink (filename) ;
653
654 puts ("ok") ;
655 } /* pcm_test_bits_16 */
656
657 static void
658 pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash)
659 { SNDFILE *file ;
660 SF_INFO sfinfo ;
661 int k, items, zero_count ;
662 short *short_out, *short_in ;
663 int *int_out, *int_in ;
664 /* Lite remove start */
665 float *float_out, *float_in ;
666 double *double_out, *double_in ;
667 /* Lite remove end */
668
669 print_test_name ("pcm_test_bits_24", filename) ;
670
671 items = 1024 ;
672
673 short_out = data_out.s ;
674 short_in = data_in.s ;
675
676 zero_count = 0 ;
677 for (k = 0 ; k < items ; k++)
678 { short_out [k] = (k * ((k % 2) ? 3 : -3)) ;
679 zero_count = short_out [k] ? zero_count : zero_count + 1 ;
680 } ;
681
682 if (zero_count > items / 4)
683 { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ;
684 exit (1) ;
685 } ;
686
687 sfinfo.samplerate = 44100 ;
688 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
689 sfinfo.channels = 1 ;
690 sfinfo.format = filetype ;
691
692 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
693
694 test_write_short_or_die (file, 0, short_out, items, __LINE__) ;
695
696 sf_close (file) ;
697
698 memset (short_in, 0, items * sizeof (short)) ;
699
700 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
701
702 if (sfinfo.format != filetype)
703 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
704 exit (1) ;
705 } ;
706
707 if (sfinfo.frames != items)
708 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
709 exit (1) ;
710 } ;
711
712 if (sfinfo.channels != 1)
713 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
714 exit (1) ;
715 } ;
716
717 check_log_buffer_or_die (file, __LINE__) ;
718
719 test_read_short_or_die (file, 0, short_in, items, __LINE__) ;
720
721 for (k = 0 ; k < items ; k++)
722 if (short_out [k] != short_in [k])
723 { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ;
724 exit (1) ;
725 } ;
726
727 sf_close (file) ;
728
729 /* Finally, check the file hash. */
730 check_file_hash_or_die (filename, hash, __LINE__) ;
731
732 /*--------------------------------------------------------------------------
733 ** Test sf_read/write_int ()
734 */
735 zero_count = 0 ;
736
737 int_out = data_out.i ;
738 int_in = data_in.i ;
739 for (k = 0 ; k < items ; k++)
740 { int_out [k] = ((k * ((k % 2) ? 3333 : -3333)) << 8) ;
741 zero_count = int_out [k] ? zero_count : zero_count + 1 ;
742 } ;
743
744 if (zero_count > items / 4)
745 { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ;
746 exit (1) ;
747 } ;
748
749 sfinfo.samplerate = 44100 ;
750 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
751 sfinfo.channels = 1 ;
752 sfinfo.format = filetype ;
753
754 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
755
756 test_write_int_or_die (file, 0, int_out, items, __LINE__) ;
757
758 sf_close (file) ;
759
760 memset (int_in, 0, items * sizeof (int)) ;
761
762 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
763
764 if (sfinfo.format != filetype)
765 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
766 exit (1) ;
767 } ;
768
769 if (sfinfo.frames != items)
770 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
771 exit (1) ;
772 } ;
773
774 if (sfinfo.channels != 1)
775 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
776 exit (1) ;
777 } ;
778
779 check_log_buffer_or_die (file, __LINE__) ;
780
781 test_read_int_or_die (file, 0, int_in, items, __LINE__) ;
782
783 for (k = 0 ; k < items ; k++)
784 if (int_out [k] != int_in [k])
785 { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ;
786 exit (1) ;
787 } ;
788
789 sf_close (file) ;
790
791 /* Lite remove start */
792 /*--------------------------------------------------------------------------
793 ** Test sf_read/write_float ()
794 */
795 zero_count = 0 ;
796
797 float_out = data_out.f ;
798 float_in = data_in.f ;
799 for (k = 0 ; k < items ; k++)
800 { float_out [k] = (k * ((k % 2) ? 3333 : -3333)) ;
801 zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
802 } ;
803
804 if (zero_count > items / 4)
805 { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ;
806 exit (1) ;
807 } ;
808
809 sfinfo.samplerate = 44100 ;
810 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
811 sfinfo.channels = 1 ;
812 sfinfo.format = filetype ;
813
814 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
815
816 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
817
818 test_write_float_or_die (file, 0, float_out, items, __LINE__) ;
819
820 sf_close (file) ;
821
822 memset (float_in, 0, items * sizeof (float)) ;
823
824 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
825
826 if (sfinfo.format != filetype)
827 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
828 exit (1) ;
829 } ;
830
831 if (sfinfo.frames != items)
832 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
833 exit (1) ;
834 } ;
835
836 if (sfinfo.channels != 1)
837 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
838 exit (1) ;
839 } ;
840
841 check_log_buffer_or_die (file, __LINE__) ;
842
843 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
844
845 test_read_float_or_die (file, 0, float_in, items, __LINE__) ;
846
847 for (k = 0 ; k < items ; k++)
848 if (fabs (float_out [k] - float_in [k]) > 1e-10)
849 { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ;
850 exit (1) ;
851 } ;
852
853 sf_close (file) ;
854
855 /*--------------------------------------------------------------------------
856 ** Test sf_read/write_double ()
857 */
858 zero_count = 0 ;
859
860 double_out = data_out.d ;
861 double_in = data_in.d ;
862 for (k = 0 ; k < items ; k++)
863 { double_out [k] = (k * ((k % 2) ? 3333 : -3333)) ;
864 zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
865 } ;
866
867 if (zero_count > items / 4)
868 { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ;
869 exit (1) ;
870 } ;
871
872 sfinfo.samplerate = 44100 ;
873 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
874 sfinfo.channels = 1 ;
875 sfinfo.format = filetype ;
876
877 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
878
879 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
880
881 test_write_double_or_die (file, 0, double_out, items, __LINE__) ;
882
883 sf_close (file) ;
884
885 memset (double_in, 0, items * sizeof (double)) ;
886
887 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
888
889 if (sfinfo.format != filetype)
890 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
891 exit (1) ;
892 } ;
893
894 if (sfinfo.frames != items)
895 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
896 exit (1) ;
897 } ;
898
899 if (sfinfo.channels != 1)
900 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
901 exit (1) ;
902 } ;
903
904 check_log_buffer_or_die (file, __LINE__) ;
905
906 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
907
908 test_read_double_or_die (file, 0, double_in, items, __LINE__) ;
909
910 for (k = 0 ; k < items ; k++)
911 if (fabs (double_out [k] - double_in [k]) > 1e-10)
912 { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ;
913 exit (1) ;
914 } ;
915
916 sf_close (file) ;
917 /* Lite remove end */
918 unlink (filename) ;
919
920 puts ("ok") ;
921 } /* pcm_test_bits_24 */
922
923 static void
924 pcm_test_bits_32 (const char *filename, int filetype, uint64_t hash)
925 { SNDFILE *file ;
926 SF_INFO sfinfo ;
927 int k, items, zero_count ;
928 short *short_out, *short_in ;
929 int *int_out, *int_in ;
930 /* Lite remove start */
931 float *float_out, *float_in ;
932 double *double_out, *double_in ;
933 /* Lite remove end */
934
935 print_test_name ("pcm_test_bits_32", filename) ;
936
937 items = 1024 ;
938
939 short_out = data_out.s ;
940 short_in = data_in.s ;
941
942 zero_count = 0 ;
943 for (k = 0 ; k < items ; k++)
944 { short_out [k] = (k * ((k % 2) ? 3 : -3)) ;
945 zero_count = short_out [k] ? zero_count : zero_count + 1 ;
946 } ;
947
948 if (zero_count > items / 4)
949 { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ;
950 exit (1) ;
951 } ;
952
953 sfinfo.samplerate = 44100 ;
954 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
955 sfinfo.channels = 1 ;
956 sfinfo.format = filetype ;
957
958 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
959
960 test_write_short_or_die (file, 0, short_out, items, __LINE__) ;
961
962 sf_close (file) ;
963
964 memset (short_in, 0, items * sizeof (short)) ;
965
966 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
967
968 if (sfinfo.format != filetype)
969 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
970 exit (1) ;
971 } ;
972
973 if (sfinfo.frames != items)
974 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
975 exit (1) ;
976 } ;
977
978 if (sfinfo.channels != 1)
979 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
980 exit (1) ;
981 } ;
982
983 check_log_buffer_or_die (file, __LINE__) ;
984
985 test_read_short_or_die (file, 0, short_in, items, __LINE__) ;
986
987 for (k = 0 ; k < items ; k++)
988 if (short_out [k] != short_in [k])
989 { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ;
990 exit (1) ;
991 } ;
992
993 sf_close (file) ;
994
995 /* Finally, check the file hash. */
996 check_file_hash_or_die (filename, hash, __LINE__) ;
997
998 /*--------------------------------------------------------------------------
999 ** Test sf_read/write_int ()
1000 */
1001 zero_count = 0 ;
1002
1003 int_out = data_out.i ;
1004 int_in = data_in.i ;
1005 for (k = 0 ; k < items ; k++)
1006 { int_out [k] = (k * ((k % 2) ? 333333 : -333333)) ;
1007 zero_count = int_out [k] ? zero_count : zero_count + 1 ;
1008 } ;
1009
1010 if (zero_count > items / 4)
1011 { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ;
1012 exit (1) ;
1013 } ;
1014
1015 sfinfo.samplerate = 44100 ;
1016 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
1017 sfinfo.channels = 1 ;
1018 sfinfo.format = filetype ;
1019
1020 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
1021
1022 test_write_int_or_die (file, 0, int_out, items, __LINE__) ;
1023
1024 sf_close (file) ;
1025
1026 memset (int_in, 0, items * sizeof (int)) ;
1027
1028 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
1029
1030 if (sfinfo.format != filetype)
1031 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
1032 exit (1) ;
1033 } ;
1034
1035 if (sfinfo.frames != items)
1036 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
1037 exit (1) ;
1038 } ;
1039
1040 if (sfinfo.channels != 1)
1041 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
1042 exit (1) ;
1043 } ;
1044
1045 check_log_buffer_or_die (file, __LINE__) ;
1046
1047 test_read_int_or_die (file, 0, int_in, items, __LINE__) ;
1048
1049 for (k = 0 ; k < items ; k++)
1050 if (int_out [k] != int_in [k])
1051 { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ;
1052 exit (1) ;
1053 } ;
1054
1055 sf_close (file) ;
1056
1057 /* Lite remove start */
1058 /*--------------------------------------------------------------------------
1059 ** Test sf_read/write_float ()
1060 */
1061 zero_count = 0 ;
1062
1063 float_out = data_out.f ;
1064 float_in = data_in.f ;
1065 for (k = 0 ; k < items ; k++)
1066 { float_out [k] = (k * ((k % 2) ? 333333 : -333333)) ;
1067 zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
1068 } ;
1069
1070 if (zero_count > items / 4)
1071 { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ;
1072 exit (1) ;
1073 } ;
1074
1075 sfinfo.samplerate = 44100 ;
1076 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
1077 sfinfo.channels = 1 ;
1078 sfinfo.format = filetype ;
1079
1080 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
1081
1082 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
1083
1084 test_write_float_or_die (file, 0, float_out, items, __LINE__) ;
1085
1086 sf_close (file) ;
1087
1088 memset (float_in, 0, items * sizeof (float)) ;
1089
1090 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
1091
1092 if (sfinfo.format != filetype)
1093 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
1094 exit (1) ;
1095 } ;
1096
1097 if (sfinfo.frames != items)
1098 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
1099 exit (1) ;
1100 } ;
1101
1102 if (sfinfo.channels != 1)
1103 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
1104 exit (1) ;
1105 } ;
1106
1107 check_log_buffer_or_die (file, __LINE__) ;
1108
1109 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
1110
1111 test_read_float_or_die (file, 0, float_in, items, __LINE__) ;
1112
1113 for (k = 0 ; k < items ; k++)
1114 if (fabs (float_out [k] - float_in [k]) > 1e-10)
1115 { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ;
1116 exit (1) ;
1117 } ;
1118
1119 sf_close (file) ;
1120
1121 /*--------------------------------------------------------------------------
1122 ** Test sf_read/write_double ()
1123 */
1124 zero_count = 0 ;
1125
1126 double_out = data_out.d ;
1127 double_in = data_in.d ;
1128 for (k = 0 ; k < items ; k++)
1129 { double_out [k] = (k * ((k % 2) ? 333333 : -333333)) ;
1130 zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
1131 } ;
1132
1133 if (zero_count > items / 4)
1134 { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ;
1135 exit (1) ;
1136 } ;
1137
1138 sfinfo.samplerate = 44100 ;
1139 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
1140 sfinfo.channels = 1 ;
1141 sfinfo.format = filetype ;
1142
1143 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
1144
1145 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
1146
1147 test_write_double_or_die (file, 0, double_out, items, __LINE__) ;
1148
1149 sf_close (file) ;
1150
1151 memset (double_in, 0, items * sizeof (double)) ;
1152
1153 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
1154
1155 if (sfinfo.format != filetype)
1156 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
1157 exit (1) ;
1158 } ;
1159
1160 if (sfinfo.frames != items)
1161 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
1162 exit (1) ;
1163 } ;
1164
1165 if (sfinfo.channels != 1)
1166 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
1167 exit (1) ;
1168 } ;
1169
1170 check_log_buffer_or_die (file, __LINE__) ;
1171
1172 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
1173
1174 test_read_double_or_die (file, 0, double_in, items, __LINE__) ;
1175
1176 for (k = 0 ; k < items ; k++)
1177 if (fabs (double_out [k] - double_in [k]) > 1e-10)
1178 { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ;
1179 exit (1) ;
1180 } ;
1181
1182 sf_close (file) ;
1183 /* Lite remove end */
1184 unlink (filename) ;
1185
1186 puts ("ok") ;
1187 } /* pcm_test_bits_32 */
1188
1189
1190
1191 /*==============================================================================
1192 */
1193
1194 static void
1195 pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float)
1196 { SNDFILE *file ;
1197 SF_INFO sfinfo ;
1198 int k, items, frames ;
1199 int sign ;
1200 double *data, error ;
1201
1202 print_test_name (replace_float ? "pcm_test_float (replace)" : "pcm_test_float", filename) ;
1203
1204 items = BUFFER_SIZE ;
1205
1206 data = data_out.d ;
1207 for (sign = 1, k = 0 ; k < items ; k++)
1208 { data [k] = ((double) (k * sign)) / 100.0 ;
1209 sign = (sign > 0) ? -1 : 1 ;
1210 } ;
1211
1212 sfinfo.samplerate = 44100 ;
1213 sfinfo.frames = items ;
1214 sfinfo.channels = 1 ;
1215 sfinfo.format = filetype ;
1216
1217 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
1218 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
1219 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
1220 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
1221 dump_log_buffer (file) ;
1222 exit (1) ;
1223 } ;
1224
1225 test_write_double_or_die (file, 0, data, items, __LINE__) ;
1226
1227 sf_close (file) ;
1228
1229 check_file_hash_or_die (filename, hash, __LINE__) ;
1230
1231 memset (data, 0, items * sizeof (double)) ;
1232
1233 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
1234 memset (&sfinfo, 0, sizeof (sfinfo)) ;
1235
1236 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
1237 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
1238 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
1239 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
1240 dump_log_buffer (file) ;
1241 exit (1) ;
1242 } ;
1243
1244 if (sfinfo.format != filetype)
1245 { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ;
1246 exit (1) ;
1247 } ;
1248
1249 if (sfinfo.frames != items)
1250 { printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
1251 exit (1) ;
1252 } ;
1253
1254 if (sfinfo.channels != 1)
1255 { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ;
1256 exit (1) ;
1257 } ;
1258
1259 check_log_buffer_or_die (file, __LINE__) ;
1260
1261 test_read_double_or_die (file, 0, data, items, __LINE__) ;
1262
1263 for (sign = -1, k = 0 ; k < items ; k++)
1264 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1265 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1266 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1267 exit (1) ;
1268 } ;
1269 } ;
1270
1271 /* Seek to start of file. */
1272 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
1273
1274 test_read_double_or_die (file, 0, data, 4, __LINE__) ;
1275 for (k = 0 ; k < 4 ; k++)
1276 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1277 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1278 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1279 exit (1) ;
1280 } ;
1281 } ;
1282
1283 /* Seek to offset from start of file. */
1284 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
1285
1286 test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
1287 for (k = 10 ; k < 14 ; k++)
1288 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1289 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1290 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1291 exit (1) ;
1292 } ;
1293 } ;
1294
1295 /* Seek to offset from current position. */
1296 test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
1297
1298 test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ;
1299 for (k = 20 ; k < 24 ; k++)
1300 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1301 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1302 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1303 exit (1) ;
1304 } ;
1305 } ;
1306
1307 /* Seek to offset from end of file. */
1308 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
1309
1310 test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
1311 for (k = 10 ; k < 14 ; k++)
1312 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1313 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1314 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1315 exit (1) ;
1316 } ;
1317 } ;
1318
1319 sf_close (file) ;
1320
1321 /* Now test Stereo. */
1322
1323 if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */
1324 { printf ("ok\n") ;
1325 return ;
1326 } ;
1327
1328 items = BUFFER_SIZE ;
1329
1330 data = data_out.d ;
1331 for (sign = -1, k = 0 ; k < items ; k++)
1332 data [k] = ((double) k) / 100.0 * (sign *= -1) ;
1333
1334 sfinfo.samplerate = 44100 ;
1335 sfinfo.frames = items ;
1336 sfinfo.channels = 2 ;
1337 sfinfo.format = filetype ;
1338
1339 frames = items / sfinfo.channels ;
1340
1341 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
1342 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
1343 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
1344 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
1345 dump_log_buffer (file) ;
1346 exit (1) ;
1347 } ;
1348
1349 test_writef_double_or_die (file, 0, data, frames, __LINE__) ;
1350
1351 sf_close (file) ;
1352
1353 check_file_hash_or_die (filename, hash, __LINE__) ;
1354
1355 memset (data, 0, items * sizeof (double)) ;
1356
1357 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
1358 memset (&sfinfo, 0, sizeof (sfinfo)) ;
1359
1360 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
1361 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
1362 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
1363 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
1364 dump_log_buffer (file) ;
1365 exit (1) ;
1366 } ;
1367
1368 if (sfinfo.format != filetype)
1369 { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ;
1370 exit (1) ;
1371 } ;
1372
1373 if (sfinfo.frames != frames)
1374 { printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, frames, SF_COUNT_TO_LONG (sfinfo.frames)) ;
1375 exit (1) ;
1376 } ;
1377
1378 if (sfinfo.channels != 2)
1379 { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ;
1380 exit (1) ;
1381 } ;
1382
1383 check_log_buffer_or_die (file, __LINE__) ;
1384
1385 test_readf_double_or_die (file, 0, data, frames, __LINE__) ;
1386 for (sign = -1, k = 0 ; k < items ; k++)
1387 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1388 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1389 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1390 exit (1) ;
1391 } ;
1392 } ;
1393
1394 /* Seek to start of file. */
1395 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
1396
1397 test_readf_double_or_die (file, 0, data, 4, __LINE__) ;
1398 for (k = 0 ; k < 4 ; k++)
1399 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1400 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1401 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1402 exit (1) ;
1403 } ;
1404 } ;
1405
1406 /* Seek to offset from start of file. */
1407 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
1408
1409 test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ;
1410 for (k = 20 ; k < 24 ; k++)
1411 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1412 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1413 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1414 exit (1) ;
1415 } ;
1416 } ;
1417
1418 /* Seek to offset from current position. */
1419 test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
1420
1421 test_readf_double_or_die (file, 0, data + 40, 2, __LINE__) ;
1422 for (k = 40 ; k < 44 ; k++)
1423 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1424 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1425 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1426 exit (1) ;
1427 } ;
1428 } ;
1429
1430 /* Seek to offset from end of file. */
1431 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
1432
1433 test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ;
1434 for (k = 20 ; k < 24 ; k++)
1435 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1436 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1437 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1438 exit (1) ;
1439 } ;
1440 } ;
1441
1442 sf_close (file) ;
1443
1444 printf ("ok\n") ;
1445 unlink (filename) ;
1446 } /* pcm_test_float */
1447
1448 static void
1449 pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float)
1450 { SNDFILE *file ;
1451 SF_INFO sfinfo ;
1452 int k, items, frames ;
1453 int sign ;
1454 double *data, error ;
1455
1456 /* This is the best test routine. Other should be brought up to this standard. */
1457
1458 print_test_name (replace_float ? "pcm_test_double (replace)" : "pcm_test_double", filename) ;
1459
1460 items = BUFFER_SIZE ;
1461
1462 data = data_out.d ;
1463 for (sign = 1, k = 0 ; k < items ; k++)
1464 { data [k] = ((double) (k * sign)) / 100.0 ;
1465 sign = (sign > 0) ? -1 : 1 ;
1466 } ;
1467
1468 sfinfo.samplerate = 44100 ;
1469 sfinfo.frames = items ;
1470 sfinfo.channels = 1 ;
1471 sfinfo.format = filetype ;
1472
1473 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
1474 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
1475 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
1476 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
1477 dump_log_buffer (file) ;
1478 exit (1) ;
1479 } ;
1480
1481 test_write_double_or_die (file, 0, data, items, __LINE__) ;
1482
1483 sf_close (file) ;
1484
1485 #if (defined (WIN32) || defined (_WIN32))
1486 /* File hashing on Win32 fails due to slighty different
1487 ** calculated values of the sin() function.
1488 */
1489 hash = hash ; /* Avoid compiler warning. */
1490 #else
1491 check_file_hash_or_die (filename, hash, __LINE__) ;
1492 #endif
1493
1494 memset (data, 0, items * sizeof (double)) ;
1495
1496 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
1497 memset (&sfinfo, 0, sizeof (sfinfo)) ;
1498
1499 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
1500 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
1501 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
1502 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
1503 dump_log_buffer (file) ;
1504 exit (1) ;
1505 } ;
1506
1507 if (sfinfo.format != filetype)
1508 { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ;
1509 exit (1) ;
1510 } ;
1511
1512 if (sfinfo.frames != items)
1513 { printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
1514 exit (1) ;
1515 } ;
1516
1517 if (sfinfo.channels != 1)
1518 { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ;
1519 exit (1) ;
1520 } ;
1521
1522 check_log_buffer_or_die (file, __LINE__) ;
1523
1524 test_read_double_or_die (file, 0, data, items, __LINE__) ;
1525
1526 for (sign = -1, k = 0 ; k < items ; k++)
1527 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1528 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1529 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1530 exit (1) ;
1531 } ;
1532 } ;
1533
1534 /* Seek to start of file. */
1535 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
1536
1537 test_read_double_or_die (file, 0, data, 4, __LINE__) ;
1538 for (k = 0 ; k < 4 ; k++)
1539 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1540 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1541 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1542 exit (1) ;
1543 } ;
1544 } ;
1545
1546 /* Seek to offset from start of file. */
1547 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
1548
1549 test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
1550
1551 test_seek_or_die (file, 0, SEEK_CUR, 14, sfinfo.channels, __LINE__) ;
1552
1553 for (k = 10 ; k < 14 ; k++)
1554 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1555 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1556 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1557 exit (1) ;
1558 } ;
1559 } ;
1560
1561 /* Seek to offset from current position. */
1562 test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
1563
1564 test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ;
1565 for (k = 20 ; k < 24 ; k++)
1566 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1567 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1568 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1569 exit (1) ;
1570 } ;
1571 } ;
1572
1573 /* Seek to offset from end of file. */
1574 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
1575
1576 test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
1577 for (k = 10 ; k < 14 ; k++)
1578 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1579 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1580 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1581 exit (1) ;
1582 } ;
1583 } ;
1584
1585 sf_close (file) ;
1586
1587 /* Now test Stereo. */
1588
1589 if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */
1590 { printf ("ok\n") ;
1591 return ;
1592 } ;
1593
1594 items = BUFFER_SIZE ;
1595
1596 data = data_out.d ;
1597 for (sign = -1, k = 0 ; k < items ; k++)
1598 data [k] = ((double) k) / 100.0 * (sign *= -1) ;
1599
1600 sfinfo.samplerate = 44100 ;
1601 sfinfo.frames = items ;
1602 sfinfo.channels = 2 ;
1603 sfinfo.format = filetype ;
1604
1605 frames = items / sfinfo.channels ;
1606
1607 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
1608 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
1609 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
1610 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
1611 dump_log_buffer (file) ;
1612 exit (1) ;
1613 } ;
1614
1615 test_writef_double_or_die (file, 0, data, frames, __LINE__) ;
1616
1617 sf_close (file) ;
1618
1619 #if (defined (WIN32) || defined (_WIN32))
1620 /* File hashing on Win32 fails due to slighty different
1621 ** calculated values.
1622 */
1623 hash = hash ; /* Avoid compiler warning. */
1624 #else
1625 check_file_hash_or_die (filename, hash, __LINE__) ;
1626 #endif
1627
1628 memset (data, 0, items * sizeof (double)) ;
1629
1630 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
1631 memset (&sfinfo, 0, sizeof (sfinfo)) ;
1632
1633 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
1634 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
1635 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
1636 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
1637 dump_log_buffer (file) ;
1638 exit (1) ;
1639 } ;
1640
1641 if (sfinfo.format != filetype)
1642 { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ;
1643 exit (1) ;
1644 } ;
1645
1646 if (sfinfo.frames != frames)
1647 { printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %ld)\n", __FILE__, __LINE__, frames, SF_COUNT_TO_LONG (sfinfo.frames)) ;
1648 exit (1) ;
1649 } ;
1650
1651 if (sfinfo.channels != 2)
1652 { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ;
1653 exit (1) ;
1654 } ;
1655
1656 check_log_buffer_or_die (file, __LINE__) ;
1657
1658 test_readf_double_or_die (file, 0, data, frames, __LINE__) ;
1659
1660 for (sign = -1, k = 0 ; k < items ; k++)
1661 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1662 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1663 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1664 exit (1) ;
1665 } ;
1666 } ;
1667
1668 /* Seek to start of file. */
1669 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
1670
1671 test_read_double_or_die (file, 0, data, 4, __LINE__) ;
1672 for (k = 0 ; k < 4 ; k++)
1673 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1674 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1675 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1676 exit (1) ;
1677 } ;
1678 } ;
1679
1680 /* Seek to offset from start of file. */
1681 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
1682
1683 test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
1684 for (k = 20 ; k < 24 ; k++)
1685 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1686 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1687 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1688 exit (1) ;
1689 } ;
1690 } ;
1691
1692 /* Seek to offset from current position. */
1693 test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
1694
1695 test_readf_double_or_die (file, 0, data + 40, 4, __LINE__) ;
1696 for (k = 40 ; k < 44 ; k++)
1697 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1698 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1699 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1700 exit (1) ;
1701 } ;
1702 } ;
1703
1704 /* Seek to offset from end of file. */
1705 test_seek_or_die (file, -1 * (sfinfo.frames -10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
1706
1707 test_readf_double_or_die (file, 0, data + 20, 4, __LINE__) ;
1708 for (k = 20 ; k < 24 ; k++)
1709 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
1710 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
1711 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
1712 exit (1) ;
1713 } ;
1714 } ;
1715
1716 sf_close (file) ;
1717
1718 printf ("ok\n") ;
1719 unlink (filename) ;
1720 } /* pcm_test_double */
1721
1722 /*==============================================================================
1723 */