Mercurial > hg > sv-dependency-builds
comparison src/libsndfile-1.0.25/tests/pcm_test.c @ 0:c7265573341e
Import initial set of sources
author | Chris Cannam |
---|---|
date | Mon, 18 Mar 2013 14:12:14 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:c7265573341e |
---|---|
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 */ |