annotate src/libsndfile-1.0.27/tests/write_read_test.tpl @ 168:ceec0dd9ec9c

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam <cannam@all-day-breakfast.com>
date Fri, 07 Feb 2020 11:51:13 +0000
parents cd6cdf86811e
children
rev   line source
cannam@125 1 [+ AutoGen5 template c +]
cannam@125 2 /*
cannam@125 3 ** Copyright (C) 1999-2016 Erik de Castro Lopo <erikd@mega-nerd.com>
cannam@125 4 **
cannam@125 5 ** This program is free software; you can redistribute it and/or modify
cannam@125 6 ** it under the terms of the GNU General Public License as published by
cannam@125 7 ** the Free Software Foundation; either version 2 of the License, or
cannam@125 8 ** (at your option) any later version.
cannam@125 9 **
cannam@125 10 ** This program is distributed in the hope that it will be useful,
cannam@125 11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
cannam@125 12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cannam@125 13 ** GNU General Public License for more details.
cannam@125 14 **
cannam@125 15 ** You should have received a copy of the GNU General Public License
cannam@125 16 ** along with this program; if not, write to the Free Software
cannam@125 17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
cannam@125 18 */
cannam@125 19
cannam@125 20 #include "sfconfig.h"
cannam@125 21
cannam@125 22 #include <stdio.h>
cannam@125 23 #include <stdlib.h>
cannam@125 24 #include <string.h>
cannam@125 25 #include <math.h>
cannam@125 26 #include <inttypes.h>
cannam@125 27
cannam@125 28
cannam@125 29 #if HAVE_UNISTD_H
cannam@125 30 #include <unistd.h>
cannam@125 31 #endif
cannam@125 32
cannam@125 33 #include <sndfile.h>
cannam@125 34
cannam@125 35 #include "utils.h"
cannam@125 36 #include "generate.h"
cannam@125 37
cannam@125 38 #define SAMPLE_RATE 11025
cannam@125 39 #define DATA_LENGTH (1 << 12)
cannam@125 40
cannam@125 41 #define SILLY_WRITE_COUNT (234)
cannam@125 42
cannam@125 43 [+ FOR data_type
cannam@125 44 +]static void pcm_test_[+ (get "type_name") +] (const char *str, int format, int long_file_ok) ;
cannam@125 45 [+ ENDFOR data_type
cannam@125 46 +]
cannam@125 47 static void empty_file_test (const char *filename, int format) ;
cannam@125 48
cannam@125 49 typedef union
cannam@125 50 { double d [DATA_LENGTH] ;
cannam@125 51 float f [DATA_LENGTH] ;
cannam@125 52 int i [DATA_LENGTH] ;
cannam@125 53 short s [DATA_LENGTH] ;
cannam@125 54 char c [DATA_LENGTH] ;
cannam@125 55 } BUFFER ;
cannam@125 56
cannam@125 57 static BUFFER orig_data ;
cannam@125 58 static BUFFER test_data ;
cannam@125 59
cannam@125 60 int
cannam@125 61 main (int argc, char **argv)
cannam@125 62 { int do_all = 0 ;
cannam@125 63 int test_count = 0 ;
cannam@125 64
cannam@125 65 count_open_files () ;
cannam@125 66
cannam@125 67 if (argc != 2)
cannam@125 68 { printf ("Usage : %s <test>\n", argv [0]) ;
cannam@125 69 printf (" Where <test> is one of the following:\n") ;
cannam@125 70 printf (" wav - test WAV file functions (little endian)\n") ;
cannam@125 71 printf (" aiff - test AIFF file functions (big endian)\n") ;
cannam@125 72 printf (" au - test AU file functions\n") ;
cannam@125 73 printf (" avr - test AVR file functions\n") ;
cannam@125 74 printf (" caf - test CAF file functions\n") ;
cannam@125 75 printf (" raw - test RAW header-less PCM file functions\n") ;
cannam@125 76 printf (" paf - test PAF file functions\n") ;
cannam@125 77 printf (" svx - test 8SVX/16SV file functions\n") ;
cannam@125 78 printf (" nist - test NIST Sphere file functions\n") ;
cannam@125 79 printf (" ircam - test IRCAM file functions\n") ;
cannam@125 80 printf (" voc - Create Voice file functions\n") ;
cannam@125 81 printf (" w64 - Sonic Foundry's W64 file functions\n") ;
cannam@125 82 printf (" flac - test FLAC file functions\n") ;
cannam@125 83 printf (" mpc2k - test MPC 2000 file functions\n") ;
cannam@125 84 printf (" rf64 - test RF64 file functions\n") ;
cannam@125 85 printf (" all - perform all tests\n") ;
cannam@125 86 exit (1) ;
cannam@125 87 } ;
cannam@125 88
cannam@125 89 do_all = !strcmp (argv [1], "all") ;
cannam@125 90
cannam@125 91 if (do_all || ! strcmp (argv [1], "wav"))
cannam@125 92 { pcm_test_char ("char.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_U8, SF_FALSE) ;
cannam@125 93 pcm_test_short ("short.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 94 pcm_test_24bit ("24bit.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 95 pcm_test_int ("int.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 96
cannam@125 97 pcm_test_char ("char.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_U8, SF_FALSE) ;
cannam@125 98 pcm_test_short ("short.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 99 pcm_test_24bit ("24bit.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 100 pcm_test_int ("int.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 101
cannam@125 102 pcm_test_24bit ("24bit.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 103 pcm_test_int ("int.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 104
cannam@125 105 /* Lite remove start */
cannam@125 106 pcm_test_float ("float.wav" , SF_FORMAT_WAV | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 107 pcm_test_double ("double.wav" , SF_FORMAT_WAV | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 108
cannam@125 109 pcm_test_float ("float.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 110 pcm_test_double ("double.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 111
cannam@125 112 pcm_test_float ("float.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 113 pcm_test_double ("double.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 114 /* Lite remove end */
cannam@125 115
cannam@125 116 empty_file_test ("empty_char.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8) ;
cannam@125 117 empty_file_test ("empty_short.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
cannam@125 118 empty_file_test ("empty_float.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT) ;
cannam@125 119
cannam@125 120 test_count++ ;
cannam@125 121 } ;
cannam@125 122
cannam@125 123 if (do_all || ! strcmp (argv [1], "aiff"))
cannam@125 124 { pcm_test_char ("char_u8.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_U8, SF_FALSE) ;
cannam@125 125 pcm_test_char ("char_s8.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_S8, SF_FALSE) ;
cannam@125 126 pcm_test_short ("short.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 127 pcm_test_24bit ("24bit.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 128 pcm_test_int ("int.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 129
cannam@125 130 pcm_test_short ("short_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 131 pcm_test_24bit ("24bit_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 132 pcm_test_int ("int_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 133
cannam@125 134 pcm_test_short ("short_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 135 pcm_test_24bit ("24bit_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 136 pcm_test_int ("int_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 137
cannam@125 138 /* Lite remove start */
cannam@125 139 pcm_test_short ("dwvw16.aifc", SF_FORMAT_AIFF | SF_FORMAT_DWVW_16, SF_TRUE) ;
cannam@125 140 pcm_test_24bit ("dwvw24.aifc", SF_FORMAT_AIFF | SF_FORMAT_DWVW_24, SF_TRUE) ;
cannam@125 141
cannam@125 142 pcm_test_float ("float.aifc" , SF_FORMAT_AIFF | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 143 pcm_test_double ("double.aifc" , SF_FORMAT_AIFF | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 144 /* Lite remove end */
cannam@125 145
cannam@125 146 empty_file_test ("empty_char.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_U8) ;
cannam@125 147 empty_file_test ("empty_short.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ;
cannam@125 148 empty_file_test ("empty_float.aiff", SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ;
cannam@125 149
cannam@125 150 test_count++ ;
cannam@125 151 } ;
cannam@125 152
cannam@125 153 if (do_all || ! strcmp (argv [1], "au"))
cannam@125 154 { pcm_test_char ("char.au" , SF_FORMAT_AU | SF_FORMAT_PCM_S8, SF_FALSE) ;
cannam@125 155 pcm_test_short ("short.au" , SF_FORMAT_AU | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 156 pcm_test_24bit ("24bit.au" , SF_FORMAT_AU | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 157 pcm_test_int ("int.au" , SF_FORMAT_AU | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 158 /* Lite remove start */
cannam@125 159 pcm_test_float ("float.au" , SF_FORMAT_AU | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 160 pcm_test_double ("double.au", SF_FORMAT_AU | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 161 /* Lite remove end */
cannam@125 162
cannam@125 163 pcm_test_char ("char_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_S8, SF_FALSE) ;
cannam@125 164 pcm_test_short ("short_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 165 pcm_test_24bit ("24bit_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 166 pcm_test_int ("int_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 167 /* Lite remove start */
cannam@125 168 pcm_test_float ("float_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 169 pcm_test_double ("double_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 170 /* Lite remove end */
cannam@125 171 test_count++ ;
cannam@125 172 } ;
cannam@125 173
cannam@125 174 if (do_all || ! strcmp (argv [1], "caf"))
cannam@125 175 { pcm_test_char ("char.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_S8, SF_FALSE) ;
cannam@125 176 pcm_test_short ("short.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 177 pcm_test_24bit ("24bit.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 178 pcm_test_int ("int.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 179 /* Lite remove start */
cannam@125 180 pcm_test_float ("float.caf" , SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 181 pcm_test_double ("double.caf" , SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 182 /* Lite remove end */
cannam@125 183
cannam@125 184 pcm_test_short ("short_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 185 pcm_test_24bit ("24bit_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 186 pcm_test_int ("int_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 187 /* Lite remove start */
cannam@125 188 pcm_test_float ("float_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 189 pcm_test_double ("double_le.caf", SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 190
cannam@125 191 pcm_test_short ("alac16.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_16, SF_FALSE) ;
cannam@125 192 pcm_test_20bit ("alac20.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_20, SF_FALSE) ;
cannam@125 193 pcm_test_24bit ("alac24.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_24, SF_FALSE) ;
cannam@125 194 pcm_test_int ("alac32.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_32, SF_FALSE) ;
cannam@125 195
cannam@125 196 /* Lite remove end */
cannam@125 197 test_count++ ;
cannam@125 198 } ;
cannam@125 199
cannam@125 200 if (do_all || ! strcmp (argv [1], "raw"))
cannam@125 201 { pcm_test_char ("char_s8.raw" , SF_FORMAT_RAW | SF_FORMAT_PCM_S8, SF_FALSE) ;
cannam@125 202 pcm_test_char ("char_u8.raw" , SF_FORMAT_RAW | SF_FORMAT_PCM_U8, SF_FALSE) ;
cannam@125 203
cannam@125 204 pcm_test_short ("short_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 205 pcm_test_short ("short_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 206 pcm_test_24bit ("24bit_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 207 pcm_test_24bit ("24bit_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 208 pcm_test_int ("int_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 209 pcm_test_int ("int_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 210
cannam@125 211 /* Lite remove start */
cannam@125 212 pcm_test_float ("float_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 213 pcm_test_float ("float_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 214
cannam@125 215 pcm_test_double ("double_le.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 216 pcm_test_double ("double_be.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 217 /* Lite remove end */
cannam@125 218 test_count++ ;
cannam@125 219 } ;
cannam@125 220
cannam@125 221 /* Lite remove start */
cannam@125 222 if (do_all || ! strcmp (argv [1], "paf"))
cannam@125 223 { pcm_test_char ("char_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_S8, SF_FALSE) ;
cannam@125 224 pcm_test_char ("char_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_S8, SF_FALSE) ;
cannam@125 225 pcm_test_short ("short_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 226 pcm_test_short ("short_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 227 pcm_test_24bit ("24bit_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, SF_TRUE) ;
cannam@125 228 pcm_test_24bit ("24bit_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, SF_TRUE) ;
cannam@125 229 test_count++ ;
cannam@125 230 } ;
cannam@125 231
cannam@125 232 if (do_all || ! strcmp (argv [1], "svx"))
cannam@125 233 { pcm_test_char ("char.svx" , SF_FORMAT_SVX | SF_FORMAT_PCM_S8, SF_FALSE) ;
cannam@125 234 pcm_test_short ("short.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 235
cannam@125 236 empty_file_test ("empty_char.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_S8) ;
cannam@125 237 empty_file_test ("empty_short.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16) ;
cannam@125 238
cannam@125 239 test_count++ ;
cannam@125 240 } ;
cannam@125 241
cannam@125 242 if (do_all || ! strcmp (argv [1], "nist"))
cannam@125 243 { pcm_test_short ("short_le.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 244 pcm_test_short ("short_be.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 245 pcm_test_24bit ("24bit_le.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 246 pcm_test_24bit ("24bit_be.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 247 pcm_test_int ("int_le.nist" , SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 248 pcm_test_int ("int_be.nist" , SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 249
cannam@125 250 test_count++ ;
cannam@125 251 } ;
cannam@125 252
cannam@125 253 if (do_all || ! strcmp (argv [1], "ircam"))
cannam@125 254 { pcm_test_short ("short_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 255 pcm_test_short ("short_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 256 pcm_test_int ("int_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 257 pcm_test_int ("int_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 258 pcm_test_float ("float_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 259 pcm_test_float ("float_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 260
cannam@125 261 test_count++ ;
cannam@125 262 } ;
cannam@125 263
cannam@125 264 if (do_all || ! strcmp (argv [1], "voc"))
cannam@125 265 { pcm_test_char ("char.voc" , SF_FORMAT_VOC | SF_FORMAT_PCM_U8, SF_FALSE) ;
cannam@125 266 pcm_test_short ("short.voc", SF_FORMAT_VOC | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 267
cannam@125 268 test_count++ ;
cannam@125 269 } ;
cannam@125 270
cannam@125 271 if (do_all || ! strcmp (argv [1], "mat4"))
cannam@125 272 { pcm_test_short ("short_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 273 pcm_test_short ("short_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 274 pcm_test_int ("int_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 275 pcm_test_int ("int_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 276 pcm_test_float ("float_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 277 pcm_test_float ("float_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 278 pcm_test_double ("double_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 279 pcm_test_double ("double_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 280
cannam@125 281 empty_file_test ("empty_short.mat4", SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ;
cannam@125 282 empty_file_test ("empty_float.mat4", SF_FORMAT_MAT4 | SF_FORMAT_FLOAT) ;
cannam@125 283 test_count++ ;
cannam@125 284 } ;
cannam@125 285
cannam@125 286 if (do_all || ! strcmp (argv [1], "mat5"))
cannam@125 287 { pcm_test_char ("char_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8, SF_FALSE) ;
cannam@125 288 pcm_test_char ("char_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8, SF_FALSE) ;
cannam@125 289 pcm_test_short ("short_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 290 pcm_test_short ("short_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 291 pcm_test_int ("int_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 292 pcm_test_int ("int_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 293 pcm_test_float ("float_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 294 pcm_test_float ("float_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 295 pcm_test_double ("double_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 296 pcm_test_double ("double_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 297
cannam@125 298 increment_open_file_count () ;
cannam@125 299
cannam@125 300 empty_file_test ("empty_char.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8) ;
cannam@125 301 empty_file_test ("empty_short.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ;
cannam@125 302 empty_file_test ("empty_float.mat5", SF_FORMAT_MAT5 | SF_FORMAT_FLOAT) ;
cannam@125 303
cannam@125 304 test_count++ ;
cannam@125 305 } ;
cannam@125 306
cannam@125 307 if (do_all || ! strcmp (argv [1], "pvf"))
cannam@125 308 { pcm_test_char ("char.pvf" , SF_FORMAT_PVF | SF_FORMAT_PCM_S8, SF_FALSE) ;
cannam@125 309 pcm_test_short ("short.pvf", SF_FORMAT_PVF | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 310 pcm_test_int ("int.pvf" , SF_FORMAT_PVF | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 311 test_count++ ;
cannam@125 312 } ;
cannam@125 313
cannam@125 314 if (do_all || ! strcmp (argv [1], "htk"))
cannam@125 315 { pcm_test_short ("short.htk", SF_FORMAT_HTK | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 316 test_count++ ;
cannam@125 317 } ;
cannam@125 318
cannam@125 319 if (do_all || ! strcmp (argv [1], "mpc2k"))
cannam@125 320 { pcm_test_short ("short.mpc", SF_FORMAT_MPC2K | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 321 test_count++ ;
cannam@125 322 } ;
cannam@125 323
cannam@125 324 if (do_all || ! strcmp (argv [1], "avr"))
cannam@125 325 { pcm_test_char ("char_u8.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_U8, SF_FALSE) ;
cannam@125 326 pcm_test_char ("char_s8.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_S8, SF_FALSE) ;
cannam@125 327 pcm_test_short ("short.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 328 test_count++ ;
cannam@125 329 } ;
cannam@125 330 /* Lite remove end */
cannam@125 331
cannam@125 332 if (do_all || ! strcmp (argv [1], "w64"))
cannam@125 333 { pcm_test_char ("char.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_U8, SF_FALSE) ;
cannam@125 334 pcm_test_short ("short.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 335 pcm_test_24bit ("24bit.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 336 pcm_test_int ("int.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 337 /* Lite remove start */
cannam@125 338 pcm_test_float ("float.w64" , SF_FORMAT_W64 | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 339 pcm_test_double ("double.w64" , SF_FORMAT_W64 | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 340 /* Lite remove end */
cannam@125 341
cannam@125 342 empty_file_test ("empty_char.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_U8) ;
cannam@125 343 empty_file_test ("empty_short.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ;
cannam@125 344 empty_file_test ("empty_float.w64", SF_FORMAT_W64 | SF_FORMAT_FLOAT) ;
cannam@125 345
cannam@125 346 test_count++ ;
cannam@125 347 } ;
cannam@125 348
cannam@125 349 if (do_all || ! strcmp (argv [1], "sds"))
cannam@125 350 { pcm_test_char ("char.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_S8, SF_FALSE) ;
cannam@125 351 pcm_test_short ("short.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 352 pcm_test_24bit ("24bit.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 353
cannam@125 354 empty_file_test ("empty_char.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_S8) ;
cannam@125 355 empty_file_test ("empty_short.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_16) ;
cannam@125 356
cannam@125 357 test_count++ ;
cannam@125 358 } ;
cannam@125 359
cannam@125 360 if (do_all || ! strcmp (argv [1], "sd2"))
cannam@125 361 { pcm_test_char ("char.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_S8, SF_TRUE) ;
cannam@125 362 pcm_test_short ("short.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_16, SF_TRUE) ;
cannam@125 363 pcm_test_24bit ("24bit.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_24, SF_TRUE) ;
cannam@125 364 pcm_test_int ("32bit.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_32, SF_TRUE) ;
cannam@125 365 test_count++ ;
cannam@125 366 } ;
cannam@125 367
cannam@125 368 if (do_all || ! strcmp (argv [1], "flac"))
cannam@125 369 { if (HAVE_EXTERNAL_XIPH_LIBS)
cannam@125 370 { pcm_test_char ("char.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, SF_TRUE) ;
cannam@125 371 pcm_test_short ("short.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_16, SF_TRUE) ;
cannam@125 372 pcm_test_24bit ("24bit.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_24, SF_TRUE) ;
cannam@125 373 }
cannam@125 374 else
cannam@125 375 puts (" No FLAC tests because FLAC support was not compiled in.") ;
cannam@125 376 test_count++ ;
cannam@125 377 } ;
cannam@125 378
cannam@125 379 if (do_all || ! strcmp (argv [1], "rf64"))
cannam@125 380 { pcm_test_char ("char.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_U8, SF_FALSE) ;
cannam@125 381 pcm_test_short ("short.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_16, SF_FALSE) ;
cannam@125 382 pcm_test_24bit ("24bit.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_24, SF_FALSE) ;
cannam@125 383 pcm_test_int ("int.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_32, SF_FALSE) ;
cannam@125 384
cannam@125 385 /* Lite remove start */
cannam@125 386 pcm_test_float ("float.rf64" , SF_FORMAT_RF64 | SF_FORMAT_FLOAT , SF_FALSE) ;
cannam@125 387 pcm_test_double ("double.rf64" , SF_FORMAT_RF64 | SF_FORMAT_DOUBLE, SF_FALSE) ;
cannam@125 388 empty_file_test ("empty_char.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_U8) ;
cannam@125 389 empty_file_test ("empty_short.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
cannam@125 390 empty_file_test ("empty_float.rf64", SF_FORMAT_RF64 | SF_FORMAT_FLOAT) ;
cannam@125 391 /* Lite remove end */
cannam@125 392
cannam@125 393 test_count++ ;
cannam@125 394 } ;
cannam@125 395
cannam@125 396 if (test_count == 0)
cannam@125 397 { printf ("Mono : ************************************\n") ;
cannam@125 398 printf ("Mono : * No '%s' test defined.\n", argv [1]) ;
cannam@125 399 printf ("Mono : ************************************\n") ;
cannam@125 400 return 1 ;
cannam@125 401 } ;
cannam@125 402
cannam@125 403 /* Only open file descriptors should be stdin, stdout and stderr. */
cannam@125 404 check_open_file_count_or_die (__LINE__) ;
cannam@125 405
cannam@125 406 return 0 ;
cannam@125 407 } /* main */
cannam@125 408
cannam@125 409 /*============================================================================================
cannam@125 410 ** Helper functions and macros.
cannam@125 411 */
cannam@125 412
cannam@125 413 static void create_short_file (const char *filename) ;
cannam@125 414
cannam@125 415 #define CHAR_ERROR(x, y) (abs ((x) - (y)) > 255)
cannam@125 416 #define INT_ERROR(x, y) (((x) - (y)) != 0)
cannam@125 417 #define BIT_20_ERROR(x, y) (abs ((x) - (y)) > 4095)
cannam@125 418 #define TRIBYTE_ERROR(x, y) (abs ((x) - (y)) > 255)
cannam@125 419 #define FLOAT_ERROR(x, y) (fabs ((x) - (y)) > 1e-5)
cannam@125 420
cannam@125 421 #define CONVERT_DATA(k, len, new, orig) \
cannam@125 422 { for ((k) = 0 ; (k) < (len) ; (k) ++) \
cannam@125 423 (new) [k] = (orig) [k] ; \
cannam@125 424 }
cannam@125 425
cannam@125 426 [+ FOR data_type
cannam@125 427 +]
cannam@125 428 /*======================================================================================
cannam@125 429 */
cannam@125 430
cannam@125 431 static void mono_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
cannam@125 432 static void stereo_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
cannam@125 433 static void mono_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
cannam@125 434 static void new_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int allow_fd) ;
cannam@125 435 static void multi_seek_test (const char * filename, int format) ;
cannam@125 436 static void write_seek_extend_test (const char * filename, int format) ;
cannam@125 437
cannam@125 438 static void
cannam@125 439 pcm_test_[+ (get "type_name") +] (const char *filename, int format, int long_file_ok)
cannam@125 440 { SF_INFO sfinfo ;
cannam@125 441 [+ (get "data_type") +] *orig ;
cannam@125 442 int k, allow_fd ;
cannam@125 443
cannam@125 444 /* Sd2 files cannot be opened from an existing file descriptor. */
cannam@125 445 allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ;
cannam@125 446
cannam@125 447 print_test_name ("pcm_test_[+ (get "type_name") +]", filename) ;
cannam@125 448
cannam@125 449 sfinfo.samplerate = 44100 ;
cannam@125 450 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
cannam@125 451 sfinfo.channels = 1 ;
cannam@125 452 sfinfo.format = format ;
cannam@125 453
cannam@125 454 test_sf_format_or_die (&sfinfo, __LINE__) ;
cannam@125 455
cannam@125 456 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, [+ (get "max_val") +]) ;
cannam@125 457
cannam@125 458 orig = orig_data.[+ (get "data_field") +] ;
cannam@125 459
cannam@125 460 /* Make this a macro so gdb steps over it in one go. */
cannam@125 461 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
cannam@125 462
cannam@125 463 /* Some test broken out here. */
cannam@125 464
cannam@125 465 mono_[+ (get "type_name") +]_test (filename, format, long_file_ok, allow_fd) ;
cannam@125 466
cannam@125 467 /* Sub format DWVW does not allow seeking. */
cannam@125 468 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
cannam@125 469 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
cannam@125 470 { unlink (filename) ;
cannam@125 471 printf ("no seek : ok\n") ;
cannam@125 472 return ;
cannam@125 473 } ;
cannam@125 474
cannam@125 475 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
cannam@125 476 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
cannam@125 477 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
cannam@125 478 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
cannam@125 479 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
cannam@125 480 )
cannam@125 481 mono_rdwr_[+ (get "type_name") +]_test (filename, format, long_file_ok, allow_fd) ;
cannam@125 482
cannam@125 483 /* If the format doesn't support stereo we're done. */
cannam@125 484 sfinfo.channels = 2 ;
cannam@125 485 if (sf_format_check (&sfinfo) == 0)
cannam@125 486 { unlink (filename) ;
cannam@125 487 puts ("no stereo : ok") ;
cannam@125 488 return ;
cannam@125 489 } ;
cannam@125 490
cannam@125 491 stereo_[+ (get "type_name") +]_test (filename, format, long_file_ok, allow_fd) ;
cannam@125 492
cannam@125 493 /* New read/write test. Not sure if this is needed yet. */
cannam@125 494
cannam@125 495 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
cannam@125 496 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
cannam@125 497 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
cannam@125 498 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
cannam@125 499 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
cannam@125 500 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
cannam@125 501 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
cannam@125 502 )
cannam@125 503 new_rdwr_[+ (get "type_name") +]_test (filename, format, allow_fd) ;
cannam@125 504
cannam@125 505 delete_file (format, filename) ;
cannam@125 506
cannam@125 507 puts ("ok") ;
cannam@125 508 return ;
cannam@125 509 } /* pcm_test_[+ (get "type_name") +] */
cannam@125 510
cannam@125 511 static void
cannam@125 512 mono_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd)
cannam@125 513 { SNDFILE *file ;
cannam@125 514 SF_INFO sfinfo ;
cannam@125 515 [+ (get "data_type") +] *orig, *test ;
cannam@125 516 sf_count_t count ;
cannam@125 517 int k, items, total ;
cannam@125 518
cannam@125 519 sfinfo.samplerate = 44100 ;
cannam@125 520 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
cannam@125 521 sfinfo.channels = 1 ;
cannam@125 522 sfinfo.format = format ;
cannam@125 523
cannam@125 524 orig = orig_data.[+ (get "data_field") +] ;
cannam@125 525 test = test_data.[+ (get "data_field") +] ;
cannam@125 526
cannam@125 527 items = DATA_LENGTH ;
cannam@125 528
cannam@125 529 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
cannam@125 530
cannam@125 531 if (sfinfo.frames || sfinfo.sections || sfinfo.seekable)
cannam@125 532 { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ;
cannam@125 533 exit (1) ;
cannam@125 534 } ;
cannam@125 535
cannam@125 536 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
cannam@125 537
cannam@125 538 test_write_[+ (get "data_type") +]_or_die (file, 0, orig, items, __LINE__) ;
cannam@125 539 sf_write_sync (file) ;
cannam@125 540 test_write_[+ (get "data_type") +]_or_die (file, 0, orig, items, __LINE__) ;
cannam@125 541 sf_write_sync (file) ;
cannam@125 542
cannam@125 543 /* Add non-audio data after the audio. */
cannam@125 544 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
cannam@125 545
cannam@125 546 sf_close (file) ;
cannam@125 547
cannam@125 548 memset (test, 0, items * sizeof ([+ (get "data_type") +])) ;
cannam@125 549
cannam@125 550 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@125 551 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@125 552
cannam@125 553 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
cannam@125 554
cannam@125 555 if (sfinfo.format != format)
cannam@125 556 { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
cannam@125 557 exit (1) ;
cannam@125 558 } ;
cannam@125 559
cannam@125 560 if (sfinfo.frames < 2 * items)
cannam@125 561 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
cannam@125 562 exit (1) ;
cannam@125 563 } ;
cannam@125 564
cannam@125 565 if (! long_file_ok && sfinfo.frames > 2 * items)
cannam@125 566 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
cannam@125 567 exit (1) ;
cannam@125 568 } ;
cannam@125 569
cannam@125 570 if (sfinfo.channels != 1)
cannam@125 571 { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ;
cannam@125 572 exit (1) ;
cannam@125 573 } ;
cannam@125 574
cannam@125 575 if (sfinfo.seekable != 1)
cannam@125 576 { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ;
cannam@125 577 exit (1) ;
cannam@125 578 } ;
cannam@125 579
cannam@125 580 check_log_buffer_or_die (file, __LINE__) ;
cannam@125 581
cannam@125 582 test_read_[+ (get "data_type") +]_or_die (file, 0, test, items, __LINE__) ;
cannam@125 583 for (k = 0 ; k < items ; k++)
cannam@125 584 if ([+ (get "error_func") +] (orig [k], test [k]))
cannam@125 585 { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ;
cannam@125 586 oct_save_[+ (get "data_type") +] (orig, test, items) ;
cannam@125 587 exit (1) ;
cannam@125 588 } ;
cannam@125 589
cannam@125 590 /* Test multiple short reads. */
cannam@125 591 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
cannam@125 592
cannam@125 593 total = 0 ;
cannam@125 594 for (k = 1 ; k <= 32 ; k++)
cannam@125 595 { int ik ;
cannam@125 596
cannam@125 597 test_read_[+ (get "data_type") +]_or_die (file, 0, test + total, k, __LINE__) ;
cannam@125 598 total += k ;
cannam@125 599
cannam@125 600 for (ik = 0 ; ik < total ; ik++)
cannam@125 601 if ([+ (get "error_func") +] (orig [ik], test [ik]))
cannam@125 602 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, ik, orig [ik], test [ik]) ;
cannam@125 603 exit (1) ;
cannam@125 604 } ;
cannam@125 605 } ;
cannam@125 606
cannam@125 607 /* Seek to start of file. */
cannam@125 608 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
cannam@125 609
cannam@125 610 test_read_[+ (get "data_type") +]_or_die (file, 0, test, 4, __LINE__) ;
cannam@125 611 for (k = 0 ; k < 4 ; k++)
cannam@125 612 if ([+ (get "error_func") +] (orig [k], test [k]))
cannam@125 613 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ;
cannam@125 614 exit (1) ;
cannam@125 615 } ;
cannam@125 616
cannam@125 617 /* For some codecs we can't go past here. */
cannam@125 618 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
cannam@125 619 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
cannam@125 620 { sf_close (file) ;
cannam@125 621 unlink (filename) ;
cannam@125 622 printf ("no seek : ") ;
cannam@125 623 return ;
cannam@125 624 } ;
cannam@125 625
cannam@125 626 /* Seek to offset from start of file. */
cannam@125 627 test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ;
cannam@125 628
cannam@125 629 test_read_[+ (get "data_type") +]_or_die (file, 0, test + 10, 4, __LINE__) ;
cannam@125 630 for (k = 10 ; k < 14 ; k++)
cannam@125 631 if ([+ (get "error_func") +] (orig [k], test [k]))
cannam@125 632 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, test [k], orig [k]) ;
cannam@125 633 exit (1) ;
cannam@125 634 } ;
cannam@125 635
cannam@125 636 /* Seek to offset from current position. */
cannam@125 637 test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ;
cannam@125 638
cannam@125 639 test_read_[+ (get "data_type") +]_or_die (file, 0, test + 20, 4, __LINE__) ;
cannam@125 640 for (k = 20 ; k < 24 ; k++)
cannam@125 641 if ([+ (get "error_func") +] (orig [k], test [k]))
cannam@125 642 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, test [k], orig [k]) ;
cannam@125 643 exit (1) ;
cannam@125 644 } ;
cannam@125 645
cannam@125 646 /* Seek to offset from end of file. */
cannam@125 647 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
cannam@125 648
cannam@125 649 test_read_[+ (get "data_type") +]_or_die (file, 0, test + 10, 4, __LINE__) ;
cannam@125 650 for (k = 10 ; k < 14 ; k++)
cannam@125 651 if ([+ (get "error_func") +] (orig [k], test [k]))
cannam@125 652 { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, test [k], orig [k]) ;
cannam@125 653 exit (1) ;
cannam@125 654 } ;
cannam@125 655
cannam@125 656 /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */
cannam@125 657 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
cannam@125 658
cannam@125 659 count = 0 ;
cannam@125 660 while (count < sfinfo.frames)
cannam@125 661 count += sf_read_[+ (get "data_type") +] (file, test, 311) ;
cannam@125 662
cannam@125 663 /* Check that no error has occurred. */
cannam@125 664 if (sf_error (file))
cannam@125 665 { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ;
cannam@125 666 puts (sf_strerror (file)) ;
cannam@125 667 exit (1) ;
cannam@125 668 } ;
cannam@125 669
cannam@125 670 /* Check that we haven't read beyond EOF. */
cannam@125 671 if (count > sfinfo.frames)
cannam@125 672 { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
cannam@125 673 exit (1) ;
cannam@125 674 } ;
cannam@125 675
cannam@125 676 test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ;
cannam@125 677
cannam@125 678 sf_close (file) ;
cannam@125 679
cannam@125 680 multi_seek_test (filename, format) ;
cannam@125 681 write_seek_extend_test (filename, format) ;
cannam@125 682
cannam@125 683 } /* mono_[+ (get "type_name") +]_test */
cannam@125 684
cannam@125 685 static void
cannam@125 686 stereo_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd)
cannam@125 687 { SNDFILE *file ;
cannam@125 688 SF_INFO sfinfo ;
cannam@125 689 [+ (get "data_type") +] *orig, *test ;
cannam@125 690 int k, items, frames ;
cannam@125 691
cannam@125 692 sfinfo.samplerate = 44100 ;
cannam@125 693 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
cannam@125 694 sfinfo.channels = 2 ;
cannam@125 695 sfinfo.format = format ;
cannam@125 696
cannam@125 697 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, [+ (get "max_val") +]) ;
cannam@125 698
cannam@125 699 orig = orig_data.[+ (get "data_field") +] ;
cannam@125 700 test = test_data.[+ (get "data_field") +] ;
cannam@125 701
cannam@125 702 /* Make this a macro so gdb steps over it in one go. */
cannam@125 703 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
cannam@125 704
cannam@125 705 items = DATA_LENGTH ;
cannam@125 706 frames = items / sfinfo.channels ;
cannam@125 707
cannam@125 708 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
cannam@125 709
cannam@125 710 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
cannam@125 711
cannam@125 712 test_writef_[+ (get "data_type") +]_or_die (file, 0, orig, frames, __LINE__) ;
cannam@125 713
cannam@125 714 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
cannam@125 715
cannam@125 716 sf_close (file) ;
cannam@125 717
cannam@125 718 memset (test, 0, items * sizeof ([+ (get "data_type") +])) ;
cannam@125 719
cannam@125 720 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
cannam@125 721 memset (&sfinfo, 0, sizeof (sfinfo)) ;
cannam@125 722
cannam@125 723 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
cannam@125 724
cannam@125 725 if (sfinfo.format != format)
cannam@125 726 { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n",
cannam@125 727 __LINE__, format, sfinfo.format) ;
cannam@125 728 exit (1) ;
cannam@125 729 } ;
cannam@125 730
cannam@125 731 if (sfinfo.frames < frames)
cannam@125 732 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
cannam@125 733 __LINE__, sfinfo.frames, frames) ;
cannam@125 734 exit (1) ;
cannam@125 735 } ;
cannam@125 736
cannam@125 737 if (! long_file_ok && sfinfo.frames > frames)
cannam@125 738 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
cannam@125 739 __LINE__, sfinfo.frames, frames) ;
cannam@125 740 exit (1) ;
cannam@125 741 } ;
cannam@125 742
cannam@125 743 if (sfinfo.channels != 2)
cannam@125 744 { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ;
cannam@125 745 exit (1) ;
cannam@125 746 } ;
cannam@125 747
cannam@125 748 check_log_buffer_or_die (file, __LINE__) ;
cannam@125 749
cannam@125 750 test_readf_[+ (get "data_type") +]_or_die (file, 0, test, frames, __LINE__) ;
cannam@125 751 for (k = 0 ; k < items ; k++)
cannam@125 752 if ([+ (get "error_func") +] (test [k], orig [k]))
cannam@125 753 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ;
cannam@125 754 exit (1) ;
cannam@125 755 } ;
cannam@125 756
cannam@125 757 /* Seek to start of file. */
cannam@125 758 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
cannam@125 759
cannam@125 760 test_readf_[+ (get "data_type") +]_or_die (file, 0, test, 2, __LINE__) ;
cannam@125 761 for (k = 0 ; k < 4 ; k++)
cannam@125 762 if ([+ (get "error_func") +] (test [k], orig [k]))
cannam@125 763 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ;
cannam@125 764 exit (1) ;
cannam@125 765 } ;
cannam@125 766
cannam@125 767 /* Seek to offset from start of file. */
cannam@125 768 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
cannam@125 769
cannam@125 770 /* Check for errors here. */
cannam@125 771 if (sf_error (file))
cannam@125 772 { printf ("Line %d: Should NOT return an error.\n", __LINE__) ;
cannam@125 773 puts (sf_strerror (file)) ;
cannam@125 774 exit (1) ;
cannam@125 775 } ;
cannam@125 776
cannam@125 777 if (sf_read_[+ (get "data_type") +] (file, test, 1) > 0)
cannam@125 778 { printf ("Line %d: Should return 0.\n", __LINE__) ;
cannam@125 779 exit (1) ;
cannam@125 780 } ;
cannam@125 781
cannam@125 782 if (! sf_error (file))
cannam@125 783 { printf ("Line %d: Should return an error.\n", __LINE__) ;
cannam@125 784 exit (1) ;
cannam@125 785 } ;
cannam@125 786 /*-----------------------*/
cannam@125 787
cannam@125 788 test_readf_[+ (get "data_type") +]_or_die (file, 0, test + 10, 2, __LINE__) ;
cannam@125 789 for (k = 20 ; k < 24 ; k++)
cannam@125 790 if ([+ (get "error_func") +] (test [k], orig [k]))
cannam@125 791 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ;
cannam@125 792 exit (1) ;
cannam@125 793 } ;
cannam@125 794
cannam@125 795 /* Seek to offset from current position. */
cannam@125 796 test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
cannam@125 797
cannam@125 798 test_readf_[+ (get "data_type") +]_or_die (file, 0, test + 20, 2, __LINE__) ;
cannam@125 799 for (k = 40 ; k < 44 ; k++)
cannam@125 800 if ([+ (get "error_func") +] (test [k], orig [k]))
cannam@125 801 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ;
cannam@125 802 exit (1) ;
cannam@125 803 } ;
cannam@125 804
cannam@125 805 /* Seek to offset from end of file. */
cannam@125 806 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
cannam@125 807
cannam@125 808 test_readf_[+ (get "data_type") +]_or_die (file, 0, test + 20, 2, __LINE__) ;
cannam@125 809 for (k = 20 ; k < 24 ; k++)
cannam@125 810 if ([+ (get "error_func") +] (test [k], orig [k]))
cannam@125 811 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ;
cannam@125 812 exit (1) ;
cannam@125 813 } ;
cannam@125 814
cannam@125 815 sf_close (file) ;
cannam@125 816 } /* stereo_[+ (get "type_name") +]_test */
cannam@125 817
cannam@125 818 static void
cannam@125 819 mono_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd)
cannam@125 820 { SNDFILE *file ;
cannam@125 821 SF_INFO sfinfo ;
cannam@125 822 [+ (get "data_type") +] *orig, *test ;
cannam@125 823 int k, pass ;
cannam@125 824
cannam@125 825 switch (format & SF_FORMAT_SUBMASK)
cannam@125 826 { case SF_FORMAT_ALAC_16 :
cannam@125 827 case SF_FORMAT_ALAC_20 :
cannam@125 828 case SF_FORMAT_ALAC_24 :
cannam@125 829 case SF_FORMAT_ALAC_32 :
cannam@125 830 allow_fd = 0 ;
cannam@125 831 break ;
cannam@125 832
cannam@125 833 default :
cannam@125 834 break ;
cannam@125 835 } ;
cannam@125 836
cannam@125 837 orig = orig_data.[+ (get "data_field") +] ;
cannam@125 838 test = test_data.[+ (get "data_field") +] ;
cannam@125 839
cannam@125 840 sfinfo.samplerate = SAMPLE_RATE ;
cannam@125 841 sfinfo.frames = DATA_LENGTH ;
cannam@125 842 sfinfo.channels = 1 ;
cannam@125 843 sfinfo.format = format ;
cannam@125 844
cannam@125 845 if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW
cannam@125 846 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU
cannam@125 847 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2)
cannam@125 848 unlink (filename) ;
cannam@125 849 else
cannam@125 850 { /* Create a short file. */
cannam@125 851 create_short_file (filename) ;
cannam@125 852
cannam@125 853 /* Opening a already existing short file (ie invalid header) RDWR is disallowed.
cannam@125 854 ** If this returns a valif pointer sf_open() screwed up.
cannam@125 855 */
cannam@125 856 if ((file = sf_open (filename, SFM_RDWR, &sfinfo)))
cannam@125 857 { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ;
cannam@125 858 exit (1) ;
cannam@125 859 } ;
cannam@125 860
cannam@125 861 /* Truncate the file to zero bytes. */
cannam@125 862 if (truncate (filename, 0) < 0)
cannam@125 863 { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ;
cannam@125 864 perror (NULL) ;
cannam@125 865 exit (1) ;
cannam@125 866 } ;
cannam@125 867 } ;
cannam@125 868
cannam@125 869 /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain
cannam@125 870 ** all the usual data required when opening the file in WRITE mode.
cannam@125 871 */
cannam@125 872 sfinfo.samplerate = SAMPLE_RATE ;
cannam@125 873 sfinfo.frames = DATA_LENGTH ;
cannam@125 874 sfinfo.channels = 1 ;
cannam@125 875 sfinfo.format = format ;
cannam@125 876
cannam@125 877 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
cannam@125 878
cannam@125 879 /* Do 3 writes followed by reads. After each, check the data and the current
cannam@125 880 ** read and write offsets.
cannam@125 881 */
cannam@125 882 for (pass = 1 ; pass <= 3 ; pass ++)
cannam@125 883 { orig [20] = pass * 2 ;
cannam@125 884
cannam@125 885 /* Write some data. */
cannam@125 886 test_write_[+ (get "data_type") +]_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ;
cannam@125 887
cannam@125 888 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ;
cannam@125 889
cannam@125 890 /* Read what we just wrote. */
cannam@125 891 test_read_[+ (get "data_type") +]_or_die (file, 0, test, DATA_LENGTH, __LINE__) ;
cannam@125 892
cannam@125 893 /* Check the data. */
cannam@125 894 for (k = 0 ; k < DATA_LENGTH ; k++)
cannam@125 895 if ([+ (get "error_func") +] (orig [k], test [k]))
cannam@125 896 { printf ("\n\nLine %d (pass %d) A : Error at sample %d ([+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, pass, k, orig [k], test [k]) ;
cannam@125 897 oct_save_[+ (get "data_type") +] (orig, test, DATA_LENGTH) ;
cannam@125 898 exit (1) ;
cannam@125 899 } ;
cannam@125 900
cannam@125 901 test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ;
cannam@125 902 } ; /* for (pass ...) */
cannam@125 903
cannam@125 904 sf_close (file) ;
cannam@125 905
cannam@125 906 /* Open the file again to check the data. */
cannam@125 907 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
cannam@125 908
cannam@125 909 if (sfinfo.format != format)
cannam@125 910 { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
cannam@125 911 exit (1) ;
cannam@125 912 } ;
cannam@125 913
cannam@125 914 if (sfinfo.frames < 3 * DATA_LENGTH)
cannam@125 915 { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
cannam@125 916 exit (1) ;
cannam@125 917 }
cannam@125 918
cannam@125 919 if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
cannam@125 920 { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
cannam@125 921 exit (1) ;
cannam@125 922 } ;
cannam@125 923
cannam@125 924 if (sfinfo.channels != 1)
cannam@125 925 { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ;
cannam@125 926 exit (1) ;
cannam@125 927 } ;
cannam@125 928
cannam@125 929 if (! long_file_ok)
cannam@125 930 test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ;
cannam@125 931 else
cannam@125 932 test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ;
cannam@125 933
cannam@125 934 for (pass = 1 ; pass <= 3 ; pass ++)
cannam@125 935 { orig [20] = pass * 2 ;
cannam@125 936
cannam@125 937 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ;
cannam@125 938
cannam@125 939 /* Read what we just wrote. */
cannam@125 940 test_read_[+ (get "data_type") +]_or_die (file, pass, test, DATA_LENGTH, __LINE__) ;
cannam@125 941
cannam@125 942 /* Check the data. */
cannam@125 943 for (k = 0 ; k < DATA_LENGTH ; k++)
cannam@125 944 if ([+ (get "error_func") +] (orig [k], test [k]))
cannam@125 945 { printf ("\n\nLine %d (pass %d) B : Error at sample %d ([+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, pass, k, orig [k], test [k]) ;
cannam@125 946 oct_save_[+ (get "data_type") +] (orig, test, DATA_LENGTH) ;
cannam@125 947 exit (1) ;
cannam@125 948 } ;
cannam@125 949
cannam@125 950 } ; /* for (pass ...) */
cannam@125 951
cannam@125 952 sf_close (file) ;
cannam@125 953 } /* mono_rdwr_[+ (get "data_type") +]_test */
cannam@125 954
cannam@125 955 static void
cannam@125 956 new_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int allow_fd)
cannam@125 957 { SNDFILE *wfile, *rwfile ;
cannam@125 958 SF_INFO sfinfo ;
cannam@125 959 [+ (get "data_type") +] *orig, *test ;
cannam@125 960 int items, frames ;
cannam@125 961
cannam@125 962 orig = orig_data.[+ (get "data_field") +] ;
cannam@125 963 test = test_data.[+ (get "data_field") +] ;
cannam@125 964
cannam@125 965 sfinfo.samplerate = 44100 ;
cannam@125 966 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
cannam@125 967 sfinfo.channels = 2 ;
cannam@125 968 sfinfo.format = format ;
cannam@125 969
cannam@125 970 items = DATA_LENGTH ;
cannam@125 971 frames = items / sfinfo.channels ;
cannam@125 972
cannam@125 973 wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
cannam@125 974 sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
cannam@125 975 test_writef_[+ (get "data_type") +]_or_die (wfile, 1, orig, frames, __LINE__) ;
cannam@125 976 sf_write_sync (wfile) ;
cannam@125 977 test_writef_[+ (get "data_type") +]_or_die (wfile, 2, orig, frames, __LINE__) ;
cannam@125 978 sf_write_sync (wfile) ;
cannam@125 979
cannam@125 980 rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
cannam@125 981 if (sfinfo.frames != 2 * frames)
cannam@125 982 { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
cannam@125 983 exit (1) ;
cannam@125 984 } ;
cannam@125 985
cannam@125 986 test_writef_[+ (get "data_type") +]_or_die (wfile, 3, orig, frames, __LINE__) ;
cannam@125 987
cannam@125 988 test_readf_[+ (get "data_type") +]_or_die (rwfile, 1, test, frames, __LINE__) ;
cannam@125 989 test_readf_[+ (get "data_type") +]_or_die (rwfile, 2, test, frames, __LINE__) ;
cannam@125 990
cannam@125 991 sf_close (wfile) ;
cannam@125 992 sf_close (rwfile) ;
cannam@125 993 } /* new_rdwr_[+ (get "type_name") +]_test */
cannam@125 994
cannam@125 995 [+ ENDFOR data_type +]
cannam@125 996
cannam@125 997 /*----------------------------------------------------------------------------------------
cannam@125 998 */
cannam@125 999
cannam@125 1000 static void
cannam@125 1001 empty_file_test (const char *filename, int format)
cannam@125 1002 { SNDFILE *file ;
cannam@125 1003 SF_INFO info ;
cannam@125 1004 int allow_fd ;
cannam@125 1005
cannam@125 1006 /* Sd2 files cannot be opened from an existing file descriptor. */
cannam@125 1007 allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ;
cannam@125 1008
cannam@125 1009 print_test_name ("empty_file_test", filename) ;
cannam@125 1010
cannam@125 1011 unlink (filename) ;
cannam@125 1012
cannam@125 1013 info.samplerate = 48000 ;
cannam@125 1014 info.channels = 2 ;
cannam@125 1015 info.format = format ;
cannam@125 1016 info.frames = 0 ;
cannam@125 1017
cannam@125 1018 if (sf_format_check (&info) == SF_FALSE)
cannam@125 1019 { info.channels = 1 ;
cannam@125 1020 if (sf_format_check (&info) == SF_FALSE)
cannam@125 1021 { puts ("invalid file format") ;
cannam@125 1022 return ;
cannam@125 1023 } ;
cannam@125 1024 } ;
cannam@125 1025
cannam@125 1026 /* Create an empty file. */
cannam@125 1027 file = test_open_file_or_die (filename, SFM_WRITE, &info, allow_fd, __LINE__) ;
cannam@125 1028 sf_close (file) ;
cannam@125 1029
cannam@125 1030 /* Open for read and check the length. */
cannam@125 1031 file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ;
cannam@125 1032
cannam@125 1033 if (info.frames != 0)
cannam@125 1034 { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ;
cannam@125 1035 exit (1) ;
cannam@125 1036 } ;
cannam@125 1037
cannam@125 1038 sf_close (file) ;
cannam@125 1039
cannam@125 1040 /* Open for read/write and check the length. */
cannam@125 1041 file = test_open_file_or_die (filename, SFM_RDWR, &info, allow_fd, __LINE__) ;
cannam@125 1042
cannam@125 1043 if (info.frames != 0)
cannam@125 1044 { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ;
cannam@125 1045 exit (1) ;
cannam@125 1046 } ;
cannam@125 1047
cannam@125 1048 sf_close (file) ;
cannam@125 1049
cannam@125 1050 /* Open for read and check the length. */
cannam@125 1051 file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ;
cannam@125 1052
cannam@125 1053 if (info.frames != 0)
cannam@125 1054 { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ;
cannam@125 1055 exit (1) ;
cannam@125 1056 } ;
cannam@125 1057
cannam@125 1058 sf_close (file) ;
cannam@125 1059
cannam@125 1060 check_open_file_count_or_die (__LINE__) ;
cannam@125 1061
cannam@125 1062 unlink (filename) ;
cannam@125 1063 puts ("ok") ;
cannam@125 1064
cannam@125 1065 return ;
cannam@125 1066 } /* empty_file_test */
cannam@125 1067
cannam@125 1068
cannam@125 1069 /*----------------------------------------------------------------------------------------
cannam@125 1070 */
cannam@125 1071
cannam@125 1072 static void
cannam@125 1073 create_short_file (const char *filename)
cannam@125 1074 { FILE *file ;
cannam@125 1075
cannam@125 1076 if (! (file = fopen (filename, "w")))
cannam@125 1077 { printf ("create_short_file : fopen (%s, \"w\") failed.", filename) ;
cannam@125 1078 fflush (stdout) ;
cannam@125 1079 perror (NULL) ;
cannam@125 1080 exit (1) ;
cannam@125 1081 } ;
cannam@125 1082
cannam@125 1083 fprintf (file, "This is the file data.\n") ;
cannam@125 1084
cannam@125 1085 fclose (file) ;
cannam@125 1086 } /* create_short_file */
cannam@125 1087
cannam@125 1088
cannam@125 1089 static void
cannam@125 1090 multi_seek_test (const char * filename, int format)
cannam@125 1091 { SNDFILE * file ;
cannam@125 1092 SF_INFO info ;
cannam@125 1093 sf_count_t pos ;
cannam@125 1094 int k ;
cannam@125 1095
cannam@125 1096 /* This test doesn't work on the following. */
cannam@125 1097 switch (format & SF_FORMAT_TYPEMASK)
cannam@125 1098 { case SF_FORMAT_RAW :
cannam@125 1099 return ;
cannam@125 1100
cannam@125 1101 default :
cannam@125 1102 break ;
cannam@125 1103 } ;
cannam@125 1104
cannam@125 1105 memset (&info, 0, sizeof (info)) ;
cannam@125 1106
cannam@125 1107 generate_file (filename, format, 88200) ;
cannam@125 1108
cannam@125 1109 file = test_open_file_or_die (filename, SFM_READ, &info, SF_FALSE, __LINE__) ;
cannam@125 1110
cannam@125 1111 for (k = 0 ; k < 10 ; k++)
cannam@125 1112 { pos = info.frames / (k + 2) ;
cannam@125 1113 test_seek_or_die (file, pos, SEEK_SET, pos, info.channels, __LINE__) ;
cannam@125 1114 } ;
cannam@125 1115
cannam@125 1116 sf_close (file) ;
cannam@125 1117 } /* multi_seek_test */
cannam@125 1118
cannam@125 1119 static void
cannam@125 1120 write_seek_extend_test (const char * filename, int format)
cannam@125 1121 { SNDFILE * file ;
cannam@125 1122 SF_INFO info ;
cannam@125 1123 short *orig, *test ;
cannam@125 1124 unsigned items, k ;
cannam@125 1125
cannam@125 1126 /* This test doesn't work on the following container formats. */
cannam@125 1127 switch (format & SF_FORMAT_TYPEMASK)
cannam@125 1128 { case SF_FORMAT_FLAC :
cannam@125 1129 case SF_FORMAT_HTK :
cannam@125 1130 case SF_FORMAT_PAF :
cannam@125 1131 case SF_FORMAT_SDS :
cannam@125 1132 case SF_FORMAT_SVX :
cannam@125 1133 return ;
cannam@125 1134
cannam@125 1135 default :
cannam@125 1136 break ;
cannam@125 1137 } ;
cannam@125 1138
cannam@125 1139 /* This test doesn't work on the following codec formats. */
cannam@125 1140 switch (format & SF_FORMAT_SUBMASK)
cannam@125 1141 { case SF_FORMAT_ALAC_16 :
cannam@125 1142 case SF_FORMAT_ALAC_20 :
cannam@125 1143 case SF_FORMAT_ALAC_24 :
cannam@125 1144 case SF_FORMAT_ALAC_32 :
cannam@125 1145 return ;
cannam@125 1146
cannam@125 1147 default :
cannam@125 1148 break ;
cannam@125 1149 } ;
cannam@125 1150
cannam@125 1151 memset (&info, 0, sizeof (info)) ;
cannam@125 1152
cannam@125 1153 info.samplerate = 48000 ;
cannam@125 1154 info.channels = 1 ;
cannam@125 1155 info.format = format ;
cannam@125 1156
cannam@125 1157 items = 512 ;
cannam@125 1158 exit_if_true (items > ARRAY_LEN (orig_data.s), "Line %d : Bad assumption.\n", __LINE__) ;
cannam@125 1159
cannam@125 1160 orig = orig_data.s ;
cannam@125 1161 test = test_data.s ;
cannam@125 1162
cannam@125 1163 for (k = 0 ; k < ARRAY_LEN (orig_data.s) ; k++)
cannam@125 1164 orig [k] = 0x3fff ;
cannam@125 1165
cannam@125 1166 file = test_open_file_or_die (filename, SFM_WRITE, &info, SF_FALSE, __LINE__) ;
cannam@125 1167 test_write_short_or_die (file, 0, orig, items, __LINE__) ;
cannam@125 1168
cannam@125 1169 /* Extend the file using a seek. */
cannam@125 1170 test_seek_or_die (file, 2 * items, SEEK_SET, 2 * items, info.channels, __LINE__) ;
cannam@125 1171
cannam@125 1172 test_writef_short_or_die (file, 0, orig, items, __LINE__) ;
cannam@125 1173 sf_close (file) ;
cannam@125 1174
cannam@125 1175 file = test_open_file_or_die (filename, SFM_READ, &info, SF_FALSE, __LINE__) ;
cannam@125 1176 test_read_short_or_die (file, 0, test, 3 * items, __LINE__) ;
cannam@125 1177 sf_close (file) ;
cannam@125 1178
cannam@125 1179 /* Can't do these formats due to scaling. */
cannam@125 1180 switch (format & SF_FORMAT_SUBMASK)
cannam@125 1181 { case SF_FORMAT_PCM_S8 :
cannam@125 1182 case SF_FORMAT_PCM_U8 :
cannam@125 1183 return ;
cannam@125 1184 default :
cannam@125 1185 break ;
cannam@125 1186 } ;
cannam@125 1187
cannam@125 1188 for (k = 0 ; k < items ; k++)
cannam@125 1189 { exit_if_true (test [k] != 0x3fff, "Line %d : test [%d] == %d, should be 0x3fff.\n", __LINE__, k, test [k]) ;
cannam@125 1190 exit_if_true (test [items + k] != 0, "Line %d : test [%d] == %d, should be 0.\n", __LINE__, items + k, test [items + k]) ;
cannam@125 1191 exit_if_true (test [2 * items + k] != 0x3fff, "Line %d : test [%d] == %d, should be 0x3fff.\n", __LINE__, 2 * items + k, test [2 * items + k]) ;
cannam@125 1192 } ;
cannam@125 1193
cannam@125 1194 return ;
cannam@125 1195 } /* write_seek_extend_test */
cannam@125 1196
cannam@125 1197