annotate src/libsndfile-1.0.27/tests/lossy_comp_test.c @ 148:b4bfdf10c4b3

Update Win64 capnp builds to v0.6
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 22 May 2017 18:56:49 +0100
parents cd6cdf86811e
children
rev   line source
cannam@125 1 /*
cannam@125 2 ** Copyright (C) 1999-2016 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
cannam@125 28 #if HAVE_UNISTD_H
cannam@125 29 #include <unistd.h>
cannam@125 30 #endif
cannam@125 31
cannam@125 32 #include <sndfile.h>
cannam@125 33
cannam@125 34 #include "utils.h"
cannam@125 35
cannam@125 36 #define BUFFER_SIZE (1 << 14)
cannam@125 37 #define SAMPLE_RATE 11025
cannam@125 38
cannam@125 39 #ifndef M_PI
cannam@125 40 #define M_PI 3.14159265358979323846264338
cannam@125 41 #endif
cannam@125 42
cannam@125 43 #define LCT_MAX(x, y) ((x) > (y) ? (x) : (y))
cannam@125 44
cannam@125 45 static void lcomp_test_short (const char *filename, int filetype, int chan, double margin) ;
cannam@125 46 static void lcomp_test_int (const char *filename, int filetype, int chan, double margin) ;
cannam@125 47 static void lcomp_test_float (const char *filename, int filetype, int chan, double margin) ;
cannam@125 48 static void lcomp_test_double (const char *filename, int filetype, int chan, double margin) ;
cannam@125 49
cannam@125 50 static void sdlcomp_test_short (const char *filename, int filetype, int chan, double margin) ;
cannam@125 51 static void sdlcomp_test_int (const char *filename, int filetype, int chan, double margin) ;
cannam@125 52 static void sdlcomp_test_float (const char *filename, int filetype, int chan, double margin) ;
cannam@125 53 static void sdlcomp_test_double (const char *filename, int filetype, int chan, double margin) ;
cannam@125 54
cannam@125 55 static void read_raw_test (const char *filename, int filetype, int chan) ;
cannam@125 56
cannam@125 57 static int error_function (double data, double orig, double margin) ;
cannam@125 58 static int decay_response (int k) ;
cannam@125 59
cannam@125 60 static void gen_signal_double (double *data, double scale, int channels, int datalen) ;
cannam@125 61
cannam@125 62 static void smoothed_diff_short (short *data, unsigned int datalen) ;
cannam@125 63 static void smoothed_diff_int (int *data, unsigned int datalen) ;
cannam@125 64 static void smoothed_diff_float (float *data, unsigned int datalen) ;
cannam@125 65 static void smoothed_diff_double (double *data, unsigned int datalen) ;
cannam@125 66
cannam@125 67 static void check_comment (SNDFILE * file, int format, int lineno) ;
cannam@125 68
cannam@125 69 static int is_lossy (int filetype) ;
cannam@125 70
cannam@125 71 /*
cannam@125 72 ** Force the start of these buffers to be double aligned. Sparc-solaris will
cannam@125 73 ** choke if they are not.
cannam@125 74 */
cannam@125 75 typedef union
cannam@125 76 { double d [BUFFER_SIZE + 1] ;
cannam@125 77 float f [BUFFER_SIZE + 1] ;
cannam@125 78 int i [BUFFER_SIZE + 1] ;
cannam@125 79 short s [BUFFER_SIZE + 1] ;
cannam@125 80 char c [BUFFER_SIZE + 1] ;
cannam@125 81 } BUFFER ;
cannam@125 82
cannam@125 83 static BUFFER data_buffer ;
cannam@125 84 static BUFFER orig_buffer ;
cannam@125 85 static BUFFER smooth_buffer ;
cannam@125 86
cannam@125 87 static const char *long_comment =
cannam@125 88 "This is really quite a long comment. It is designed to be long enough "
cannam@125 89 "to screw up the encoders and decoders if the file container format does "
cannam@125 90 "not handle things correctly. If everything is working correctly, the "
cannam@125 91 "decoder will only decode the actual audio data, and not this string at "
cannam@125 92 "the end of the file." ;
cannam@125 93
cannam@125 94 int
cannam@125 95 main (int argc, char *argv [])
cannam@125 96 { int do_all = 0 ;
cannam@125 97 int test_count = 0 ;
cannam@125 98
cannam@125 99 if (argc != 2)
cannam@125 100 { printf ("Usage : %s <test>\n", argv [0]) ;
cannam@125 101 printf (" Where <test> is one of the following:\n") ;
cannam@125 102 printf (" wav_ima - test IMA ADPCM WAV file functions\n") ;
cannam@125 103 printf (" wav_msadpcm - test MS ADPCM WAV file functions\n") ;
cannam@125 104 printf (" wav_gsm610 - test GSM 6.10 WAV file functions\n") ;
cannam@125 105 printf (" wav_ulaw - test u-law WAV file functions\n") ;
cannam@125 106 printf (" wav_alaw - test A-law WAV file functions\n") ;
cannam@125 107 printf (" wve - test Psion WVE file functions\n") ;
cannam@125 108 printf (" all - perform all tests\n") ;
cannam@125 109 exit (1) ;
cannam@125 110 } ;
cannam@125 111
cannam@125 112 do_all = ! strcmp (argv [1], "all") ;
cannam@125 113
cannam@125 114 if (do_all || strcmp (argv [1], "wav_pcm") == 0)
cannam@125 115 { /* This is just a sanity test for PCM encoding. */
cannam@125 116 lcomp_test_short ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16, 2, 1e-50) ;
cannam@125 117 lcomp_test_int ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_32, 2, 1e-50) ;
cannam@125 118 lcomp_test_short ("pcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16, 2, 1e-50) ;
cannam@125 119 lcomp_test_int ("pcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_32, 2, 1e-50) ;
cannam@125 120 /* Lite remove start */
cannam@125 121 lcomp_test_float ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT, 2, 1e-50) ;
cannam@125 122 lcomp_test_double ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_DOUBLE, 2, 1e-50) ;
cannam@125 123 /* Lite remove end */
cannam@125 124
cannam@125 125 read_raw_test ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8, 2) ;
cannam@125 126 test_count++ ;
cannam@125 127 } ;
cannam@125 128
cannam@125 129 /* For all the rest, if the file format supports more than 1 channel, use stereo. */
cannam@125 130 /* Lite remove start */
cannam@125 131 if (do_all || strcmp (argv [1], "wav_ima") == 0)
cannam@125 132 { lcomp_test_short ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 133 lcomp_test_int ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.65) ;
cannam@125 134 lcomp_test_float ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 135 lcomp_test_double ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 136
cannam@125 137 lcomp_test_short ("ima.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 138 lcomp_test_int ("ima.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 139 lcomp_test_float ("ima.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 140 lcomp_test_double ("ima.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 141
cannam@125 142 sdlcomp_test_short ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 143 sdlcomp_test_int ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 144 sdlcomp_test_float ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 145 sdlcomp_test_double ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 146 test_count++ ;
cannam@125 147 } ;
cannam@125 148
cannam@125 149 if (do_all || strcmp (argv [1], "wav_msadpcm") == 0)
cannam@125 150 { lcomp_test_short ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 151 lcomp_test_int ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 152 lcomp_test_float ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 153 lcomp_test_double ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 154
cannam@125 155 lcomp_test_short ("msadpcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 156 lcomp_test_int ("msadpcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 157 lcomp_test_float ("msadpcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 158 lcomp_test_double ("msadpcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 159
cannam@125 160 sdlcomp_test_short ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 161 sdlcomp_test_int ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 162 sdlcomp_test_float ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 163 sdlcomp_test_double ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 164
cannam@125 165 test_count++ ;
cannam@125 166 } ;
cannam@125 167
cannam@125 168 if (do_all || strcmp (argv [1], "wav_g721") == 0)
cannam@125 169 { printf ("**** Fix this later : error bound should be 0.06 ****\n") ;
cannam@125 170 lcomp_test_short ("g721.wav", SF_FORMAT_WAV | SF_FORMAT_G721_32, 1, 0.7) ;
cannam@125 171 lcomp_test_int ("g721.wav", SF_FORMAT_WAV | SF_FORMAT_G721_32, 1, 0.7) ;
cannam@125 172
cannam@125 173 lcomp_test_short ("g721.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_G721_32, 1, 0.7) ;
cannam@125 174 lcomp_test_int ("g721.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_G721_32, 1, 0.7) ;
cannam@125 175
cannam@125 176 test_count++ ;
cannam@125 177 } ;
cannam@125 178 /* Lite remove end */
cannam@125 179
cannam@125 180 if (do_all || strcmp (argv [1], "wav_ulaw") == 0)
cannam@125 181 { lcomp_test_short ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 182 lcomp_test_int ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 183
cannam@125 184 lcomp_test_short ("ulaw.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 185 lcomp_test_int ("ulaw.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 186
cannam@125 187 /* Lite remove start */
cannam@125 188 lcomp_test_float ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 189 lcomp_test_double ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 190 /* Lite remove end */
cannam@125 191
cannam@125 192 read_raw_test ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2) ;
cannam@125 193 test_count++ ;
cannam@125 194 } ;
cannam@125 195
cannam@125 196 if (do_all || strcmp (argv [1], "wav_alaw") == 0)
cannam@125 197 { lcomp_test_short ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 198 lcomp_test_int ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 199 /* Lite remove start */
cannam@125 200 lcomp_test_float ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 201 lcomp_test_double ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 202 /* Lite remove end */
cannam@125 203
cannam@125 204 read_raw_test ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2) ;
cannam@125 205 test_count++ ;
cannam@125 206 } ;
cannam@125 207
cannam@125 208 if (do_all || strcmp (argv [1], "wav_gsm610") == 0)
cannam@125 209 { /* Don't do lcomp_test_XXX as the errors are too big. */
cannam@125 210 sdlcomp_test_short ("gsm610.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 211 sdlcomp_test_int ("gsm610.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 212
cannam@125 213 sdlcomp_test_short ("gsm610.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 214 sdlcomp_test_int ("gsm610.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 215
cannam@125 216 /* Lite remove start */
cannam@125 217 sdlcomp_test_float ("gsm610.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 218 sdlcomp_test_double ("gsm610.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 219 /* Lite remove end */
cannam@125 220 test_count++ ;
cannam@125 221 } ;
cannam@125 222
cannam@125 223 if (do_all || strcmp (argv [1], "aiff_ulaw") == 0)
cannam@125 224 { lcomp_test_short ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 225 lcomp_test_int ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 226 /* Lite remove start */
cannam@125 227 lcomp_test_float ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 228 lcomp_test_double ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 229 /* Lite remove end */
cannam@125 230
cannam@125 231 read_raw_test ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2) ;
cannam@125 232 test_count++ ;
cannam@125 233 } ;
cannam@125 234
cannam@125 235 if (do_all || strcmp (argv [1], "aiff_alaw") == 0)
cannam@125 236 { lcomp_test_short ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 237 lcomp_test_int ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 238 /* Lite remove start */
cannam@125 239 lcomp_test_float ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 240 lcomp_test_double ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 241 /* Lite remove end */
cannam@125 242
cannam@125 243 read_raw_test ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2) ;
cannam@125 244 test_count++ ;
cannam@125 245 } ;
cannam@125 246
cannam@125 247 if (do_all || strcmp (argv [1], "aiff_gsm610") == 0)
cannam@125 248 { /* Don't do lcomp_test_XXX as the errors are too big. */
cannam@125 249 sdlcomp_test_short ("gsm610.aiff", SF_FORMAT_AIFF | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 250 sdlcomp_test_int ("gsm610.aiff", SF_FORMAT_AIFF | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 251 /* Lite remove start */
cannam@125 252 sdlcomp_test_float ("gsm610.aiff", SF_FORMAT_AIFF | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 253 sdlcomp_test_double ("gsm610.aiff", SF_FORMAT_AIFF | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 254 /* Lite remove end */
cannam@125 255 test_count++ ;
cannam@125 256 } ;
cannam@125 257
cannam@125 258 if (strcmp (argv [1], "aiff_ima") == 0)
cannam@125 259 { lcomp_test_short ("ima.aiff", SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 260 lcomp_test_int ("ima.aiff", SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 261 /* Lite remove start */
cannam@125 262 lcomp_test_float ("ima.aiff", SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 263 lcomp_test_double ("ima.aiff", SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 264 /* Lite remove end */
cannam@125 265 } ;
cannam@125 266
cannam@125 267 if (do_all || strcmp (argv [1], "au_ulaw") == 0)
cannam@125 268 { lcomp_test_short ("ulaw.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 269 lcomp_test_int ("ulaw.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 270 /* Lite remove start */
cannam@125 271 lcomp_test_float ("ulaw.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 272 lcomp_test_double ("ulaw.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 273 /* Lite remove end */
cannam@125 274 test_count++ ;
cannam@125 275 } ;
cannam@125 276
cannam@125 277 if (do_all || strcmp (argv [1], "au_alaw") == 0)
cannam@125 278 { lcomp_test_short ("alaw.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 279 lcomp_test_int ("alaw.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 280 /* Lite remove start */
cannam@125 281 lcomp_test_float ("alaw.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 282 lcomp_test_double ("alaw.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 283 /* Lite remove end */
cannam@125 284 test_count++ ;
cannam@125 285 } ;
cannam@125 286
cannam@125 287 /* Lite remove start */
cannam@125 288 if (do_all || strcmp (argv [1], "au_g721") == 0)
cannam@125 289 { printf ("**** Fix this later : error bound should be 0.06 ****\n") ;
cannam@125 290 lcomp_test_short ("g721.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.7) ;
cannam@125 291 lcomp_test_int ("g721.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.7) ;
cannam@125 292 lcomp_test_float ("g721.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.7) ;
cannam@125 293 lcomp_test_double ("g721.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.7) ;
cannam@125 294
cannam@125 295 /*- sdlcomp_test_short ("g721.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.07) ;
cannam@125 296 sdlcomp_test_int ("g721.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.07) ;
cannam@125 297 sdlcomp_test_float ("g721.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.07) ;
cannam@125 298 sdlcomp_test_double ("g721.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.12) ;
cannam@125 299 -*/
cannam@125 300 test_count++ ;
cannam@125 301 } ;
cannam@125 302
cannam@125 303 if (do_all || strcmp (argv [1], "au_g723") == 0)
cannam@125 304 { printf ("**** Fix this later : error bound should be 0.16 ****\n") ;
cannam@125 305 lcomp_test_short ("g723_24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.7) ;
cannam@125 306 lcomp_test_int ("g723_24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.7) ;
cannam@125 307 lcomp_test_float ("g723_24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.7) ;
cannam@125 308 lcomp_test_double ("g723_24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.7) ;
cannam@125 309
cannam@125 310 lcomp_test_short ("g723_40.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_40, 1, 0.85) ;
cannam@125 311 lcomp_test_int ("g723_40.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_40, 1, 0.84) ;
cannam@125 312 lcomp_test_float ("g723_40.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_40, 1, 0.86) ;
cannam@125 313 lcomp_test_double ("g723_40.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_40, 1, 0.86) ;
cannam@125 314
cannam@125 315 /*- sdlcomp_test_short ("g723.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.15) ;
cannam@125 316 sdlcomp_test_int ("g723.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.15) ;
cannam@125 317 sdlcomp_test_float ("g723.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.15) ;
cannam@125 318 sdlcomp_test_double ("g723.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.15) ;
cannam@125 319 -*/
cannam@125 320 test_count++ ;
cannam@125 321 } ;
cannam@125 322 /* Lite remove end */
cannam@125 323
cannam@125 324 if (do_all || strcmp (argv [1], "caf_ulaw") == 0)
cannam@125 325 { lcomp_test_short ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 326 lcomp_test_int ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 327 /* Lite remove start */
cannam@125 328 lcomp_test_float ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 329 lcomp_test_double ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 330 /* Lite remove end */
cannam@125 331
cannam@125 332 read_raw_test ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2) ;
cannam@125 333 test_count++ ;
cannam@125 334 } ;
cannam@125 335
cannam@125 336 if (do_all || strcmp (argv [1], "caf_alaw") == 0)
cannam@125 337 { lcomp_test_short ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 338 lcomp_test_int ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 339 /* Lite remove start */
cannam@125 340 lcomp_test_float ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 341 lcomp_test_double ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 342 /* Lite remove end */
cannam@125 343
cannam@125 344 read_raw_test ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2) ;
cannam@125 345 test_count++ ;
cannam@125 346 } ;
cannam@125 347
cannam@125 348
cannam@125 349 if (do_all || strcmp (argv [1], "raw_ulaw") == 0)
cannam@125 350 { lcomp_test_short ("ulaw.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 351 lcomp_test_int ("ulaw.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 352 /* Lite remove start */
cannam@125 353 lcomp_test_float ("ulaw.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 354 lcomp_test_double ("ulaw.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 355 /* Lite remove end */
cannam@125 356 test_count++ ;
cannam@125 357 } ;
cannam@125 358
cannam@125 359 if (do_all || strcmp (argv [1], "raw_alaw") == 0)
cannam@125 360 { lcomp_test_short ("alaw.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 361 lcomp_test_int ("alaw.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 362 /* Lite remove start */
cannam@125 363 lcomp_test_float ("alaw.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 364 lcomp_test_double ("alaw.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 365 /* Lite remove end */
cannam@125 366 test_count++ ;
cannam@125 367 } ;
cannam@125 368
cannam@125 369 if (do_all || strcmp (argv [1], "raw_gsm610") == 0)
cannam@125 370 { /* Don't do lcomp_test_XXX as the errors are too big. */
cannam@125 371 sdlcomp_test_short ("raw.gsm", SF_FORMAT_RAW | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 372 sdlcomp_test_int ("raw.gsm", SF_FORMAT_RAW | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 373 sdlcomp_test_float ("raw.gsm", SF_FORMAT_RAW | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 374 sdlcomp_test_double ("raw.gsm", SF_FORMAT_RAW | SF_FORMAT_GSM610, 1, 0.24) ;
cannam@125 375 test_count++ ;
cannam@125 376 } ;
cannam@125 377
cannam@125 378 if (do_all || strcmp (argv [1], "ogg_vorbis") == 0)
cannam@125 379 { if (HAVE_EXTERNAL_XIPH_LIBS)
cannam@125 380 { /* Don't do lcomp_test_XXX as the errors are too big. */
cannam@125 381 sdlcomp_test_short ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS, 1, 0.30) ;
cannam@125 382 sdlcomp_test_int ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS, 1, 0.30) ;
cannam@125 383 sdlcomp_test_float ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS, 1, 0.30) ;
cannam@125 384 sdlcomp_test_double ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS, 1, 0.30) ;
cannam@125 385 }
cannam@125 386 else
cannam@125 387 puts (" No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ;
cannam@125 388
cannam@125 389 test_count++ ;
cannam@125 390 } ;
cannam@125 391
cannam@125 392 /* Lite remove start */
cannam@125 393 if (do_all || strcmp (argv [1], "ircam_ulaw") == 0)
cannam@125 394 { lcomp_test_short ("ulaw.ircam", SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 395 lcomp_test_int ("ulaw.ircam", SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 396 lcomp_test_float ("ulaw.ircam", SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 397 lcomp_test_double ("ulaw.ircam", SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 398 test_count++ ;
cannam@125 399 } ;
cannam@125 400
cannam@125 401 if (do_all || strcmp (argv [1], "ircam_alaw") == 0)
cannam@125 402 { lcomp_test_short ("alaw.ircam", SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 403 lcomp_test_int ("alaw.ircam", SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 404 lcomp_test_float ("alaw.ircam", SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 405 lcomp_test_double ("alaw.ircam", SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 406 test_count++ ;
cannam@125 407 } ;
cannam@125 408
cannam@125 409 if (do_all || strcmp (argv [1], "nist_ulaw") == 0)
cannam@125 410 { lcomp_test_short ("ulaw.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 411 lcomp_test_int ("ulaw.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 412 lcomp_test_float ("ulaw.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 413 lcomp_test_double ("ulaw.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 414 test_count++ ;
cannam@125 415 } ;
cannam@125 416
cannam@125 417 if (do_all || strcmp (argv [1], "nist_alaw") == 0)
cannam@125 418 { lcomp_test_short ("alaw.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 419 lcomp_test_int ("alaw.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 420 lcomp_test_float ("alaw.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 421 lcomp_test_double ("alaw.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 422 test_count++ ;
cannam@125 423 } ;
cannam@125 424
cannam@125 425 if (do_all || strcmp (argv [1], "voc_ulaw") == 0)
cannam@125 426 { lcomp_test_short ("ulaw.voc", SF_FORMAT_VOC | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 427 lcomp_test_int ("ulaw.voc", SF_FORMAT_VOC | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 428 lcomp_test_float ("ulaw.voc", SF_FORMAT_VOC | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 429 lcomp_test_double ("ulaw.voc", SF_FORMAT_VOC | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 430 test_count++ ;
cannam@125 431 } ;
cannam@125 432
cannam@125 433 if (do_all || strcmp (argv [1], "voc_alaw") == 0)
cannam@125 434 { lcomp_test_short ("alaw.voc", SF_FORMAT_VOC | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 435 lcomp_test_int ("alaw.voc", SF_FORMAT_VOC | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 436 lcomp_test_float ("alaw.voc", SF_FORMAT_VOC | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 437 lcomp_test_double ("alaw.voc", SF_FORMAT_VOC | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 438 test_count++ ;
cannam@125 439 } ;
cannam@125 440 /* Lite remove end */
cannam@125 441
cannam@125 442 if (do_all || strcmp (argv [1], "w64_ulaw") == 0)
cannam@125 443 { lcomp_test_short ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 444 lcomp_test_int ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 445 /* Lite remove start */
cannam@125 446 lcomp_test_float ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 447 lcomp_test_double ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2, 0.04) ;
cannam@125 448 /* Lite remove end */
cannam@125 449
cannam@125 450 read_raw_test ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2) ;
cannam@125 451 test_count++ ;
cannam@125 452 } ;
cannam@125 453
cannam@125 454 if (do_all || strcmp (argv [1], "w64_alaw") == 0)
cannam@125 455 { lcomp_test_short ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 456 lcomp_test_int ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 457 /* Lite remove start */
cannam@125 458 lcomp_test_float ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 459 lcomp_test_double ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2, 0.04) ;
cannam@125 460 /* Lite remove end */
cannam@125 461
cannam@125 462 read_raw_test ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2) ;
cannam@125 463 test_count++ ;
cannam@125 464 } ;
cannam@125 465
cannam@125 466 /* Lite remove start */
cannam@125 467 if (do_all || strcmp (argv [1], "w64_ima") == 0)
cannam@125 468 { lcomp_test_short ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 469 lcomp_test_int ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 470 lcomp_test_float ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 471 lcomp_test_double ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 472
cannam@125 473 sdlcomp_test_short ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 474 sdlcomp_test_int ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 475 sdlcomp_test_float ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 476 sdlcomp_test_double ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ;
cannam@125 477 test_count++ ;
cannam@125 478 } ;
cannam@125 479
cannam@125 480 if (do_all || strcmp (argv [1], "w64_msadpcm") == 0)
cannam@125 481 { lcomp_test_short ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 482 lcomp_test_int ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 483 lcomp_test_float ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 484 lcomp_test_double ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 485
cannam@125 486 sdlcomp_test_short ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 487 sdlcomp_test_int ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 488 sdlcomp_test_float ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 489 sdlcomp_test_double ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ;
cannam@125 490 test_count++ ;
cannam@125 491 } ;
cannam@125 492
cannam@125 493 if (do_all || strcmp (argv [1], "wve") == 0)
cannam@125 494 { lcomp_test_short ("psion.wve", SF_FORMAT_WVE | SF_FORMAT_ALAW, 1, 0.04) ;
cannam@125 495 lcomp_test_int ("psion.wve", SF_FORMAT_WVE | SF_FORMAT_ALAW, 1, 0.04) ;
cannam@125 496 /* Lite remove start */
cannam@125 497 lcomp_test_float ("psion.wve", SF_FORMAT_WVE | SF_FORMAT_ALAW, 1, 0.04) ;
cannam@125 498 lcomp_test_double ("psion.wve", SF_FORMAT_WVE | SF_FORMAT_ALAW, 1, 0.04) ;
cannam@125 499 /* Lite remove end */
cannam@125 500 test_count++ ;
cannam@125 501 } ;
cannam@125 502
cannam@125 503 /* Lite remove end */
cannam@125 504
cannam@125 505 if (do_all || strcmp (argv [1], "w64_gsm610") == 0)
cannam@125 506 { /* Don't do lcomp_test_XXX as the errors are too big. */
cannam@125 507 sdlcomp_test_short ("gsm610.w64", SF_FORMAT_W64 | SF_FORMAT_GSM610, 1, 0.2) ;
cannam@125 508 sdlcomp_test_int ("gsm610.w64", SF_FORMAT_W64 | SF_FORMAT_GSM610, 1, 0.2) ;
cannam@125 509 /* Lite remove start */
cannam@125 510 sdlcomp_test_float ("gsm610.w64", SF_FORMAT_W64 | SF_FORMAT_GSM610, 1, 0.2) ;
cannam@125 511 sdlcomp_test_double ("gsm610.w64", SF_FORMAT_W64 | SF_FORMAT_GSM610, 1, 0.2) ;
cannam@125 512 /* Lite remove end */
cannam@125 513 test_count++ ;
cannam@125 514 } ;
cannam@125 515
cannam@125 516 /* Lite remove start */
cannam@125 517 if (do_all || strcmp (argv [1], "vox_adpcm") == 0)
cannam@125 518 { lcomp_test_short ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.17) ;
cannam@125 519 lcomp_test_int ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.17) ;
cannam@125 520 lcomp_test_float ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.17) ;
cannam@125 521 lcomp_test_double ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.17) ;
cannam@125 522
cannam@125 523 sdlcomp_test_short ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.072) ;
cannam@125 524 sdlcomp_test_int ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.072) ;
cannam@125 525 sdlcomp_test_float ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.072) ;
cannam@125 526 sdlcomp_test_double ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.072) ;
cannam@125 527 test_count++ ;
cannam@125 528 } ;
cannam@125 529
cannam@125 530 if (do_all || strcmp (argv [1], "xi_dpcm") == 0)
cannam@125 531 { lcomp_test_short ("8bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_8, 1, 0.25) ;
cannam@125 532 lcomp_test_int ("8bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_8, 1, 0.25) ;
cannam@125 533
cannam@125 534 lcomp_test_short ("16bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16, 1, 0.002) ;
cannam@125 535 lcomp_test_int ("16bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16, 1, 0.002) ;
cannam@125 536 lcomp_test_float ("16bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16, 1, 0.002) ;
cannam@125 537 lcomp_test_double ("16bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16, 1, 0.002) ;
cannam@125 538 test_count++ ;
cannam@125 539 } ;
cannam@125 540 /* Lite remove end */
cannam@125 541
cannam@125 542 if (test_count == 0)
cannam@125 543 { printf ("************************************\n") ;
cannam@125 544 printf ("* No '%s' test defined.\n", argv [1]) ;
cannam@125 545 printf ("************************************\n") ;
cannam@125 546 return 1 ;
cannam@125 547 } ;
cannam@125 548
cannam@125 549 return 0 ;
cannam@125 550 } /* main */
cannam@125 551
cannam@125 552 /*============================================================================================
cannam@125 553 ** Here are the test functions.
cannam@125 554 */
cannam@125 555
cannam@125 556 static void
cannam@125 557 lcomp_test_short (const char *filename, int filetype, int channels, double margin)
cannam@125 558 { SNDFILE *file ;
cannam@125 559 SF_INFO sfinfo ;
cannam@125 560 int k, m, seekpos, half_max_abs ;
cannam@125 561 sf_count_t datalen ;
cannam@125 562 short *orig, *data ;
cannam@125 563
cannam@125 564 print_test_name ("lcomp_test_short", filename) ;
cannam@125 565
cannam@125 566 datalen = BUFFER_SIZE / channels ;
cannam@125 567
cannam@125 568 data = data_buffer.s ;
cannam@125 569 orig = orig_buffer.s ;
cannam@125 570
cannam@125 571 gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ;
cannam@125 572 for (k = 0 ; k < channels * datalen ; k++)
cannam@125 573 orig [k] = (short) (orig_buffer.d [k]) ;
cannam@125 574
cannam@125 575 sfinfo.samplerate = SAMPLE_RATE ;
cannam@125 576 sfinfo.frames = 123456789 ; /* Ridiculous value. */
cannam@125 577 sfinfo.channels = channels ;
cannam@125 578 sfinfo.format = filetype ;
cannam@125 579
cannam@125 580 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 581 test_writef_short_or_die (file, 0, orig, datalen, __LINE__) ;
cannam@125 582 sf_set_string (file, SF_STR_COMMENT, long_comment) ;
cannam@125 583 sf_close (file) ;
cannam@125 584
cannam@125 585 memset (data, 0, datalen * sizeof (short)) ;
cannam@125 586
cannam@125 587 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@125 588 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@125 589
cannam@125 590 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 591
cannam@125 592 if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)))
cannam@125 593 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
cannam@125 594 exit (1) ;
cannam@125 595 } ;
cannam@125 596
cannam@125 597 if (sfinfo.frames < datalen / channels)
cannam@125 598 { printf ("Too few frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
cannam@125 599 exit (1) ;
cannam@125 600 } ;
cannam@125 601
cannam@125 602 if (sfinfo.frames > (datalen + datalen / 20))
cannam@125 603 { printf ("Too many frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
cannam@125 604 exit (1) ;
cannam@125 605 } ;
cannam@125 606
cannam@125 607 if (sfinfo.channels != channels)
cannam@125 608 { printf ("Incorrect number of channels in file.\n") ;
cannam@125 609 exit (1) ;
cannam@125 610 } ;
cannam@125 611
cannam@125 612 check_log_buffer_or_die (file, __LINE__) ;
cannam@125 613
cannam@125 614 check_comment (file, filetype, __LINE__) ;
cannam@125 615
cannam@125 616 test_readf_short_or_die (file, 0, data, datalen, __LINE__) ;
cannam@125 617
cannam@125 618 half_max_abs = 0 ;
cannam@125 619 for (k = 0 ; k < datalen ; k++)
cannam@125 620 { if (error_function (data [k], orig [k], margin))
cannam@125 621 { printf ("\n\nLine %d: Incorrect sample A (#%d : %d should be %d).\n", __LINE__, k, data [k], orig [k]) ;
cannam@125 622 oct_save_short (orig, data, datalen) ;
cannam@125 623 exit (1) ;
cannam@125 624 } ;
cannam@125 625 half_max_abs = LCT_MAX (half_max_abs, abs (data [k] / 2)) ;
cannam@125 626 } ;
cannam@125 627
cannam@125 628 if (half_max_abs < 1.0)
cannam@125 629 { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ;
cannam@125 630 exit (1) ;
cannam@125 631 } ;
cannam@125 632
cannam@125 633 if ((k = sf_readf_short (file, data, datalen)) != sfinfo.frames - datalen)
cannam@125 634 { printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__,
cannam@125 635 channels * sfinfo.frames - datalen, k) ;
cannam@125 636 exit (1) ;
cannam@125 637 } ;
cannam@125 638
cannam@125 639 /* This check is only for block based encoders which must append silence
cannam@125 640 ** to the end of a file so as to fill out a block.
cannam@125 641 */
cannam@125 642 for (k = 0 ; k < sfinfo.frames - datalen ; k++)
cannam@125 643 if (abs (data [channels * k]) > decay_response (channels * k))
cannam@125 644 { printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%d) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ;
cannam@125 645 exit (1) ;
cannam@125 646 } ;
cannam@125 647
cannam@125 648 if (! sfinfo.seekable)
cannam@125 649 { sf_close (file) ;
cannam@125 650 unlink (filename) ;
cannam@125 651 printf ("ok\n") ;
cannam@125 652 return ;
cannam@125 653 } ;
cannam@125 654
cannam@125 655 /* Now test sf_seek function. */
cannam@125 656
cannam@125 657 if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
cannam@125 658 { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ;
cannam@125 659 exit (1) ;
cannam@125 660 } ;
cannam@125 661
cannam@125 662 for (m = 0 ; m < 3 ; m++)
cannam@125 663 { test_readf_short_or_die (file, m, data, 11, __LINE__) ;
cannam@125 664
cannam@125 665 for (k = 0 ; k < channels * 11 ; k++)
cannam@125 666 if (error_function (1.0 * data [k], 1.0 * orig [k + channels * m * 11], margin))
cannam@125 667 { printf ("\n\nLine %d: Incorrect sample (m = %d) (#%d : %d => %d).\n", __LINE__, m, k + channels * m * 11, orig [k + channels * m * 11], data [k]) ;
cannam@125 668 for (m = 0 ; m < channels ; m++)
cannam@125 669 printf ("%d ", data [m]) ;
cannam@125 670 printf ("\n") ;
cannam@125 671 exit (1) ;
cannam@125 672 } ;
cannam@125 673 } ;
cannam@125 674
cannam@125 675 seekpos = BUFFER_SIZE / 10 ;
cannam@125 676
cannam@125 677 /* Check seek from start of file. */
cannam@125 678 if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
cannam@125 679 { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
cannam@125 680 exit (1) ;
cannam@125 681 } ;
cannam@125 682
cannam@125 683 test_readf_short_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 684
cannam@125 685 if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin))
cannam@125 686 { printf ("\n\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_short failed (%d, %d).\n", __LINE__, orig [1], data [0]) ;
cannam@125 687 exit (1) ;
cannam@125 688 } ;
cannam@125 689
cannam@125 690 if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
cannam@125 691 { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ;
cannam@125 692 exit (1) ;
cannam@125 693 } ;
cannam@125 694
cannam@125 695 seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
cannam@125 696 k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
cannam@125 697 test_readf_short_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 698 if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos)
cannam@125 699 { printf ("\n\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_short failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ;
cannam@125 700 oct_save_short (orig, data, datalen) ;
cannam@125 701 exit (1) ;
cannam@125 702 } ;
cannam@125 703
cannam@125 704 seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
cannam@125 705 /* Check seek backward from current position. */
cannam@125 706 k = sf_seek (file, -20, SEEK_CUR) ;
cannam@125 707 test_readf_short_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 708 if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos)
cannam@125 709 { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_short failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ;
cannam@125 710 exit (1) ;
cannam@125 711 } ;
cannam@125 712
cannam@125 713 /* Check that read past end of file returns number of items. */
cannam@125 714 sf_seek (file, sfinfo.frames, SEEK_SET) ;
cannam@125 715
cannam@125 716 if ((k = sf_readf_short (file, data, datalen)) != 0)
cannam@125 717 { printf ("\n\nLine %d: Return value from sf_readf_short past end of file incorrect (%d).\n", __LINE__, k) ;
cannam@125 718 exit (1) ;
cannam@125 719 } ;
cannam@125 720
cannam@125 721 /* Check seek backward from end. */
cannam@125 722 if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5)
cannam@125 723 { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ;
cannam@125 724 exit (1) ;
cannam@125 725 } ;
cannam@125 726
cannam@125 727 test_readf_short_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 728 if (error_function (1.0 * data [0], 1.0 * orig [5 * channels], margin))
cannam@125 729 { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%d should be %d).\n", __LINE__, data [0], orig [5 * channels]) ;
cannam@125 730 exit (1) ;
cannam@125 731 } ;
cannam@125 732
cannam@125 733 sf_close (file) ;
cannam@125 734
cannam@125 735 unlink (filename) ;
cannam@125 736 printf ("ok\n") ;
cannam@125 737 } /* lcomp_test_short */
cannam@125 738
cannam@125 739 /*--------------------------------------------------------------------------------------------
cannam@125 740 */
cannam@125 741
cannam@125 742 static void
cannam@125 743 lcomp_test_int (const char *filename, int filetype, int channels, double margin)
cannam@125 744 { SNDFILE *file ;
cannam@125 745 SF_INFO sfinfo ;
cannam@125 746 int k, m, half_max_abs ;
cannam@125 747 sf_count_t datalen, seekpos ;
cannam@125 748 double scale, max_val ;
cannam@125 749 int *orig, *data ;
cannam@125 750
cannam@125 751 print_test_name ("lcomp_test_int", filename) ;
cannam@125 752
cannam@125 753 datalen = BUFFER_SIZE / channels ;
cannam@125 754
cannam@125 755 if (is_lossy (filetype))
cannam@125 756 { scale = 1.0 * 0x10000 ;
cannam@125 757 max_val = 32000.0 * scale ;
cannam@125 758 }
cannam@125 759 else
cannam@125 760 { scale = 1.0 ;
cannam@125 761 max_val = 0x7fffffff * scale ;
cannam@125 762 } ;
cannam@125 763
cannam@125 764 data = data_buffer.i ;
cannam@125 765 orig = orig_buffer.i ;
cannam@125 766
cannam@125 767 gen_signal_double (orig_buffer.d, max_val, channels, datalen) ;
cannam@125 768
cannam@125 769 for (k = 0 ; k < channels * datalen ; k++)
cannam@125 770 orig [k] = lrint (orig_buffer.d [k]) ;
cannam@125 771
cannam@125 772 sfinfo.samplerate = SAMPLE_RATE ;
cannam@125 773 sfinfo.frames = 123456789 ; /* Ridiculous value. */
cannam@125 774 sfinfo.channels = channels ;
cannam@125 775 sfinfo.format = filetype ;
cannam@125 776
cannam@125 777 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 778 test_writef_int_or_die (file, 0, orig, datalen, __LINE__) ;
cannam@125 779 sf_set_string (file, SF_STR_COMMENT, long_comment) ;
cannam@125 780 sf_close (file) ;
cannam@125 781
cannam@125 782 memset (data, 0, datalen * sizeof (int)) ;
cannam@125 783
cannam@125 784 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@125 785 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@125 786
cannam@125 787 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 788
cannam@125 789 if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)))
cannam@125 790 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
cannam@125 791 exit (1) ;
cannam@125 792 } ;
cannam@125 793
cannam@125 794 if (sfinfo.frames < datalen / channels)
cannam@125 795 { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
cannam@125 796 exit (1) ;
cannam@125 797 } ;
cannam@125 798
cannam@125 799 if (sfinfo.frames > (datalen + datalen / 20))
cannam@125 800 { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
cannam@125 801 exit (1) ;
cannam@125 802 } ;
cannam@125 803
cannam@125 804 if (sfinfo.channels != channels)
cannam@125 805 { printf ("Incorrect number of channels in file.\n") ;
cannam@125 806 exit (1) ;
cannam@125 807 } ;
cannam@125 808
cannam@125 809 check_log_buffer_or_die (file, __LINE__) ;
cannam@125 810
cannam@125 811 check_comment (file, filetype, __LINE__) ;
cannam@125 812
cannam@125 813 test_readf_int_or_die (file, 0, data, datalen, __LINE__) ;
cannam@125 814
cannam@125 815 half_max_abs = 0 ;
cannam@125 816 for (k = 0 ; k < datalen ; k++)
cannam@125 817 { if (error_function (data [k] / scale, orig [k] / scale, margin))
cannam@125 818 { printf ("\nLine %d: Incorrect sample (#%d : %f should be %f).\n", __LINE__, k, data [k] / scale, orig [k] / scale) ;
cannam@125 819 oct_save_int (orig, data, datalen) ;
cannam@125 820 exit (1) ;
cannam@125 821 } ;
cannam@125 822 half_max_abs = LCT_MAX (half_max_abs, abs (data [k] / 2)) ;
cannam@125 823 } ;
cannam@125 824
cannam@125 825 if (half_max_abs < 1.0)
cannam@125 826 { printf ("\n\nLine %d: Signal is all zeros (%d, 0x%X).\n", __LINE__, half_max_abs, half_max_abs) ;
cannam@125 827 exit (1) ;
cannam@125 828 } ;
cannam@125 829
cannam@125 830 if ((k = sf_readf_int (file, data, datalen)) != sfinfo.frames - datalen)
cannam@125 831 { printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__,
cannam@125 832 channels * sfinfo.frames - datalen, k) ;
cannam@125 833 exit (1) ;
cannam@125 834 } ;
cannam@125 835
cannam@125 836 /* This check is only for block based encoders which must append silence
cannam@125 837 ** to the end of a file so as to fill out a block.
cannam@125 838 */
cannam@125 839 if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM)
cannam@125 840 for (k = 0 ; k < sfinfo.frames - datalen ; k++)
cannam@125 841 if (ABS (data [channels * k] / scale) > decay_response (channels * k))
cannam@125 842 { printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%d) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ;
cannam@125 843 exit (1) ;
cannam@125 844 } ;
cannam@125 845
cannam@125 846 if (! sfinfo.seekable)
cannam@125 847 { sf_close (file) ;
cannam@125 848 unlink (filename) ;
cannam@125 849 printf ("ok\n") ;
cannam@125 850 return ;
cannam@125 851 } ;
cannam@125 852
cannam@125 853 /* Now test sf_seek function. */
cannam@125 854
cannam@125 855 if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
cannam@125 856 { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ;
cannam@125 857 exit (1) ;
cannam@125 858 } ;
cannam@125 859
cannam@125 860 for (m = 0 ; m < 3 ; m++)
cannam@125 861 { test_readf_int_or_die (file, m, data, 11, __LINE__) ;
cannam@125 862
cannam@125 863 for (k = 0 ; k < channels * 11 ; k++)
cannam@125 864 if (error_function (data [k] / scale, orig [k + channels * m * 11] / scale, margin))
cannam@125 865 { printf ("\nLine %d: Incorrect sample (m = %d) (#%d : %d => %d).\n", __LINE__, m, k + channels * m * 11, orig [k + channels * m * 11], data [k]) ;
cannam@125 866 for (m = 0 ; m < channels ; m++)
cannam@125 867 printf ("%d ", data [m]) ;
cannam@125 868 printf ("\n") ;
cannam@125 869 exit (1) ;
cannam@125 870 } ;
cannam@125 871 } ;
cannam@125 872
cannam@125 873 seekpos = BUFFER_SIZE / 10 ;
cannam@125 874
cannam@125 875 /* Check seek from start of file. */
cannam@125 876 if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
cannam@125 877 { printf ("Seek to start of file + %" PRId64 " failed (%d).\n", seekpos, k) ;
cannam@125 878 exit (1) ;
cannam@125 879 } ;
cannam@125 880
cannam@125 881 test_readf_int_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 882
cannam@125 883 if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin))
cannam@125 884 { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_int failed (%d, %d).\n", __LINE__, orig [1], data [0]) ;
cannam@125 885 exit (1) ;
cannam@125 886 } ;
cannam@125 887
cannam@125 888 if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
cannam@125 889 { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %" PRId64 ")\n", __LINE__, k, seekpos + 1) ;
cannam@125 890 exit (1) ;
cannam@125 891 } ;
cannam@125 892
cannam@125 893 seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
cannam@125 894 k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
cannam@125 895 test_readf_int_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 896 if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos)
cannam@125 897 { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ;
cannam@125 898 exit (1) ;
cannam@125 899 } ;
cannam@125 900
cannam@125 901 seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
cannam@125 902 /* Check seek backward from current position. */
cannam@125 903 k = sf_seek (file, -20, SEEK_CUR) ;
cannam@125 904 test_readf_int_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 905 if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos)
cannam@125 906 { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ;
cannam@125 907 exit (1) ;
cannam@125 908 } ;
cannam@125 909
cannam@125 910 /* Check that read past end of file returns number of items. */
cannam@125 911 sf_seek (file, sfinfo.frames, SEEK_SET) ;
cannam@125 912
cannam@125 913 if ((k = sf_readf_int (file, data, datalen)) != 0)
cannam@125 914 { printf ("\n\nLine %d: Return value from sf_readf_int past end of file incorrect (%d).\n", __LINE__, k) ;
cannam@125 915 exit (1) ;
cannam@125 916 } ;
cannam@125 917
cannam@125 918 /* Check seek backward from end. */
cannam@125 919 if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5)
cannam@125 920 { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ;
cannam@125 921 exit (1) ;
cannam@125 922 } ;
cannam@125 923
cannam@125 924 test_readf_int_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 925 if (error_function (data [0] / scale, orig [5 * channels] / scale, margin))
cannam@125 926 { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%d should be %d).\n", __LINE__, data [0], orig [5]) ;
cannam@125 927 exit (1) ;
cannam@125 928 } ;
cannam@125 929
cannam@125 930 sf_close (file) ;
cannam@125 931
cannam@125 932 unlink (filename) ;
cannam@125 933 printf ("ok\n") ;
cannam@125 934 } /* lcomp_test_int */
cannam@125 935
cannam@125 936 /*--------------------------------------------------------------------------------------------
cannam@125 937 */
cannam@125 938
cannam@125 939 static void
cannam@125 940 lcomp_test_float (const char *filename, int filetype, int channels, double margin)
cannam@125 941 { SNDFILE *file ;
cannam@125 942 SF_INFO sfinfo ;
cannam@125 943 int k, m, seekpos ;
cannam@125 944 sf_count_t datalen ;
cannam@125 945 float *orig, *data ;
cannam@125 946 double half_max_abs ;
cannam@125 947
cannam@125 948 print_test_name ("lcomp_test_float", filename) ;
cannam@125 949
cannam@125 950 datalen = BUFFER_SIZE / channels ;
cannam@125 951
cannam@125 952 data = data_buffer.f ;
cannam@125 953 orig = orig_buffer.f ;
cannam@125 954
cannam@125 955 gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ;
cannam@125 956 for (k = 0 ; k < channels * datalen ; k++)
cannam@125 957 orig [k] = orig_buffer.d [k] ;
cannam@125 958
cannam@125 959 sfinfo.samplerate = SAMPLE_RATE ;
cannam@125 960 sfinfo.frames = 123456789 ; /* Ridiculous value. */
cannam@125 961 sfinfo.channels = channels ;
cannam@125 962 sfinfo.format = filetype ;
cannam@125 963
cannam@125 964 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 965 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
cannam@125 966 test_writef_float_or_die (file, 0, orig, datalen, __LINE__) ;
cannam@125 967 sf_set_string (file, SF_STR_COMMENT, long_comment) ;
cannam@125 968 sf_close (file) ;
cannam@125 969
cannam@125 970 memset (data, 0, datalen * sizeof (float)) ;
cannam@125 971
cannam@125 972 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@125 973 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@125 974
cannam@125 975 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 976
cannam@125 977 if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)))
cannam@125 978 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
cannam@125 979 exit (1) ;
cannam@125 980 } ;
cannam@125 981
cannam@125 982 if (sfinfo.frames < datalen / channels)
cannam@125 983 { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
cannam@125 984 exit (1) ;
cannam@125 985 } ;
cannam@125 986
cannam@125 987 if (sfinfo.frames > (datalen + datalen / 20))
cannam@125 988 { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
cannam@125 989 exit (1) ;
cannam@125 990 } ;
cannam@125 991
cannam@125 992 if (sfinfo.channels != channels)
cannam@125 993 { printf ("Incorrect number of channels in file.\n") ;
cannam@125 994 exit (1) ;
cannam@125 995 } ;
cannam@125 996
cannam@125 997 check_comment (file, filetype, __LINE__) ;
cannam@125 998
cannam@125 999 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
cannam@125 1000
cannam@125 1001 check_log_buffer_or_die (file, __LINE__) ;
cannam@125 1002
cannam@125 1003 check_comment (file, filetype, __LINE__) ;
cannam@125 1004
cannam@125 1005 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
cannam@125 1006
cannam@125 1007 test_readf_float_or_die (file, 0, data, datalen, __LINE__) ;
cannam@125 1008
cannam@125 1009 half_max_abs = 0.0 ;
cannam@125 1010 for (k = 0 ; k < datalen ; k++)
cannam@125 1011 { if (error_function (data [k], orig [k], margin))
cannam@125 1012 { printf ("\nLine %d: Incorrect sample A (#%d : %f should be %f).\n", __LINE__, k, data [k], orig [k]) ;
cannam@125 1013 oct_save_float (orig, data, datalen) ;
cannam@125 1014 exit (1) ;
cannam@125 1015 } ;
cannam@125 1016 half_max_abs = LCT_MAX (half_max_abs, fabs (0.5 * data [k])) ;
cannam@125 1017 } ;
cannam@125 1018
cannam@125 1019 if (half_max_abs < 1.0)
cannam@125 1020 { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ;
cannam@125 1021 exit (1) ;
cannam@125 1022 } ;
cannam@125 1023
cannam@125 1024 if ((k = sf_readf_float (file, data, datalen)) != sfinfo.frames - datalen)
cannam@125 1025 { printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__,
cannam@125 1026 channels * sfinfo.frames - datalen, k) ;
cannam@125 1027 exit (1) ;
cannam@125 1028 } ;
cannam@125 1029
cannam@125 1030 /* This check is only for block based encoders which must append silence
cannam@125 1031 ** to the end of a file so as to fill out a block.
cannam@125 1032 */
cannam@125 1033 if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM)
cannam@125 1034 for (k = 0 ; k < sfinfo.frames - datalen ; k++)
cannam@125 1035 if (ABS (data [channels * k]) > decay_response (channels * k))
cannam@125 1036 { printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%f) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ;
cannam@125 1037 exit (1) ;
cannam@125 1038 } ;
cannam@125 1039
cannam@125 1040 if (! sfinfo.seekable)
cannam@125 1041 { sf_close (file) ;
cannam@125 1042 unlink (filename) ;
cannam@125 1043 printf ("ok\n") ;
cannam@125 1044 return ;
cannam@125 1045 } ;
cannam@125 1046
cannam@125 1047 /* Now test sf_seek function. */
cannam@125 1048
cannam@125 1049 if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
cannam@125 1050 { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ;
cannam@125 1051 exit (1) ;
cannam@125 1052 } ;
cannam@125 1053
cannam@125 1054 for (m = 0 ; m < 3 ; m++)
cannam@125 1055 { test_readf_float_or_die (file, 0, data, 11, __LINE__) ;
cannam@125 1056
cannam@125 1057 for (k = 0 ; k < channels * 11 ; k++)
cannam@125 1058 if (error_function (data [k], orig [k + channels * m * 11], margin))
cannam@125 1059 { printf ("\nLine %d: Incorrect sample (m = %d) (#%d : %f => %f).\n", __LINE__, m, k + channels * m * 11, orig [k + channels * m * 11], data [k]) ;
cannam@125 1060 for (m = 0 ; m < channels ; m++)
cannam@125 1061 printf ("%f ", data [m]) ;
cannam@125 1062 printf ("\n") ;
cannam@125 1063 exit (1) ;
cannam@125 1064 } ;
cannam@125 1065 } ;
cannam@125 1066
cannam@125 1067 seekpos = BUFFER_SIZE / 10 ;
cannam@125 1068
cannam@125 1069 /* Check seek from start of file. */
cannam@125 1070 if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
cannam@125 1071 { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
cannam@125 1072 exit (1) ;
cannam@125 1073 } ;
cannam@125 1074
cannam@125 1075 test_readf_float_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1076
cannam@125 1077 if (error_function (data [0], orig [seekpos * channels], margin))
cannam@125 1078 { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_float failed (%f, %f).\n", __LINE__, orig [1], data [0]) ;
cannam@125 1079 exit (1) ;
cannam@125 1080 } ;
cannam@125 1081
cannam@125 1082 if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
cannam@125 1083 { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ;
cannam@125 1084 exit (1) ;
cannam@125 1085 } ;
cannam@125 1086
cannam@125 1087 seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
cannam@125 1088 k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
cannam@125 1089 test_readf_float_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1090 if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos)
cannam@125 1091 { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_float failed (%f, %f) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ;
cannam@125 1092 exit (1) ;
cannam@125 1093 } ;
cannam@125 1094
cannam@125 1095 seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
cannam@125 1096 /* Check seek backward from current position. */
cannam@125 1097 k = sf_seek (file, -20, SEEK_CUR) ;
cannam@125 1098 test_readf_float_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1099 if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos)
cannam@125 1100 { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_float failed (%f, %f) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ;
cannam@125 1101 exit (1) ;
cannam@125 1102 } ;
cannam@125 1103
cannam@125 1104 /* Check that read past end of file returns number of items. */
cannam@125 1105 sf_seek (file, sfinfo.frames, SEEK_SET) ;
cannam@125 1106
cannam@125 1107 if ((k = sf_readf_float (file, data, datalen)) != 0)
cannam@125 1108 { printf ("\n\nLine %d: Return value from sf_readf_float past end of file incorrect (%d).\n", __LINE__, k) ;
cannam@125 1109 exit (1) ;
cannam@125 1110 } ;
cannam@125 1111
cannam@125 1112 /* Check seek backward from end. */
cannam@125 1113 if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5)
cannam@125 1114 { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ;
cannam@125 1115 exit (1) ;
cannam@125 1116 } ;
cannam@125 1117
cannam@125 1118 test_readf_float_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1119 if (error_function (data [0], orig [5 * channels], margin))
cannam@125 1120 { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%f should be %f).\n", __LINE__, data [0], orig [5 * channels]) ;
cannam@125 1121 exit (1) ;
cannam@125 1122 } ;
cannam@125 1123
cannam@125 1124 sf_close (file) ;
cannam@125 1125
cannam@125 1126 unlink (filename) ;
cannam@125 1127 printf ("ok\n") ;
cannam@125 1128 } /* lcomp_test_float */
cannam@125 1129
cannam@125 1130 /*--------------------------------------------------------------------------------------------
cannam@125 1131 */
cannam@125 1132
cannam@125 1133 static void
cannam@125 1134 lcomp_test_double (const char *filename, int filetype, int channels, double margin)
cannam@125 1135 { SNDFILE *file ;
cannam@125 1136 SF_INFO sfinfo ;
cannam@125 1137 int k, m, seekpos ;
cannam@125 1138 sf_count_t datalen ;
cannam@125 1139 double *orig, *data ;
cannam@125 1140 double half_max_abs ;
cannam@125 1141
cannam@125 1142 print_test_name ("lcomp_test_double", filename) ;
cannam@125 1143
cannam@125 1144 datalen = BUFFER_SIZE / channels ;
cannam@125 1145
cannam@125 1146 data = data_buffer.d ;
cannam@125 1147 orig = orig_buffer.d ;
cannam@125 1148
cannam@125 1149 gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ;
cannam@125 1150 for (k = 0 ; k < channels * datalen ; k++)
cannam@125 1151 orig [k] = orig_buffer.d [k] ;
cannam@125 1152
cannam@125 1153 sfinfo.samplerate = SAMPLE_RATE ;
cannam@125 1154 sfinfo.frames = 123456789 ; /* Ridiculous value. */
cannam@125 1155 sfinfo.channels = channels ;
cannam@125 1156 sfinfo.format = filetype ;
cannam@125 1157
cannam@125 1158 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 1159 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
cannam@125 1160 test_writef_double_or_die (file, 0, orig, datalen, __LINE__) ;
cannam@125 1161 sf_set_string (file, SF_STR_COMMENT, long_comment) ;
cannam@125 1162 sf_close (file) ;
cannam@125 1163
cannam@125 1164 memset (data, 0, datalen * sizeof (double)) ;
cannam@125 1165
cannam@125 1166 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@125 1167 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@125 1168
cannam@125 1169 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 1170
cannam@125 1171 if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)))
cannam@125 1172 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
cannam@125 1173 exit (1) ;
cannam@125 1174 } ;
cannam@125 1175
cannam@125 1176 if (sfinfo.frames < datalen / channels)
cannam@125 1177 { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
cannam@125 1178 exit (1) ;
cannam@125 1179 } ;
cannam@125 1180
cannam@125 1181 if (sfinfo.frames > (datalen + datalen / 20))
cannam@125 1182 { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
cannam@125 1183 exit (1) ;
cannam@125 1184 } ;
cannam@125 1185
cannam@125 1186 if (sfinfo.channels != channels)
cannam@125 1187 { printf ("Incorrect number of channels in file.\n") ;
cannam@125 1188 exit (1) ;
cannam@125 1189 } ;
cannam@125 1190
cannam@125 1191 check_comment (file, filetype, __LINE__) ;
cannam@125 1192
cannam@125 1193 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
cannam@125 1194
cannam@125 1195 check_log_buffer_or_die (file, __LINE__) ;
cannam@125 1196
cannam@125 1197 check_comment (file, filetype, __LINE__) ;
cannam@125 1198
cannam@125 1199 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
cannam@125 1200
cannam@125 1201 test_readf_double_or_die (file, 0, data, datalen, __LINE__) ;
cannam@125 1202
cannam@125 1203 half_max_abs = 0.0 ;
cannam@125 1204 for (k = 0 ; k < datalen ; k++)
cannam@125 1205 { if (error_function (data [k], orig [k], margin))
cannam@125 1206 { printf ("\nLine %d: Incorrect sample A (#%d : %f should be %f).\n", __LINE__, k, data [k], orig [k]) ;
cannam@125 1207 oct_save_double (orig, data, datalen) ;
cannam@125 1208 exit (1) ;
cannam@125 1209 } ;
cannam@125 1210 half_max_abs = LCT_MAX (half_max_abs, ABS (0.5 * data [k])) ;
cannam@125 1211 } ;
cannam@125 1212
cannam@125 1213 if (half_max_abs < 1.0)
cannam@125 1214 { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ;
cannam@125 1215 exit (1) ;
cannam@125 1216 } ;
cannam@125 1217
cannam@125 1218 if ((k = sf_readf_double (file, data, datalen)) != sfinfo.frames - datalen)
cannam@125 1219 { printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__,
cannam@125 1220 channels * sfinfo.frames - datalen, k) ;
cannam@125 1221 exit (1) ;
cannam@125 1222 } ;
cannam@125 1223
cannam@125 1224 /* This check is only for block based encoders which must append silence
cannam@125 1225 ** to the end of a file so as to fill out a block.
cannam@125 1226 */
cannam@125 1227 if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM)
cannam@125 1228 for (k = 0 ; k < sfinfo.frames - datalen ; k++)
cannam@125 1229 if (ABS (data [channels * k]) > decay_response (channels * k))
cannam@125 1230 { printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%f) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ;
cannam@125 1231 exit (1) ;
cannam@125 1232 } ;
cannam@125 1233
cannam@125 1234 if (! sfinfo.seekable)
cannam@125 1235 { sf_close (file) ;
cannam@125 1236 unlink (filename) ;
cannam@125 1237 printf ("ok\n") ;
cannam@125 1238 return ;
cannam@125 1239 } ;
cannam@125 1240
cannam@125 1241 /* Now test sf_seek function. */
cannam@125 1242
cannam@125 1243 if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
cannam@125 1244 { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ;
cannam@125 1245 exit (1) ;
cannam@125 1246 } ;
cannam@125 1247
cannam@125 1248 for (m = 0 ; m < 3 ; m++)
cannam@125 1249 { test_readf_double_or_die (file, m, data, 11, __LINE__) ;
cannam@125 1250
cannam@125 1251 for (k = 0 ; k < channels * 11 ; k++)
cannam@125 1252 if (error_function (data [k], orig [k + channels * m * 11], margin))
cannam@125 1253 { printf ("\nLine %d: Incorrect sample (m = %d) (#%d : %f => %f).\n", __LINE__, m, k + channels * m * 11, orig [k + channels * m * 11], data [k]) ;
cannam@125 1254 for (m = 0 ; m < channels ; m++)
cannam@125 1255 printf ("%f ", data [m]) ;
cannam@125 1256 printf ("\n") ;
cannam@125 1257 exit (1) ;
cannam@125 1258 } ;
cannam@125 1259 } ;
cannam@125 1260
cannam@125 1261 seekpos = BUFFER_SIZE / 10 ;
cannam@125 1262
cannam@125 1263 /* Check seek from start of file. */
cannam@125 1264 if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
cannam@125 1265 { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
cannam@125 1266 exit (1) ;
cannam@125 1267 } ;
cannam@125 1268
cannam@125 1269 test_readf_double_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1270
cannam@125 1271 if (error_function (data [0], orig [seekpos * channels], margin))
cannam@125 1272 { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_double failed (%f, %f).\n", __LINE__, orig [1], data [0]) ;
cannam@125 1273 exit (1) ;
cannam@125 1274 } ;
cannam@125 1275
cannam@125 1276 if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
cannam@125 1277 { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ;
cannam@125 1278 exit (1) ;
cannam@125 1279 } ;
cannam@125 1280
cannam@125 1281 seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
cannam@125 1282 k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
cannam@125 1283 test_readf_double_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1284 if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos)
cannam@125 1285 { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_double failed (%f, %f) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ;
cannam@125 1286 exit (1) ;
cannam@125 1287 } ;
cannam@125 1288
cannam@125 1289 seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
cannam@125 1290 /* Check seek backward from current position. */
cannam@125 1291 k = sf_seek (file, -20, SEEK_CUR) ;
cannam@125 1292 test_readf_double_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1293 if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos)
cannam@125 1294 { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_double failed (%f, %f) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ;
cannam@125 1295 exit (1) ;
cannam@125 1296 } ;
cannam@125 1297
cannam@125 1298 /* Check that read past end of file returns number of items. */
cannam@125 1299 sf_seek (file, sfinfo.frames, SEEK_SET) ;
cannam@125 1300
cannam@125 1301 if ((k = sf_readf_double (file, data, datalen)) != 0)
cannam@125 1302 { printf ("\n\nLine %d: Return value from sf_readf_double past end of file incorrect (%d).\n", __LINE__, k) ;
cannam@125 1303 exit (1) ;
cannam@125 1304 } ;
cannam@125 1305
cannam@125 1306 /* Check seek backward from end. */
cannam@125 1307 if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5)
cannam@125 1308 { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ;
cannam@125 1309 exit (1) ;
cannam@125 1310 } ;
cannam@125 1311
cannam@125 1312 test_readf_double_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1313 if (error_function (data [0], orig [5 * channels], margin))
cannam@125 1314 { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%f should be %f).\n", __LINE__, data [0], orig [5 * channels]) ;
cannam@125 1315 exit (1) ;
cannam@125 1316 } ;
cannam@125 1317
cannam@125 1318 sf_close (file) ;
cannam@125 1319
cannam@125 1320 unlink (filename) ;
cannam@125 1321 printf ("ok\n") ;
cannam@125 1322 } /* lcomp_test_double */
cannam@125 1323
cannam@125 1324 /*========================================================================================
cannam@125 1325 ** Smoothed differential loss compression tests.
cannam@125 1326 */
cannam@125 1327
cannam@125 1328 static void
cannam@125 1329 sdlcomp_test_short (const char *filename, int filetype, int channels, double margin)
cannam@125 1330 { SNDFILE *file ;
cannam@125 1331 SF_INFO sfinfo ;
cannam@125 1332 int k, m, seekpos, half_max_abs ;
cannam@125 1333 sf_count_t datalen ;
cannam@125 1334 short *orig, *data, *smooth ;
cannam@125 1335
cannam@125 1336 channels = 1 ;
cannam@125 1337 print_test_name ("sdlcomp_test_short", filename) ;
cannam@125 1338
cannam@125 1339 datalen = BUFFER_SIZE ;
cannam@125 1340
cannam@125 1341 orig = orig_buffer.s ;
cannam@125 1342 data = data_buffer.s ;
cannam@125 1343 smooth = smooth_buffer.s ;
cannam@125 1344
cannam@125 1345 gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ;
cannam@125 1346 for (k = 0 ; k < datalen ; k++)
cannam@125 1347 orig [k] = lrint (orig_buffer.d [k]) ;
cannam@125 1348
cannam@125 1349 sfinfo.samplerate = SAMPLE_RATE ;
cannam@125 1350 sfinfo.frames = 123456789 ; /* Ridiculous value. */
cannam@125 1351 sfinfo.channels = channels ;
cannam@125 1352 sfinfo.format = filetype ;
cannam@125 1353
cannam@125 1354 /* The Vorbis encoder has a bug on PowerPC and X86-64 with sample rates
cannam@125 1355 ** <= 22050. Increasing the sample rate to 32000 avoids triggering it.
cannam@125 1356 ** See https://trac.xiph.org/ticket/1229
cannam@125 1357 */
cannam@125 1358 if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL)
cannam@125 1359 { const char * errstr ;
cannam@125 1360
cannam@125 1361 errstr = sf_strerror (NULL) ;
cannam@125 1362 if (strstr (errstr, "Sample rate chosen is known to trigger a Vorbis") == NULL)
cannam@125 1363 { printf ("Line %d: sf_open_fd (SFM_WRITE) failed : %s\n", __LINE__, errstr) ;
cannam@125 1364 dump_log_buffer (NULL) ;
cannam@125 1365 exit (1) ;
cannam@125 1366 } ;
cannam@125 1367
cannam@125 1368 printf ("\n Sample rate -> 32kHz ") ;
cannam@125 1369 sfinfo.samplerate = 32000 ;
cannam@125 1370
cannam@125 1371 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
cannam@125 1372 } ;
cannam@125 1373
cannam@125 1374 test_write_short_or_die (file, 0, orig, datalen, __LINE__) ;
cannam@125 1375 sf_set_string (file, SF_STR_COMMENT, long_comment) ;
cannam@125 1376 sf_close (file) ;
cannam@125 1377
cannam@125 1378 memset (data, 0, datalen * sizeof (short)) ;
cannam@125 1379
cannam@125 1380 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@125 1381 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@125 1382
cannam@125 1383 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 1384
cannam@125 1385 if (sfinfo.format != filetype)
cannam@125 1386 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
cannam@125 1387 exit (1) ;
cannam@125 1388 } ;
cannam@125 1389
cannam@125 1390 if (sfinfo.frames < datalen / channels)
cannam@125 1391 { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
cannam@125 1392 exit (1) ;
cannam@125 1393 } ;
cannam@125 1394
cannam@125 1395 if (sfinfo.frames > (datalen + 400))
cannam@125 1396 { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
cannam@125 1397 exit (1) ;
cannam@125 1398 } ;
cannam@125 1399
cannam@125 1400 if (sfinfo.channels != channels)
cannam@125 1401 { printf ("Incorrect number of channels in file.\n") ;
cannam@125 1402 exit (1) ;
cannam@125 1403 } ;
cannam@125 1404
cannam@125 1405 check_comment (file, filetype, __LINE__) ;
cannam@125 1406
cannam@125 1407 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
cannam@125 1408
cannam@125 1409 check_log_buffer_or_die (file, __LINE__) ;
cannam@125 1410
cannam@125 1411 test_readf_short_or_die (file, 0, data, datalen, __LINE__) ;
cannam@125 1412
cannam@125 1413 memcpy (smooth, orig, datalen * sizeof (short)) ;
cannam@125 1414 smoothed_diff_short (data, datalen) ;
cannam@125 1415 smoothed_diff_short (smooth, datalen) ;
cannam@125 1416
cannam@125 1417 half_max_abs = 0.0 ;
cannam@125 1418 for (k = 0 ; k < datalen ; k++)
cannam@125 1419 { if (error_function (1.0 * data [k], 1.0 * smooth [k], margin))
cannam@125 1420 { printf ("\nLine %d: Incorrect sample (#%d : %d should be %d).\n", __LINE__, k, data [k], smooth [k]) ;
cannam@125 1421 oct_save_short (orig, smooth, datalen) ;
cannam@125 1422 exit (1) ;
cannam@125 1423 } ;
cannam@125 1424 half_max_abs = LCT_MAX (half_max_abs, ABS (0.5 * data [k])) ;
cannam@125 1425 } ;
cannam@125 1426
cannam@125 1427 if (half_max_abs < 1)
cannam@125 1428 { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ;
cannam@125 1429 exit (1) ;
cannam@125 1430 } ;
cannam@125 1431
cannam@125 1432 if ((k = sf_read_short (file, data, datalen)) != sfinfo.frames - datalen)
cannam@125 1433 { printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ;
cannam@125 1434 exit (1) ;
cannam@125 1435 } ;
cannam@125 1436
cannam@125 1437 if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM &&
cannam@125 1438 (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610)
cannam@125 1439 for (k = 0 ; k < sfinfo.frames - datalen ; k++)
cannam@125 1440 if (ABS (data [k]) > decay_response (k))
cannam@125 1441 { printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, data [k], decay_response (k)) ;
cannam@125 1442 exit (1) ;
cannam@125 1443 } ;
cannam@125 1444
cannam@125 1445 /* Now test sf_seek function. */
cannam@125 1446 if (sfinfo.seekable)
cannam@125 1447 { if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
cannam@125 1448 { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ;
cannam@125 1449 exit (1) ;
cannam@125 1450 } ;
cannam@125 1451
cannam@125 1452 for (m = 0 ; m < 3 ; m++)
cannam@125 1453 { test_readf_short_or_die (file, m, data, datalen / 7, __LINE__) ;
cannam@125 1454
cannam@125 1455 smoothed_diff_short (data, datalen / 7) ;
cannam@125 1456 memcpy (smooth, orig + m * datalen / 7, datalen / 7 * sizeof (short)) ;
cannam@125 1457 smoothed_diff_short (smooth, datalen / 7) ;
cannam@125 1458
cannam@125 1459 for (k = 0 ; k < datalen / 7 ; k++)
cannam@125 1460 if (error_function (1.0 * data [k], 1.0 * smooth [k], margin))
cannam@125 1461 { printf ("\nLine %d: Incorrect sample C (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), smooth [k], data [k]) ;
cannam@125 1462 for (m = 0 ; m < 10 ; m++)
cannam@125 1463 printf ("%d ", data [k]) ;
cannam@125 1464 printf ("\n") ;
cannam@125 1465 exit (1) ;
cannam@125 1466 } ;
cannam@125 1467 } ; /* for (m = 0 ; m < 3 ; m++) */
cannam@125 1468
cannam@125 1469 seekpos = BUFFER_SIZE / 10 ;
cannam@125 1470
cannam@125 1471 /* Check seek from start of file. */
cannam@125 1472 if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
cannam@125 1473 { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
cannam@125 1474 exit (1) ;
cannam@125 1475 } ;
cannam@125 1476 test_readf_short_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1477
cannam@125 1478 if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin))
cannam@125 1479 { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_read_short failed (%d, %d).\n", __LINE__, orig [1], data [0]) ;
cannam@125 1480 exit (1) ;
cannam@125 1481 } ;
cannam@125 1482
cannam@125 1483 if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
cannam@125 1484 { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ;
cannam@125 1485 exit (1) ;
cannam@125 1486 } ;
cannam@125 1487
cannam@125 1488 seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
cannam@125 1489 k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
cannam@125 1490 test_readf_short_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1491 if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos)
cannam@125 1492 { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_read_short failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ;
cannam@125 1493 exit (1) ;
cannam@125 1494 } ;
cannam@125 1495
cannam@125 1496 seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
cannam@125 1497 /* Check seek backward from current position. */
cannam@125 1498 k = sf_seek (file, -20, SEEK_CUR) ;
cannam@125 1499 test_readf_short_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1500 if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos)
cannam@125 1501 { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_read_short failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ;
cannam@125 1502 exit (1) ;
cannam@125 1503 } ;
cannam@125 1504
cannam@125 1505 /* Check that read past end of file returns number of items. */
cannam@125 1506 sf_seek (file, sfinfo.frames, SEEK_SET) ;
cannam@125 1507
cannam@125 1508 if ((k = sf_read_short (file, data, datalen)) != 0)
cannam@125 1509 { printf ("\n\nLine %d: Return value from sf_read_short past end of file incorrect (%d).\n", __LINE__, k) ;
cannam@125 1510 exit (1) ;
cannam@125 1511 } ;
cannam@125 1512
cannam@125 1513 /* Check seek backward from end. */
cannam@125 1514
cannam@125 1515 if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5)
cannam@125 1516 { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ;
cannam@125 1517 exit (1) ;
cannam@125 1518 } ;
cannam@125 1519
cannam@125 1520 test_read_short_or_die (file, 0, data, channels, __LINE__) ;
cannam@125 1521 if (error_function (1.0 * data [0], 1.0 * orig [5 * channels], margin))
cannam@125 1522 { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_read_short failed (%d should be %d).\n", __LINE__, data [0], orig [5 * channels]) ;
cannam@125 1523 exit (1) ;
cannam@125 1524 } ;
cannam@125 1525 } /* if (sfinfo.seekable) */
cannam@125 1526
cannam@125 1527 sf_close (file) ;
cannam@125 1528
cannam@125 1529 unlink (filename) ;
cannam@125 1530 printf ("ok\n") ;
cannam@125 1531 } /* sdlcomp_test_short */
cannam@125 1532
cannam@125 1533 static void
cannam@125 1534 sdlcomp_test_int (const char *filename, int filetype, int channels, double margin)
cannam@125 1535 { SNDFILE *file ;
cannam@125 1536 SF_INFO sfinfo ;
cannam@125 1537 int k, m, seekpos, half_max_abs ;
cannam@125 1538 sf_count_t datalen ;
cannam@125 1539 int *orig, *data, *smooth ;
cannam@125 1540 double scale ;
cannam@125 1541
cannam@125 1542 channels = 1 ;
cannam@125 1543
cannam@125 1544 print_test_name ("sdlcomp_test_int", filename) ;
cannam@125 1545
cannam@125 1546 datalen = BUFFER_SIZE ;
cannam@125 1547 scale = 1.0 * 0x10000 ;
cannam@125 1548
cannam@125 1549 orig = orig_buffer.i ;
cannam@125 1550 data = data_buffer.i ;
cannam@125 1551 smooth = smooth_buffer.i ;
cannam@125 1552
cannam@125 1553 gen_signal_double (orig_buffer.d, 32000.0 * scale, channels, datalen) ;
cannam@125 1554 for (k = 0 ; k < datalen ; k++)
cannam@125 1555 orig [k] = lrint (orig_buffer.d [k]) ;
cannam@125 1556
cannam@125 1557 sfinfo.samplerate = SAMPLE_RATE ;
cannam@125 1558 sfinfo.frames = 123456789 ; /* Ridiculous value. */
cannam@125 1559 sfinfo.channels = channels ;
cannam@125 1560 sfinfo.format = filetype ;
cannam@125 1561
cannam@125 1562 /* The Vorbis encoder has a bug on PowerPC and X86-64 with sample rates
cannam@125 1563 ** <= 22050. Increasing the sample rate to 32000 avoids triggering it.
cannam@125 1564 ** See https://trac.xiph.org/ticket/1229
cannam@125 1565 */
cannam@125 1566 if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL)
cannam@125 1567 { const char * errstr ;
cannam@125 1568
cannam@125 1569 errstr = sf_strerror (NULL) ;
cannam@125 1570 if (strstr (errstr, "Sample rate chosen is known to trigger a Vorbis") == NULL)
cannam@125 1571 { printf ("Line %d: sf_open_fd (SFM_WRITE) failed : %s\n", __LINE__, errstr) ;
cannam@125 1572 dump_log_buffer (NULL) ;
cannam@125 1573 exit (1) ;
cannam@125 1574 } ;
cannam@125 1575
cannam@125 1576 printf ("\n Sample rate -> 32kHz ") ;
cannam@125 1577 sfinfo.samplerate = 32000 ;
cannam@125 1578
cannam@125 1579 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
cannam@125 1580 } ;
cannam@125 1581
cannam@125 1582 test_writef_int_or_die (file, 0, orig, datalen, __LINE__) ;
cannam@125 1583 sf_set_string (file, SF_STR_COMMENT, long_comment) ;
cannam@125 1584 sf_close (file) ;
cannam@125 1585
cannam@125 1586 memset (data, 0, datalen * sizeof (int)) ;
cannam@125 1587
cannam@125 1588 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@125 1589 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@125 1590
cannam@125 1591 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 1592
cannam@125 1593 if (sfinfo.format != filetype)
cannam@125 1594 { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", filetype, sfinfo.format) ;
cannam@125 1595 exit (1) ;
cannam@125 1596 } ;
cannam@125 1597
cannam@125 1598 if (sfinfo.frames < datalen / channels)
cannam@125 1599 { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
cannam@125 1600 exit (1) ;
cannam@125 1601 } ;
cannam@125 1602
cannam@125 1603 if (sfinfo.frames > (datalen + 400))
cannam@125 1604 { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
cannam@125 1605 exit (1) ;
cannam@125 1606 } ;
cannam@125 1607
cannam@125 1608 if (sfinfo.channels != channels)
cannam@125 1609 { printf ("Incorrect number of channels in file.\n") ;
cannam@125 1610 exit (1) ;
cannam@125 1611 } ;
cannam@125 1612
cannam@125 1613 check_log_buffer_or_die (file, __LINE__) ;
cannam@125 1614
cannam@125 1615 test_readf_int_or_die (file, 0, data, datalen, __LINE__) ;
cannam@125 1616
cannam@125 1617 memcpy (smooth, orig, datalen * sizeof (int)) ;
cannam@125 1618 smoothed_diff_int (data, datalen) ;
cannam@125 1619 smoothed_diff_int (smooth, datalen) ;
cannam@125 1620
cannam@125 1621 half_max_abs = abs (data [0] >> 16) ;
cannam@125 1622 for (k = 1 ; k < datalen ; k++)
cannam@125 1623 { if (error_function (data [k] / scale, smooth [k] / scale, margin))
cannam@125 1624 { printf ("\nLine %d: Incorrect sample (#%d : %d should be %d).\n", __LINE__, k, data [k], smooth [k]) ;
cannam@125 1625 oct_save_int (orig, smooth, datalen) ;
cannam@125 1626 exit (1) ;
cannam@125 1627 } ;
cannam@125 1628 half_max_abs = LCT_MAX (half_max_abs, abs (data [k] / 2)) ;
cannam@125 1629 } ;
cannam@125 1630
cannam@125 1631 if (half_max_abs < 1)
cannam@125 1632 { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ;
cannam@125 1633 exit (1) ;
cannam@125 1634 } ;
cannam@125 1635
cannam@125 1636 if ((k = sf_readf_int (file, data, datalen)) != sfinfo.frames - datalen)
cannam@125 1637 { printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ;
cannam@125 1638 exit (1) ;
cannam@125 1639 } ;
cannam@125 1640
cannam@125 1641 if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_IMA_ADPCM &&
cannam@125 1642 (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM &&
cannam@125 1643 (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610 &&
cannam@125 1644 (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_G721_32 &&
cannam@125 1645 (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_G723_24)
cannam@125 1646 for (k = 0 ; k < sfinfo.frames - datalen ; k++)
cannam@125 1647 if (abs (data [k]) > decay_response (k))
cannam@125 1648 { printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, data [k], decay_response (k)) ;
cannam@125 1649 exit (1) ;
cannam@125 1650 } ;
cannam@125 1651
cannam@125 1652 /* Now test sf_seek function. */
cannam@125 1653 if (sfinfo.seekable)
cannam@125 1654 { if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
cannam@125 1655 { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ;
cannam@125 1656 exit (1) ;
cannam@125 1657 } ;
cannam@125 1658
cannam@125 1659 for (m = 0 ; m < 3 ; m++)
cannam@125 1660 { test_readf_int_or_die (file, m, data, datalen / 7, __LINE__) ;
cannam@125 1661
cannam@125 1662 smoothed_diff_int (data, datalen / 7) ;
cannam@125 1663 memcpy (smooth, orig + m * datalen / 7, datalen / 7 * sizeof (int)) ;
cannam@125 1664 smoothed_diff_int (smooth, datalen / 7) ;
cannam@125 1665
cannam@125 1666 for (k = 0 ; k < datalen / 7 ; k++)
cannam@125 1667 if (error_function (data [k] / scale, smooth [k] / scale, margin))
cannam@125 1668 { printf ("\nLine %d: Incorrect sample (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), smooth [k], data [k]) ;
cannam@125 1669 for (m = 0 ; m < 10 ; m++)
cannam@125 1670 printf ("%d ", data [k]) ;
cannam@125 1671 printf ("\n") ;
cannam@125 1672 exit (1) ;
cannam@125 1673 } ;
cannam@125 1674 } ; /* for (m = 0 ; m < 3 ; m++) */
cannam@125 1675
cannam@125 1676 seekpos = BUFFER_SIZE / 10 ;
cannam@125 1677
cannam@125 1678 /* Check seek from start of file. */
cannam@125 1679 if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
cannam@125 1680 { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
cannam@125 1681 exit (1) ;
cannam@125 1682 } ;
cannam@125 1683 test_readf_int_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1684
cannam@125 1685 if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin))
cannam@125 1686 { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_int failed (%d, %d).\n", __LINE__, orig [1], data [0]) ;
cannam@125 1687 exit (1) ;
cannam@125 1688 } ;
cannam@125 1689
cannam@125 1690 if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
cannam@125 1691 { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ;
cannam@125 1692 exit (1) ;
cannam@125 1693 } ;
cannam@125 1694
cannam@125 1695 seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
cannam@125 1696 k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
cannam@125 1697 test_readf_int_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1698 if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos)
cannam@125 1699 { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ;
cannam@125 1700 exit (1) ;
cannam@125 1701 } ;
cannam@125 1702
cannam@125 1703 seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
cannam@125 1704 /* Check seek backward from current position. */
cannam@125 1705 k = sf_seek (file, -20, SEEK_CUR) ;
cannam@125 1706 test_readf_int_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1707 if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos)
cannam@125 1708 { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ;
cannam@125 1709 exit (1) ;
cannam@125 1710 } ;
cannam@125 1711
cannam@125 1712 /* Check that read past end of file returns number of items. */
cannam@125 1713 sf_seek (file, sfinfo.frames, SEEK_SET) ;
cannam@125 1714
cannam@125 1715 if ((k = sf_readf_int (file, data, datalen)) != 0)
cannam@125 1716 { printf ("\n\nLine %d: Return value from sf_readf_int past end of file incorrect (%d).\n", __LINE__, k) ;
cannam@125 1717 exit (1) ;
cannam@125 1718 } ;
cannam@125 1719
cannam@125 1720 /* Check seek backward from end. */
cannam@125 1721
cannam@125 1722 if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5)
cannam@125 1723 { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ;
cannam@125 1724 exit (1) ;
cannam@125 1725 } ;
cannam@125 1726
cannam@125 1727 test_readf_int_or_die (file, 0, data, 1, __LINE__) ;
cannam@125 1728 if (error_function (data [0] / scale, orig [5] / scale, margin))
cannam@125 1729 { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_int failed (%d should be %d).\n", __LINE__, data [0], orig [5]) ;
cannam@125 1730 exit (1) ;
cannam@125 1731 } ;
cannam@125 1732 } /* if (sfinfo.seekable) */
cannam@125 1733
cannam@125 1734 sf_close (file) ;
cannam@125 1735
cannam@125 1736 unlink (filename) ;
cannam@125 1737 printf ("ok\n") ;
cannam@125 1738 } /* sdlcomp_test_int */
cannam@125 1739
cannam@125 1740 static void
cannam@125 1741 sdlcomp_test_float (const char *filename, int filetype, int channels, double margin)
cannam@125 1742 { SNDFILE *file ;
cannam@125 1743 SF_INFO sfinfo ;
cannam@125 1744 int k, m, seekpos ;
cannam@125 1745 sf_count_t datalen ;
cannam@125 1746 float *orig, *data, *smooth ;
cannam@125 1747 double half_max_abs ;
cannam@125 1748
cannam@125 1749 channels = 1 ;
cannam@125 1750
cannam@125 1751 print_test_name ("sdlcomp_test_float", filename) ;
cannam@125 1752
cannam@125 1753 if ((filetype & SF_FORMAT_SUBMASK) == SF_FORMAT_VORBIS)
cannam@125 1754 { puts ("Not working for this format.") ;
cannam@125 1755 return ;
cannam@125 1756 } ;
cannam@125 1757
cannam@125 1758 printf ("** fix this ** ") ;
cannam@125 1759
cannam@125 1760 datalen = BUFFER_SIZE ;
cannam@125 1761
cannam@125 1762 orig = orig_buffer.f ;
cannam@125 1763 data = data_buffer.f ;
cannam@125 1764 smooth = smooth_buffer.f ;
cannam@125 1765
cannam@125 1766 gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ;
cannam@125 1767 for (k = 0 ; k < datalen ; k++)
cannam@125 1768 orig [k] = lrint (orig_buffer.d [k]) ;
cannam@125 1769
cannam@125 1770 sfinfo.samplerate = SAMPLE_RATE ;
cannam@125 1771 sfinfo.frames = 123456789 ; /* Ridiculous value. */
cannam@125 1772 sfinfo.channels = channels ;
cannam@125 1773 sfinfo.format = filetype ;
cannam@125 1774
cannam@125 1775 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 1776 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
cannam@125 1777 test_write_float_or_die (file, 0, orig, datalen, __LINE__) ;
cannam@125 1778 sf_set_string (file, SF_STR_COMMENT, long_comment) ;
cannam@125 1779 sf_close (file) ;
cannam@125 1780
cannam@125 1781 memset (data, 0, datalen * sizeof (float)) ;
cannam@125 1782
cannam@125 1783 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@125 1784 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@125 1785
cannam@125 1786 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 1787
cannam@125 1788 if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)))
cannam@125 1789 { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ;
cannam@125 1790 exit (1) ;
cannam@125 1791 } ;
cannam@125 1792
cannam@125 1793 if (sfinfo.frames < datalen / channels)
cannam@125 1794 { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
cannam@125 1795 exit (1) ;
cannam@125 1796 } ;
cannam@125 1797
cannam@125 1798 if (sfinfo.frames > (datalen + 400))
cannam@125 1799 { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
cannam@125 1800 exit (1) ;
cannam@125 1801 } ;
cannam@125 1802
cannam@125 1803 if (sfinfo.channels != channels)
cannam@125 1804 { printf ("Incorrect number of channels in file.\n") ;
cannam@125 1805 exit (1) ;
cannam@125 1806 } ;
cannam@125 1807
cannam@125 1808 check_comment (file, filetype, __LINE__) ;
cannam@125 1809
cannam@125 1810 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
cannam@125 1811
cannam@125 1812 check_log_buffer_or_die (file, __LINE__) ;
cannam@125 1813
cannam@125 1814 test_read_float_or_die (file, 0, data, datalen, __LINE__) ;
cannam@125 1815
cannam@125 1816 memcpy (smooth, orig, datalen * sizeof (float)) ;
cannam@125 1817 smoothed_diff_float (data, datalen) ;
cannam@125 1818 smoothed_diff_float (smooth, datalen) ;
cannam@125 1819
cannam@125 1820 half_max_abs = fabs (data [0]) ;
cannam@125 1821 for (k = 1 ; k < datalen ; k++)
cannam@125 1822 { if (error_function (data [k], smooth [k], margin))
cannam@125 1823 { printf ("\nLine %d: Incorrect sample (#%d : %d should be %d).\n", __LINE__, k, (int) data [k], (int) smooth [k]) ;
cannam@125 1824 oct_save_float (orig, smooth, datalen) ;
cannam@125 1825 exit (1) ;
cannam@125 1826 } ;
cannam@125 1827 half_max_abs = LCT_MAX (half_max_abs, ABS (0.5 * data [k])) ;
cannam@125 1828 } ;
cannam@125 1829
cannam@125 1830 if (half_max_abs <= 0.0)
cannam@125 1831 { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ;
cannam@125 1832 printf ("half_max_abs : % 10.6f\n", half_max_abs) ;
cannam@125 1833 exit (1) ;
cannam@125 1834 } ;
cannam@125 1835
cannam@125 1836 if ((k = sf_read_float (file, data, datalen)) != sfinfo.frames - datalen)
cannam@125 1837 { printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ;
cannam@125 1838 exit (1) ;
cannam@125 1839 } ;
cannam@125 1840
cannam@125 1841 if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM &&
cannam@125 1842 (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610)
cannam@125 1843 for (k = 0 ; k < sfinfo.frames - datalen ; k++)
cannam@125 1844 if (ABS (data [k]) > decay_response (k))
cannam@125 1845 { printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, (int) data [k], (int) decay_response (k)) ;
cannam@125 1846 exit (1) ;
cannam@125 1847 } ;
cannam@125 1848
cannam@125 1849 /* Now test sf_seek function. */
cannam@125 1850 if (sfinfo.seekable)
cannam@125 1851 { if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
cannam@125 1852 { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ;
cannam@125 1853 exit (1) ;
cannam@125 1854 } ;
cannam@125 1855
cannam@125 1856 for (m = 0 ; m < 3 ; m++)
cannam@125 1857 { test_read_float_or_die (file, 0, data, datalen / 7, __LINE__) ;
cannam@125 1858
cannam@125 1859 smoothed_diff_float (data, datalen / 7) ;
cannam@125 1860 memcpy (smooth, orig + m * datalen / 7, datalen / 7 * sizeof (float)) ;
cannam@125 1861 smoothed_diff_float (smooth, datalen / 7) ;
cannam@125 1862
cannam@125 1863 for (k = 0 ; k < datalen / 7 ; k++)
cannam@125 1864 if (error_function (data [k], smooth [k], margin))
cannam@125 1865 { printf ("\nLine %d: Incorrect sample C (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), (int) smooth [k], (int) data [k]) ;
cannam@125 1866 for (m = 0 ; m < 10 ; m++)
cannam@125 1867 printf ("%d ", (int) data [k]) ;
cannam@125 1868 printf ("\n") ;
cannam@125 1869 exit (1) ;
cannam@125 1870 } ;
cannam@125 1871 } ; /* for (m = 0 ; m < 3 ; m++) */
cannam@125 1872
cannam@125 1873 seekpos = BUFFER_SIZE / 10 ;
cannam@125 1874
cannam@125 1875 /* Check seek from start of file. */
cannam@125 1876 if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
cannam@125 1877 { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
cannam@125 1878 exit (1) ;
cannam@125 1879 } ;
cannam@125 1880 test_read_float_or_die (file, 0, data, channels, __LINE__) ;
cannam@125 1881
cannam@125 1882 if (error_function (data [0], orig [seekpos * channels], margin))
cannam@125 1883 { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_read_float failed (%d, %d).\n", __LINE__, (int) orig [1], (int) data [0]) ;
cannam@125 1884 exit (1) ;
cannam@125 1885 } ;
cannam@125 1886
cannam@125 1887 if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
cannam@125 1888 { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ;
cannam@125 1889 exit (1) ;
cannam@125 1890 } ;
cannam@125 1891
cannam@125 1892 seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
cannam@125 1893 k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
cannam@125 1894 test_read_float_or_die (file, 0, data, channels, __LINE__) ;
cannam@125 1895 if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos)
cannam@125 1896 { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_read_float failed (%d, %d) (%d, %d).\n", __LINE__, (int) data [0], (int) orig [seekpos * channels], k, seekpos + 1) ;
cannam@125 1897 exit (1) ;
cannam@125 1898 } ;
cannam@125 1899
cannam@125 1900 seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
cannam@125 1901 /* Check seek backward from current position. */
cannam@125 1902 k = sf_seek (file, -20, SEEK_CUR) ;
cannam@125 1903 test_read_float_or_die (file, 0, data, channels, __LINE__) ;
cannam@125 1904 if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos)
cannam@125 1905 { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_read_float failed (%d, %d) (%d, %d).\n", __LINE__, (int) data [0], (int) orig [seekpos * channels], k, seekpos) ;
cannam@125 1906 exit (1) ;
cannam@125 1907 } ;
cannam@125 1908
cannam@125 1909 /* Check that read past end of file returns number of items. */
cannam@125 1910 sf_seek (file, sfinfo.frames, SEEK_SET) ;
cannam@125 1911
cannam@125 1912 if ((k = sf_read_float (file, data, datalen)) != 0)
cannam@125 1913 { printf ("\n\nLine %d: Return value from sf_read_float past end of file incorrect (%d).\n", __LINE__, k) ;
cannam@125 1914 exit (1) ;
cannam@125 1915 } ;
cannam@125 1916
cannam@125 1917 /* Check seek backward from end. */
cannam@125 1918
cannam@125 1919 if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5)
cannam@125 1920 { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ;
cannam@125 1921 exit (1) ;
cannam@125 1922 } ;
cannam@125 1923
cannam@125 1924 test_read_float_or_die (file, 0, data, channels, __LINE__) ;
cannam@125 1925 if (error_function (data [0], orig [5 * channels], margin))
cannam@125 1926 { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_read_float failed (%f should be %f).\n", __LINE__, data [0], orig [5 * channels]) ;
cannam@125 1927 exit (1) ;
cannam@125 1928 } ;
cannam@125 1929 } /* if (sfinfo.seekable) */
cannam@125 1930
cannam@125 1931 sf_close (file) ;
cannam@125 1932
cannam@125 1933 unlink (filename) ;
cannam@125 1934 printf ("ok\n") ;
cannam@125 1935 } /* sdlcomp_test_float */
cannam@125 1936
cannam@125 1937 static void
cannam@125 1938 sdlcomp_test_double (const char *filename, int filetype, int channels, double margin)
cannam@125 1939 { SNDFILE *file ;
cannam@125 1940 SF_INFO sfinfo ;
cannam@125 1941 int k, m, seekpos ;
cannam@125 1942 sf_count_t datalen ;
cannam@125 1943 double *orig, *data, *smooth, half_max_abs ;
cannam@125 1944
cannam@125 1945 channels = 1 ;
cannam@125 1946 print_test_name ("sdlcomp_test_double", filename) ;
cannam@125 1947
cannam@125 1948 if ((filetype & SF_FORMAT_SUBMASK) == SF_FORMAT_VORBIS)
cannam@125 1949 { puts ("Not working for this format.") ;
cannam@125 1950 return ;
cannam@125 1951 } ;
cannam@125 1952
cannam@125 1953 datalen = BUFFER_SIZE ;
cannam@125 1954
cannam@125 1955 orig = orig_buffer.d ;
cannam@125 1956 data = data_buffer.d ;
cannam@125 1957 smooth = smooth_buffer.d ;
cannam@125 1958
cannam@125 1959 gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ;
cannam@125 1960
cannam@125 1961 sfinfo.samplerate = SAMPLE_RATE ;
cannam@125 1962 sfinfo.frames = 123456789 ; /* Ridiculous value. */
cannam@125 1963 sfinfo.channels = channels ;
cannam@125 1964 sfinfo.format = filetype ;
cannam@125 1965
cannam@125 1966 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 1967 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
cannam@125 1968 test_write_double_or_die (file, 0, orig, datalen, __LINE__) ;
cannam@125 1969 sf_set_string (file, SF_STR_COMMENT, long_comment) ;
cannam@125 1970 sf_close (file) ;
cannam@125 1971
cannam@125 1972 memset (data, 0, datalen * sizeof (double)) ;
cannam@125 1973
cannam@125 1974 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@125 1975 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@125 1976
cannam@125 1977 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 1978
cannam@125 1979 if (sfinfo.format != filetype)
cannam@125 1980 { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", filetype, sfinfo.format) ;
cannam@125 1981 exit (1) ;
cannam@125 1982 } ;
cannam@125 1983
cannam@125 1984 if (sfinfo.frames < datalen / channels)
cannam@125 1985 { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
cannam@125 1986 exit (1) ;
cannam@125 1987 } ;
cannam@125 1988
cannam@125 1989 if (sfinfo.frames > (datalen + 400))
cannam@125 1990 { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
cannam@125 1991 exit (1) ;
cannam@125 1992 } ;
cannam@125 1993
cannam@125 1994 if (sfinfo.channels != channels)
cannam@125 1995 { printf ("Incorrect number of channels in file.\n") ;
cannam@125 1996 exit (1) ;
cannam@125 1997 } ;
cannam@125 1998
cannam@125 1999 check_comment (file, filetype, __LINE__) ;
cannam@125 2000
cannam@125 2001 check_comment (file, filetype, __LINE__) ;
cannam@125 2002
cannam@125 2003 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
cannam@125 2004
cannam@125 2005 check_log_buffer_or_die (file, __LINE__) ;
cannam@125 2006
cannam@125 2007 test_read_double_or_die (file, 0, data, datalen, __LINE__) ;
cannam@125 2008
cannam@125 2009 memcpy (smooth, orig, datalen * sizeof (double)) ;
cannam@125 2010 smoothed_diff_double (data, datalen) ;
cannam@125 2011 smoothed_diff_double (smooth, datalen) ;
cannam@125 2012
cannam@125 2013 half_max_abs = 0.0 ;
cannam@125 2014 for (k = 0 ; k < datalen ; k++)
cannam@125 2015 { if (error_function (data [k], smooth [k], margin))
cannam@125 2016 { printf ("\n\nLine %d: Incorrect sample (#%d : %d should be %d).\n", __LINE__, k, (int) data [k], (int) smooth [k]) ;
cannam@125 2017 oct_save_double (orig, smooth, datalen) ;
cannam@125 2018 exit (1) ;
cannam@125 2019 } ;
cannam@125 2020 half_max_abs = LCT_MAX (half_max_abs, 0.5 * fabs (data [k])) ;
cannam@125 2021 } ;
cannam@125 2022
cannam@125 2023 if (half_max_abs < 1.0)
cannam@125 2024 { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ;
cannam@125 2025 exit (1) ;
cannam@125 2026 } ;
cannam@125 2027
cannam@125 2028 if ((k = sf_read_double (file, data, datalen)) != sfinfo.frames - datalen)
cannam@125 2029 { printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ;
cannam@125 2030 exit (1) ;
cannam@125 2031 } ;
cannam@125 2032
cannam@125 2033 if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM &&
cannam@125 2034 (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610)
cannam@125 2035 for (k = 0 ; k < sfinfo.frames - datalen ; k++)
cannam@125 2036 if (ABS (data [k]) > decay_response (k))
cannam@125 2037 { printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, (int) data [k], (int) decay_response (k)) ;
cannam@125 2038 exit (1) ;
cannam@125 2039 } ;
cannam@125 2040
cannam@125 2041 /* Now test sf_seek function. */
cannam@125 2042 if (sfinfo.seekable)
cannam@125 2043 { if ((k = sf_seek (file, 0, SEEK_SET)) != 0)
cannam@125 2044 { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ;
cannam@125 2045 exit (1) ;
cannam@125 2046 } ;
cannam@125 2047
cannam@125 2048 for (m = 0 ; m < 3 ; m++)
cannam@125 2049 { test_read_double_or_die (file, m, data, datalen / 7, __LINE__) ;
cannam@125 2050
cannam@125 2051 smoothed_diff_double (data, datalen / 7) ;
cannam@125 2052 memcpy (smooth, orig + m * datalen / 7, datalen / 7 * sizeof (double)) ;
cannam@125 2053 smoothed_diff_double (smooth, datalen / 7) ;
cannam@125 2054
cannam@125 2055 for (k = 0 ; k < datalen / 7 ; k++)
cannam@125 2056 if (error_function (data [k], smooth [k], margin))
cannam@125 2057 { printf ("\nLine %d: Incorrect sample C (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), (int) smooth [k], (int) data [k]) ;
cannam@125 2058 for (m = 0 ; m < 10 ; m++)
cannam@125 2059 printf ("%d ", (int) data [k]) ;
cannam@125 2060 printf ("\n") ;
cannam@125 2061 exit (1) ;
cannam@125 2062 } ;
cannam@125 2063 } ; /* for (m = 0 ; m < 3 ; m++) */
cannam@125 2064
cannam@125 2065 seekpos = BUFFER_SIZE / 10 ;
cannam@125 2066
cannam@125 2067 /* Check seek from start of file. */
cannam@125 2068 if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos)
cannam@125 2069 { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ;
cannam@125 2070 exit (1) ;
cannam@125 2071 } ;
cannam@125 2072 test_read_double_or_die (file, 0, data, channels, __LINE__) ;
cannam@125 2073
cannam@125 2074 if (error_function (data [0], orig [seekpos * channels], margin))
cannam@125 2075 { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_read_double failed (%d, %d).\n", __LINE__, (int) orig [1], (int) data [0]) ;
cannam@125 2076 exit (1) ;
cannam@125 2077 } ;
cannam@125 2078
cannam@125 2079 if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1)
cannam@125 2080 { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ;
cannam@125 2081 exit (1) ;
cannam@125 2082 } ;
cannam@125 2083
cannam@125 2084 seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ;
cannam@125 2085 k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ;
cannam@125 2086 test_read_double_or_die (file, 0, data, channels, __LINE__) ;
cannam@125 2087 if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos)
cannam@125 2088 { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_read_double failed (%d, %d) (%d, %d).\n", __LINE__, (int) data [0], (int) orig [seekpos * channels], k, seekpos + 1) ;
cannam@125 2089 exit (1) ;
cannam@125 2090 } ;
cannam@125 2091
cannam@125 2092 seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ;
cannam@125 2093 /* Check seek backward from current position. */
cannam@125 2094 k = sf_seek (file, -20, SEEK_CUR) ;
cannam@125 2095 test_read_double_or_die (file, 0, data, channels, __LINE__) ;
cannam@125 2096 if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos)
cannam@125 2097 { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_read_double failed (%d, %d) (%d, %d).\n", __LINE__, (int) data [0], (int) orig [seekpos * channels], k, seekpos) ;
cannam@125 2098 exit (1) ;
cannam@125 2099 } ;
cannam@125 2100
cannam@125 2101 /* Check that read past end of file returns number of items. */
cannam@125 2102 sf_seek (file, sfinfo.frames, SEEK_SET) ;
cannam@125 2103
cannam@125 2104 if ((k = sf_read_double (file, data, datalen)) != 0)
cannam@125 2105 { printf ("\n\nLine %d: Return value from sf_read_double past end of file incorrect (%d).\n", __LINE__, k) ;
cannam@125 2106 exit (1) ;
cannam@125 2107 } ;
cannam@125 2108
cannam@125 2109 /* Check seek backward from end. */
cannam@125 2110
cannam@125 2111 if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5)
cannam@125 2112 { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ;
cannam@125 2113 exit (1) ;
cannam@125 2114 } ;
cannam@125 2115
cannam@125 2116 test_read_double_or_die (file, 0, data, channels, __LINE__) ;
cannam@125 2117 if (error_function (data [0], orig [5 * channels], margin))
cannam@125 2118 { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_read_double failed (%f should be %f).\n", __LINE__, data [0], orig [5 * channels]) ;
cannam@125 2119 exit (1) ;
cannam@125 2120 } ;
cannam@125 2121 } /* if (sfinfo.seekable) */
cannam@125 2122
cannam@125 2123 sf_close (file) ;
cannam@125 2124
cannam@125 2125 unlink (filename) ;
cannam@125 2126 printf ("ok\n") ;
cannam@125 2127 } /* sdlcomp_test_double */
cannam@125 2128
cannam@125 2129 static void
cannam@125 2130 read_raw_test (const char *filename, int filetype, int channels)
cannam@125 2131 { SNDFILE *file ;
cannam@125 2132 SF_INFO sfinfo ;
cannam@125 2133 sf_count_t count, datalen ;
cannam@125 2134 short *orig, *data ;
cannam@125 2135 int k ;
cannam@125 2136
cannam@125 2137 print_test_name ("read_raw_test", filename) ;
cannam@125 2138
cannam@125 2139 datalen = ARRAY_LEN (orig_buffer.s) / 2 ;
cannam@125 2140
cannam@125 2141 orig = orig_buffer.s ;
cannam@125 2142 data = data_buffer.s ;
cannam@125 2143
cannam@125 2144 gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ;
cannam@125 2145 for (k = 0 ; k < datalen ; k++)
cannam@125 2146 orig [k] = lrint (orig_buffer.d [k]) ;
cannam@125 2147
cannam@125 2148 sfinfo.samplerate = SAMPLE_RATE ;
cannam@125 2149 sfinfo.frames = 123456789 ; /* Ridiculous value. */
cannam@125 2150 sfinfo.channels = channels ;
cannam@125 2151 sfinfo.format = filetype ;
cannam@125 2152
cannam@125 2153 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 2154 test_write_short_or_die (file, 0, orig, datalen, __LINE__) ;
cannam@125 2155 sf_set_string (file, SF_STR_COMMENT, long_comment) ;
cannam@125 2156 sf_close (file) ;
cannam@125 2157
cannam@125 2158 memset (data, 0, datalen * sizeof (double)) ;
cannam@125 2159
cannam@125 2160 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@125 2161 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@125 2162
cannam@125 2163 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
cannam@125 2164
cannam@125 2165 if (sfinfo.format != filetype)
cannam@125 2166 { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", filetype, sfinfo.format) ;
cannam@125 2167 exit (1) ;
cannam@125 2168 } ;
cannam@125 2169
cannam@125 2170 if (sfinfo.frames < datalen / channels)
cannam@125 2171 { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ;
cannam@125 2172 exit (1) ;
cannam@125 2173 } ;
cannam@125 2174
cannam@125 2175 if (sfinfo.frames > (datalen + 400))
cannam@125 2176 { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ;
cannam@125 2177 exit (1) ;
cannam@125 2178 } ;
cannam@125 2179
cannam@125 2180 if (sfinfo.channels != channels)
cannam@125 2181 { printf ("Incorrect number of channels in file.\n") ;
cannam@125 2182 exit (1) ;
cannam@125 2183 } ;
cannam@125 2184
cannam@125 2185 check_comment (file, filetype, __LINE__) ;
cannam@125 2186
cannam@125 2187 count = sf_read_raw (file, orig_buffer.c, datalen + 5 * channels) ;
cannam@125 2188 if (count != sfinfo.channels * sfinfo.frames)
cannam@125 2189 { printf ("\nLine %d : sf_read_raw returned %" PRId64 " should be %" PRId64 "\n", __LINE__, count, sfinfo.channels * sfinfo.frames) ;
cannam@125 2190 exit (1) ;
cannam@125 2191 } ;
cannam@125 2192
cannam@125 2193 sf_close (file) ;
cannam@125 2194
cannam@125 2195 unlink (filename) ;
cannam@125 2196 printf ("ok\n") ;
cannam@125 2197 } /* read_raw_test */
cannam@125 2198
cannam@125 2199 /*========================================================================================
cannam@125 2200 ** Auxiliary functions
cannam@125 2201 */
cannam@125 2202
cannam@125 2203 #define SIGNAL_MAXVAL 30000.0
cannam@125 2204 #define DECAY_COUNT 1000
cannam@125 2205
cannam@125 2206 static int
cannam@125 2207 decay_response (int k)
cannam@125 2208 { if (k < 1)
cannam@125 2209 return (int) (1.2 * SIGNAL_MAXVAL) ;
cannam@125 2210 if (k > DECAY_COUNT)
cannam@125 2211 return 0 ;
cannam@125 2212 return (int) (1.2 * SIGNAL_MAXVAL * (DECAY_COUNT - k) / (1.0 * DECAY_COUNT)) ;
cannam@125 2213 } /* decay_response */
cannam@125 2214
cannam@125 2215 static void
cannam@125 2216 gen_signal_double (double *data, double scale, int channels, int datalen)
cannam@125 2217 { int k, ramplen ;
cannam@125 2218 double amp = 0.0 ;
cannam@125 2219
cannam@125 2220 ramplen = DECAY_COUNT ;
cannam@125 2221
cannam@125 2222 if (channels == 1)
cannam@125 2223 { for (k = 0 ; k < datalen ; k++)
cannam@125 2224 { if (k <= ramplen)
cannam@125 2225 amp = scale * k / ((double) ramplen) ;
cannam@125 2226 else if (k > datalen - ramplen)
cannam@125 2227 amp = scale * (datalen - k) / ((double) ramplen) ;
cannam@125 2228
cannam@125 2229 /*-printf ("%3d : %g\n", k, amp) ;-*/
cannam@125 2230
cannam@125 2231 data [k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))
cannam@125 2232 + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ;
cannam@125 2233 } ;
cannam@125 2234 }
cannam@125 2235 else
cannam@125 2236 { for (k = 0 ; k < datalen ; k ++)
cannam@125 2237 { if (k <= ramplen)
cannam@125 2238 amp = scale * k / ((double) ramplen) ;
cannam@125 2239 else if (k > datalen - ramplen)
cannam@125 2240 amp = scale * (datalen - k) / ((double) ramplen) ;
cannam@125 2241
cannam@125 2242 data [2 * k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))
cannam@125 2243 + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ;
cannam@125 2244 data [2 * k + 1] = amp * (0.4 * sin (55.5 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))
cannam@125 2245 + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ;
cannam@125 2246 } ;
cannam@125 2247 } ;
cannam@125 2248
cannam@125 2249 return ;
cannam@125 2250 } /* gen_signal_double */
cannam@125 2251
cannam@125 2252 static int
cannam@125 2253 error_function (double data, double orig, double margin)
cannam@125 2254 { double error ;
cannam@125 2255
cannam@125 2256 if (fabs (orig) <= 500.0)
cannam@125 2257 error = fabs (fabs (data) - fabs (orig)) / 2000.0 ;
cannam@125 2258 else if (fabs (orig) <= 1000.0)
cannam@125 2259 error = fabs (data - orig) / 3000.0 ;
cannam@125 2260 else
cannam@125 2261 error = fabs (data - orig) / fabs (orig) ;
cannam@125 2262
cannam@125 2263 if (error > margin)
cannam@125 2264 { printf ("\n\nerror_function (data = %f, orig = %f, margin = %f) -> %f\n", data, orig, margin, error) ;
cannam@125 2265 return 1 ;
cannam@125 2266 } ;
cannam@125 2267 return 0 ;
cannam@125 2268 } /* error_function */
cannam@125 2269
cannam@125 2270 static void
cannam@125 2271 smoothed_diff_short (short *data, unsigned int datalen)
cannam@125 2272 { unsigned int k ;
cannam@125 2273 double memory = 0.0 ;
cannam@125 2274
cannam@125 2275 /* Calculate the smoothed sample-to-sample difference. */
cannam@125 2276 for (k = 0 ; k < datalen - 1 ; k++)
cannam@125 2277 { memory = 0.7 * memory + (1 - 0.7) * (double) (data [k+1] - data [k]) ;
cannam@125 2278 data [k] = (short) memory ;
cannam@125 2279 } ;
cannam@125 2280 data [datalen-1] = data [datalen-2] ;
cannam@125 2281
cannam@125 2282 } /* smoothed_diff_short */
cannam@125 2283
cannam@125 2284 static void
cannam@125 2285 smoothed_diff_int (int *data, unsigned int datalen)
cannam@125 2286 { unsigned int k ;
cannam@125 2287 double memory = 0.0 ;
cannam@125 2288
cannam@125 2289 /* Calculate the smoothed sample-to-sample difference. */
cannam@125 2290 for (k = 0 ; k < datalen - 1 ; k++)
cannam@125 2291 { memory = 0.7 * memory + (1 - 0.7) * (double) (data [k+1] - data [k]) ;
cannam@125 2292 data [k] = (int) memory ;
cannam@125 2293 } ;
cannam@125 2294 data [datalen-1] = data [datalen-2] ;
cannam@125 2295
cannam@125 2296 } /* smoothed_diff_int */
cannam@125 2297
cannam@125 2298 static void
cannam@125 2299 smoothed_diff_float (float *data, unsigned int datalen)
cannam@125 2300 { unsigned int k ;
cannam@125 2301 float memory = 0.0 ;
cannam@125 2302
cannam@125 2303 /* Calculate the smoothed sample-to-sample difference. */
cannam@125 2304 for (k = 0 ; k < datalen - 1 ; k++)
cannam@125 2305 { memory = 0.7 * memory + (1 - 0.7) * (data [k+1] - data [k]) ;
cannam@125 2306 data [k] = memory ;
cannam@125 2307 } ;
cannam@125 2308 data [datalen-1] = data [datalen-2] ;
cannam@125 2309
cannam@125 2310 } /* smoothed_diff_float */
cannam@125 2311
cannam@125 2312 static void
cannam@125 2313 smoothed_diff_double (double *data, unsigned int datalen)
cannam@125 2314 { unsigned int k ;
cannam@125 2315 double memory = 0.0 ;
cannam@125 2316
cannam@125 2317 /* Calculate the smoothed sample-to-sample difference. */
cannam@125 2318 for (k = 0 ; k < datalen - 1 ; k++)
cannam@125 2319 { memory = 0.7 * memory + (1 - 0.7) * (data [k+1] - data [k]) ;
cannam@125 2320 data [k] = memory ;
cannam@125 2321 } ;
cannam@125 2322 data [datalen-1] = data [datalen-2] ;
cannam@125 2323
cannam@125 2324 } /* smoothed_diff_double */
cannam@125 2325
cannam@125 2326 static void
cannam@125 2327 check_comment (SNDFILE * file, int format, int lineno)
cannam@125 2328 { const char *comment ;
cannam@125 2329
cannam@125 2330 switch (format & SF_FORMAT_TYPEMASK)
cannam@125 2331 { case SF_FORMAT_AIFF :
cannam@125 2332 case SF_FORMAT_WAV :
cannam@125 2333 case SF_FORMAT_WAVEX :
cannam@125 2334 break ;
cannam@125 2335 default :
cannam@125 2336 return ;
cannam@125 2337 } ;
cannam@125 2338
cannam@125 2339 comment = sf_get_string (file, SF_STR_COMMENT) ;
cannam@125 2340 if (comment == NULL)
cannam@125 2341 { printf ("\n\nLine %d : File does not contain a comment string.\n\n", lineno) ;
cannam@125 2342 exit (1) ;
cannam@125 2343 } ;
cannam@125 2344
cannam@125 2345 if (strcmp (comment, long_comment) != 0)
cannam@125 2346 { printf ("\n\nLine %d : File comment does not match comment written.\n\n", lineno) ;
cannam@125 2347 exit (1) ;
cannam@125 2348 } ;
cannam@125 2349
cannam@125 2350 return ;
cannam@125 2351 } /* check_comment */
cannam@125 2352
cannam@125 2353 static int
cannam@125 2354 is_lossy (int filetype)
cannam@125 2355 {
cannam@125 2356 switch (SF_FORMAT_SUBMASK & filetype)
cannam@125 2357 { case SF_FORMAT_PCM_U8 :
cannam@125 2358 case SF_FORMAT_PCM_S8 :
cannam@125 2359 case SF_FORMAT_PCM_16 :
cannam@125 2360 case SF_FORMAT_PCM_24 :
cannam@125 2361 case SF_FORMAT_PCM_32 :
cannam@125 2362 case SF_FORMAT_FLOAT :
cannam@125 2363 case SF_FORMAT_DOUBLE :
cannam@125 2364 return 0 ;
cannam@125 2365
cannam@125 2366 default :
cannam@125 2367 break ;
cannam@125 2368 } ;
cannam@125 2369
cannam@125 2370 return 1 ;
cannam@125 2371 } /* is_lossy */
cannam@125 2372