annotate src/libsndfile-1.0.27/tests/misc_test.c @ 83:ae30d91d2ffe

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