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