annotate src/libsndfile-1.0.27/tests/utils.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) 2002-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 /*
Chris@40 20 ** Utility functions to make writing the test suite easier.
Chris@40 21 **
Chris@40 22 ** The .c and .h files were generated automagically with Autogen from
Chris@40 23 ** the files utils.def and utils.tpl.
Chris@40 24 */
Chris@40 25
Chris@40 26
Chris@40 27
Chris@40 28 #include "sfconfig.h"
Chris@40 29
Chris@40 30 #include <stdio.h>
Chris@40 31 #include <stdlib.h>
Chris@40 32 #include <inttypes.h>
Chris@40 33
Chris@40 34 #if HAVE_UNISTD_H
Chris@40 35 #include <unistd.h>
Chris@40 36 #endif
Chris@40 37
Chris@40 38 #if (HAVE_DECL_S_IRGRP == 0)
Chris@40 39 #include <sf_unistd.h>
Chris@40 40 #endif
Chris@40 41
Chris@40 42 #include <errno.h>
Chris@40 43 #include <string.h>
Chris@40 44 #include <ctype.h>
Chris@40 45 #include <math.h>
Chris@40 46 #include <fcntl.h>
Chris@40 47 #include <sys/stat.h>
Chris@40 48
Chris@40 49 #include <sndfile.h>
Chris@40 50
Chris@40 51 #include "utils.h"
Chris@40 52
Chris@40 53 #ifndef M_PI
Chris@40 54 #define M_PI 3.14159265358979323846264338
Chris@40 55 #endif
Chris@40 56
Chris@40 57 #define LOG_BUFFER_SIZE 2048
Chris@40 58
Chris@40 59 /*
Chris@40 60 ** Neat solution to the Win32/OS2 binary file flage requirement.
Chris@40 61 ** If O_BINARY isn't already defined by the inclusion of the system
Chris@40 62 ** headers, set it to zero.
Chris@40 63 */
Chris@40 64 #ifndef O_BINARY
Chris@40 65 #define O_BINARY 0
Chris@40 66 #endif
Chris@40 67
Chris@40 68
Chris@40 69 void
Chris@40 70 gen_windowed_sine_float (float *data, int len, double maximum)
Chris@40 71 { int k ;
Chris@40 72
Chris@40 73 memset (data, 0, len * sizeof (float)) ;
Chris@40 74
Chris@40 75 len = (5 * len) / 6 ;
Chris@40 76
Chris@40 77 for (k = 0 ; k < len ; k++)
Chris@40 78 { data [k] = sin (2.0 * k * M_PI * 1.0 / 32.0 + 0.4) ;
Chris@40 79
Chris@40 80 /* Apply Hanning Window. */
Chris@40 81 data [k] *= maximum * (0.5 - 0.5 * cos (2.0 * M_PI * k / ((len) - 1))) ;
Chris@40 82 }
Chris@40 83
Chris@40 84 return ;
Chris@40 85 } /* gen_windowed_sine_float */
Chris@40 86
Chris@40 87 void
Chris@40 88 gen_windowed_sine_double (double *data, int len, double maximum)
Chris@40 89 { int k ;
Chris@40 90
Chris@40 91 memset (data, 0, len * sizeof (double)) ;
Chris@40 92
Chris@40 93 len = (5 * len) / 6 ;
Chris@40 94
Chris@40 95 for (k = 0 ; k < len ; k++)
Chris@40 96 { data [k] = sin (2.0 * k * M_PI * 1.0 / 32.0 + 0.4) ;
Chris@40 97
Chris@40 98 /* Apply Hanning Window. */
Chris@40 99 data [k] *= maximum * (0.5 - 0.5 * cos (2.0 * M_PI * k / ((len) - 1))) ;
Chris@40 100 }
Chris@40 101
Chris@40 102 return ;
Chris@40 103 } /* gen_windowed_sine_double */
Chris@40 104
Chris@40 105
Chris@40 106 void
Chris@40 107 create_short_sndfile (const char *filename, int format, int channels)
Chris@40 108 { short data [2 * 3 * 4 * 5 * 6 * 7] = { 0, } ;
Chris@40 109 SNDFILE *file ;
Chris@40 110 SF_INFO sfinfo ;
Chris@40 111
Chris@40 112 sfinfo.samplerate = 44100 ;
Chris@40 113 sfinfo.channels = channels ;
Chris@40 114 sfinfo.format = format ;
Chris@40 115
Chris@40 116 if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL)
Chris@40 117 { printf ("Error (%s, %d) : sf_open failed : %s\n", __FILE__, __LINE__, sf_strerror (file)) ;
Chris@40 118 exit (1) ;
Chris@40 119 } ;
Chris@40 120
Chris@40 121 sf_write_short (file, data, ARRAY_LEN (data)) ;
Chris@40 122
Chris@40 123 sf_close (file) ;
Chris@40 124 } /* create_short_sndfile */
Chris@40 125
Chris@40 126 void
Chris@40 127 check_file_hash_or_die (const char *filename, uint64_t target_hash, int line_num)
Chris@40 128 { static unsigned char buf [4096] ;
Chris@40 129 uint64_t cksum ;
Chris@40 130 FILE *file ;
Chris@40 131 int k, read_count ;
Chris@40 132
Chris@40 133 memset (buf, 0, sizeof (buf)) ;
Chris@40 134
Chris@40 135 /* The 'b' in the mode string means binary for Win32. */
Chris@40 136 if ((file = fopen (filename, "rb")) == NULL)
Chris@40 137 { printf ("\n\nLine %d: could not open file '%s'\n\n", line_num, filename) ;
Chris@40 138 exit (1) ;
Chris@40 139 } ;
Chris@40 140
Chris@40 141 cksum = 0 ;
Chris@40 142
Chris@40 143 while ((read_count = fread (buf, 1, sizeof (buf), file)))
Chris@40 144 for (k = 0 ; k < read_count ; k++)
Chris@40 145 cksum = (cksum * 511 + buf [k]) & 0xfffffffffffff ;
Chris@40 146
Chris@40 147 fclose (file) ;
Chris@40 148
Chris@40 149 if (target_hash == 0)
Chris@40 150 { printf (" 0x%" PRIx64 "\n", cksum) ;
Chris@40 151 return ;
Chris@40 152 } ;
Chris@40 153
Chris@40 154 if (cksum != target_hash)
Chris@40 155 { printf ("\n\nLine %d: incorrect hash value 0x%" PRIx64 " should be 0x%" PRIx64 ".\n\n", line_num, cksum, target_hash) ;
Chris@40 156 exit (1) ;
Chris@40 157 } ;
Chris@40 158
Chris@40 159 return ;
Chris@40 160 } /* check_file_hash_or_die */
Chris@40 161
Chris@40 162 void
Chris@40 163 print_test_name (const char *test, const char *filename)
Chris@40 164 { int count ;
Chris@40 165
Chris@40 166 if (test == NULL)
Chris@40 167 { printf (__FILE__ ": bad test of filename parameter.\n") ;
Chris@40 168 exit (1) ;
Chris@40 169 } ;
Chris@40 170
Chris@40 171 if (filename == NULL || strlen (filename) == 0)
Chris@40 172 { printf (" %-30s : ", test) ;
Chris@40 173 count = 25 ;
Chris@40 174 }
Chris@40 175 else
Chris@40 176 { printf (" %-30s : %s ", test, filename) ;
Chris@40 177 count = 24 - strlen (filename) ;
Chris@40 178 } ;
Chris@40 179
Chris@40 180 while (count -- > 0)
Chris@40 181 putchar ('.') ;
Chris@40 182 putchar (' ') ;
Chris@40 183
Chris@40 184 fflush (stdout) ;
Chris@40 185 } /* print_test_name */
Chris@40 186
Chris@40 187 void
Chris@40 188 dump_data_to_file (const char *filename, const void *data, unsigned int datalen)
Chris@40 189 { FILE *file ;
Chris@40 190
Chris@40 191 if ((file = fopen (filename, "wb")) == NULL)
Chris@40 192 { printf ("\n\nLine %d : could not open file : %s\n\n", __LINE__, filename) ;
Chris@40 193 exit (1) ;
Chris@40 194 } ;
Chris@40 195
Chris@40 196 if (fwrite (data, 1, datalen, file) != datalen)
Chris@40 197 { printf ("\n\nLine %d : fwrite failed.\n\n", __LINE__) ;
Chris@40 198 exit (1) ;
Chris@40 199 } ;
Chris@40 200
Chris@40 201 fclose (file) ;
Chris@40 202
Chris@40 203 } /* dump_data_to_file */
Chris@40 204
Chris@40 205 /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Chris@40 206 */
Chris@40 207
Chris@40 208 static char octfilename [] = "error.dat" ;
Chris@40 209
Chris@40 210 int
Chris@40 211 oct_save_short (const short *a, const short *b, int len)
Chris@40 212 { FILE *file ;
Chris@40 213 int k ;
Chris@40 214
Chris@40 215 if (! (file = fopen (octfilename, "w")))
Chris@40 216 return 1 ;
Chris@40 217
Chris@40 218 fprintf (file, "# Not created by Octave\n") ;
Chris@40 219
Chris@40 220 fprintf (file, "# name: a\n") ;
Chris@40 221 fprintf (file, "# type: matrix\n") ;
Chris@40 222 fprintf (file, "# rows: %d\n", len) ;
Chris@40 223 fprintf (file, "# columns: 1\n") ;
Chris@40 224
Chris@40 225 for (k = 0 ; k < len ; k++)
Chris@40 226 fprintf (file, "% d" "\n", a [k]) ;
Chris@40 227
Chris@40 228 fprintf (file, "# name: b\n") ;
Chris@40 229 fprintf (file, "# type: matrix\n") ;
Chris@40 230 fprintf (file, "# rows: %d\n", len) ;
Chris@40 231 fprintf (file, "# columns: 1\n") ;
Chris@40 232
Chris@40 233 for (k = 0 ; k < len ; k++)
Chris@40 234 fprintf (file, "% d" "\n", b [k]) ;
Chris@40 235
Chris@40 236 fclose (file) ;
Chris@40 237 return 0 ;
Chris@40 238 } /* oct_save_short */
Chris@40 239 int
Chris@40 240 oct_save_int (const int *a, const int *b, int len)
Chris@40 241 { FILE *file ;
Chris@40 242 int k ;
Chris@40 243
Chris@40 244 if (! (file = fopen (octfilename, "w")))
Chris@40 245 return 1 ;
Chris@40 246
Chris@40 247 fprintf (file, "# Not created by Octave\n") ;
Chris@40 248
Chris@40 249 fprintf (file, "# name: a\n") ;
Chris@40 250 fprintf (file, "# type: matrix\n") ;
Chris@40 251 fprintf (file, "# rows: %d\n", len) ;
Chris@40 252 fprintf (file, "# columns: 1\n") ;
Chris@40 253
Chris@40 254 for (k = 0 ; k < len ; k++)
Chris@40 255 fprintf (file, "% d" "\n", a [k]) ;
Chris@40 256
Chris@40 257 fprintf (file, "# name: b\n") ;
Chris@40 258 fprintf (file, "# type: matrix\n") ;
Chris@40 259 fprintf (file, "# rows: %d\n", len) ;
Chris@40 260 fprintf (file, "# columns: 1\n") ;
Chris@40 261
Chris@40 262 for (k = 0 ; k < len ; k++)
Chris@40 263 fprintf (file, "% d" "\n", b [k]) ;
Chris@40 264
Chris@40 265 fclose (file) ;
Chris@40 266 return 0 ;
Chris@40 267 } /* oct_save_int */
Chris@40 268 int
Chris@40 269 oct_save_float (const float *a, const float *b, int len)
Chris@40 270 { FILE *file ;
Chris@40 271 int k ;
Chris@40 272
Chris@40 273 if (! (file = fopen (octfilename, "w")))
Chris@40 274 return 1 ;
Chris@40 275
Chris@40 276 fprintf (file, "# Not created by Octave\n") ;
Chris@40 277
Chris@40 278 fprintf (file, "# name: a\n") ;
Chris@40 279 fprintf (file, "# type: matrix\n") ;
Chris@40 280 fprintf (file, "# rows: %d\n", len) ;
Chris@40 281 fprintf (file, "# columns: 1\n") ;
Chris@40 282
Chris@40 283 for (k = 0 ; k < len ; k++)
Chris@40 284 fprintf (file, "% g" "\n", a [k]) ;
Chris@40 285
Chris@40 286 fprintf (file, "# name: b\n") ;
Chris@40 287 fprintf (file, "# type: matrix\n") ;
Chris@40 288 fprintf (file, "# rows: %d\n", len) ;
Chris@40 289 fprintf (file, "# columns: 1\n") ;
Chris@40 290
Chris@40 291 for (k = 0 ; k < len ; k++)
Chris@40 292 fprintf (file, "% g" "\n", b [k]) ;
Chris@40 293
Chris@40 294 fclose (file) ;
Chris@40 295 return 0 ;
Chris@40 296 } /* oct_save_float */
Chris@40 297 int
Chris@40 298 oct_save_double (const double *a, const double *b, int len)
Chris@40 299 { FILE *file ;
Chris@40 300 int k ;
Chris@40 301
Chris@40 302 if (! (file = fopen (octfilename, "w")))
Chris@40 303 return 1 ;
Chris@40 304
Chris@40 305 fprintf (file, "# Not created by Octave\n") ;
Chris@40 306
Chris@40 307 fprintf (file, "# name: a\n") ;
Chris@40 308 fprintf (file, "# type: matrix\n") ;
Chris@40 309 fprintf (file, "# rows: %d\n", len) ;
Chris@40 310 fprintf (file, "# columns: 1\n") ;
Chris@40 311
Chris@40 312 for (k = 0 ; k < len ; k++)
Chris@40 313 fprintf (file, "% g" "\n", a [k]) ;
Chris@40 314
Chris@40 315 fprintf (file, "# name: b\n") ;
Chris@40 316 fprintf (file, "# type: matrix\n") ;
Chris@40 317 fprintf (file, "# rows: %d\n", len) ;
Chris@40 318 fprintf (file, "# columns: 1\n") ;
Chris@40 319
Chris@40 320 for (k = 0 ; k < len ; k++)
Chris@40 321 fprintf (file, "% g" "\n", b [k]) ;
Chris@40 322
Chris@40 323 fclose (file) ;
Chris@40 324 return 0 ;
Chris@40 325 } /* oct_save_double */
Chris@40 326
Chris@40 327
Chris@40 328 void
Chris@40 329 check_log_buffer_or_die (SNDFILE *file, int line_num)
Chris@40 330 { static char buffer [LOG_BUFFER_SIZE] ;
Chris@40 331 int count ;
Chris@40 332
Chris@40 333 memset (buffer, 0, sizeof (buffer)) ;
Chris@40 334
Chris@40 335 /* Get the log buffer data. */
Chris@40 336 count = sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ;
Chris@40 337
Chris@40 338 if (LOG_BUFFER_SIZE - count < 2)
Chris@40 339 { printf ("\n\nLine %d : Possible long log buffer.\n", line_num) ;
Chris@40 340 exit (1) ;
Chris@40 341 }
Chris@40 342
Chris@40 343 /* Look for "Should" */
Chris@40 344 if (strstr (buffer, "ould"))
Chris@40 345 { printf ("\n\nLine %d : Log buffer contains `ould'. Dumping.\n", line_num) ;
Chris@40 346 puts (buffer) ;
Chris@40 347 exit (1) ;
Chris@40 348 } ;
Chris@40 349
Chris@40 350 /* Look for "**" */
Chris@40 351 if (strstr (buffer, "*"))
Chris@40 352 { printf ("\n\nLine %d : Log buffer contains `*'. Dumping.\n", line_num) ;
Chris@40 353 puts (buffer) ;
Chris@40 354 exit (1) ;
Chris@40 355 } ;
Chris@40 356
Chris@40 357 /* Look for "Should" */
Chris@40 358 if (strstr (buffer, "nknown marker"))
Chris@40 359 { printf ("\n\nLine %d : Log buffer contains `nknown marker'. Dumping.\n", line_num) ;
Chris@40 360 puts (buffer) ;
Chris@40 361 exit (1) ;
Chris@40 362 } ;
Chris@40 363
Chris@40 364 return ;
Chris@40 365 } /* check_log_buffer_or_die */
Chris@40 366
Chris@40 367 int
Chris@40 368 string_in_log_buffer (SNDFILE *file, const char *s)
Chris@40 369 { static char buffer [LOG_BUFFER_SIZE] ;
Chris@40 370 int count ;
Chris@40 371
Chris@40 372 memset (buffer, 0, sizeof (buffer)) ;
Chris@40 373
Chris@40 374 /* Get the log buffer data. */
Chris@40 375 count = sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ;
Chris@40 376
Chris@40 377 if (LOG_BUFFER_SIZE - count < 2)
Chris@40 378 { printf ("Possible long log buffer.\n") ;
Chris@40 379 exit (1) ;
Chris@40 380 }
Chris@40 381
Chris@40 382 /* Look for string */
Chris@40 383 return strstr (buffer, s) ? SF_TRUE : SF_FALSE ;
Chris@40 384 } /* string_in_log_buffer */
Chris@40 385
Chris@40 386 void
Chris@40 387 hexdump_file (const char * filename, sf_count_t offset, sf_count_t length)
Chris@40 388 {
Chris@40 389 FILE * file ;
Chris@40 390 char buffer [16] ;
Chris@40 391 int k, m, ch, readcount ;
Chris@40 392
Chris@40 393 if (length > 1000000)
Chris@40 394 { printf ("\n\nError : length (%" PRId64 ") too long.\n\n", offset) ;
Chris@40 395 exit (1) ;
Chris@40 396 } ;
Chris@40 397
Chris@40 398 if ((file = fopen (filename, "r")) == NULL)
Chris@40 399 { printf ("\n\nError : hexdump_file (%s) could not open file for read.\n\n", filename) ;
Chris@40 400 exit (1) ;
Chris@40 401 } ;
Chris@40 402
Chris@40 403 if (fseek (file, offset, SEEK_SET) != 0)
Chris@40 404 { printf ("\n\nError : fseek(file, %" PRId64 ", SEEK_SET) failed : %s\n\n", offset, strerror (errno)) ;
Chris@40 405 exit (1) ;
Chris@40 406 } ;
Chris@40 407
Chris@40 408 puts ("\n\n") ;
Chris@40 409
Chris@40 410 for (k = 0 ; k < length ; k+= sizeof (buffer))
Chris@40 411 { readcount = fread (buffer, 1, sizeof (buffer), file) ;
Chris@40 412
Chris@40 413 printf ("%08" PRIx64 " : ", offset + k) ;
Chris@40 414
Chris@40 415 for (m = 0 ; m < readcount ; m++)
Chris@40 416 printf ("%02x ", buffer [m] & 0xFF) ;
Chris@40 417
Chris@40 418 for (m = readcount ; m < SIGNED_SIZEOF (buffer) ; m++)
Chris@40 419 printf (" ") ;
Chris@40 420
Chris@40 421 printf (" ") ;
Chris@40 422 for (m = 0 ; m < readcount ; m++)
Chris@40 423 { ch = isprint (buffer [m]) ? buffer [m] : '.' ;
Chris@40 424 putchar (ch) ;
Chris@40 425 } ;
Chris@40 426
Chris@40 427 if (readcount < SIGNED_SIZEOF (buffer))
Chris@40 428 break ;
Chris@40 429
Chris@40 430 putchar ('\n') ;
Chris@40 431 } ;
Chris@40 432
Chris@40 433 puts ("\n") ;
Chris@40 434
Chris@40 435 fclose (file) ;
Chris@40 436 } /* hexdump_file */
Chris@40 437
Chris@40 438 void
Chris@40 439 dump_log_buffer (SNDFILE *file)
Chris@40 440 { static char buffer [LOG_BUFFER_SIZE] ;
Chris@40 441
Chris@40 442 memset (buffer, 0, sizeof (buffer)) ;
Chris@40 443
Chris@40 444 /* Get the log buffer data. */
Chris@40 445 sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ;
Chris@40 446
Chris@40 447 if (strlen (buffer) < 1)
Chris@40 448 puts ("Log buffer empty.\n") ;
Chris@40 449 else
Chris@40 450 puts (buffer) ;
Chris@40 451
Chris@40 452 return ;
Chris@40 453 } /* dump_log_buffer */
Chris@40 454
Chris@40 455 void
Chris@40 456 test_sf_format_or_die (const SF_INFO *info, int line_num)
Chris@40 457 { int res ;
Chris@40 458
Chris@40 459 if ((res = sf_format_check (info)) != 1)
Chris@40 460 { printf ("\n\nLine %d : sf_format_check returned error (%d)\n\n", line_num,res) ;
Chris@40 461 exit (1) ;
Chris@40 462 } ;
Chris@40 463
Chris@40 464 return ;
Chris@40 465 } /* test_sf_format_or_die */
Chris@40 466
Chris@40 467 SNDFILE *
Chris@40 468 test_open_file_or_die (const char *filename, int mode, SF_INFO *sfinfo, int allow_fd, int line_num)
Chris@40 469 { static int count = 0 ;
Chris@40 470
Chris@40 471 SNDFILE *file ;
Chris@40 472 const char *modestr, *func_name ;
Chris@40 473 int oflags = 0, omode = 0, err ;
Chris@40 474
Chris@40 475 /*
Chris@40 476 ** Need to test both sf_open() and sf_open_fd().
Chris@40 477 ** Do so alternately.
Chris@40 478 */
Chris@40 479 switch (mode)
Chris@40 480 { case SFM_READ :
Chris@40 481 modestr = "SFM_READ" ;
Chris@40 482 oflags = O_RDONLY | O_BINARY ;
Chris@40 483 omode = 0 ;
Chris@40 484 break ;
Chris@40 485
Chris@40 486 case SFM_WRITE :
Chris@40 487 modestr = "SFM_WRITE" ;
Chris@40 488 oflags = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ;
Chris@40 489 omode = S_IRUSR | S_IWUSR | S_IRGRP ;
Chris@40 490 break ;
Chris@40 491
Chris@40 492 case SFM_RDWR :
Chris@40 493 modestr = "SFM_RDWR" ;
Chris@40 494 oflags = O_RDWR | O_CREAT | O_BINARY ;
Chris@40 495 omode = S_IRUSR | S_IWUSR | S_IRGRP ;
Chris@40 496 break ;
Chris@40 497 default :
Chris@40 498 printf ("\n\nLine %d: Bad mode.\n", line_num) ;
Chris@40 499 fflush (stdout) ;
Chris@40 500 exit (1) ;
Chris@40 501 } ;
Chris@40 502
Chris@40 503 if (OS_IS_WIN32)
Chris@40 504 { /* Windows does not understand and ignores the S_IRGRP flag, but Wine
Chris@40 505 ** gives a run time warning message, so just clear it.
Chris@40 506 */
Chris@40 507 omode &= ~S_IRGRP ;
Chris@40 508 } ;
Chris@40 509
Chris@40 510 if (allow_fd && ((++count) & 1) == 1)
Chris@40 511 { int fd ;
Chris@40 512
Chris@40 513 /* Only use the three argument open() function if omode != 0. */
Chris@40 514 fd = (omode == 0) ? open (filename, oflags) : open (filename, oflags, omode) ;
Chris@40 515
Chris@40 516 if (fd < 0)
Chris@40 517 { printf ("\n\n%s : open failed : %s\n", __func__, strerror (errno)) ;
Chris@40 518 exit (1) ;
Chris@40 519 } ;
Chris@40 520
Chris@40 521 func_name = "sf_open_fd" ;
Chris@40 522 file = sf_open_fd (fd, mode, sfinfo, SF_TRUE) ;
Chris@40 523 }
Chris@40 524 else
Chris@40 525 { func_name = "sf_open" ;
Chris@40 526 file = sf_open (filename, mode, sfinfo) ;
Chris@40 527 } ;
Chris@40 528
Chris@40 529 if (file == NULL)
Chris@40 530 { printf ("\n\nLine %d: %s (%s) failed : %s\n\n", line_num, func_name, modestr, sf_strerror (NULL)) ;
Chris@40 531 dump_log_buffer (file) ;
Chris@40 532 exit (1) ;
Chris@40 533 } ;
Chris@40 534
Chris@40 535 err = sf_error (file) ;
Chris@40 536 if (err != SF_ERR_NO_ERROR)
Chris@40 537 { printf ("\n\nLine %d : sf_error : %s\n\n", line_num, sf_error_number (err)) ;
Chris@40 538 dump_log_buffer (file) ;
Chris@40 539 exit (1) ;
Chris@40 540 } ;
Chris@40 541
Chris@40 542 return file ;
Chris@40 543 } /* test_open_file_or_die */
Chris@40 544
Chris@40 545 void
Chris@40 546 test_read_write_position_or_die (SNDFILE *file, int line_num, int pass, sf_count_t read_pos, sf_count_t write_pos)
Chris@40 547 { sf_count_t pos ;
Chris@40 548
Chris@40 549 /* Check the current read position. */
Chris@40 550 if (read_pos >= 0 && (pos = sf_seek (file, 0, SEEK_CUR | SFM_READ)) != read_pos)
Chris@40 551 { printf ("\n\nLine %d ", line_num) ;
Chris@40 552 if (pass > 0)
Chris@40 553 printf ("(pass %d): ", pass) ;
Chris@40 554 printf ("Read position (%" PRId64 ") should be %" PRId64 ".\n", pos, read_pos) ;
Chris@40 555 exit (1) ;
Chris@40 556 } ;
Chris@40 557
Chris@40 558 /* Check the current write position. */
Chris@40 559 if (write_pos >= 0 && (pos = sf_seek (file, 0, SEEK_CUR | SFM_WRITE)) != write_pos)
Chris@40 560 { printf ("\n\nLine %d", line_num) ;
Chris@40 561 if (pass > 0)
Chris@40 562 printf (" (pass %d)", pass) ;
Chris@40 563 printf (" : Write position (%" PRId64 ") should be %" PRId64 ".\n", pos, write_pos) ;
Chris@40 564 exit (1) ;
Chris@40 565 } ;
Chris@40 566
Chris@40 567 return ;
Chris@40 568 } /* test_read_write_position */
Chris@40 569
Chris@40 570 void
Chris@40 571 test_seek_or_die (SNDFILE *file, sf_count_t offset, int whence, sf_count_t new_pos, int channels, int line_num)
Chris@40 572 { sf_count_t position ;
Chris@40 573 const char *channel_name, *whence_name ;
Chris@40 574
Chris@40 575 switch (whence)
Chris@40 576 { case SEEK_SET :
Chris@40 577 whence_name = "SEEK_SET" ;
Chris@40 578 break ;
Chris@40 579 case SEEK_CUR :
Chris@40 580 whence_name = "SEEK_CUR" ;
Chris@40 581 break ;
Chris@40 582 case SEEK_END :
Chris@40 583 whence_name = "SEEK_END" ;
Chris@40 584 break ;
Chris@40 585
Chris@40 586 /* SFM_READ */
Chris@40 587 case SEEK_SET | SFM_READ :
Chris@40 588 whence_name = "SFM_READ | SEEK_SET" ;
Chris@40 589 break ;
Chris@40 590 case SEEK_CUR | SFM_READ :
Chris@40 591 whence_name = "SFM_READ | SEEK_CUR" ;
Chris@40 592 break ;
Chris@40 593 case SEEK_END | SFM_READ :
Chris@40 594 whence_name = "SFM_READ | SEEK_END" ;
Chris@40 595 break ;
Chris@40 596
Chris@40 597 /* SFM_WRITE */
Chris@40 598 case SEEK_SET | SFM_WRITE :
Chris@40 599 whence_name = "SFM_WRITE | SEEK_SET" ;
Chris@40 600 break ;
Chris@40 601 case SEEK_CUR | SFM_WRITE :
Chris@40 602 whence_name = "SFM_WRITE | SEEK_CUR" ;
Chris@40 603 break ;
Chris@40 604 case SEEK_END | SFM_WRITE :
Chris@40 605 whence_name = "SFM_WRITE | SEEK_END" ;
Chris@40 606 break ;
Chris@40 607
Chris@40 608 default :
Chris@40 609 printf ("\n\nLine %d: bad whence parameter.\n", line_num) ;
Chris@40 610 exit (1) ;
Chris@40 611 } ;
Chris@40 612
Chris@40 613 channel_name = (channels == 1) ? "Mono" : "Stereo" ;
Chris@40 614
Chris@40 615 if ((position = sf_seek (file, offset, whence)) != new_pos)
Chris@40 616 { printf ("\n\nLine %d : %s : sf_seek (file, %" PRId64 ", %s) returned %" PRId64 " (should be %" PRId64 ").\n\n",
Chris@40 617 line_num, channel_name, offset, whence_name, position, new_pos) ;
Chris@40 618 exit (1) ;
Chris@40 619 } ;
Chris@40 620
Chris@40 621 } /* test_seek_or_die */
Chris@40 622
Chris@40 623
Chris@40 624
Chris@40 625 void
Chris@40 626 test_read_short_or_die (SNDFILE *file, int pass, short *test, sf_count_t items, int line_num)
Chris@40 627 { sf_count_t count ;
Chris@40 628
Chris@40 629 if ((count = sf_read_short (file, test, items)) != items)
Chris@40 630 { printf ("\n\nLine %d", line_num) ;
Chris@40 631 if (pass > 0)
Chris@40 632 printf (" (pass %d)", pass) ;
Chris@40 633 printf (" : sf_read_short failed with short read (%" PRId64 " => %" PRId64 ").\n",
Chris@40 634 items, count) ;
Chris@40 635 fflush (stdout) ;
Chris@40 636 puts (sf_strerror (file)) ;
Chris@40 637 exit (1) ;
Chris@40 638 } ;
Chris@40 639
Chris@40 640 return ;
Chris@40 641 } /* test_read_short_or_die */
Chris@40 642
Chris@40 643 void
Chris@40 644 test_read_int_or_die (SNDFILE *file, int pass, int *test, sf_count_t items, int line_num)
Chris@40 645 { sf_count_t count ;
Chris@40 646
Chris@40 647 if ((count = sf_read_int (file, test, items)) != items)
Chris@40 648 { printf ("\n\nLine %d", line_num) ;
Chris@40 649 if (pass > 0)
Chris@40 650 printf (" (pass %d)", pass) ;
Chris@40 651 printf (" : sf_read_int failed with short read (%" PRId64 " => %" PRId64 ").\n",
Chris@40 652 items, count) ;
Chris@40 653 fflush (stdout) ;
Chris@40 654 puts (sf_strerror (file)) ;
Chris@40 655 exit (1) ;
Chris@40 656 } ;
Chris@40 657
Chris@40 658 return ;
Chris@40 659 } /* test_read_int_or_die */
Chris@40 660
Chris@40 661 void
Chris@40 662 test_read_float_or_die (SNDFILE *file, int pass, float *test, sf_count_t items, int line_num)
Chris@40 663 { sf_count_t count ;
Chris@40 664
Chris@40 665 if ((count = sf_read_float (file, test, items)) != items)
Chris@40 666 { printf ("\n\nLine %d", line_num) ;
Chris@40 667 if (pass > 0)
Chris@40 668 printf (" (pass %d)", pass) ;
Chris@40 669 printf (" : sf_read_float failed with short read (%" PRId64 " => %" PRId64 ").\n",
Chris@40 670 items, count) ;
Chris@40 671 fflush (stdout) ;
Chris@40 672 puts (sf_strerror (file)) ;
Chris@40 673 exit (1) ;
Chris@40 674 } ;
Chris@40 675
Chris@40 676 return ;
Chris@40 677 } /* test_read_float_or_die */
Chris@40 678
Chris@40 679 void
Chris@40 680 test_read_double_or_die (SNDFILE *file, int pass, double *test, sf_count_t items, int line_num)
Chris@40 681 { sf_count_t count ;
Chris@40 682
Chris@40 683 if ((count = sf_read_double (file, test, items)) != items)
Chris@40 684 { printf ("\n\nLine %d", line_num) ;
Chris@40 685 if (pass > 0)
Chris@40 686 printf (" (pass %d)", pass) ;
Chris@40 687 printf (" : sf_read_double failed with short read (%" PRId64 " => %" PRId64 ").\n",
Chris@40 688 items, count) ;
Chris@40 689 fflush (stdout) ;
Chris@40 690 puts (sf_strerror (file)) ;
Chris@40 691 exit (1) ;
Chris@40 692 } ;
Chris@40 693
Chris@40 694 return ;
Chris@40 695 } /* test_read_double_or_die */
Chris@40 696
Chris@40 697
Chris@40 698 void
Chris@40 699 test_readf_short_or_die (SNDFILE *file, int pass, short *test, sf_count_t frames, int line_num)
Chris@40 700 { sf_count_t count ;
Chris@40 701
Chris@40 702 if ((count = sf_readf_short (file, test, frames)) != frames)
Chris@40 703 { printf ("\n\nLine %d", line_num) ;
Chris@40 704 if (pass > 0)
Chris@40 705 printf (" (pass %d)", pass) ;
Chris@40 706 printf (" : sf_readf_short failed with short readf (%" PRId64 " => %" PRId64 ").\n",
Chris@40 707 frames, count) ;
Chris@40 708 fflush (stdout) ;
Chris@40 709 puts (sf_strerror (file)) ;
Chris@40 710 exit (1) ;
Chris@40 711 } ;
Chris@40 712
Chris@40 713 return ;
Chris@40 714 } /* test_readf_short_or_die */
Chris@40 715
Chris@40 716 void
Chris@40 717 test_readf_int_or_die (SNDFILE *file, int pass, int *test, sf_count_t frames, int line_num)
Chris@40 718 { sf_count_t count ;
Chris@40 719
Chris@40 720 if ((count = sf_readf_int (file, test, frames)) != frames)
Chris@40 721 { printf ("\n\nLine %d", line_num) ;
Chris@40 722 if (pass > 0)
Chris@40 723 printf (" (pass %d)", pass) ;
Chris@40 724 printf (" : sf_readf_int failed with short readf (%" PRId64 " => %" PRId64 ").\n",
Chris@40 725 frames, count) ;
Chris@40 726 fflush (stdout) ;
Chris@40 727 puts (sf_strerror (file)) ;
Chris@40 728 exit (1) ;
Chris@40 729 } ;
Chris@40 730
Chris@40 731 return ;
Chris@40 732 } /* test_readf_int_or_die */
Chris@40 733
Chris@40 734 void
Chris@40 735 test_readf_float_or_die (SNDFILE *file, int pass, float *test, sf_count_t frames, int line_num)
Chris@40 736 { sf_count_t count ;
Chris@40 737
Chris@40 738 if ((count = sf_readf_float (file, test, frames)) != frames)
Chris@40 739 { printf ("\n\nLine %d", line_num) ;
Chris@40 740 if (pass > 0)
Chris@40 741 printf (" (pass %d)", pass) ;
Chris@40 742 printf (" : sf_readf_float failed with short readf (%" PRId64 " => %" PRId64 ").\n",
Chris@40 743 frames, count) ;
Chris@40 744 fflush (stdout) ;
Chris@40 745 puts (sf_strerror (file)) ;
Chris@40 746 exit (1) ;
Chris@40 747 } ;
Chris@40 748
Chris@40 749 return ;
Chris@40 750 } /* test_readf_float_or_die */
Chris@40 751
Chris@40 752 void
Chris@40 753 test_readf_double_or_die (SNDFILE *file, int pass, double *test, sf_count_t frames, int line_num)
Chris@40 754 { sf_count_t count ;
Chris@40 755
Chris@40 756 if ((count = sf_readf_double (file, test, frames)) != frames)
Chris@40 757 { printf ("\n\nLine %d", line_num) ;
Chris@40 758 if (pass > 0)
Chris@40 759 printf (" (pass %d)", pass) ;
Chris@40 760 printf (" : sf_readf_double failed with short readf (%" PRId64 " => %" PRId64 ").\n",
Chris@40 761 frames, count) ;
Chris@40 762 fflush (stdout) ;
Chris@40 763 puts (sf_strerror (file)) ;
Chris@40 764 exit (1) ;
Chris@40 765 } ;
Chris@40 766
Chris@40 767 return ;
Chris@40 768 } /* test_readf_double_or_die */
Chris@40 769
Chris@40 770
Chris@40 771 void
Chris@40 772 test_read_raw_or_die (SNDFILE *file, int pass, void *test, sf_count_t items, int line_num)
Chris@40 773 { sf_count_t count ;
Chris@40 774
Chris@40 775 if ((count = sf_read_raw (file, test, items)) != items)
Chris@40 776 { printf ("\n\nLine %d", line_num) ;
Chris@40 777 if (pass > 0)
Chris@40 778 printf (" (pass %d)", pass) ;
Chris@40 779 printf (" : sf_read_raw failed with short read (%" PRId64 " => %" PRId64 ").\n", items, count) ;
Chris@40 780 fflush (stdout) ;
Chris@40 781 puts (sf_strerror (file)) ;
Chris@40 782 exit (1) ;
Chris@40 783 } ;
Chris@40 784
Chris@40 785 return ;
Chris@40 786 } /* test_read_raw_or_die */
Chris@40 787
Chris@40 788
Chris@40 789
Chris@40 790 void
Chris@40 791 test_write_short_or_die (SNDFILE *file, int pass, const short *test, sf_count_t items, int line_num)
Chris@40 792 { sf_count_t count ;
Chris@40 793
Chris@40 794 if ((count = sf_write_short (file, test, items)) != items)
Chris@40 795 { printf ("\n\nLine %d", line_num) ;
Chris@40 796 if (pass > 0)
Chris@40 797 printf (" (pass %d)", pass) ;
Chris@40 798 printf (" : sf_write_short failed with short write (%" PRId64 " => %" PRId64 ").\n",
Chris@40 799 items, count) ;
Chris@40 800 fflush (stdout) ;
Chris@40 801 puts (sf_strerror (file)) ;
Chris@40 802 exit (1) ;
Chris@40 803 } ;
Chris@40 804
Chris@40 805 return ;
Chris@40 806 } /* test_write_short_or_die */
Chris@40 807
Chris@40 808 void
Chris@40 809 test_write_int_or_die (SNDFILE *file, int pass, const int *test, sf_count_t items, int line_num)
Chris@40 810 { sf_count_t count ;
Chris@40 811
Chris@40 812 if ((count = sf_write_int (file, test, items)) != items)
Chris@40 813 { printf ("\n\nLine %d", line_num) ;
Chris@40 814 if (pass > 0)
Chris@40 815 printf (" (pass %d)", pass) ;
Chris@40 816 printf (" : sf_write_int failed with short write (%" PRId64 " => %" PRId64 ").\n",
Chris@40 817 items, count) ;
Chris@40 818 fflush (stdout) ;
Chris@40 819 puts (sf_strerror (file)) ;
Chris@40 820 exit (1) ;
Chris@40 821 } ;
Chris@40 822
Chris@40 823 return ;
Chris@40 824 } /* test_write_int_or_die */
Chris@40 825
Chris@40 826 void
Chris@40 827 test_write_float_or_die (SNDFILE *file, int pass, const float *test, sf_count_t items, int line_num)
Chris@40 828 { sf_count_t count ;
Chris@40 829
Chris@40 830 if ((count = sf_write_float (file, test, items)) != items)
Chris@40 831 { printf ("\n\nLine %d", line_num) ;
Chris@40 832 if (pass > 0)
Chris@40 833 printf (" (pass %d)", pass) ;
Chris@40 834 printf (" : sf_write_float failed with short write (%" PRId64 " => %" PRId64 ").\n",
Chris@40 835 items, count) ;
Chris@40 836 fflush (stdout) ;
Chris@40 837 puts (sf_strerror (file)) ;
Chris@40 838 exit (1) ;
Chris@40 839 } ;
Chris@40 840
Chris@40 841 return ;
Chris@40 842 } /* test_write_float_or_die */
Chris@40 843
Chris@40 844 void
Chris@40 845 test_write_double_or_die (SNDFILE *file, int pass, const double *test, sf_count_t items, int line_num)
Chris@40 846 { sf_count_t count ;
Chris@40 847
Chris@40 848 if ((count = sf_write_double (file, test, items)) != items)
Chris@40 849 { printf ("\n\nLine %d", line_num) ;
Chris@40 850 if (pass > 0)
Chris@40 851 printf (" (pass %d)", pass) ;
Chris@40 852 printf (" : sf_write_double failed with short write (%" PRId64 " => %" PRId64 ").\n",
Chris@40 853 items, count) ;
Chris@40 854 fflush (stdout) ;
Chris@40 855 puts (sf_strerror (file)) ;
Chris@40 856 exit (1) ;
Chris@40 857 } ;
Chris@40 858
Chris@40 859 return ;
Chris@40 860 } /* test_write_double_or_die */
Chris@40 861
Chris@40 862
Chris@40 863 void
Chris@40 864 test_writef_short_or_die (SNDFILE *file, int pass, const short *test, sf_count_t frames, int line_num)
Chris@40 865 { sf_count_t count ;
Chris@40 866
Chris@40 867 if ((count = sf_writef_short (file, test, frames)) != frames)
Chris@40 868 { printf ("\n\nLine %d", line_num) ;
Chris@40 869 if (pass > 0)
Chris@40 870 printf (" (pass %d)", pass) ;
Chris@40 871 printf (" : sf_writef_short failed with short writef (%" PRId64 " => %" PRId64 ").\n",
Chris@40 872 frames, count) ;
Chris@40 873 fflush (stdout) ;
Chris@40 874 puts (sf_strerror (file)) ;
Chris@40 875 exit (1) ;
Chris@40 876 } ;
Chris@40 877
Chris@40 878 return ;
Chris@40 879 } /* test_writef_short_or_die */
Chris@40 880
Chris@40 881 void
Chris@40 882 test_writef_int_or_die (SNDFILE *file, int pass, const int *test, sf_count_t frames, int line_num)
Chris@40 883 { sf_count_t count ;
Chris@40 884
Chris@40 885 if ((count = sf_writef_int (file, test, frames)) != frames)
Chris@40 886 { printf ("\n\nLine %d", line_num) ;
Chris@40 887 if (pass > 0)
Chris@40 888 printf (" (pass %d)", pass) ;
Chris@40 889 printf (" : sf_writef_int failed with short writef (%" PRId64 " => %" PRId64 ").\n",
Chris@40 890 frames, count) ;
Chris@40 891 fflush (stdout) ;
Chris@40 892 puts (sf_strerror (file)) ;
Chris@40 893 exit (1) ;
Chris@40 894 } ;
Chris@40 895
Chris@40 896 return ;
Chris@40 897 } /* test_writef_int_or_die */
Chris@40 898
Chris@40 899 void
Chris@40 900 test_writef_float_or_die (SNDFILE *file, int pass, const float *test, sf_count_t frames, int line_num)
Chris@40 901 { sf_count_t count ;
Chris@40 902
Chris@40 903 if ((count = sf_writef_float (file, test, frames)) != frames)
Chris@40 904 { printf ("\n\nLine %d", line_num) ;
Chris@40 905 if (pass > 0)
Chris@40 906 printf (" (pass %d)", pass) ;
Chris@40 907 printf (" : sf_writef_float failed with short writef (%" PRId64 " => %" PRId64 ").\n",
Chris@40 908 frames, count) ;
Chris@40 909 fflush (stdout) ;
Chris@40 910 puts (sf_strerror (file)) ;
Chris@40 911 exit (1) ;
Chris@40 912 } ;
Chris@40 913
Chris@40 914 return ;
Chris@40 915 } /* test_writef_float_or_die */
Chris@40 916
Chris@40 917 void
Chris@40 918 test_writef_double_or_die (SNDFILE *file, int pass, const double *test, sf_count_t frames, int line_num)
Chris@40 919 { sf_count_t count ;
Chris@40 920
Chris@40 921 if ((count = sf_writef_double (file, test, frames)) != frames)
Chris@40 922 { printf ("\n\nLine %d", line_num) ;
Chris@40 923 if (pass > 0)
Chris@40 924 printf (" (pass %d)", pass) ;
Chris@40 925 printf (" : sf_writef_double failed with short writef (%" PRId64 " => %" PRId64 ").\n",
Chris@40 926 frames, count) ;
Chris@40 927 fflush (stdout) ;
Chris@40 928 puts (sf_strerror (file)) ;
Chris@40 929 exit (1) ;
Chris@40 930 } ;
Chris@40 931
Chris@40 932 return ;
Chris@40 933 } /* test_writef_double_or_die */
Chris@40 934
Chris@40 935
Chris@40 936 void
Chris@40 937 test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t items, int line_num)
Chris@40 938 { sf_count_t count ;
Chris@40 939
Chris@40 940 if ((count = sf_write_raw (file, test, items)) != items)
Chris@40 941 { printf ("\n\nLine %d", line_num) ;
Chris@40 942 if (pass > 0)
Chris@40 943 printf (" (pass %d)", pass) ;
Chris@40 944 printf (" : sf_write_raw failed with short write (%" PRId64 " => %" PRId64 ").\n", items, count) ;
Chris@40 945 fflush (stdout) ;
Chris@40 946 puts (sf_strerror (file)) ;
Chris@40 947 exit (1) ;
Chris@40 948 } ;
Chris@40 949
Chris@40 950 return ;
Chris@40 951 } /* test_write_raw_or_die */
Chris@40 952
Chris@40 953
Chris@40 954 void
Chris@40 955 compare_short_or_die (const short *expected, const short *actual, unsigned count, int line_num)
Chris@40 956 {
Chris@40 957 unsigned k ;
Chris@40 958
Chris@40 959 for (k = 0 ; k < count ; k++)
Chris@40 960 if (expected [k] != actual [k])
Chris@40 961 { printf ("\n\nLine %d : Error at index %d, got " "% d" ", should be " "% d" ".\n\n", line_num, k, actual [k], expected [k]) ;
Chris@40 962 exit (1) ;
Chris@40 963 } ;
Chris@40 964
Chris@40 965 return ;
Chris@40 966 } /* compare_short_or_die */
Chris@40 967 void
Chris@40 968 compare_int_or_die (const int *expected, const int *actual, unsigned count, int line_num)
Chris@40 969 {
Chris@40 970 unsigned k ;
Chris@40 971
Chris@40 972 for (k = 0 ; k < count ; k++)
Chris@40 973 if (expected [k] != actual [k])
Chris@40 974 { printf ("\n\nLine %d : Error at index %d, got " "% d" ", should be " "% d" ".\n\n", line_num, k, actual [k], expected [k]) ;
Chris@40 975 exit (1) ;
Chris@40 976 } ;
Chris@40 977
Chris@40 978 return ;
Chris@40 979 } /* compare_int_or_die */
Chris@40 980 void
Chris@40 981 compare_float_or_die (const float *expected, const float *actual, unsigned count, int line_num)
Chris@40 982 {
Chris@40 983 unsigned k ;
Chris@40 984
Chris@40 985 for (k = 0 ; k < count ; k++)
Chris@40 986 if (expected [k] != actual [k])
Chris@40 987 { printf ("\n\nLine %d : Error at index %d, got " "% g" ", should be " "% g" ".\n\n", line_num, k, actual [k], expected [k]) ;
Chris@40 988 exit (1) ;
Chris@40 989 } ;
Chris@40 990
Chris@40 991 return ;
Chris@40 992 } /* compare_float_or_die */
Chris@40 993 void
Chris@40 994 compare_double_or_die (const double *expected, const double *actual, unsigned count, int line_num)
Chris@40 995 {
Chris@40 996 unsigned k ;
Chris@40 997
Chris@40 998 for (k = 0 ; k < count ; k++)
Chris@40 999 if (expected [k] != actual [k])
Chris@40 1000 { printf ("\n\nLine %d : Error at index %d, got " "% g" ", should be " "% g" ".\n\n", line_num, k, actual [k], expected [k]) ;
Chris@40 1001 exit (1) ;
Chris@40 1002 } ;
Chris@40 1003
Chris@40 1004 return ;
Chris@40 1005 } /* compare_double_or_die */
Chris@40 1006
Chris@40 1007
Chris@40 1008
Chris@40 1009 void
Chris@40 1010 delete_file (int format, const char *filename)
Chris@40 1011 { char rsrc_name [512], *fname ;
Chris@40 1012
Chris@40 1013 unlink (filename) ;
Chris@40 1014
Chris@40 1015 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_SD2)
Chris@40 1016 return ;
Chris@40 1017
Chris@40 1018 /*
Chris@40 1019 ** Now try for a resource fork stored as a separate file.
Chris@40 1020 ** Grab the un-adulterated filename again.
Chris@40 1021 */
Chris@40 1022 snprintf (rsrc_name, sizeof (rsrc_name), "%s", filename) ;
Chris@40 1023
Chris@40 1024 if ((fname = strrchr (rsrc_name, '/')) != NULL)
Chris@40 1025 fname ++ ;
Chris@40 1026 else if ((fname = strrchr (rsrc_name, '\\')) != NULL)
Chris@40 1027 fname ++ ;
Chris@40 1028 else
Chris@40 1029 fname = rsrc_name ;
Chris@40 1030
Chris@40 1031 memmove (fname + 2, fname, strlen (fname) + 1) ;
Chris@40 1032 fname [0] = '.' ;
Chris@40 1033 fname [1] = '_' ;
Chris@40 1034
Chris@40 1035 unlink (rsrc_name) ;
Chris@40 1036 } /* delete_file */
Chris@40 1037
Chris@40 1038 static int allowed_open_files = -1 ;
Chris@40 1039
Chris@40 1040 void
Chris@40 1041 count_open_files (void)
Chris@40 1042 {
Chris@40 1043 #if OS_IS_WIN32
Chris@40 1044 return ;
Chris@40 1045 #else
Chris@40 1046 int k, count = 0 ;
Chris@40 1047 struct stat statbuf ;
Chris@40 1048
Chris@40 1049 if (allowed_open_files > 0)
Chris@40 1050 return ;
Chris@40 1051
Chris@40 1052 for (k = 0 ; k < 1024 ; k++)
Chris@40 1053 if (fstat (k, &statbuf) == 0)
Chris@40 1054 count ++ ;
Chris@40 1055
Chris@40 1056 allowed_open_files = count ;
Chris@40 1057 #endif
Chris@40 1058 } /* count_open_files */
Chris@40 1059
Chris@40 1060 void
Chris@40 1061 increment_open_file_count (void)
Chris@40 1062 { allowed_open_files ++ ;
Chris@40 1063 } /* increment_open_file_count */
Chris@40 1064
Chris@40 1065 void
Chris@40 1066 check_open_file_count_or_die (int lineno)
Chris@40 1067 {
Chris@40 1068 #if OS_IS_WIN32
Chris@40 1069 (void) lineno ;
Chris@40 1070 return ;
Chris@40 1071 #else
Chris@40 1072 int k, count = 0 ;
Chris@40 1073 struct stat statbuf ;
Chris@40 1074
Chris@40 1075 if (allowed_open_files < 0)
Chris@40 1076 count_open_files () ;
Chris@40 1077
Chris@40 1078 for (k = 0 ; k < 1024 ; k++)
Chris@40 1079 if (fstat (k, &statbuf) == 0)
Chris@40 1080 count ++ ;
Chris@40 1081
Chris@40 1082 if (count > allowed_open_files)
Chris@40 1083 { printf ("\nLine %d : number of open files (%d) > allowed (%d).\n\n", lineno, count, allowed_open_files) ;
Chris@40 1084 exit (1) ;
Chris@40 1085 } ;
Chris@40 1086 #endif
Chris@40 1087 } /* check_open_file_count_or_die */
Chris@40 1088
Chris@40 1089 void
Chris@40 1090 write_mono_file (const char * filename, int format, int srate, float * output, int len)
Chris@40 1091 { SNDFILE * file ;
Chris@40 1092 SF_INFO sfinfo ;
Chris@40 1093
Chris@40 1094 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 1095
Chris@40 1096 sfinfo.samplerate = srate ;
Chris@40 1097 sfinfo.channels = 1 ;
Chris@40 1098 sfinfo.format = format ;
Chris@40 1099
Chris@40 1100 if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL)
Chris@40 1101 { printf ("sf_open (%s) : %s\n", filename, sf_strerror (NULL)) ;
Chris@40 1102 exit (1) ;
Chris@40 1103 } ;
Chris@40 1104
Chris@40 1105 sf_write_float (file, output, len) ;
Chris@40 1106
Chris@40 1107 sf_close (file) ;
Chris@40 1108 } /* write_mono_file */
Chris@40 1109
Chris@40 1110 void
Chris@40 1111 gen_lowpass_signal_float (float *data, int len)
Chris@40 1112 { int64_t value = 0x1243456 ;
Chris@40 1113 double sample, last_val = 0.0 ;
Chris@40 1114 int k ;
Chris@40 1115
Chris@40 1116 for (k = 0 ; k < len ; k++)
Chris@40 1117 { /* Not a crypto quality RNG. */
Chris@40 1118 value = (11117 * value + 211231) & 0xffffffff ;
Chris@40 1119 value = (11117 * value + 211231) & 0xffffffff ;
Chris@40 1120 value = (11117 * value + 211231) & 0xffffffff ;
Chris@40 1121
Chris@40 1122 sample = value / (0x7fffffff * 1.000001) ;
Chris@40 1123 sample = 0.2 * sample - 0.9 * last_val ;
Chris@40 1124
Chris@40 1125 last_val = sample ;
Chris@40 1126
Chris@40 1127 data [k] = 0.5 * (sample + sin (2.0 * k * M_PI * 1.0 / 32.0)) ;
Chris@40 1128 } ;
Chris@40 1129
Chris@40 1130 } /* gen_lowpass_signal_float */
Chris@40 1131
Chris@40 1132
Chris@40 1133 /*
Chris@40 1134 ** Windows is fucked.
Chris@40 1135 ** If a file is opened R/W and data is written to it, then fstat will return
Chris@40 1136 ** the correct file length, but stat will return zero.
Chris@40 1137 */
Chris@40 1138
Chris@40 1139 sf_count_t
Chris@40 1140 file_length (const char * fname)
Chris@40 1141 { struct stat data ;
Chris@40 1142
Chris@40 1143 if (stat (fname, &data) != 0)
Chris@40 1144 return 0 ;
Chris@40 1145
Chris@40 1146 return (sf_count_t) data.st_size ;
Chris@40 1147 } /* file_length */
Chris@40 1148
Chris@40 1149 sf_count_t
Chris@40 1150 file_length_fd (int fd)
Chris@40 1151 { struct stat data ;
Chris@40 1152
Chris@40 1153 memset (&data, 0, sizeof (data)) ;
Chris@40 1154 if (fstat (fd, &data) != 0)
Chris@40 1155 return 0 ;
Chris@40 1156
Chris@40 1157 return (sf_count_t) data.st_size ;
Chris@40 1158 } /* file_length_fd */
Chris@40 1159
Chris@40 1160
Chris@40 1161
Chris@40 1162