cannam@125
|
1 /*
|
cannam@125
|
2 ** Copyright (C) 2001-2016 Erik de Castro Lopo <erikd@mega-nerd.com>
|
cannam@125
|
3 **
|
cannam@125
|
4 ** This program is free software ; you can redistribute it and/or modify
|
cannam@125
|
5 ** it under the terms of the GNU General Public License as published by
|
cannam@125
|
6 ** the Free Software Foundation ; either version 2 of the License, or
|
cannam@125
|
7 ** (at your option) any later version.
|
cannam@125
|
8 **
|
cannam@125
|
9 ** This program is distributed in the hope that it will be useful,
|
cannam@125
|
10 ** but WITHOUT ANY WARRANTY ; without even the implied warranty of
|
cannam@125
|
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
cannam@125
|
12 ** GNU General Public License for more details.
|
cannam@125
|
13 **
|
cannam@125
|
14 ** You should have received a copy of the GNU General Public License
|
cannam@125
|
15 ** along with this program ; if not, write to the Free Software
|
cannam@125
|
16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
cannam@125
|
17 */
|
cannam@125
|
18
|
cannam@125
|
19 #include "sfconfig.h"
|
cannam@125
|
20
|
cannam@125
|
21 #include <stdio.h>
|
cannam@125
|
22 #include <stdlib.h>
|
cannam@125
|
23 #include <string.h>
|
cannam@125
|
24 #include <errno.h>
|
cannam@125
|
25 #include <inttypes.h>
|
cannam@125
|
26
|
cannam@125
|
27 #include <sys/stat.h>
|
cannam@125
|
28 #include <math.h>
|
cannam@125
|
29
|
cannam@125
|
30 #if HAVE_UNISTD_H
|
cannam@125
|
31 #include <unistd.h>
|
cannam@125
|
32 #endif
|
cannam@125
|
33
|
cannam@125
|
34 #if (HAVE_DECL_S_IRGRP == 0)
|
cannam@125
|
35 #include <sf_unistd.h>
|
cannam@125
|
36 #endif
|
cannam@125
|
37
|
cannam@125
|
38 #if (defined (WIN32) || defined (_WIN32))
|
cannam@125
|
39 #include <io.h>
|
cannam@125
|
40 #include <direct.h>
|
cannam@125
|
41 #endif
|
cannam@125
|
42
|
cannam@125
|
43 #include <sndfile.h>
|
cannam@125
|
44
|
cannam@125
|
45 #include "utils.h"
|
cannam@125
|
46
|
cannam@125
|
47 #define BUFFER_LEN (1 << 10)
|
cannam@125
|
48 #define LOG_BUFFER_SIZE 1024
|
cannam@125
|
49
|
cannam@125
|
50 static void zero_data_test (const char *filename, int format) ;
|
cannam@125
|
51 static void filesystem_full_test (int format) ;
|
cannam@125
|
52 static void permission_test (const char *filename, int typemajor) ;
|
cannam@125
|
53 static void wavex_amb_test (const char *filename) ;
|
cannam@125
|
54 static void rf64_downgrade_test (const char *filename) ;
|
cannam@125
|
55
|
cannam@125
|
56 int
|
cannam@125
|
57 main (int argc, char *argv [])
|
cannam@125
|
58 { int do_all = 0 ;
|
cannam@125
|
59 int test_count = 0 ;
|
cannam@125
|
60
|
cannam@125
|
61 if (argc != 2)
|
cannam@125
|
62 { printf ("Usage : %s <test>\n", argv [0]) ;
|
cannam@125
|
63 printf (" Where <test> is one of the following:\n") ;
|
cannam@125
|
64 printf (" wav - test WAV file peak chunk\n") ;
|
cannam@125
|
65 printf (" aiff - test AIFF file PEAK chunk\n") ;
|
cannam@125
|
66 printf (" all - perform all tests\n") ;
|
cannam@125
|
67 exit (1) ;
|
cannam@125
|
68 } ;
|
cannam@125
|
69
|
cannam@125
|
70 do_all = ! strcmp (argv [1], "all") ;
|
cannam@125
|
71
|
cannam@125
|
72 if (do_all || ! strcmp (argv [1], "wav"))
|
cannam@125
|
73 { zero_data_test ("zerolen.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
|
cannam@125
|
74 filesystem_full_test (SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
|
cannam@125
|
75 permission_test ("readonly.wav", SF_FORMAT_WAV) ;
|
cannam@125
|
76 wavex_amb_test ("ambisonic.wav") ;
|
cannam@125
|
77 test_count++ ;
|
cannam@125
|
78 } ;
|
cannam@125
|
79
|
cannam@125
|
80 if (do_all || ! strcmp (argv [1], "aiff"))
|
cannam@125
|
81 { zero_data_test ("zerolen.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ;
|
cannam@125
|
82 filesystem_full_test (SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ;
|
cannam@125
|
83 permission_test ("readonly.aiff", SF_FORMAT_AIFF) ;
|
cannam@125
|
84 test_count++ ;
|
cannam@125
|
85 } ;
|
cannam@125
|
86
|
cannam@125
|
87 if (do_all || ! strcmp (argv [1], "au"))
|
cannam@125
|
88 { zero_data_test ("zerolen.au", SF_FORMAT_AU | SF_FORMAT_PCM_16) ;
|
cannam@125
|
89 filesystem_full_test (SF_FORMAT_AU | SF_FORMAT_PCM_16) ;
|
cannam@125
|
90 permission_test ("readonly.au", SF_FORMAT_AU) ;
|
cannam@125
|
91 test_count++ ;
|
cannam@125
|
92 } ;
|
cannam@125
|
93
|
cannam@125
|
94 if (do_all || ! strcmp (argv [1], "caf"))
|
cannam@125
|
95 { zero_data_test ("zerolen.caf", SF_FORMAT_CAF | SF_FORMAT_PCM_16) ;
|
cannam@125
|
96 filesystem_full_test (SF_FORMAT_CAF | SF_FORMAT_PCM_16) ;
|
cannam@125
|
97 permission_test ("readonly.caf", SF_FORMAT_CAF) ;
|
cannam@125
|
98 test_count++ ;
|
cannam@125
|
99 } ;
|
cannam@125
|
100
|
cannam@125
|
101 if (do_all || ! strcmp (argv [1], "svx"))
|
cannam@125
|
102 { zero_data_test ("zerolen.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16) ;
|
cannam@125
|
103 filesystem_full_test (SF_FORMAT_SVX | SF_FORMAT_PCM_16) ;
|
cannam@125
|
104 permission_test ("readonly.svx", SF_FORMAT_SVX) ;
|
cannam@125
|
105 test_count++ ;
|
cannam@125
|
106 } ;
|
cannam@125
|
107
|
cannam@125
|
108 if (do_all || ! strcmp (argv [1], "nist"))
|
cannam@125
|
109 { zero_data_test ("zerolen.nist", SF_FORMAT_NIST | SF_FORMAT_PCM_16) ;
|
cannam@125
|
110 filesystem_full_test (SF_FORMAT_NIST | SF_FORMAT_PCM_16) ;
|
cannam@125
|
111 permission_test ("readonly.nist", SF_FORMAT_NIST) ;
|
cannam@125
|
112 test_count++ ;
|
cannam@125
|
113 } ;
|
cannam@125
|
114
|
cannam@125
|
115 if (do_all || ! strcmp (argv [1], "paf"))
|
cannam@125
|
116 { zero_data_test ("zerolen.paf", SF_FORMAT_PAF | SF_FORMAT_PCM_16) ;
|
cannam@125
|
117 filesystem_full_test (SF_FORMAT_PAF | SF_FORMAT_PCM_16) ;
|
cannam@125
|
118 permission_test ("readonly.paf", SF_FORMAT_PAF) ;
|
cannam@125
|
119 test_count++ ;
|
cannam@125
|
120 } ;
|
cannam@125
|
121
|
cannam@125
|
122 if (do_all || ! strcmp (argv [1], "ircam"))
|
cannam@125
|
123 { zero_data_test ("zerolen.ircam", SF_FORMAT_IRCAM | SF_FORMAT_PCM_16) ;
|
cannam@125
|
124 filesystem_full_test (SF_FORMAT_IRCAM | SF_FORMAT_PCM_16) ;
|
cannam@125
|
125 permission_test ("readonly.ircam", SF_FORMAT_IRCAM) ;
|
cannam@125
|
126 test_count++ ;
|
cannam@125
|
127 } ;
|
cannam@125
|
128
|
cannam@125
|
129 if (do_all || ! strcmp (argv [1], "voc"))
|
cannam@125
|
130 { zero_data_test ("zerolen.voc", SF_FORMAT_VOC | SF_FORMAT_PCM_16) ;
|
cannam@125
|
131 filesystem_full_test (SF_FORMAT_VOC | SF_FORMAT_PCM_16) ;
|
cannam@125
|
132 permission_test ("readonly.voc", SF_FORMAT_VOC) ;
|
cannam@125
|
133 test_count++ ;
|
cannam@125
|
134 } ;
|
cannam@125
|
135
|
cannam@125
|
136 if (do_all || ! strcmp (argv [1], "w64"))
|
cannam@125
|
137 { zero_data_test ("zerolen.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ;
|
cannam@125
|
138 filesystem_full_test (SF_FORMAT_W64 | SF_FORMAT_PCM_16) ;
|
cannam@125
|
139 permission_test ("readonly.w64", SF_FORMAT_W64) ;
|
cannam@125
|
140 test_count++ ;
|
cannam@125
|
141 } ;
|
cannam@125
|
142
|
cannam@125
|
143 if (do_all || ! strcmp (argv [1], "rf64"))
|
cannam@125
|
144 { zero_data_test ("zerolen.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
|
cannam@125
|
145 filesystem_full_test (SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
|
cannam@125
|
146 permission_test ("readonly.rf64", SF_FORMAT_RF64) ;
|
cannam@125
|
147 rf64_downgrade_test ("downgrade.wav") ;
|
cannam@125
|
148 test_count++ ;
|
cannam@125
|
149 } ;
|
cannam@125
|
150
|
cannam@125
|
151 if (do_all || ! strcmp (argv [1], "mat4"))
|
cannam@125
|
152 { zero_data_test ("zerolen.mat4", SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ;
|
cannam@125
|
153 filesystem_full_test (SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ;
|
cannam@125
|
154 permission_test ("readonly.mat4", SF_FORMAT_MAT4) ;
|
cannam@125
|
155 test_count++ ;
|
cannam@125
|
156 } ;
|
cannam@125
|
157
|
cannam@125
|
158 if (do_all || ! strcmp (argv [1], "mat5"))
|
cannam@125
|
159 { zero_data_test ("zerolen.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ;
|
cannam@125
|
160 filesystem_full_test (SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ;
|
cannam@125
|
161 permission_test ("readonly.mat5", SF_FORMAT_MAT5) ;
|
cannam@125
|
162 test_count++ ;
|
cannam@125
|
163 } ;
|
cannam@125
|
164
|
cannam@125
|
165 if (do_all || ! strcmp (argv [1], "pvf"))
|
cannam@125
|
166 { zero_data_test ("zerolen.pvf", SF_FORMAT_PVF | SF_FORMAT_PCM_16) ;
|
cannam@125
|
167 filesystem_full_test (SF_FORMAT_PVF | SF_FORMAT_PCM_16) ;
|
cannam@125
|
168 permission_test ("readonly.pvf", SF_FORMAT_PVF) ;
|
cannam@125
|
169 test_count++ ;
|
cannam@125
|
170 } ;
|
cannam@125
|
171
|
cannam@125
|
172 if (do_all || ! strcmp (argv [1], "htk"))
|
cannam@125
|
173 { zero_data_test ("zerolen.htk", SF_FORMAT_HTK | SF_FORMAT_PCM_16) ;
|
cannam@125
|
174 filesystem_full_test (SF_FORMAT_HTK | SF_FORMAT_PCM_16) ;
|
cannam@125
|
175 permission_test ("readonly.htk", SF_FORMAT_HTK) ;
|
cannam@125
|
176 test_count++ ;
|
cannam@125
|
177 } ;
|
cannam@125
|
178
|
cannam@125
|
179 if (do_all || ! strcmp (argv [1], "avr"))
|
cannam@125
|
180 { zero_data_test ("zerolen.avr", SF_FORMAT_AVR | SF_FORMAT_PCM_16) ;
|
cannam@125
|
181 filesystem_full_test (SF_FORMAT_AVR | SF_FORMAT_PCM_16) ;
|
cannam@125
|
182 permission_test ("readonly.avr", SF_FORMAT_AVR) ;
|
cannam@125
|
183 test_count++ ;
|
cannam@125
|
184 } ;
|
cannam@125
|
185
|
cannam@125
|
186 if (do_all || ! strcmp (argv [1], "sds"))
|
cannam@125
|
187 { zero_data_test ("zerolen.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_16) ;
|
cannam@125
|
188 filesystem_full_test (SF_FORMAT_SDS | SF_FORMAT_PCM_16) ;
|
cannam@125
|
189 permission_test ("readonly.sds", SF_FORMAT_SDS) ;
|
cannam@125
|
190 test_count++ ;
|
cannam@125
|
191 } ;
|
cannam@125
|
192
|
cannam@125
|
193 if (do_all || ! strcmp (argv [1], "mpc2k"))
|
cannam@125
|
194 { zero_data_test ("zerolen.mpc", SF_FORMAT_MPC2K | SF_FORMAT_PCM_16) ;
|
cannam@125
|
195 filesystem_full_test (SF_FORMAT_MPC2K | SF_FORMAT_PCM_16) ;
|
cannam@125
|
196 permission_test ("readonly.mpc", SF_FORMAT_MPC2K) ;
|
cannam@125
|
197 test_count++ ;
|
cannam@125
|
198 } ;
|
cannam@125
|
199
|
cannam@125
|
200 if (do_all || ! strcmp (argv [1], "ogg"))
|
cannam@125
|
201 { zero_data_test ("zerolen.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS) ;
|
cannam@125
|
202 /*-filesystem_full_test (SF_FORMAT_OGG | SF_FORMAT_VORBIS) ;-*/
|
cannam@125
|
203 permission_test ("readonly.oga", SF_FORMAT_OGG) ;
|
cannam@125
|
204 test_count++ ;
|
cannam@125
|
205 } ;
|
cannam@125
|
206
|
cannam@125
|
207 if (test_count == 0)
|
cannam@125
|
208 { printf ("Mono : ************************************\n") ;
|
cannam@125
|
209 printf ("Mono : * No '%s' test defined.\n", argv [1]) ;
|
cannam@125
|
210 printf ("Mono : ************************************\n") ;
|
cannam@125
|
211 return 1 ;
|
cannam@125
|
212 } ;
|
cannam@125
|
213
|
cannam@125
|
214 return 0 ;
|
cannam@125
|
215 } /* main */
|
cannam@125
|
216
|
cannam@125
|
217
|
cannam@125
|
218 /*============================================================================================
|
cannam@125
|
219 ** Here are the test functions.
|
cannam@125
|
220 */
|
cannam@125
|
221
|
cannam@125
|
222 static void
|
cannam@125
|
223 zero_data_test (const char *filename, int format)
|
cannam@125
|
224 { SNDFILE *file ;
|
cannam@125
|
225 SF_INFO sfinfo ;
|
cannam@125
|
226
|
cannam@125
|
227 switch (format & SF_FORMAT_TYPEMASK)
|
cannam@125
|
228 { case SF_FORMAT_OGG :
|
cannam@125
|
229 if (HAVE_EXTERNAL_XIPH_LIBS == 0)
|
cannam@125
|
230 return ;
|
cannam@125
|
231 break ;
|
cannam@125
|
232 default :
|
cannam@125
|
233 break ;
|
cannam@125
|
234 } ;
|
cannam@125
|
235
|
cannam@125
|
236 print_test_name ("zero_data_test", filename) ;
|
cannam@125
|
237
|
cannam@125
|
238 sfinfo.samplerate = 44100 ;
|
cannam@125
|
239 sfinfo.format = format ;
|
cannam@125
|
240 sfinfo.channels = 1 ;
|
cannam@125
|
241 sfinfo.frames = 0 ;
|
cannam@125
|
242
|
cannam@125
|
243 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
|
cannam@125
|
244
|
cannam@125
|
245 sf_close (file) ;
|
cannam@125
|
246
|
cannam@125
|
247 memset (&sfinfo, 0, sizeof (sfinfo)) ;
|
cannam@125
|
248
|
cannam@125
|
249 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
|
cannam@125
|
250
|
cannam@125
|
251 sf_close (file) ;
|
cannam@125
|
252
|
cannam@125
|
253 unlink (filename) ;
|
cannam@125
|
254 puts ("ok") ;
|
cannam@125
|
255 } /* zero_data_test */
|
cannam@125
|
256
|
cannam@125
|
257 static void
|
cannam@125
|
258 filesystem_full_test (int format)
|
cannam@125
|
259 { SNDFILE *file ;
|
cannam@125
|
260 SF_INFO sfinfo ;
|
cannam@125
|
261 struct stat buf ;
|
cannam@125
|
262
|
cannam@125
|
263 const char *filename = "/dev/full", *errorstr ;
|
cannam@125
|
264
|
cannam@125
|
265 #if (defined (WIN32) || defined (_WIN32))
|
cannam@125
|
266 /* Can't run this test on Win32 so return. */
|
cannam@125
|
267 return ;
|
cannam@125
|
268 #endif
|
cannam@125
|
269
|
cannam@125
|
270 /* Make sure errno is zero before doing anything else. */
|
cannam@125
|
271 errno = 0 ;
|
cannam@125
|
272
|
cannam@125
|
273 print_test_name ("filesystem_full_test", filename) ;
|
cannam@125
|
274
|
cannam@125
|
275 if (stat (filename, &buf) != 0)
|
cannam@125
|
276 { puts ("/dev/full missing") ;
|
cannam@125
|
277 return ;
|
cannam@125
|
278 } ;
|
cannam@125
|
279
|
cannam@125
|
280 if (S_ISCHR (buf.st_mode) == 0 && S_ISBLK (buf.st_mode) == 0)
|
cannam@125
|
281 { puts ("/dev/full is not a device file") ;
|
cannam@125
|
282 return ;
|
cannam@125
|
283 } ;
|
cannam@125
|
284
|
cannam@125
|
285 sfinfo.samplerate = 44100 ;
|
cannam@125
|
286 sfinfo.format = format ;
|
cannam@125
|
287 sfinfo.channels = 1 ;
|
cannam@125
|
288 sfinfo.frames = 0 ;
|
cannam@125
|
289
|
cannam@125
|
290 if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) != NULL)
|
cannam@125
|
291 { printf ("\n\nLine %d : Error, file should not have openned.\n", __LINE__ - 1) ;
|
cannam@125
|
292 exit (1) ;
|
cannam@125
|
293 } ;
|
cannam@125
|
294
|
cannam@125
|
295 errorstr = sf_strerror (file) ;
|
cannam@125
|
296
|
cannam@125
|
297 if (strstr (errorstr, " space ") == NULL || strstr (errorstr, "device") == NULL)
|
cannam@125
|
298 { printf ("\n\nLine %d : Error bad error string : %s.\n", __LINE__ - 1, errorstr) ;
|
cannam@125
|
299 exit (1) ;
|
cannam@125
|
300 } ;
|
cannam@125
|
301
|
cannam@125
|
302 puts ("ok") ;
|
cannam@125
|
303 } /* filesystem_full_test */
|
cannam@125
|
304
|
cannam@125
|
305 static void
|
cannam@125
|
306 permission_test (const char *filename, int typemajor)
|
cannam@125
|
307 {
|
cannam@125
|
308 #if (OS_IS_WIN32)
|
cannam@125
|
309 /* Avoid compiler warnings. */
|
cannam@125
|
310 filename = filename ;
|
cannam@125
|
311 typemajor = typemajor ;
|
cannam@125
|
312
|
cannam@125
|
313 /* Can't run this test on Win32 so return. */
|
cannam@125
|
314 return ;
|
cannam@125
|
315 #else
|
cannam@125
|
316
|
cannam@125
|
317 FILE *textfile ;
|
cannam@125
|
318 SNDFILE *file ;
|
cannam@125
|
319 SF_INFO sfinfo ;
|
cannam@125
|
320 const char *errorstr ;
|
cannam@125
|
321
|
cannam@125
|
322 /* Make sure errno is zero before doing anything else. */
|
cannam@125
|
323 errno = 0 ;
|
cannam@125
|
324
|
cannam@125
|
325 if (getuid () == 0)
|
cannam@125
|
326 { /* If running as root bypass this test.
|
cannam@125
|
327 ** Root is allowed to open a readonly file for write.
|
cannam@125
|
328 */
|
cannam@125
|
329 return ;
|
cannam@125
|
330 } ;
|
cannam@125
|
331
|
cannam@125
|
332 print_test_name ("permission_test", filename) ;
|
cannam@125
|
333
|
cannam@125
|
334 if (access (filename, F_OK) == 0)
|
cannam@125
|
335 { chmod (filename, S_IWUSR) ;
|
cannam@125
|
336 unlink (filename) ;
|
cannam@125
|
337 } ;
|
cannam@125
|
338
|
cannam@125
|
339 if ((textfile = fopen (filename, "w")) == NULL)
|
cannam@125
|
340 { printf ("\n\nLine %d : not able to open text file for write.\n", __LINE__) ;
|
cannam@125
|
341 exit (1) ;
|
cannam@125
|
342 } ;
|
cannam@125
|
343
|
cannam@125
|
344 fprintf (textfile, "This is a read only file.\n") ;
|
cannam@125
|
345 fclose (textfile) ;
|
cannam@125
|
346
|
cannam@125
|
347 if (chmod (filename, S_IRUSR | S_IRGRP))
|
cannam@125
|
348 { printf ("\n\nLine %d : chmod failed", __LINE__) ;
|
cannam@125
|
349 fflush (stdout) ;
|
cannam@125
|
350 perror ("") ;
|
cannam@125
|
351 exit (1) ;
|
cannam@125
|
352 } ;
|
cannam@125
|
353
|
cannam@125
|
354 sfinfo.samplerate = 44100 ;
|
cannam@125
|
355 sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ;
|
cannam@125
|
356 sfinfo.channels = 1 ;
|
cannam@125
|
357 sfinfo.frames = 0 ;
|
cannam@125
|
358
|
cannam@125
|
359 if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) != NULL)
|
cannam@125
|
360 { printf ("\n\nLine %d : Error, file should not have opened.\n", __LINE__ - 1) ;
|
cannam@125
|
361 exit (1) ;
|
cannam@125
|
362 } ;
|
cannam@125
|
363
|
cannam@125
|
364 errorstr = sf_strerror (file) ;
|
cannam@125
|
365
|
cannam@125
|
366 if (strstr (errorstr, "ermission denied") == NULL)
|
cannam@125
|
367 { printf ("\n\nLine %d : Error bad error string : %s.\n", __LINE__ - 1, errorstr) ;
|
cannam@125
|
368 exit (1) ;
|
cannam@125
|
369 } ;
|
cannam@125
|
370
|
cannam@125
|
371 if (chmod (filename, S_IWUSR | S_IWGRP))
|
cannam@125
|
372 { printf ("\n\nLine %d : chmod failed", __LINE__) ;
|
cannam@125
|
373 fflush (stdout) ;
|
cannam@125
|
374 perror ("") ;
|
cannam@125
|
375 exit (1) ;
|
cannam@125
|
376 } ;
|
cannam@125
|
377
|
cannam@125
|
378 unlink (filename) ;
|
cannam@125
|
379
|
cannam@125
|
380 puts ("ok") ;
|
cannam@125
|
381
|
cannam@125
|
382 #endif
|
cannam@125
|
383 } /* permission_test */
|
cannam@125
|
384
|
cannam@125
|
385 static void
|
cannam@125
|
386 wavex_amb_test (const char *filename)
|
cannam@125
|
387 { static short buffer [800] ;
|
cannam@125
|
388 SNDFILE *file ;
|
cannam@125
|
389 SF_INFO sfinfo ;
|
cannam@125
|
390 sf_count_t frames ;
|
cannam@125
|
391
|
cannam@125
|
392 print_test_name (__func__, filename) ;
|
cannam@125
|
393
|
cannam@125
|
394 sfinfo.samplerate = 44100 ;
|
cannam@125
|
395 sfinfo.format = SF_FORMAT_WAVEX | SF_FORMAT_PCM_16 ;
|
cannam@125
|
396 sfinfo.channels = 4 ;
|
cannam@125
|
397
|
cannam@125
|
398 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
|
cannam@125
|
399
|
cannam@125
|
400 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
|
cannam@125
|
401 sf_command (file, SFC_WAVEX_SET_AMBISONIC, NULL, SF_AMBISONIC_B_FORMAT) ;
|
cannam@125
|
402 test_writef_short_or_die (file, 0, buffer, frames, __LINE__) ;
|
cannam@125
|
403 sf_close (file) ;
|
cannam@125
|
404
|
cannam@125
|
405 memset (&sfinfo, 0, sizeof (sfinfo)) ;
|
cannam@125
|
406
|
cannam@125
|
407 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
|
cannam@125
|
408
|
cannam@125
|
409 exit_if_true (
|
cannam@125
|
410 sf_command (file, SFC_WAVEX_GET_AMBISONIC, NULL, 0) != SF_AMBISONIC_B_FORMAT,
|
cannam@125
|
411 "\n\nLine %d : Error, this file should be in Ambisonic B format.\n", __LINE__
|
cannam@125
|
412 ) ;
|
cannam@125
|
413
|
cannam@125
|
414 sf_close (file) ;
|
cannam@125
|
415
|
cannam@125
|
416 unlink (filename) ;
|
cannam@125
|
417 puts ("ok") ;
|
cannam@125
|
418 } /* wavex_amb_test */
|
cannam@125
|
419
|
cannam@125
|
420 static void
|
cannam@125
|
421 rf64_downgrade_test (const char *filename)
|
cannam@125
|
422 { static short output [BUFFER_LEN] ;
|
cannam@125
|
423 static short input [BUFFER_LEN] ;
|
cannam@125
|
424
|
cannam@125
|
425 SNDFILE *file ;
|
cannam@125
|
426 SF_INFO sfinfo ;
|
cannam@125
|
427 unsigned k ;
|
cannam@125
|
428
|
cannam@125
|
429 print_test_name (__func__, filename) ;
|
cannam@125
|
430
|
cannam@125
|
431 sf_info_clear (&sfinfo) ;
|
cannam@125
|
432
|
cannam@125
|
433 sfinfo.samplerate = 44100 ;
|
cannam@125
|
434 sfinfo.frames = ARRAY_LEN (output) ;
|
cannam@125
|
435 sfinfo.channels = 1 ;
|
cannam@125
|
436 sfinfo.format = SF_FORMAT_RF64 | SF_FORMAT_PCM_16 ;
|
cannam@125
|
437
|
cannam@125
|
438 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
|
cannam@125
|
439
|
cannam@125
|
440 exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_FALSE) != SF_FALSE, "\n\nLine %d: sf_command failed.\n", __LINE__) ;
|
cannam@125
|
441 exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_TRUE) != SF_TRUE, "\n\nLine %d: sf_command failed.\n", __LINE__) ;
|
cannam@125
|
442
|
cannam@125
|
443 test_write_short_or_die (file, 0, output, ARRAY_LEN (output), __LINE__) ;
|
cannam@125
|
444
|
cannam@125
|
445 exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_FALSE) != SF_TRUE, "\n\nLine %d: sf_command failed.\n", __LINE__) ;
|
cannam@125
|
446 exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_TRUE) != SF_TRUE, "\n\nLine %d: sf_command failed.\n", __LINE__) ;
|
cannam@125
|
447
|
cannam@125
|
448 sf_close (file) ;
|
cannam@125
|
449
|
cannam@125
|
450 memset (input, 0, sizeof (input)) ;
|
cannam@125
|
451 sf_info_clear (&sfinfo) ;
|
cannam@125
|
452
|
cannam@125
|
453 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
|
cannam@125
|
454
|
cannam@125
|
455 exit_if_true (sfinfo.format != (SF_FORMAT_WAVEX | SF_FORMAT_PCM_16), "\n\nLine %d: RF64 to WAV downgrade failed.\n", __LINE__) ;
|
cannam@125
|
456 exit_if_true (sfinfo.frames != ARRAY_LEN (output), "\n\nLine %d: Incorrect number of frames in file (too short). (%d should be %d)\n", __LINE__, (int) sfinfo.frames, (int) ARRAY_LEN (output)) ;
|
cannam@125
|
457 exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
|
cannam@125
|
458
|
cannam@125
|
459 check_log_buffer_or_die (file, __LINE__) ;
|
cannam@125
|
460
|
cannam@125
|
461 test_read_short_or_die (file, 0, input, ARRAY_LEN (input), __LINE__) ;
|
cannam@125
|
462
|
cannam@125
|
463 sf_close (file) ;
|
cannam@125
|
464
|
cannam@125
|
465 for (k = 0 ; k < ARRAY_LEN (input) ; k++)
|
cannam@125
|
466 exit_if_true (input [k] != output [k],
|
cannam@125
|
467 "\n\nLine: %d: Error on input %d, expected %d, got %d\n", __LINE__, k, output [k], input [k]) ;
|
cannam@125
|
468
|
cannam@125
|
469 puts ("ok") ;
|
cannam@125
|
470 unlink (filename) ;
|
cannam@125
|
471
|
cannam@125
|
472 return ;
|
cannam@125
|
473 } /* rf64_downgrade_test */
|