annotate src/libsndfile-1.0.25/tests/pcm_test.c @ 169:223a55898ab9 tip default

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