annotate src/libsndfile-1.0.27/tests/pcm_test.c @ 84:08ae793730bd

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