annotate src/libsndfile-1.0.25/tests/pcm_test.tpl @ 88:fe7c3a0b0259

Add some MinGW builds
author Chris Cannam <cannam@all-day-breakfast.com>
date Wed, 20 Mar 2013 13:49:36 +0000
parents 545efbb81310
children
rev   line source
cannam@85 1 [+ AutoGen5 template c +]
cannam@85 2 /*
cannam@85 3 ** Copyright (C) 1999-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
cannam@85 4 **
cannam@85 5 ** This program is free software; you can redistribute it and/or modify
cannam@85 6 ** it under the terms of the GNU General Public License as published by
cannam@85 7 ** the Free Software Foundation; either version 2 of the License, or
cannam@85 8 ** (at your option) any later version.
cannam@85 9 **
cannam@85 10 ** This program is distributed in the hope that it will be useful,
cannam@85 11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
cannam@85 12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cannam@85 13 ** GNU General Public License for more details.
cannam@85 14 **
cannam@85 15 ** You should have received a copy of the GNU General Public License
cannam@85 16 ** along with this program; if not, write to the Free Software
cannam@85 17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
cannam@85 18 */
cannam@85 19
cannam@85 20 #include "sfconfig.h"
cannam@85 21
cannam@85 22 #include <stdio.h>
cannam@85 23 #include <stdlib.h>
cannam@85 24 #include <string.h>
cannam@85 25 #include <math.h>
cannam@85 26
cannam@85 27 #if HAVE_UNISTD_H
cannam@85 28 #include <unistd.h>
cannam@85 29 #endif
cannam@85 30
cannam@85 31 #include <sndfile.h>
cannam@85 32
cannam@85 33 #include "utils.h"
cannam@85 34
cannam@85 35 #define BUFFER_SIZE (1<<12)
cannam@85 36
cannam@85 37 static void lrintf_test (void) ;
cannam@85 38
cannam@85 39 [+ FOR data_type
cannam@85 40 +]static void pcm_test_[+ (get "name") +] (const char *filename, int filetype, uint64_t hash) ;
cannam@85 41 [+ ENDFOR data_type
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 [+ FOR data_type
cannam@85 126 +]static void
cannam@85 127 pcm_test_[+ (get "name") +] (const char *filename, int filetype, uint64_t hash)
cannam@85 128 { SNDFILE *file ;
cannam@85 129 SF_INFO sfinfo ;
cannam@85 130 int k, items, zero_count ;
cannam@85 131 short *short_out, *short_in ;
cannam@85 132 int *int_out, *int_in ;
cannam@85 133 /* Lite remove start */
cannam@85 134 float *float_out, *float_in ;
cannam@85 135 double *double_out, *double_in ;
cannam@85 136 /* Lite remove end */
cannam@85 137
cannam@85 138 print_test_name ("pcm_test_[+ (get "name") +]", filename) ;
cannam@85 139
cannam@85 140 items = [+ (get "item_count") +] ;
cannam@85 141
cannam@85 142 short_out = data_out.s ;
cannam@85 143 short_in = data_in.s ;
cannam@85 144
cannam@85 145 zero_count = 0 ;
cannam@85 146 for (k = 0 ; k < items ; k++)
cannam@85 147 { short_out [k] = [+ (get "short_func") +] ;
cannam@85 148 zero_count = short_out [k] ? zero_count : zero_count + 1 ;
cannam@85 149 } ;
cannam@85 150
cannam@85 151 if (zero_count > items / 4)
cannam@85 152 { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ;
cannam@85 153 exit (1) ;
cannam@85 154 } ;
cannam@85 155
cannam@85 156 sfinfo.samplerate = 44100 ;
cannam@85 157 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
cannam@85 158 sfinfo.channels = 1 ;
cannam@85 159 sfinfo.format = filetype ;
cannam@85 160
cannam@85 161 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 162
cannam@85 163 test_write_short_or_die (file, 0, short_out, items, __LINE__) ;
cannam@85 164
cannam@85 165 sf_close (file) ;
cannam@85 166
cannam@85 167 memset (short_in, 0, items * sizeof (short)) ;
cannam@85 168
cannam@85 169 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 170
cannam@85 171 if (sfinfo.format != filetype)
cannam@85 172 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
cannam@85 173 exit (1) ;
cannam@85 174 } ;
cannam@85 175
cannam@85 176 if (sfinfo.frames != items)
cannam@85 177 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
cannam@85 178 exit (1) ;
cannam@85 179 } ;
cannam@85 180
cannam@85 181 if (sfinfo.channels != 1)
cannam@85 182 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
cannam@85 183 exit (1) ;
cannam@85 184 } ;
cannam@85 185
cannam@85 186 check_log_buffer_or_die (file, __LINE__) ;
cannam@85 187
cannam@85 188 test_read_short_or_die (file, 0, short_in, items, __LINE__) ;
cannam@85 189
cannam@85 190 for (k = 0 ; k < items ; k++)
cannam@85 191 if (short_out [k] != short_in [k])
cannam@85 192 { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ;
cannam@85 193 exit (1) ;
cannam@85 194 } ;
cannam@85 195
cannam@85 196 sf_close (file) ;
cannam@85 197
cannam@85 198 /* Finally, check the file hash. */
cannam@85 199 check_file_hash_or_die (filename, hash, __LINE__) ;
cannam@85 200
cannam@85 201 /*--------------------------------------------------------------------------
cannam@85 202 ** Test sf_read/write_int ()
cannam@85 203 */
cannam@85 204 zero_count = 0 ;
cannam@85 205
cannam@85 206 int_out = data_out.i ;
cannam@85 207 int_in = data_in.i ;
cannam@85 208 for (k = 0 ; k < items ; k++)
cannam@85 209 { int_out [k] = [+ (get "int_func") +] ;
cannam@85 210 zero_count = int_out [k] ? zero_count : zero_count + 1 ;
cannam@85 211 } ;
cannam@85 212
cannam@85 213 if (zero_count > items / 4)
cannam@85 214 { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ;
cannam@85 215 exit (1) ;
cannam@85 216 } ;
cannam@85 217
cannam@85 218 sfinfo.samplerate = 44100 ;
cannam@85 219 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
cannam@85 220 sfinfo.channels = 1 ;
cannam@85 221 sfinfo.format = filetype ;
cannam@85 222
cannam@85 223 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 224
cannam@85 225 test_write_int_or_die (file, 0, int_out, items, __LINE__) ;
cannam@85 226
cannam@85 227 sf_close (file) ;
cannam@85 228
cannam@85 229 memset (int_in, 0, items * sizeof (int)) ;
cannam@85 230
cannam@85 231 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 232
cannam@85 233 if (sfinfo.format != filetype)
cannam@85 234 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
cannam@85 235 exit (1) ;
cannam@85 236 } ;
cannam@85 237
cannam@85 238 if (sfinfo.frames != items)
cannam@85 239 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
cannam@85 240 exit (1) ;
cannam@85 241 } ;
cannam@85 242
cannam@85 243 if (sfinfo.channels != 1)
cannam@85 244 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
cannam@85 245 exit (1) ;
cannam@85 246 } ;
cannam@85 247
cannam@85 248 check_log_buffer_or_die (file, __LINE__) ;
cannam@85 249
cannam@85 250 test_read_int_or_die (file, 0, int_in, items, __LINE__) ;
cannam@85 251
cannam@85 252 for (k = 0 ; k < items ; k++)
cannam@85 253 if (int_out [k] != int_in [k])
cannam@85 254 { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ;
cannam@85 255 exit (1) ;
cannam@85 256 } ;
cannam@85 257
cannam@85 258 sf_close (file) ;
cannam@85 259
cannam@85 260 /* Lite remove start */
cannam@85 261 /*--------------------------------------------------------------------------
cannam@85 262 ** Test sf_read/write_float ()
cannam@85 263 */
cannam@85 264 zero_count = 0 ;
cannam@85 265
cannam@85 266 float_out = data_out.f ;
cannam@85 267 float_in = data_in.f ;
cannam@85 268 for (k = 0 ; k < items ; k++)
cannam@85 269 { float_out [k] = [+ (get "float_func") +] ;
cannam@85 270 zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
cannam@85 271 } ;
cannam@85 272
cannam@85 273 if (zero_count > items / 4)
cannam@85 274 { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ;
cannam@85 275 exit (1) ;
cannam@85 276 } ;
cannam@85 277
cannam@85 278 sfinfo.samplerate = 44100 ;
cannam@85 279 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
cannam@85 280 sfinfo.channels = 1 ;
cannam@85 281 sfinfo.format = filetype ;
cannam@85 282
cannam@85 283 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 284
cannam@85 285 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
cannam@85 286
cannam@85 287 test_write_float_or_die (file, 0, float_out, items, __LINE__) ;
cannam@85 288
cannam@85 289 sf_close (file) ;
cannam@85 290
cannam@85 291 memset (float_in, 0, items * sizeof (float)) ;
cannam@85 292
cannam@85 293 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 294
cannam@85 295 if (sfinfo.format != filetype)
cannam@85 296 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
cannam@85 297 exit (1) ;
cannam@85 298 } ;
cannam@85 299
cannam@85 300 if (sfinfo.frames != items)
cannam@85 301 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
cannam@85 302 exit (1) ;
cannam@85 303 } ;
cannam@85 304
cannam@85 305 if (sfinfo.channels != 1)
cannam@85 306 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
cannam@85 307 exit (1) ;
cannam@85 308 } ;
cannam@85 309
cannam@85 310 check_log_buffer_or_die (file, __LINE__) ;
cannam@85 311
cannam@85 312 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
cannam@85 313
cannam@85 314 test_read_float_or_die (file, 0, float_in, items, __LINE__) ;
cannam@85 315
cannam@85 316 for (k = 0 ; k < items ; k++)
cannam@85 317 if (fabs (float_out [k] - float_in [k]) > 1e-10)
cannam@85 318 { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ;
cannam@85 319 exit (1) ;
cannam@85 320 } ;
cannam@85 321
cannam@85 322 sf_close (file) ;
cannam@85 323
cannam@85 324 /*--------------------------------------------------------------------------
cannam@85 325 ** Test sf_read/write_double ()
cannam@85 326 */
cannam@85 327 zero_count = 0 ;
cannam@85 328
cannam@85 329 double_out = data_out.d ;
cannam@85 330 double_in = data_in.d ;
cannam@85 331 for (k = 0 ; k < items ; k++)
cannam@85 332 { double_out [k] = [+ (get "float_func") +] ;
cannam@85 333 zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
cannam@85 334 } ;
cannam@85 335
cannam@85 336 if (zero_count > items / 4)
cannam@85 337 { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ;
cannam@85 338 exit (1) ;
cannam@85 339 } ;
cannam@85 340
cannam@85 341 sfinfo.samplerate = 44100 ;
cannam@85 342 sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
cannam@85 343 sfinfo.channels = 1 ;
cannam@85 344 sfinfo.format = filetype ;
cannam@85 345
cannam@85 346 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 347
cannam@85 348 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
cannam@85 349
cannam@85 350 test_write_double_or_die (file, 0, double_out, items, __LINE__) ;
cannam@85 351
cannam@85 352 sf_close (file) ;
cannam@85 353
cannam@85 354 memset (double_in, 0, items * sizeof (double)) ;
cannam@85 355
cannam@85 356 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 357
cannam@85 358 if (sfinfo.format != filetype)
cannam@85 359 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
cannam@85 360 exit (1) ;
cannam@85 361 } ;
cannam@85 362
cannam@85 363 if (sfinfo.frames != items)
cannam@85 364 { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
cannam@85 365 exit (1) ;
cannam@85 366 } ;
cannam@85 367
cannam@85 368 if (sfinfo.channels != 1)
cannam@85 369 { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ;
cannam@85 370 exit (1) ;
cannam@85 371 } ;
cannam@85 372
cannam@85 373 check_log_buffer_or_die (file, __LINE__) ;
cannam@85 374
cannam@85 375 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
cannam@85 376
cannam@85 377 test_read_double_or_die (file, 0, double_in, items, __LINE__) ;
cannam@85 378
cannam@85 379 for (k = 0 ; k < items ; k++)
cannam@85 380 if (fabs (double_out [k] - double_in [k]) > 1e-10)
cannam@85 381 { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ;
cannam@85 382 exit (1) ;
cannam@85 383 } ;
cannam@85 384
cannam@85 385 sf_close (file) ;
cannam@85 386 /* Lite remove end */
cannam@85 387 unlink (filename) ;
cannam@85 388
cannam@85 389 puts ("ok") ;
cannam@85 390 } /* pcm_test_[+ (get "name") +] */
cannam@85 391
cannam@85 392 [+ ENDFOR data_type
cannam@85 393 +]
cannam@85 394
cannam@85 395 /*==============================================================================
cannam@85 396 */
cannam@85 397
cannam@85 398 static void
cannam@85 399 pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float)
cannam@85 400 { SNDFILE *file ;
cannam@85 401 SF_INFO sfinfo ;
cannam@85 402 int k, items, frames ;
cannam@85 403 int sign ;
cannam@85 404 double *data, error ;
cannam@85 405
cannam@85 406 print_test_name (replace_float ? "pcm_test_float (replace)" : "pcm_test_float", filename) ;
cannam@85 407
cannam@85 408 items = BUFFER_SIZE ;
cannam@85 409
cannam@85 410 data = data_out.d ;
cannam@85 411 for (sign = 1, k = 0 ; k < items ; k++)
cannam@85 412 { data [k] = ((double) (k * sign)) / 100.0 ;
cannam@85 413 sign = (sign > 0) ? -1 : 1 ;
cannam@85 414 } ;
cannam@85 415
cannam@85 416 sfinfo.samplerate = 44100 ;
cannam@85 417 sfinfo.frames = items ;
cannam@85 418 sfinfo.channels = 1 ;
cannam@85 419 sfinfo.format = filetype ;
cannam@85 420
cannam@85 421 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 422 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
cannam@85 423 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
cannam@85 424 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
cannam@85 425 dump_log_buffer (file) ;
cannam@85 426 exit (1) ;
cannam@85 427 } ;
cannam@85 428
cannam@85 429 test_write_double_or_die (file, 0, data, items, __LINE__) ;
cannam@85 430
cannam@85 431 sf_close (file) ;
cannam@85 432
cannam@85 433 check_file_hash_or_die (filename, hash, __LINE__) ;
cannam@85 434
cannam@85 435 memset (data, 0, items * sizeof (double)) ;
cannam@85 436
cannam@85 437 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@85 438 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@85 439
cannam@85 440 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 441 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
cannam@85 442 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
cannam@85 443 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
cannam@85 444 dump_log_buffer (file) ;
cannam@85 445 exit (1) ;
cannam@85 446 } ;
cannam@85 447
cannam@85 448 if (sfinfo.format != filetype)
cannam@85 449 { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ;
cannam@85 450 exit (1) ;
cannam@85 451 } ;
cannam@85 452
cannam@85 453 if (sfinfo.frames != items)
cannam@85 454 { 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 455 exit (1) ;
cannam@85 456 } ;
cannam@85 457
cannam@85 458 if (sfinfo.channels != 1)
cannam@85 459 { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ;
cannam@85 460 exit (1) ;
cannam@85 461 } ;
cannam@85 462
cannam@85 463 check_log_buffer_or_die (file, __LINE__) ;
cannam@85 464
cannam@85 465 test_read_double_or_die (file, 0, data, items, __LINE__) ;
cannam@85 466
cannam@85 467 for (sign = -1, k = 0 ; k < items ; k++)
cannam@85 468 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 469 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 470 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 471 exit (1) ;
cannam@85 472 } ;
cannam@85 473 } ;
cannam@85 474
cannam@85 475 /* Seek to start of file. */
cannam@85 476 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
cannam@85 477
cannam@85 478 test_read_double_or_die (file, 0, data, 4, __LINE__) ;
cannam@85 479 for (k = 0 ; k < 4 ; k++)
cannam@85 480 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 481 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 482 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 483 exit (1) ;
cannam@85 484 } ;
cannam@85 485 } ;
cannam@85 486
cannam@85 487 /* Seek to offset from start of file. */
cannam@85 488 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
cannam@85 489
cannam@85 490 test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
cannam@85 491 for (k = 10 ; k < 14 ; k++)
cannam@85 492 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 493 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 494 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 495 exit (1) ;
cannam@85 496 } ;
cannam@85 497 } ;
cannam@85 498
cannam@85 499 /* Seek to offset from current position. */
cannam@85 500 test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
cannam@85 501
cannam@85 502 test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ;
cannam@85 503 for (k = 20 ; k < 24 ; k++)
cannam@85 504 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 505 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 506 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 507 exit (1) ;
cannam@85 508 } ;
cannam@85 509 } ;
cannam@85 510
cannam@85 511 /* Seek to offset from end of file. */
cannam@85 512 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
cannam@85 513
cannam@85 514 test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
cannam@85 515 for (k = 10 ; k < 14 ; k++)
cannam@85 516 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 517 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 518 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 519 exit (1) ;
cannam@85 520 } ;
cannam@85 521 } ;
cannam@85 522
cannam@85 523 sf_close (file) ;
cannam@85 524
cannam@85 525 /* Now test Stereo. */
cannam@85 526
cannam@85 527 if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */
cannam@85 528 { printf ("ok\n") ;
cannam@85 529 return ;
cannam@85 530 } ;
cannam@85 531
cannam@85 532 items = BUFFER_SIZE ;
cannam@85 533
cannam@85 534 data = data_out.d ;
cannam@85 535 for (sign = -1, k = 0 ; k < items ; k++)
cannam@85 536 data [k] = ((double) k) / 100.0 * (sign *= -1) ;
cannam@85 537
cannam@85 538 sfinfo.samplerate = 44100 ;
cannam@85 539 sfinfo.frames = items ;
cannam@85 540 sfinfo.channels = 2 ;
cannam@85 541 sfinfo.format = filetype ;
cannam@85 542
cannam@85 543 frames = items / sfinfo.channels ;
cannam@85 544
cannam@85 545 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 546 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
cannam@85 547 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
cannam@85 548 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
cannam@85 549 dump_log_buffer (file) ;
cannam@85 550 exit (1) ;
cannam@85 551 } ;
cannam@85 552
cannam@85 553 test_writef_double_or_die (file, 0, data, frames, __LINE__) ;
cannam@85 554
cannam@85 555 sf_close (file) ;
cannam@85 556
cannam@85 557 check_file_hash_or_die (filename, hash, __LINE__) ;
cannam@85 558
cannam@85 559 memset (data, 0, items * sizeof (double)) ;
cannam@85 560
cannam@85 561 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@85 562 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@85 563
cannam@85 564 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 565 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
cannam@85 566 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
cannam@85 567 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
cannam@85 568 dump_log_buffer (file) ;
cannam@85 569 exit (1) ;
cannam@85 570 } ;
cannam@85 571
cannam@85 572 if (sfinfo.format != filetype)
cannam@85 573 { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ;
cannam@85 574 exit (1) ;
cannam@85 575 } ;
cannam@85 576
cannam@85 577 if (sfinfo.frames != frames)
cannam@85 578 { 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 579 exit (1) ;
cannam@85 580 } ;
cannam@85 581
cannam@85 582 if (sfinfo.channels != 2)
cannam@85 583 { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ;
cannam@85 584 exit (1) ;
cannam@85 585 } ;
cannam@85 586
cannam@85 587 check_log_buffer_or_die (file, __LINE__) ;
cannam@85 588
cannam@85 589 test_readf_double_or_die (file, 0, data, frames, __LINE__) ;
cannam@85 590 for (sign = -1, k = 0 ; k < items ; k++)
cannam@85 591 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 592 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 593 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 594 exit (1) ;
cannam@85 595 } ;
cannam@85 596 } ;
cannam@85 597
cannam@85 598 /* Seek to start of file. */
cannam@85 599 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
cannam@85 600
cannam@85 601 test_readf_double_or_die (file, 0, data, 4, __LINE__) ;
cannam@85 602 for (k = 0 ; k < 4 ; k++)
cannam@85 603 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 604 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 605 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 606 exit (1) ;
cannam@85 607 } ;
cannam@85 608 } ;
cannam@85 609
cannam@85 610 /* Seek to offset from start of file. */
cannam@85 611 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
cannam@85 612
cannam@85 613 test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ;
cannam@85 614 for (k = 20 ; k < 24 ; k++)
cannam@85 615 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 616 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 617 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 618 exit (1) ;
cannam@85 619 } ;
cannam@85 620 } ;
cannam@85 621
cannam@85 622 /* Seek to offset from current position. */
cannam@85 623 test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
cannam@85 624
cannam@85 625 test_readf_double_or_die (file, 0, data + 40, 2, __LINE__) ;
cannam@85 626 for (k = 40 ; k < 44 ; k++)
cannam@85 627 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 628 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 629 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 630 exit (1) ;
cannam@85 631 } ;
cannam@85 632 } ;
cannam@85 633
cannam@85 634 /* Seek to offset from end of file. */
cannam@85 635 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
cannam@85 636
cannam@85 637 test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ;
cannam@85 638 for (k = 20 ; k < 24 ; k++)
cannam@85 639 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 640 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 641 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 642 exit (1) ;
cannam@85 643 } ;
cannam@85 644 } ;
cannam@85 645
cannam@85 646 sf_close (file) ;
cannam@85 647
cannam@85 648 printf ("ok\n") ;
cannam@85 649 unlink (filename) ;
cannam@85 650 } /* pcm_test_float */
cannam@85 651
cannam@85 652 static void
cannam@85 653 pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float)
cannam@85 654 { SNDFILE *file ;
cannam@85 655 SF_INFO sfinfo ;
cannam@85 656 int k, items, frames ;
cannam@85 657 int sign ;
cannam@85 658 double *data, error ;
cannam@85 659
cannam@85 660 /* This is the best test routine. Other should be brought up to this standard. */
cannam@85 661
cannam@85 662 print_test_name (replace_float ? "pcm_test_double (replace)" : "pcm_test_double", filename) ;
cannam@85 663
cannam@85 664 items = BUFFER_SIZE ;
cannam@85 665
cannam@85 666 data = data_out.d ;
cannam@85 667 for (sign = 1, k = 0 ; k < items ; k++)
cannam@85 668 { data [k] = ((double) (k * sign)) / 100.0 ;
cannam@85 669 sign = (sign > 0) ? -1 : 1 ;
cannam@85 670 } ;
cannam@85 671
cannam@85 672 sfinfo.samplerate = 44100 ;
cannam@85 673 sfinfo.frames = items ;
cannam@85 674 sfinfo.channels = 1 ;
cannam@85 675 sfinfo.format = filetype ;
cannam@85 676
cannam@85 677 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 678 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
cannam@85 679 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
cannam@85 680 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
cannam@85 681 dump_log_buffer (file) ;
cannam@85 682 exit (1) ;
cannam@85 683 } ;
cannam@85 684
cannam@85 685 test_write_double_or_die (file, 0, data, items, __LINE__) ;
cannam@85 686
cannam@85 687 sf_close (file) ;
cannam@85 688
cannam@85 689 #if (defined (WIN32) || defined (_WIN32))
cannam@85 690 /* File hashing on Win32 fails due to slighty different
cannam@85 691 ** calculated values of the sin() function.
cannam@85 692 */
cannam@85 693 hash = hash ; /* Avoid compiler warning. */
cannam@85 694 #else
cannam@85 695 check_file_hash_or_die (filename, hash, __LINE__) ;
cannam@85 696 #endif
cannam@85 697
cannam@85 698 memset (data, 0, items * sizeof (double)) ;
cannam@85 699
cannam@85 700 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@85 701 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@85 702
cannam@85 703 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 704 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
cannam@85 705 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
cannam@85 706 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
cannam@85 707 dump_log_buffer (file) ;
cannam@85 708 exit (1) ;
cannam@85 709 } ;
cannam@85 710
cannam@85 711 if (sfinfo.format != filetype)
cannam@85 712 { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ;
cannam@85 713 exit (1) ;
cannam@85 714 } ;
cannam@85 715
cannam@85 716 if (sfinfo.frames != items)
cannam@85 717 { 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 718 exit (1) ;
cannam@85 719 } ;
cannam@85 720
cannam@85 721 if (sfinfo.channels != 1)
cannam@85 722 { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ;
cannam@85 723 exit (1) ;
cannam@85 724 } ;
cannam@85 725
cannam@85 726 check_log_buffer_or_die (file, __LINE__) ;
cannam@85 727
cannam@85 728 test_read_double_or_die (file, 0, data, items, __LINE__) ;
cannam@85 729
cannam@85 730 for (sign = -1, k = 0 ; k < items ; k++)
cannam@85 731 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 732 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 733 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 734 exit (1) ;
cannam@85 735 } ;
cannam@85 736 } ;
cannam@85 737
cannam@85 738 /* Seek to start of file. */
cannam@85 739 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
cannam@85 740
cannam@85 741 test_read_double_or_die (file, 0, data, 4, __LINE__) ;
cannam@85 742 for (k = 0 ; k < 4 ; k++)
cannam@85 743 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 744 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 745 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 746 exit (1) ;
cannam@85 747 } ;
cannam@85 748 } ;
cannam@85 749
cannam@85 750 /* Seek to offset from start of file. */
cannam@85 751 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
cannam@85 752
cannam@85 753 test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
cannam@85 754
cannam@85 755 test_seek_or_die (file, 0, SEEK_CUR, 14, sfinfo.channels, __LINE__) ;
cannam@85 756
cannam@85 757 for (k = 10 ; k < 14 ; k++)
cannam@85 758 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 759 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 760 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 761 exit (1) ;
cannam@85 762 } ;
cannam@85 763 } ;
cannam@85 764
cannam@85 765 /* Seek to offset from current position. */
cannam@85 766 test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
cannam@85 767
cannam@85 768 test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ;
cannam@85 769 for (k = 20 ; k < 24 ; k++)
cannam@85 770 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 771 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 772 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 773 exit (1) ;
cannam@85 774 } ;
cannam@85 775 } ;
cannam@85 776
cannam@85 777 /* Seek to offset from end of file. */
cannam@85 778 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
cannam@85 779
cannam@85 780 test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
cannam@85 781 for (k = 10 ; k < 14 ; k++)
cannam@85 782 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 783 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 784 { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 785 exit (1) ;
cannam@85 786 } ;
cannam@85 787 } ;
cannam@85 788
cannam@85 789 sf_close (file) ;
cannam@85 790
cannam@85 791 /* Now test Stereo. */
cannam@85 792
cannam@85 793 if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */
cannam@85 794 { printf ("ok\n") ;
cannam@85 795 return ;
cannam@85 796 } ;
cannam@85 797
cannam@85 798 items = BUFFER_SIZE ;
cannam@85 799
cannam@85 800 data = data_out.d ;
cannam@85 801 for (sign = -1, k = 0 ; k < items ; k++)
cannam@85 802 data [k] = ((double) k) / 100.0 * (sign *= -1) ;
cannam@85 803
cannam@85 804 sfinfo.samplerate = 44100 ;
cannam@85 805 sfinfo.frames = items ;
cannam@85 806 sfinfo.channels = 2 ;
cannam@85 807 sfinfo.format = filetype ;
cannam@85 808
cannam@85 809 frames = items / sfinfo.channels ;
cannam@85 810
cannam@85 811 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 812 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
cannam@85 813 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
cannam@85 814 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
cannam@85 815 dump_log_buffer (file) ;
cannam@85 816 exit (1) ;
cannam@85 817 } ;
cannam@85 818
cannam@85 819 test_writef_double_or_die (file, 0, data, frames, __LINE__) ;
cannam@85 820
cannam@85 821 sf_close (file) ;
cannam@85 822
cannam@85 823 #if (defined (WIN32) || defined (_WIN32))
cannam@85 824 /* File hashing on Win32 fails due to slighty different
cannam@85 825 ** calculated values.
cannam@85 826 */
cannam@85 827 hash = hash ; /* Avoid compiler warning. */
cannam@85 828 #else
cannam@85 829 check_file_hash_or_die (filename, hash, __LINE__) ;
cannam@85 830 #endif
cannam@85 831
cannam@85 832 memset (data, 0, items * sizeof (double)) ;
cannam@85 833
cannam@85 834 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@85 835 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@85 836
cannam@85 837 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
cannam@85 838 sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
cannam@85 839 if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
cannam@85 840 { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ;
cannam@85 841 dump_log_buffer (file) ;
cannam@85 842 exit (1) ;
cannam@85 843 } ;
cannam@85 844
cannam@85 845 if (sfinfo.format != filetype)
cannam@85 846 { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ;
cannam@85 847 exit (1) ;
cannam@85 848 } ;
cannam@85 849
cannam@85 850 if (sfinfo.frames != frames)
cannam@85 851 { 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 852 exit (1) ;
cannam@85 853 } ;
cannam@85 854
cannam@85 855 if (sfinfo.channels != 2)
cannam@85 856 { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ;
cannam@85 857 exit (1) ;
cannam@85 858 } ;
cannam@85 859
cannam@85 860 check_log_buffer_or_die (file, __LINE__) ;
cannam@85 861
cannam@85 862 test_readf_double_or_die (file, 0, data, frames, __LINE__) ;
cannam@85 863
cannam@85 864 for (sign = -1, k = 0 ; k < items ; k++)
cannam@85 865 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 866 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 867 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 868 exit (1) ;
cannam@85 869 } ;
cannam@85 870 } ;
cannam@85 871
cannam@85 872 /* Seek to start of file. */
cannam@85 873 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
cannam@85 874
cannam@85 875 test_read_double_or_die (file, 0, data, 4, __LINE__) ;
cannam@85 876 for (k = 0 ; k < 4 ; k++)
cannam@85 877 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 878 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 879 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 880 exit (1) ;
cannam@85 881 } ;
cannam@85 882 } ;
cannam@85 883
cannam@85 884 /* Seek to offset from start of file. */
cannam@85 885 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
cannam@85 886
cannam@85 887 test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
cannam@85 888 for (k = 20 ; k < 24 ; k++)
cannam@85 889 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 890 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 891 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 892 exit (1) ;
cannam@85 893 } ;
cannam@85 894 } ;
cannam@85 895
cannam@85 896 /* Seek to offset from current position. */
cannam@85 897 test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
cannam@85 898
cannam@85 899 test_readf_double_or_die (file, 0, data + 40, 4, __LINE__) ;
cannam@85 900 for (k = 40 ; k < 44 ; k++)
cannam@85 901 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 902 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 903 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 904 exit (1) ;
cannam@85 905 } ;
cannam@85 906 } ;
cannam@85 907
cannam@85 908 /* Seek to offset from end of file. */
cannam@85 909 test_seek_or_die (file, -1 * (sfinfo.frames -10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
cannam@85 910
cannam@85 911 test_readf_double_or_die (file, 0, data + 20, 4, __LINE__) ;
cannam@85 912 for (k = 20 ; k < 24 ; k++)
cannam@85 913 { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
cannam@85 914 if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
cannam@85 915 { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
cannam@85 916 exit (1) ;
cannam@85 917 } ;
cannam@85 918 } ;
cannam@85 919
cannam@85 920 sf_close (file) ;
cannam@85 921
cannam@85 922 printf ("ok\n") ;
cannam@85 923 unlink (filename) ;
cannam@85 924 } /* pcm_test_double */
cannam@85 925
cannam@85 926 /*==============================================================================
cannam@85 927 */