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

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 1df64224f5ac
children
rev   line source
Chris@40 1 /*
Chris@40 2 ** Copyright (C) 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 */