annotate src/libsndfile-1.0.25/tests/scale_clip_test.c @ 83:ae30d91d2ffe

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