annotate src/libsndfile-1.0.27/tests/pcm_test.tpl @ 148:b4bfdf10c4b3

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