annotate src/libsndfile-1.0.25/tests/pcm_test.c @ 23:619f715526df sv_v2.1

Update Vamp plugin SDK to 2.5
author Chris Cannam
date Thu, 09 May 2013 10:52:46 +0100
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 */