annotate src/libsndfile-1.0.25/tests/utils.c @ 0:c7265573341e

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