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

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