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