annotate src/libsndfile-1.0.27/tests/pcm_test.c @ 127:7867fa7e1b6b

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