annotate src/libsndfile-1.0.27/tests/write_read_test.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 1df64224f5ac
children
rev   line source
Chris@40 1 /*
Chris@40 2 ** Copyright (C) 1999-2016 Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@40 3 **
Chris@40 4 ** This program is free software; you can redistribute it and/or modify
Chris@40 5 ** it under the terms of the GNU General Public License as published by
Chris@40 6 ** the Free Software Foundation; either version 2 of the License, or
Chris@40 7 ** (at your option) any later version.
Chris@40 8 **
Chris@40 9 ** This program is distributed in the hope that it will be useful,
Chris@40 10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@40 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@40 12 ** GNU General Public License for more details.
Chris@40 13 **
Chris@40 14 ** You should have received a copy of the GNU General Public License
Chris@40 15 ** along with this program; if not, write to the Free Software
Chris@40 16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Chris@40 17 */
Chris@40 18
Chris@40 19 #include "sfconfig.h"
Chris@40 20
Chris@40 21 #include <stdio.h>
Chris@40 22 #include <stdlib.h>
Chris@40 23 #include <string.h>
Chris@40 24 #include <math.h>
Chris@40 25 #include <inttypes.h>
Chris@40 26
Chris@40 27
Chris@40 28 #if HAVE_UNISTD_H
Chris@40 29 #include <unistd.h>
Chris@40 30 #endif
Chris@40 31
Chris@40 32 #include <sndfile.h>
Chris@40 33
Chris@40 34 #include "utils.h"
Chris@40 35 #include "generate.h"
Chris@40 36
Chris@40 37 #define SAMPLE_RATE 11025
Chris@40 38 #define DATA_LENGTH (1 << 12)
Chris@40 39
Chris@40 40 #define SILLY_WRITE_COUNT (234)
Chris@40 41
Chris@40 42 static void pcm_test_char (const char *str, int format, int long_file_ok) ;
Chris@40 43 static void pcm_test_short (const char *str, int format, int long_file_ok) ;
Chris@40 44 static void pcm_test_20bit (const char *str, int format, int long_file_ok) ;
Chris@40 45 static void pcm_test_24bit (const char *str, int format, int long_file_ok) ;
Chris@40 46 static void pcm_test_int (const char *str, int format, int long_file_ok) ;
Chris@40 47 static void pcm_test_float (const char *str, int format, int long_file_ok) ;
Chris@40 48 static void pcm_test_double (const char *str, int format, int long_file_ok) ;
Chris@40 49
Chris@40 50 static void empty_file_test (const char *filename, int format) ;
Chris@40 51
Chris@40 52 typedef union
Chris@40 53 { double d [DATA_LENGTH] ;
Chris@40 54 float f [DATA_LENGTH] ;
Chris@40 55 int i [DATA_LENGTH] ;
Chris@40 56 short s [DATA_LENGTH] ;
Chris@40 57 char c [DATA_LENGTH] ;
Chris@40 58 } BUFFER ;
Chris@40 59
Chris@40 60 static BUFFER orig_data ;
Chris@40 61 static BUFFER test_data ;
Chris@40 62
Chris@40 63 int
Chris@40 64 main (int argc, char **argv)
Chris@40 65 { int do_all = 0 ;
Chris@40 66 int test_count = 0 ;
Chris@40 67
Chris@40 68 count_open_files () ;
Chris@40 69
Chris@40 70 if (argc != 2)
Chris@40 71 { printf ("Usage : %s <test>\n", argv [0]) ;
Chris@40 72 printf (" Where <test> is one of the following:\n") ;
Chris@40 73 printf (" wav - test WAV file functions (little endian)\n") ;
Chris@40 74 printf (" aiff - test AIFF file functions (big endian)\n") ;
Chris@40 75 printf (" au - test AU file functions\n") ;
Chris@40 76 printf (" avr - test AVR file functions\n") ;
Chris@40 77 printf (" caf - test CAF file functions\n") ;
Chris@40 78 printf (" raw - test RAW header-less PCM file functions\n") ;
Chris@40 79 printf (" paf - test PAF file functions\n") ;
Chris@40 80 printf (" svx - test 8SVX/16SV file functions\n") ;
Chris@40 81 printf (" nist - test NIST Sphere file functions\n") ;
Chris@40 82 printf (" ircam - test IRCAM file functions\n") ;
Chris@40 83 printf (" voc - Create Voice file functions\n") ;
Chris@40 84 printf (" w64 - Sonic Foundry's W64 file functions\n") ;
Chris@40 85 printf (" flac - test FLAC file functions\n") ;
Chris@40 86 printf (" mpc2k - test MPC 2000 file functions\n") ;
Chris@40 87 printf (" rf64 - test RF64 file functions\n") ;
Chris@40 88 printf (" all - perform all tests\n") ;
Chris@40 89 exit (1) ;
Chris@40 90 } ;
Chris@40 91
Chris@40 92 do_all = !strcmp (argv [1], "all") ;
Chris@40 93
Chris@40 94 if (do_all || ! strcmp (argv [1], "wav"))
Chris@40 95 { pcm_test_char ("char.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_U8, SF_FALSE) ;
Chris@40 96 pcm_test_short ("short.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 97 pcm_test_24bit ("24bit.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 98 pcm_test_int ("int.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 99
Chris@40 100 pcm_test_char ("char.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_U8, SF_FALSE) ;
Chris@40 101 pcm_test_short ("short.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 102 pcm_test_24bit ("24bit.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 103 pcm_test_int ("int.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 104
Chris@40 105 pcm_test_24bit ("24bit.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 106 pcm_test_int ("int.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 107
Chris@40 108 /* Lite remove start */
Chris@40 109 pcm_test_float ("float.wav" , SF_FORMAT_WAV | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 110 pcm_test_double ("double.wav" , SF_FORMAT_WAV | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 111
Chris@40 112 pcm_test_float ("float.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 113 pcm_test_double ("double.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 114
Chris@40 115 pcm_test_float ("float.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 116 pcm_test_double ("double.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 117 /* Lite remove end */
Chris@40 118
Chris@40 119 empty_file_test ("empty_char.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8) ;
Chris@40 120 empty_file_test ("empty_short.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@40 121 empty_file_test ("empty_float.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT) ;
Chris@40 122
Chris@40 123 test_count++ ;
Chris@40 124 } ;
Chris@40 125
Chris@40 126 if (do_all || ! strcmp (argv [1], "aiff"))
Chris@40 127 { pcm_test_char ("char_u8.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_U8, SF_FALSE) ;
Chris@40 128 pcm_test_char ("char_s8.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_S8, SF_FALSE) ;
Chris@40 129 pcm_test_short ("short.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 130 pcm_test_24bit ("24bit.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 131 pcm_test_int ("int.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 132
Chris@40 133 pcm_test_short ("short_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 134 pcm_test_24bit ("24bit_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 135 pcm_test_int ("int_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 136
Chris@40 137 pcm_test_short ("short_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 138 pcm_test_24bit ("24bit_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 139 pcm_test_int ("int_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 140
Chris@40 141 /* Lite remove start */
Chris@40 142 pcm_test_short ("dwvw16.aifc", SF_FORMAT_AIFF | SF_FORMAT_DWVW_16, SF_TRUE) ;
Chris@40 143 pcm_test_24bit ("dwvw24.aifc", SF_FORMAT_AIFF | SF_FORMAT_DWVW_24, SF_TRUE) ;
Chris@40 144
Chris@40 145 pcm_test_float ("float.aifc" , SF_FORMAT_AIFF | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 146 pcm_test_double ("double.aifc" , SF_FORMAT_AIFF | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 147 /* Lite remove end */
Chris@40 148
Chris@40 149 empty_file_test ("empty_char.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_U8) ;
Chris@40 150 empty_file_test ("empty_short.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ;
Chris@40 151 empty_file_test ("empty_float.aiff", SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ;
Chris@40 152
Chris@40 153 test_count++ ;
Chris@40 154 } ;
Chris@40 155
Chris@40 156 if (do_all || ! strcmp (argv [1], "au"))
Chris@40 157 { pcm_test_char ("char.au" , SF_FORMAT_AU | SF_FORMAT_PCM_S8, SF_FALSE) ;
Chris@40 158 pcm_test_short ("short.au" , SF_FORMAT_AU | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 159 pcm_test_24bit ("24bit.au" , SF_FORMAT_AU | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 160 pcm_test_int ("int.au" , SF_FORMAT_AU | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 161 /* Lite remove start */
Chris@40 162 pcm_test_float ("float.au" , SF_FORMAT_AU | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 163 pcm_test_double ("double.au", SF_FORMAT_AU | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 164 /* Lite remove end */
Chris@40 165
Chris@40 166 pcm_test_char ("char_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_S8, SF_FALSE) ;
Chris@40 167 pcm_test_short ("short_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 168 pcm_test_24bit ("24bit_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 169 pcm_test_int ("int_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 170 /* Lite remove start */
Chris@40 171 pcm_test_float ("float_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 172 pcm_test_double ("double_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 173 /* Lite remove end */
Chris@40 174 test_count++ ;
Chris@40 175 } ;
Chris@40 176
Chris@40 177 if (do_all || ! strcmp (argv [1], "caf"))
Chris@40 178 { pcm_test_char ("char.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_S8, SF_FALSE) ;
Chris@40 179 pcm_test_short ("short.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 180 pcm_test_24bit ("24bit.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 181 pcm_test_int ("int.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 182 /* Lite remove start */
Chris@40 183 pcm_test_float ("float.caf" , SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 184 pcm_test_double ("double.caf" , SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 185 /* Lite remove end */
Chris@40 186
Chris@40 187 pcm_test_short ("short_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 188 pcm_test_24bit ("24bit_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 189 pcm_test_int ("int_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 190 /* Lite remove start */
Chris@40 191 pcm_test_float ("float_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 192 pcm_test_double ("double_le.caf", SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 193
Chris@40 194 pcm_test_short ("alac16.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_16, SF_FALSE) ;
Chris@40 195 pcm_test_20bit ("alac20.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_20, SF_FALSE) ;
Chris@40 196 pcm_test_24bit ("alac24.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_24, SF_FALSE) ;
Chris@40 197 pcm_test_int ("alac32.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_32, SF_FALSE) ;
Chris@40 198
Chris@40 199 /* Lite remove end */
Chris@40 200 test_count++ ;
Chris@40 201 } ;
Chris@40 202
Chris@40 203 if (do_all || ! strcmp (argv [1], "raw"))
Chris@40 204 { pcm_test_char ("char_s8.raw" , SF_FORMAT_RAW | SF_FORMAT_PCM_S8, SF_FALSE) ;
Chris@40 205 pcm_test_char ("char_u8.raw" , SF_FORMAT_RAW | SF_FORMAT_PCM_U8, SF_FALSE) ;
Chris@40 206
Chris@40 207 pcm_test_short ("short_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 208 pcm_test_short ("short_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 209 pcm_test_24bit ("24bit_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 210 pcm_test_24bit ("24bit_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 211 pcm_test_int ("int_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 212 pcm_test_int ("int_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 213
Chris@40 214 /* Lite remove start */
Chris@40 215 pcm_test_float ("float_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 216 pcm_test_float ("float_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 217
Chris@40 218 pcm_test_double ("double_le.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 219 pcm_test_double ("double_be.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 220 /* Lite remove end */
Chris@40 221 test_count++ ;
Chris@40 222 } ;
Chris@40 223
Chris@40 224 /* Lite remove start */
Chris@40 225 if (do_all || ! strcmp (argv [1], "paf"))
Chris@40 226 { pcm_test_char ("char_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_S8, SF_FALSE) ;
Chris@40 227 pcm_test_char ("char_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_S8, SF_FALSE) ;
Chris@40 228 pcm_test_short ("short_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 229 pcm_test_short ("short_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 230 pcm_test_24bit ("24bit_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, SF_TRUE) ;
Chris@40 231 pcm_test_24bit ("24bit_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, SF_TRUE) ;
Chris@40 232 test_count++ ;
Chris@40 233 } ;
Chris@40 234
Chris@40 235 if (do_all || ! strcmp (argv [1], "svx"))
Chris@40 236 { pcm_test_char ("char.svx" , SF_FORMAT_SVX | SF_FORMAT_PCM_S8, SF_FALSE) ;
Chris@40 237 pcm_test_short ("short.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 238
Chris@40 239 empty_file_test ("empty_char.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_S8) ;
Chris@40 240 empty_file_test ("empty_short.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16) ;
Chris@40 241
Chris@40 242 test_count++ ;
Chris@40 243 } ;
Chris@40 244
Chris@40 245 if (do_all || ! strcmp (argv [1], "nist"))
Chris@40 246 { pcm_test_short ("short_le.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 247 pcm_test_short ("short_be.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 248 pcm_test_24bit ("24bit_le.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 249 pcm_test_24bit ("24bit_be.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 250 pcm_test_int ("int_le.nist" , SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 251 pcm_test_int ("int_be.nist" , SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 252
Chris@40 253 test_count++ ;
Chris@40 254 } ;
Chris@40 255
Chris@40 256 if (do_all || ! strcmp (argv [1], "ircam"))
Chris@40 257 { pcm_test_short ("short_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 258 pcm_test_short ("short_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 259 pcm_test_int ("int_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 260 pcm_test_int ("int_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 261 pcm_test_float ("float_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 262 pcm_test_float ("float_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 263
Chris@40 264 test_count++ ;
Chris@40 265 } ;
Chris@40 266
Chris@40 267 if (do_all || ! strcmp (argv [1], "voc"))
Chris@40 268 { pcm_test_char ("char.voc" , SF_FORMAT_VOC | SF_FORMAT_PCM_U8, SF_FALSE) ;
Chris@40 269 pcm_test_short ("short.voc", SF_FORMAT_VOC | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 270
Chris@40 271 test_count++ ;
Chris@40 272 } ;
Chris@40 273
Chris@40 274 if (do_all || ! strcmp (argv [1], "mat4"))
Chris@40 275 { pcm_test_short ("short_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 276 pcm_test_short ("short_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 277 pcm_test_int ("int_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 278 pcm_test_int ("int_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 279 pcm_test_float ("float_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 280 pcm_test_float ("float_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 281 pcm_test_double ("double_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 282 pcm_test_double ("double_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 283
Chris@40 284 empty_file_test ("empty_short.mat4", SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ;
Chris@40 285 empty_file_test ("empty_float.mat4", SF_FORMAT_MAT4 | SF_FORMAT_FLOAT) ;
Chris@40 286 test_count++ ;
Chris@40 287 } ;
Chris@40 288
Chris@40 289 if (do_all || ! strcmp (argv [1], "mat5"))
Chris@40 290 { pcm_test_char ("char_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8, SF_FALSE) ;
Chris@40 291 pcm_test_char ("char_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8, SF_FALSE) ;
Chris@40 292 pcm_test_short ("short_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 293 pcm_test_short ("short_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 294 pcm_test_int ("int_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 295 pcm_test_int ("int_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 296 pcm_test_float ("float_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 297 pcm_test_float ("float_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 298 pcm_test_double ("double_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 299 pcm_test_double ("double_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 300
Chris@40 301 increment_open_file_count () ;
Chris@40 302
Chris@40 303 empty_file_test ("empty_char.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8) ;
Chris@40 304 empty_file_test ("empty_short.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ;
Chris@40 305 empty_file_test ("empty_float.mat5", SF_FORMAT_MAT5 | SF_FORMAT_FLOAT) ;
Chris@40 306
Chris@40 307 test_count++ ;
Chris@40 308 } ;
Chris@40 309
Chris@40 310 if (do_all || ! strcmp (argv [1], "pvf"))
Chris@40 311 { pcm_test_char ("char.pvf" , SF_FORMAT_PVF | SF_FORMAT_PCM_S8, SF_FALSE) ;
Chris@40 312 pcm_test_short ("short.pvf", SF_FORMAT_PVF | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 313 pcm_test_int ("int.pvf" , SF_FORMAT_PVF | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 314 test_count++ ;
Chris@40 315 } ;
Chris@40 316
Chris@40 317 if (do_all || ! strcmp (argv [1], "htk"))
Chris@40 318 { pcm_test_short ("short.htk", SF_FORMAT_HTK | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 319 test_count++ ;
Chris@40 320 } ;
Chris@40 321
Chris@40 322 if (do_all || ! strcmp (argv [1], "mpc2k"))
Chris@40 323 { pcm_test_short ("short.mpc", SF_FORMAT_MPC2K | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 324 test_count++ ;
Chris@40 325 } ;
Chris@40 326
Chris@40 327 if (do_all || ! strcmp (argv [1], "avr"))
Chris@40 328 { pcm_test_char ("char_u8.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_U8, SF_FALSE) ;
Chris@40 329 pcm_test_char ("char_s8.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_S8, SF_FALSE) ;
Chris@40 330 pcm_test_short ("short.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 331 test_count++ ;
Chris@40 332 } ;
Chris@40 333 /* Lite remove end */
Chris@40 334
Chris@40 335 if (do_all || ! strcmp (argv [1], "w64"))
Chris@40 336 { pcm_test_char ("char.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_U8, SF_FALSE) ;
Chris@40 337 pcm_test_short ("short.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 338 pcm_test_24bit ("24bit.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 339 pcm_test_int ("int.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 340 /* Lite remove start */
Chris@40 341 pcm_test_float ("float.w64" , SF_FORMAT_W64 | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 342 pcm_test_double ("double.w64" , SF_FORMAT_W64 | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 343 /* Lite remove end */
Chris@40 344
Chris@40 345 empty_file_test ("empty_char.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_U8) ;
Chris@40 346 empty_file_test ("empty_short.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ;
Chris@40 347 empty_file_test ("empty_float.w64", SF_FORMAT_W64 | SF_FORMAT_FLOAT) ;
Chris@40 348
Chris@40 349 test_count++ ;
Chris@40 350 } ;
Chris@40 351
Chris@40 352 if (do_all || ! strcmp (argv [1], "sds"))
Chris@40 353 { pcm_test_char ("char.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_S8, SF_FALSE) ;
Chris@40 354 pcm_test_short ("short.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 355 pcm_test_24bit ("24bit.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 356
Chris@40 357 empty_file_test ("empty_char.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_S8) ;
Chris@40 358 empty_file_test ("empty_short.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_16) ;
Chris@40 359
Chris@40 360 test_count++ ;
Chris@40 361 } ;
Chris@40 362
Chris@40 363 if (do_all || ! strcmp (argv [1], "sd2"))
Chris@40 364 { pcm_test_char ("char.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_S8, SF_TRUE) ;
Chris@40 365 pcm_test_short ("short.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_16, SF_TRUE) ;
Chris@40 366 pcm_test_24bit ("24bit.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_24, SF_TRUE) ;
Chris@40 367 pcm_test_int ("32bit.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_32, SF_TRUE) ;
Chris@40 368 test_count++ ;
Chris@40 369 } ;
Chris@40 370
Chris@40 371 if (do_all || ! strcmp (argv [1], "flac"))
Chris@40 372 { if (HAVE_EXTERNAL_XIPH_LIBS)
Chris@40 373 { pcm_test_char ("char.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, SF_TRUE) ;
Chris@40 374 pcm_test_short ("short.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_16, SF_TRUE) ;
Chris@40 375 pcm_test_24bit ("24bit.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_24, SF_TRUE) ;
Chris@40 376 }
Chris@40 377 else
Chris@40 378 puts (" No FLAC tests because FLAC support was not compiled in.") ;
Chris@40 379 test_count++ ;
Chris@40 380 } ;
Chris@40 381
Chris@40 382 if (do_all || ! strcmp (argv [1], "rf64"))
Chris@40 383 { pcm_test_char ("char.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_U8, SF_FALSE) ;
Chris@40 384 pcm_test_short ("short.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_16, SF_FALSE) ;
Chris@40 385 pcm_test_24bit ("24bit.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_24, SF_FALSE) ;
Chris@40 386 pcm_test_int ("int.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_32, SF_FALSE) ;
Chris@40 387
Chris@40 388 /* Lite remove start */
Chris@40 389 pcm_test_float ("float.rf64" , SF_FORMAT_RF64 | SF_FORMAT_FLOAT , SF_FALSE) ;
Chris@40 390 pcm_test_double ("double.rf64" , SF_FORMAT_RF64 | SF_FORMAT_DOUBLE, SF_FALSE) ;
Chris@40 391 empty_file_test ("empty_char.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_U8) ;
Chris@40 392 empty_file_test ("empty_short.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
Chris@40 393 empty_file_test ("empty_float.rf64", SF_FORMAT_RF64 | SF_FORMAT_FLOAT) ;
Chris@40 394 /* Lite remove end */
Chris@40 395
Chris@40 396 test_count++ ;
Chris@40 397 } ;
Chris@40 398
Chris@40 399 if (test_count == 0)
Chris@40 400 { printf ("Mono : ************************************\n") ;
Chris@40 401 printf ("Mono : * No '%s' test defined.\n", argv [1]) ;
Chris@40 402 printf ("Mono : ************************************\n") ;
Chris@40 403 return 1 ;
Chris@40 404 } ;
Chris@40 405
Chris@40 406 /* Only open file descriptors should be stdin, stdout and stderr. */
Chris@40 407 check_open_file_count_or_die (__LINE__) ;
Chris@40 408
Chris@40 409 return 0 ;
Chris@40 410 } /* main */
Chris@40 411
Chris@40 412 /*============================================================================================
Chris@40 413 ** Helper functions and macros.
Chris@40 414 */
Chris@40 415
Chris@40 416 static void create_short_file (const char *filename) ;
Chris@40 417
Chris@40 418 #define CHAR_ERROR(x, y) (abs ((x) - (y)) > 255)
Chris@40 419 #define INT_ERROR(x, y) (((x) - (y)) != 0)
Chris@40 420 #define BIT_20_ERROR(x, y) (abs ((x) - (y)) > 4095)
Chris@40 421 #define TRIBYTE_ERROR(x, y) (abs ((x) - (y)) > 255)
Chris@40 422 #define FLOAT_ERROR(x, y) (fabs ((x) - (y)) > 1e-5)
Chris@40 423
Chris@40 424 #define CONVERT_DATA(k, len, new, orig) \
Chris@40 425 { for ((k) = 0 ; (k) < (len) ; (k) ++) \
Chris@40 426 (new) [k] = (orig) [k] ; \
Chris@40 427 }
Chris@40 428
Chris@40 429
Chris@40 430 /*======================================================================================
Chris@40 431 */
Chris@40 432
Chris@40 433 static void mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 434 static void stereo_char_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 435 static void mono_rdwr_char_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 436 static void new_rdwr_char_test (const char *filename, int format, int allow_fd) ;
Chris@40 437 static void multi_seek_test (const char * filename, int format) ;
Chris@40 438 static void write_seek_extend_test (const char * filename, int format) ;
Chris@40 439
Chris@40 440 static void
Chris@40 441 pcm_test_char (const char *filename, int format, int long_file_ok)
Chris@40 442 { SF_INFO sfinfo ;
Chris@40 443 short *orig ;
Chris@40 444 int k, allow_fd ;
Chris@40 445
Chris@40 446 /* Sd2 files cannot be opened from an existing file descriptor. */
Chris@40 447 allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ;
Chris@40 448
Chris@40 449 print_test_name ("pcm_test_char", filename) ;
Chris@40 450
Chris@40 451 sfinfo.samplerate = 44100 ;
Chris@40 452 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 453 sfinfo.channels = 1 ;
Chris@40 454 sfinfo.format = format ;
Chris@40 455
Chris@40 456 test_sf_format_or_die (&sfinfo, __LINE__) ;
Chris@40 457
Chris@40 458 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ;
Chris@40 459
Chris@40 460 orig = orig_data.s ;
Chris@40 461
Chris@40 462 /* Make this a macro so gdb steps over it in one go. */
Chris@40 463 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 464
Chris@40 465 /* Some test broken out here. */
Chris@40 466
Chris@40 467 mono_char_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 468
Chris@40 469 /* Sub format DWVW does not allow seeking. */
Chris@40 470 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 471 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 472 { unlink (filename) ;
Chris@40 473 printf ("no seek : ok\n") ;
Chris@40 474 return ;
Chris@40 475 } ;
Chris@40 476
Chris@40 477 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 478 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 479 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 480 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 481 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 482 )
Chris@40 483 mono_rdwr_char_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 484
Chris@40 485 /* If the format doesn't support stereo we're done. */
Chris@40 486 sfinfo.channels = 2 ;
Chris@40 487 if (sf_format_check (&sfinfo) == 0)
Chris@40 488 { unlink (filename) ;
Chris@40 489 puts ("no stereo : ok") ;
Chris@40 490 return ;
Chris@40 491 } ;
Chris@40 492
Chris@40 493 stereo_char_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 494
Chris@40 495 /* New read/write test. Not sure if this is needed yet. */
Chris@40 496
Chris@40 497 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
Chris@40 498 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
Chris@40 499 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 500 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 501 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 502 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 503 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 504 )
Chris@40 505 new_rdwr_char_test (filename, format, allow_fd) ;
Chris@40 506
Chris@40 507 delete_file (format, filename) ;
Chris@40 508
Chris@40 509 puts ("ok") ;
Chris@40 510 return ;
Chris@40 511 } /* pcm_test_char */
Chris@40 512
Chris@40 513 static void
Chris@40 514 mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 515 { SNDFILE *file ;
Chris@40 516 SF_INFO sfinfo ;
Chris@40 517 short *orig, *test ;
Chris@40 518 sf_count_t count ;
Chris@40 519 int k, items, total ;
Chris@40 520
Chris@40 521 sfinfo.samplerate = 44100 ;
Chris@40 522 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 523 sfinfo.channels = 1 ;
Chris@40 524 sfinfo.format = format ;
Chris@40 525
Chris@40 526 orig = orig_data.s ;
Chris@40 527 test = test_data.s ;
Chris@40 528
Chris@40 529 items = DATA_LENGTH ;
Chris@40 530
Chris@40 531 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 532
Chris@40 533 if (sfinfo.frames || sfinfo.sections || sfinfo.seekable)
Chris@40 534 { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ;
Chris@40 535 exit (1) ;
Chris@40 536 } ;
Chris@40 537
Chris@40 538 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 539
Chris@40 540 test_write_short_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 541 sf_write_sync (file) ;
Chris@40 542 test_write_short_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 543 sf_write_sync (file) ;
Chris@40 544
Chris@40 545 /* Add non-audio data after the audio. */
Chris@40 546 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 547
Chris@40 548 sf_close (file) ;
Chris@40 549
Chris@40 550 memset (test, 0, items * sizeof (short)) ;
Chris@40 551
Chris@40 552 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 553 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 554
Chris@40 555 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 556
Chris@40 557 if (sfinfo.format != format)
Chris@40 558 { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 559 exit (1) ;
Chris@40 560 } ;
Chris@40 561
Chris@40 562 if (sfinfo.frames < 2 * items)
Chris@40 563 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 564 exit (1) ;
Chris@40 565 } ;
Chris@40 566
Chris@40 567 if (! long_file_ok && sfinfo.frames > 2 * items)
Chris@40 568 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 569 exit (1) ;
Chris@40 570 } ;
Chris@40 571
Chris@40 572 if (sfinfo.channels != 1)
Chris@40 573 { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 574 exit (1) ;
Chris@40 575 } ;
Chris@40 576
Chris@40 577 if (sfinfo.seekable != 1)
Chris@40 578 { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ;
Chris@40 579 exit (1) ;
Chris@40 580 } ;
Chris@40 581
Chris@40 582 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 583
Chris@40 584 test_read_short_or_die (file, 0, test, items, __LINE__) ;
Chris@40 585 for (k = 0 ; k < items ; k++)
Chris@40 586 if (CHAR_ERROR (orig [k], test [k]))
Chris@40 587 { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 588 oct_save_short (orig, test, items) ;
Chris@40 589 exit (1) ;
Chris@40 590 } ;
Chris@40 591
Chris@40 592 /* Test multiple short reads. */
Chris@40 593 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 594
Chris@40 595 total = 0 ;
Chris@40 596 for (k = 1 ; k <= 32 ; k++)
Chris@40 597 { int ik ;
Chris@40 598
Chris@40 599 test_read_short_or_die (file, 0, test + total, k, __LINE__) ;
Chris@40 600 total += k ;
Chris@40 601
Chris@40 602 for (ik = 0 ; ik < total ; ik++)
Chris@40 603 if (CHAR_ERROR (orig [ik], test [ik]))
Chris@40 604 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ;
Chris@40 605 exit (1) ;
Chris@40 606 } ;
Chris@40 607 } ;
Chris@40 608
Chris@40 609 /* Seek to start of file. */
Chris@40 610 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 611
Chris@40 612 test_read_short_or_die (file, 0, test, 4, __LINE__) ;
Chris@40 613 for (k = 0 ; k < 4 ; k++)
Chris@40 614 if (CHAR_ERROR (orig [k], test [k]))
Chris@40 615 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 616 exit (1) ;
Chris@40 617 } ;
Chris@40 618
Chris@40 619 /* For some codecs we can't go past here. */
Chris@40 620 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 621 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 622 { sf_close (file) ;
Chris@40 623 unlink (filename) ;
Chris@40 624 printf ("no seek : ") ;
Chris@40 625 return ;
Chris@40 626 } ;
Chris@40 627
Chris@40 628 /* Seek to offset from start of file. */
Chris@40 629 test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ;
Chris@40 630
Chris@40 631 test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 632 for (k = 10 ; k < 14 ; k++)
Chris@40 633 if (CHAR_ERROR (orig [k], test [k]))
Chris@40 634 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 635 exit (1) ;
Chris@40 636 } ;
Chris@40 637
Chris@40 638 /* Seek to offset from current position. */
Chris@40 639 test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ;
Chris@40 640
Chris@40 641 test_read_short_or_die (file, 0, test + 20, 4, __LINE__) ;
Chris@40 642 for (k = 20 ; k < 24 ; k++)
Chris@40 643 if (CHAR_ERROR (orig [k], test [k]))
Chris@40 644 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 645 exit (1) ;
Chris@40 646 } ;
Chris@40 647
Chris@40 648 /* Seek to offset from end of file. */
Chris@40 649 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 650
Chris@40 651 test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 652 for (k = 10 ; k < 14 ; k++)
Chris@40 653 if (CHAR_ERROR (orig [k], test [k]))
Chris@40 654 { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 655 exit (1) ;
Chris@40 656 } ;
Chris@40 657
Chris@40 658 /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */
Chris@40 659 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 660
Chris@40 661 count = 0 ;
Chris@40 662 while (count < sfinfo.frames)
Chris@40 663 count += sf_read_short (file, test, 311) ;
Chris@40 664
Chris@40 665 /* Check that no error has occurred. */
Chris@40 666 if (sf_error (file))
Chris@40 667 { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ;
Chris@40 668 puts (sf_strerror (file)) ;
Chris@40 669 exit (1) ;
Chris@40 670 } ;
Chris@40 671
Chris@40 672 /* Check that we haven't read beyond EOF. */
Chris@40 673 if (count > sfinfo.frames)
Chris@40 674 { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
Chris@40 675 exit (1) ;
Chris@40 676 } ;
Chris@40 677
Chris@40 678 test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ;
Chris@40 679
Chris@40 680 sf_close (file) ;
Chris@40 681
Chris@40 682 multi_seek_test (filename, format) ;
Chris@40 683 write_seek_extend_test (filename, format) ;
Chris@40 684
Chris@40 685 } /* mono_char_test */
Chris@40 686
Chris@40 687 static void
Chris@40 688 stereo_char_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 689 { SNDFILE *file ;
Chris@40 690 SF_INFO sfinfo ;
Chris@40 691 short *orig, *test ;
Chris@40 692 int k, items, frames ;
Chris@40 693
Chris@40 694 sfinfo.samplerate = 44100 ;
Chris@40 695 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 696 sfinfo.channels = 2 ;
Chris@40 697 sfinfo.format = format ;
Chris@40 698
Chris@40 699 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ;
Chris@40 700
Chris@40 701 orig = orig_data.s ;
Chris@40 702 test = test_data.s ;
Chris@40 703
Chris@40 704 /* Make this a macro so gdb steps over it in one go. */
Chris@40 705 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 706
Chris@40 707 items = DATA_LENGTH ;
Chris@40 708 frames = items / sfinfo.channels ;
Chris@40 709
Chris@40 710 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 711
Chris@40 712 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 713
Chris@40 714 test_writef_short_or_die (file, 0, orig, frames, __LINE__) ;
Chris@40 715
Chris@40 716 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 717
Chris@40 718 sf_close (file) ;
Chris@40 719
Chris@40 720 memset (test, 0, items * sizeof (short)) ;
Chris@40 721
Chris@40 722 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 723 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 724
Chris@40 725 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 726
Chris@40 727 if (sfinfo.format != format)
Chris@40 728 { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n",
Chris@40 729 __LINE__, format, sfinfo.format) ;
Chris@40 730 exit (1) ;
Chris@40 731 } ;
Chris@40 732
Chris@40 733 if (sfinfo.frames < frames)
Chris@40 734 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
Chris@40 735 __LINE__, sfinfo.frames, frames) ;
Chris@40 736 exit (1) ;
Chris@40 737 } ;
Chris@40 738
Chris@40 739 if (! long_file_ok && sfinfo.frames > frames)
Chris@40 740 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
Chris@40 741 __LINE__, sfinfo.frames, frames) ;
Chris@40 742 exit (1) ;
Chris@40 743 } ;
Chris@40 744
Chris@40 745 if (sfinfo.channels != 2)
Chris@40 746 { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 747 exit (1) ;
Chris@40 748 } ;
Chris@40 749
Chris@40 750 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 751
Chris@40 752 test_readf_short_or_die (file, 0, test, frames, __LINE__) ;
Chris@40 753 for (k = 0 ; k < items ; k++)
Chris@40 754 if (CHAR_ERROR (test [k], orig [k]))
Chris@40 755 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 756 exit (1) ;
Chris@40 757 } ;
Chris@40 758
Chris@40 759 /* Seek to start of file. */
Chris@40 760 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 761
Chris@40 762 test_readf_short_or_die (file, 0, test, 2, __LINE__) ;
Chris@40 763 for (k = 0 ; k < 4 ; k++)
Chris@40 764 if (CHAR_ERROR (test [k], orig [k]))
Chris@40 765 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 766 exit (1) ;
Chris@40 767 } ;
Chris@40 768
Chris@40 769 /* Seek to offset from start of file. */
Chris@40 770 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
Chris@40 771
Chris@40 772 /* Check for errors here. */
Chris@40 773 if (sf_error (file))
Chris@40 774 { printf ("Line %d: Should NOT return an error.\n", __LINE__) ;
Chris@40 775 puts (sf_strerror (file)) ;
Chris@40 776 exit (1) ;
Chris@40 777 } ;
Chris@40 778
Chris@40 779 if (sf_read_short (file, test, 1) > 0)
Chris@40 780 { printf ("Line %d: Should return 0.\n", __LINE__) ;
Chris@40 781 exit (1) ;
Chris@40 782 } ;
Chris@40 783
Chris@40 784 if (! sf_error (file))
Chris@40 785 { printf ("Line %d: Should return an error.\n", __LINE__) ;
Chris@40 786 exit (1) ;
Chris@40 787 } ;
Chris@40 788 /*-----------------------*/
Chris@40 789
Chris@40 790 test_readf_short_or_die (file, 0, test + 10, 2, __LINE__) ;
Chris@40 791 for (k = 20 ; k < 24 ; k++)
Chris@40 792 if (CHAR_ERROR (test [k], orig [k]))
Chris@40 793 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 794 exit (1) ;
Chris@40 795 } ;
Chris@40 796
Chris@40 797 /* Seek to offset from current position. */
Chris@40 798 test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
Chris@40 799
Chris@40 800 test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 801 for (k = 40 ; k < 44 ; k++)
Chris@40 802 if (CHAR_ERROR (test [k], orig [k]))
Chris@40 803 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 804 exit (1) ;
Chris@40 805 } ;
Chris@40 806
Chris@40 807 /* Seek to offset from end of file. */
Chris@40 808 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 809
Chris@40 810 test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 811 for (k = 20 ; k < 24 ; k++)
Chris@40 812 if (CHAR_ERROR (test [k], orig [k]))
Chris@40 813 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 814 exit (1) ;
Chris@40 815 } ;
Chris@40 816
Chris@40 817 sf_close (file) ;
Chris@40 818 } /* stereo_char_test */
Chris@40 819
Chris@40 820 static void
Chris@40 821 mono_rdwr_char_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 822 { SNDFILE *file ;
Chris@40 823 SF_INFO sfinfo ;
Chris@40 824 short *orig, *test ;
Chris@40 825 int k, pass ;
Chris@40 826
Chris@40 827 switch (format & SF_FORMAT_SUBMASK)
Chris@40 828 { case SF_FORMAT_ALAC_16 :
Chris@40 829 case SF_FORMAT_ALAC_20 :
Chris@40 830 case SF_FORMAT_ALAC_24 :
Chris@40 831 case SF_FORMAT_ALAC_32 :
Chris@40 832 allow_fd = 0 ;
Chris@40 833 break ;
Chris@40 834
Chris@40 835 default :
Chris@40 836 break ;
Chris@40 837 } ;
Chris@40 838
Chris@40 839 orig = orig_data.s ;
Chris@40 840 test = test_data.s ;
Chris@40 841
Chris@40 842 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 843 sfinfo.frames = DATA_LENGTH ;
Chris@40 844 sfinfo.channels = 1 ;
Chris@40 845 sfinfo.format = format ;
Chris@40 846
Chris@40 847 if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW
Chris@40 848 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU
Chris@40 849 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2)
Chris@40 850 unlink (filename) ;
Chris@40 851 else
Chris@40 852 { /* Create a short file. */
Chris@40 853 create_short_file (filename) ;
Chris@40 854
Chris@40 855 /* Opening a already existing short file (ie invalid header) RDWR is disallowed.
Chris@40 856 ** If this returns a valif pointer sf_open() screwed up.
Chris@40 857 */
Chris@40 858 if ((file = sf_open (filename, SFM_RDWR, &sfinfo)))
Chris@40 859 { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ;
Chris@40 860 exit (1) ;
Chris@40 861 } ;
Chris@40 862
Chris@40 863 /* Truncate the file to zero bytes. */
Chris@40 864 if (truncate (filename, 0) < 0)
Chris@40 865 { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ;
Chris@40 866 perror (NULL) ;
Chris@40 867 exit (1) ;
Chris@40 868 } ;
Chris@40 869 } ;
Chris@40 870
Chris@40 871 /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain
Chris@40 872 ** all the usual data required when opening the file in WRITE mode.
Chris@40 873 */
Chris@40 874 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 875 sfinfo.frames = DATA_LENGTH ;
Chris@40 876 sfinfo.channels = 1 ;
Chris@40 877 sfinfo.format = format ;
Chris@40 878
Chris@40 879 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 880
Chris@40 881 /* Do 3 writes followed by reads. After each, check the data and the current
Chris@40 882 ** read and write offsets.
Chris@40 883 */
Chris@40 884 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 885 { orig [20] = pass * 2 ;
Chris@40 886
Chris@40 887 /* Write some data. */
Chris@40 888 test_write_short_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ;
Chris@40 889
Chris@40 890 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 891
Chris@40 892 /* Read what we just wrote. */
Chris@40 893 test_read_short_or_die (file, 0, test, DATA_LENGTH, __LINE__) ;
Chris@40 894
Chris@40 895 /* Check the data. */
Chris@40 896 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 897 if (CHAR_ERROR (orig [k], test [k]))
Chris@40 898 { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 899 oct_save_short (orig, test, DATA_LENGTH) ;
Chris@40 900 exit (1) ;
Chris@40 901 } ;
Chris@40 902
Chris@40 903 test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 904 } ; /* for (pass ...) */
Chris@40 905
Chris@40 906 sf_close (file) ;
Chris@40 907
Chris@40 908 /* Open the file again to check the data. */
Chris@40 909 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 910
Chris@40 911 if (sfinfo.format != format)
Chris@40 912 { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 913 exit (1) ;
Chris@40 914 } ;
Chris@40 915
Chris@40 916 if (sfinfo.frames < 3 * DATA_LENGTH)
Chris@40 917 { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 918 exit (1) ;
Chris@40 919 }
Chris@40 920
Chris@40 921 if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
Chris@40 922 { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 923 exit (1) ;
Chris@40 924 } ;
Chris@40 925
Chris@40 926 if (sfinfo.channels != 1)
Chris@40 927 { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 928 exit (1) ;
Chris@40 929 } ;
Chris@40 930
Chris@40 931 if (! long_file_ok)
Chris@40 932 test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ;
Chris@40 933 else
Chris@40 934 test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ;
Chris@40 935
Chris@40 936 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 937 { orig [20] = pass * 2 ;
Chris@40 938
Chris@40 939 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ;
Chris@40 940
Chris@40 941 /* Read what we just wrote. */
Chris@40 942 test_read_short_or_die (file, pass, test, DATA_LENGTH, __LINE__) ;
Chris@40 943
Chris@40 944 /* Check the data. */
Chris@40 945 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 946 if (CHAR_ERROR (orig [k], test [k]))
Chris@40 947 { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 948 oct_save_short (orig, test, DATA_LENGTH) ;
Chris@40 949 exit (1) ;
Chris@40 950 } ;
Chris@40 951
Chris@40 952 } ; /* for (pass ...) */
Chris@40 953
Chris@40 954 sf_close (file) ;
Chris@40 955 } /* mono_rdwr_short_test */
Chris@40 956
Chris@40 957 static void
Chris@40 958 new_rdwr_char_test (const char *filename, int format, int allow_fd)
Chris@40 959 { SNDFILE *wfile, *rwfile ;
Chris@40 960 SF_INFO sfinfo ;
Chris@40 961 short *orig, *test ;
Chris@40 962 int items, frames ;
Chris@40 963
Chris@40 964 orig = orig_data.s ;
Chris@40 965 test = test_data.s ;
Chris@40 966
Chris@40 967 sfinfo.samplerate = 44100 ;
Chris@40 968 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 969 sfinfo.channels = 2 ;
Chris@40 970 sfinfo.format = format ;
Chris@40 971
Chris@40 972 items = DATA_LENGTH ;
Chris@40 973 frames = items / sfinfo.channels ;
Chris@40 974
Chris@40 975 wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 976 sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
Chris@40 977 test_writef_short_or_die (wfile, 1, orig, frames, __LINE__) ;
Chris@40 978 sf_write_sync (wfile) ;
Chris@40 979 test_writef_short_or_die (wfile, 2, orig, frames, __LINE__) ;
Chris@40 980 sf_write_sync (wfile) ;
Chris@40 981
Chris@40 982 rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 983 if (sfinfo.frames != 2 * frames)
Chris@40 984 { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
Chris@40 985 exit (1) ;
Chris@40 986 } ;
Chris@40 987
Chris@40 988 test_writef_short_or_die (wfile, 3, orig, frames, __LINE__) ;
Chris@40 989
Chris@40 990 test_readf_short_or_die (rwfile, 1, test, frames, __LINE__) ;
Chris@40 991 test_readf_short_or_die (rwfile, 2, test, frames, __LINE__) ;
Chris@40 992
Chris@40 993 sf_close (wfile) ;
Chris@40 994 sf_close (rwfile) ;
Chris@40 995 } /* new_rdwr_char_test */
Chris@40 996
Chris@40 997
Chris@40 998 /*======================================================================================
Chris@40 999 */
Chris@40 1000
Chris@40 1001 static void mono_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 1002 static void stereo_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 1003 static void mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 1004 static void new_rdwr_short_test (const char *filename, int format, int allow_fd) ;
Chris@40 1005 static void multi_seek_test (const char * filename, int format) ;
Chris@40 1006 static void write_seek_extend_test (const char * filename, int format) ;
Chris@40 1007
Chris@40 1008 static void
Chris@40 1009 pcm_test_short (const char *filename, int format, int long_file_ok)
Chris@40 1010 { SF_INFO sfinfo ;
Chris@40 1011 short *orig ;
Chris@40 1012 int k, allow_fd ;
Chris@40 1013
Chris@40 1014 /* Sd2 files cannot be opened from an existing file descriptor. */
Chris@40 1015 allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ;
Chris@40 1016
Chris@40 1017 print_test_name ("pcm_test_short", filename) ;
Chris@40 1018
Chris@40 1019 sfinfo.samplerate = 44100 ;
Chris@40 1020 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 1021 sfinfo.channels = 1 ;
Chris@40 1022 sfinfo.format = format ;
Chris@40 1023
Chris@40 1024 test_sf_format_or_die (&sfinfo, __LINE__) ;
Chris@40 1025
Chris@40 1026 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ;
Chris@40 1027
Chris@40 1028 orig = orig_data.s ;
Chris@40 1029
Chris@40 1030 /* Make this a macro so gdb steps over it in one go. */
Chris@40 1031 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 1032
Chris@40 1033 /* Some test broken out here. */
Chris@40 1034
Chris@40 1035 mono_short_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 1036
Chris@40 1037 /* Sub format DWVW does not allow seeking. */
Chris@40 1038 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 1039 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 1040 { unlink (filename) ;
Chris@40 1041 printf ("no seek : ok\n") ;
Chris@40 1042 return ;
Chris@40 1043 } ;
Chris@40 1044
Chris@40 1045 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 1046 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 1047 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 1048 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 1049 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 1050 )
Chris@40 1051 mono_rdwr_short_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 1052
Chris@40 1053 /* If the format doesn't support stereo we're done. */
Chris@40 1054 sfinfo.channels = 2 ;
Chris@40 1055 if (sf_format_check (&sfinfo) == 0)
Chris@40 1056 { unlink (filename) ;
Chris@40 1057 puts ("no stereo : ok") ;
Chris@40 1058 return ;
Chris@40 1059 } ;
Chris@40 1060
Chris@40 1061 stereo_short_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 1062
Chris@40 1063 /* New read/write test. Not sure if this is needed yet. */
Chris@40 1064
Chris@40 1065 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
Chris@40 1066 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
Chris@40 1067 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 1068 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 1069 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 1070 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 1071 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 1072 )
Chris@40 1073 new_rdwr_short_test (filename, format, allow_fd) ;
Chris@40 1074
Chris@40 1075 delete_file (format, filename) ;
Chris@40 1076
Chris@40 1077 puts ("ok") ;
Chris@40 1078 return ;
Chris@40 1079 } /* pcm_test_short */
Chris@40 1080
Chris@40 1081 static void
Chris@40 1082 mono_short_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 1083 { SNDFILE *file ;
Chris@40 1084 SF_INFO sfinfo ;
Chris@40 1085 short *orig, *test ;
Chris@40 1086 sf_count_t count ;
Chris@40 1087 int k, items, total ;
Chris@40 1088
Chris@40 1089 sfinfo.samplerate = 44100 ;
Chris@40 1090 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 1091 sfinfo.channels = 1 ;
Chris@40 1092 sfinfo.format = format ;
Chris@40 1093
Chris@40 1094 orig = orig_data.s ;
Chris@40 1095 test = test_data.s ;
Chris@40 1096
Chris@40 1097 items = DATA_LENGTH ;
Chris@40 1098
Chris@40 1099 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 1100
Chris@40 1101 if (sfinfo.frames || sfinfo.sections || sfinfo.seekable)
Chris@40 1102 { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ;
Chris@40 1103 exit (1) ;
Chris@40 1104 } ;
Chris@40 1105
Chris@40 1106 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 1107
Chris@40 1108 test_write_short_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 1109 sf_write_sync (file) ;
Chris@40 1110 test_write_short_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 1111 sf_write_sync (file) ;
Chris@40 1112
Chris@40 1113 /* Add non-audio data after the audio. */
Chris@40 1114 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 1115
Chris@40 1116 sf_close (file) ;
Chris@40 1117
Chris@40 1118 memset (test, 0, items * sizeof (short)) ;
Chris@40 1119
Chris@40 1120 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 1121 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 1122
Chris@40 1123 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 1124
Chris@40 1125 if (sfinfo.format != format)
Chris@40 1126 { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 1127 exit (1) ;
Chris@40 1128 } ;
Chris@40 1129
Chris@40 1130 if (sfinfo.frames < 2 * items)
Chris@40 1131 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 1132 exit (1) ;
Chris@40 1133 } ;
Chris@40 1134
Chris@40 1135 if (! long_file_ok && sfinfo.frames > 2 * items)
Chris@40 1136 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 1137 exit (1) ;
Chris@40 1138 } ;
Chris@40 1139
Chris@40 1140 if (sfinfo.channels != 1)
Chris@40 1141 { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 1142 exit (1) ;
Chris@40 1143 } ;
Chris@40 1144
Chris@40 1145 if (sfinfo.seekable != 1)
Chris@40 1146 { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ;
Chris@40 1147 exit (1) ;
Chris@40 1148 } ;
Chris@40 1149
Chris@40 1150 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 1151
Chris@40 1152 test_read_short_or_die (file, 0, test, items, __LINE__) ;
Chris@40 1153 for (k = 0 ; k < items ; k++)
Chris@40 1154 if (INT_ERROR (orig [k], test [k]))
Chris@40 1155 { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1156 oct_save_short (orig, test, items) ;
Chris@40 1157 exit (1) ;
Chris@40 1158 } ;
Chris@40 1159
Chris@40 1160 /* Test multiple short reads. */
Chris@40 1161 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 1162
Chris@40 1163 total = 0 ;
Chris@40 1164 for (k = 1 ; k <= 32 ; k++)
Chris@40 1165 { int ik ;
Chris@40 1166
Chris@40 1167 test_read_short_or_die (file, 0, test + total, k, __LINE__) ;
Chris@40 1168 total += k ;
Chris@40 1169
Chris@40 1170 for (ik = 0 ; ik < total ; ik++)
Chris@40 1171 if (INT_ERROR (orig [ik], test [ik]))
Chris@40 1172 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ;
Chris@40 1173 exit (1) ;
Chris@40 1174 } ;
Chris@40 1175 } ;
Chris@40 1176
Chris@40 1177 /* Seek to start of file. */
Chris@40 1178 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 1179
Chris@40 1180 test_read_short_or_die (file, 0, test, 4, __LINE__) ;
Chris@40 1181 for (k = 0 ; k < 4 ; k++)
Chris@40 1182 if (INT_ERROR (orig [k], test [k]))
Chris@40 1183 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1184 exit (1) ;
Chris@40 1185 } ;
Chris@40 1186
Chris@40 1187 /* For some codecs we can't go past here. */
Chris@40 1188 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 1189 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 1190 { sf_close (file) ;
Chris@40 1191 unlink (filename) ;
Chris@40 1192 printf ("no seek : ") ;
Chris@40 1193 return ;
Chris@40 1194 } ;
Chris@40 1195
Chris@40 1196 /* Seek to offset from start of file. */
Chris@40 1197 test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ;
Chris@40 1198
Chris@40 1199 test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 1200 for (k = 10 ; k < 14 ; k++)
Chris@40 1201 if (INT_ERROR (orig [k], test [k]))
Chris@40 1202 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 1203 exit (1) ;
Chris@40 1204 } ;
Chris@40 1205
Chris@40 1206 /* Seek to offset from current position. */
Chris@40 1207 test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ;
Chris@40 1208
Chris@40 1209 test_read_short_or_die (file, 0, test + 20, 4, __LINE__) ;
Chris@40 1210 for (k = 20 ; k < 24 ; k++)
Chris@40 1211 if (INT_ERROR (orig [k], test [k]))
Chris@40 1212 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 1213 exit (1) ;
Chris@40 1214 } ;
Chris@40 1215
Chris@40 1216 /* Seek to offset from end of file. */
Chris@40 1217 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 1218
Chris@40 1219 test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 1220 for (k = 10 ; k < 14 ; k++)
Chris@40 1221 if (INT_ERROR (orig [k], test [k]))
Chris@40 1222 { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 1223 exit (1) ;
Chris@40 1224 } ;
Chris@40 1225
Chris@40 1226 /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */
Chris@40 1227 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 1228
Chris@40 1229 count = 0 ;
Chris@40 1230 while (count < sfinfo.frames)
Chris@40 1231 count += sf_read_short (file, test, 311) ;
Chris@40 1232
Chris@40 1233 /* Check that no error has occurred. */
Chris@40 1234 if (sf_error (file))
Chris@40 1235 { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ;
Chris@40 1236 puts (sf_strerror (file)) ;
Chris@40 1237 exit (1) ;
Chris@40 1238 } ;
Chris@40 1239
Chris@40 1240 /* Check that we haven't read beyond EOF. */
Chris@40 1241 if (count > sfinfo.frames)
Chris@40 1242 { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
Chris@40 1243 exit (1) ;
Chris@40 1244 } ;
Chris@40 1245
Chris@40 1246 test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ;
Chris@40 1247
Chris@40 1248 sf_close (file) ;
Chris@40 1249
Chris@40 1250 multi_seek_test (filename, format) ;
Chris@40 1251 write_seek_extend_test (filename, format) ;
Chris@40 1252
Chris@40 1253 } /* mono_short_test */
Chris@40 1254
Chris@40 1255 static void
Chris@40 1256 stereo_short_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 1257 { SNDFILE *file ;
Chris@40 1258 SF_INFO sfinfo ;
Chris@40 1259 short *orig, *test ;
Chris@40 1260 int k, items, frames ;
Chris@40 1261
Chris@40 1262 sfinfo.samplerate = 44100 ;
Chris@40 1263 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 1264 sfinfo.channels = 2 ;
Chris@40 1265 sfinfo.format = format ;
Chris@40 1266
Chris@40 1267 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ;
Chris@40 1268
Chris@40 1269 orig = orig_data.s ;
Chris@40 1270 test = test_data.s ;
Chris@40 1271
Chris@40 1272 /* Make this a macro so gdb steps over it in one go. */
Chris@40 1273 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 1274
Chris@40 1275 items = DATA_LENGTH ;
Chris@40 1276 frames = items / sfinfo.channels ;
Chris@40 1277
Chris@40 1278 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 1279
Chris@40 1280 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 1281
Chris@40 1282 test_writef_short_or_die (file, 0, orig, frames, __LINE__) ;
Chris@40 1283
Chris@40 1284 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 1285
Chris@40 1286 sf_close (file) ;
Chris@40 1287
Chris@40 1288 memset (test, 0, items * sizeof (short)) ;
Chris@40 1289
Chris@40 1290 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 1291 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 1292
Chris@40 1293 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 1294
Chris@40 1295 if (sfinfo.format != format)
Chris@40 1296 { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n",
Chris@40 1297 __LINE__, format, sfinfo.format) ;
Chris@40 1298 exit (1) ;
Chris@40 1299 } ;
Chris@40 1300
Chris@40 1301 if (sfinfo.frames < frames)
Chris@40 1302 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
Chris@40 1303 __LINE__, sfinfo.frames, frames) ;
Chris@40 1304 exit (1) ;
Chris@40 1305 } ;
Chris@40 1306
Chris@40 1307 if (! long_file_ok && sfinfo.frames > frames)
Chris@40 1308 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
Chris@40 1309 __LINE__, sfinfo.frames, frames) ;
Chris@40 1310 exit (1) ;
Chris@40 1311 } ;
Chris@40 1312
Chris@40 1313 if (sfinfo.channels != 2)
Chris@40 1314 { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 1315 exit (1) ;
Chris@40 1316 } ;
Chris@40 1317
Chris@40 1318 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 1319
Chris@40 1320 test_readf_short_or_die (file, 0, test, frames, __LINE__) ;
Chris@40 1321 for (k = 0 ; k < items ; k++)
Chris@40 1322 if (INT_ERROR (test [k], orig [k]))
Chris@40 1323 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1324 exit (1) ;
Chris@40 1325 } ;
Chris@40 1326
Chris@40 1327 /* Seek to start of file. */
Chris@40 1328 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 1329
Chris@40 1330 test_readf_short_or_die (file, 0, test, 2, __LINE__) ;
Chris@40 1331 for (k = 0 ; k < 4 ; k++)
Chris@40 1332 if (INT_ERROR (test [k], orig [k]))
Chris@40 1333 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1334 exit (1) ;
Chris@40 1335 } ;
Chris@40 1336
Chris@40 1337 /* Seek to offset from start of file. */
Chris@40 1338 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
Chris@40 1339
Chris@40 1340 /* Check for errors here. */
Chris@40 1341 if (sf_error (file))
Chris@40 1342 { printf ("Line %d: Should NOT return an error.\n", __LINE__) ;
Chris@40 1343 puts (sf_strerror (file)) ;
Chris@40 1344 exit (1) ;
Chris@40 1345 } ;
Chris@40 1346
Chris@40 1347 if (sf_read_short (file, test, 1) > 0)
Chris@40 1348 { printf ("Line %d: Should return 0.\n", __LINE__) ;
Chris@40 1349 exit (1) ;
Chris@40 1350 } ;
Chris@40 1351
Chris@40 1352 if (! sf_error (file))
Chris@40 1353 { printf ("Line %d: Should return an error.\n", __LINE__) ;
Chris@40 1354 exit (1) ;
Chris@40 1355 } ;
Chris@40 1356 /*-----------------------*/
Chris@40 1357
Chris@40 1358 test_readf_short_or_die (file, 0, test + 10, 2, __LINE__) ;
Chris@40 1359 for (k = 20 ; k < 24 ; k++)
Chris@40 1360 if (INT_ERROR (test [k], orig [k]))
Chris@40 1361 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1362 exit (1) ;
Chris@40 1363 } ;
Chris@40 1364
Chris@40 1365 /* Seek to offset from current position. */
Chris@40 1366 test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
Chris@40 1367
Chris@40 1368 test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 1369 for (k = 40 ; k < 44 ; k++)
Chris@40 1370 if (INT_ERROR (test [k], orig [k]))
Chris@40 1371 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1372 exit (1) ;
Chris@40 1373 } ;
Chris@40 1374
Chris@40 1375 /* Seek to offset from end of file. */
Chris@40 1376 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 1377
Chris@40 1378 test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 1379 for (k = 20 ; k < 24 ; k++)
Chris@40 1380 if (INT_ERROR (test [k], orig [k]))
Chris@40 1381 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1382 exit (1) ;
Chris@40 1383 } ;
Chris@40 1384
Chris@40 1385 sf_close (file) ;
Chris@40 1386 } /* stereo_short_test */
Chris@40 1387
Chris@40 1388 static void
Chris@40 1389 mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 1390 { SNDFILE *file ;
Chris@40 1391 SF_INFO sfinfo ;
Chris@40 1392 short *orig, *test ;
Chris@40 1393 int k, pass ;
Chris@40 1394
Chris@40 1395 switch (format & SF_FORMAT_SUBMASK)
Chris@40 1396 { case SF_FORMAT_ALAC_16 :
Chris@40 1397 case SF_FORMAT_ALAC_20 :
Chris@40 1398 case SF_FORMAT_ALAC_24 :
Chris@40 1399 case SF_FORMAT_ALAC_32 :
Chris@40 1400 allow_fd = 0 ;
Chris@40 1401 break ;
Chris@40 1402
Chris@40 1403 default :
Chris@40 1404 break ;
Chris@40 1405 } ;
Chris@40 1406
Chris@40 1407 orig = orig_data.s ;
Chris@40 1408 test = test_data.s ;
Chris@40 1409
Chris@40 1410 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 1411 sfinfo.frames = DATA_LENGTH ;
Chris@40 1412 sfinfo.channels = 1 ;
Chris@40 1413 sfinfo.format = format ;
Chris@40 1414
Chris@40 1415 if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW
Chris@40 1416 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU
Chris@40 1417 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2)
Chris@40 1418 unlink (filename) ;
Chris@40 1419 else
Chris@40 1420 { /* Create a short file. */
Chris@40 1421 create_short_file (filename) ;
Chris@40 1422
Chris@40 1423 /* Opening a already existing short file (ie invalid header) RDWR is disallowed.
Chris@40 1424 ** If this returns a valif pointer sf_open() screwed up.
Chris@40 1425 */
Chris@40 1426 if ((file = sf_open (filename, SFM_RDWR, &sfinfo)))
Chris@40 1427 { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ;
Chris@40 1428 exit (1) ;
Chris@40 1429 } ;
Chris@40 1430
Chris@40 1431 /* Truncate the file to zero bytes. */
Chris@40 1432 if (truncate (filename, 0) < 0)
Chris@40 1433 { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ;
Chris@40 1434 perror (NULL) ;
Chris@40 1435 exit (1) ;
Chris@40 1436 } ;
Chris@40 1437 } ;
Chris@40 1438
Chris@40 1439 /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain
Chris@40 1440 ** all the usual data required when opening the file in WRITE mode.
Chris@40 1441 */
Chris@40 1442 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 1443 sfinfo.frames = DATA_LENGTH ;
Chris@40 1444 sfinfo.channels = 1 ;
Chris@40 1445 sfinfo.format = format ;
Chris@40 1446
Chris@40 1447 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 1448
Chris@40 1449 /* Do 3 writes followed by reads. After each, check the data and the current
Chris@40 1450 ** read and write offsets.
Chris@40 1451 */
Chris@40 1452 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 1453 { orig [20] = pass * 2 ;
Chris@40 1454
Chris@40 1455 /* Write some data. */
Chris@40 1456 test_write_short_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ;
Chris@40 1457
Chris@40 1458 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 1459
Chris@40 1460 /* Read what we just wrote. */
Chris@40 1461 test_read_short_or_die (file, 0, test, DATA_LENGTH, __LINE__) ;
Chris@40 1462
Chris@40 1463 /* Check the data. */
Chris@40 1464 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 1465 if (INT_ERROR (orig [k], test [k]))
Chris@40 1466 { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 1467 oct_save_short (orig, test, DATA_LENGTH) ;
Chris@40 1468 exit (1) ;
Chris@40 1469 } ;
Chris@40 1470
Chris@40 1471 test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 1472 } ; /* for (pass ...) */
Chris@40 1473
Chris@40 1474 sf_close (file) ;
Chris@40 1475
Chris@40 1476 /* Open the file again to check the data. */
Chris@40 1477 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 1478
Chris@40 1479 if (sfinfo.format != format)
Chris@40 1480 { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 1481 exit (1) ;
Chris@40 1482 } ;
Chris@40 1483
Chris@40 1484 if (sfinfo.frames < 3 * DATA_LENGTH)
Chris@40 1485 { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 1486 exit (1) ;
Chris@40 1487 }
Chris@40 1488
Chris@40 1489 if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
Chris@40 1490 { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 1491 exit (1) ;
Chris@40 1492 } ;
Chris@40 1493
Chris@40 1494 if (sfinfo.channels != 1)
Chris@40 1495 { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 1496 exit (1) ;
Chris@40 1497 } ;
Chris@40 1498
Chris@40 1499 if (! long_file_ok)
Chris@40 1500 test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ;
Chris@40 1501 else
Chris@40 1502 test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ;
Chris@40 1503
Chris@40 1504 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 1505 { orig [20] = pass * 2 ;
Chris@40 1506
Chris@40 1507 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ;
Chris@40 1508
Chris@40 1509 /* Read what we just wrote. */
Chris@40 1510 test_read_short_or_die (file, pass, test, DATA_LENGTH, __LINE__) ;
Chris@40 1511
Chris@40 1512 /* Check the data. */
Chris@40 1513 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 1514 if (INT_ERROR (orig [k], test [k]))
Chris@40 1515 { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 1516 oct_save_short (orig, test, DATA_LENGTH) ;
Chris@40 1517 exit (1) ;
Chris@40 1518 } ;
Chris@40 1519
Chris@40 1520 } ; /* for (pass ...) */
Chris@40 1521
Chris@40 1522 sf_close (file) ;
Chris@40 1523 } /* mono_rdwr_short_test */
Chris@40 1524
Chris@40 1525 static void
Chris@40 1526 new_rdwr_short_test (const char *filename, int format, int allow_fd)
Chris@40 1527 { SNDFILE *wfile, *rwfile ;
Chris@40 1528 SF_INFO sfinfo ;
Chris@40 1529 short *orig, *test ;
Chris@40 1530 int items, frames ;
Chris@40 1531
Chris@40 1532 orig = orig_data.s ;
Chris@40 1533 test = test_data.s ;
Chris@40 1534
Chris@40 1535 sfinfo.samplerate = 44100 ;
Chris@40 1536 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 1537 sfinfo.channels = 2 ;
Chris@40 1538 sfinfo.format = format ;
Chris@40 1539
Chris@40 1540 items = DATA_LENGTH ;
Chris@40 1541 frames = items / sfinfo.channels ;
Chris@40 1542
Chris@40 1543 wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 1544 sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
Chris@40 1545 test_writef_short_or_die (wfile, 1, orig, frames, __LINE__) ;
Chris@40 1546 sf_write_sync (wfile) ;
Chris@40 1547 test_writef_short_or_die (wfile, 2, orig, frames, __LINE__) ;
Chris@40 1548 sf_write_sync (wfile) ;
Chris@40 1549
Chris@40 1550 rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 1551 if (sfinfo.frames != 2 * frames)
Chris@40 1552 { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
Chris@40 1553 exit (1) ;
Chris@40 1554 } ;
Chris@40 1555
Chris@40 1556 test_writef_short_or_die (wfile, 3, orig, frames, __LINE__) ;
Chris@40 1557
Chris@40 1558 test_readf_short_or_die (rwfile, 1, test, frames, __LINE__) ;
Chris@40 1559 test_readf_short_or_die (rwfile, 2, test, frames, __LINE__) ;
Chris@40 1560
Chris@40 1561 sf_close (wfile) ;
Chris@40 1562 sf_close (rwfile) ;
Chris@40 1563 } /* new_rdwr_short_test */
Chris@40 1564
Chris@40 1565
Chris@40 1566 /*======================================================================================
Chris@40 1567 */
Chris@40 1568
Chris@40 1569 static void mono_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 1570 static void stereo_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 1571 static void mono_rdwr_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 1572 static void new_rdwr_20bit_test (const char *filename, int format, int allow_fd) ;
Chris@40 1573 static void multi_seek_test (const char * filename, int format) ;
Chris@40 1574 static void write_seek_extend_test (const char * filename, int format) ;
Chris@40 1575
Chris@40 1576 static void
Chris@40 1577 pcm_test_20bit (const char *filename, int format, int long_file_ok)
Chris@40 1578 { SF_INFO sfinfo ;
Chris@40 1579 int *orig ;
Chris@40 1580 int k, allow_fd ;
Chris@40 1581
Chris@40 1582 /* Sd2 files cannot be opened from an existing file descriptor. */
Chris@40 1583 allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ;
Chris@40 1584
Chris@40 1585 print_test_name ("pcm_test_20bit", filename) ;
Chris@40 1586
Chris@40 1587 sfinfo.samplerate = 44100 ;
Chris@40 1588 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 1589 sfinfo.channels = 1 ;
Chris@40 1590 sfinfo.format = format ;
Chris@40 1591
Chris@40 1592 test_sf_format_or_die (&sfinfo, __LINE__) ;
Chris@40 1593
Chris@40 1594 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F00000)) ;
Chris@40 1595
Chris@40 1596 orig = orig_data.i ;
Chris@40 1597
Chris@40 1598 /* Make this a macro so gdb steps over it in one go. */
Chris@40 1599 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 1600
Chris@40 1601 /* Some test broken out here. */
Chris@40 1602
Chris@40 1603 mono_20bit_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 1604
Chris@40 1605 /* Sub format DWVW does not allow seeking. */
Chris@40 1606 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 1607 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 1608 { unlink (filename) ;
Chris@40 1609 printf ("no seek : ok\n") ;
Chris@40 1610 return ;
Chris@40 1611 } ;
Chris@40 1612
Chris@40 1613 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 1614 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 1615 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 1616 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 1617 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 1618 )
Chris@40 1619 mono_rdwr_20bit_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 1620
Chris@40 1621 /* If the format doesn't support stereo we're done. */
Chris@40 1622 sfinfo.channels = 2 ;
Chris@40 1623 if (sf_format_check (&sfinfo) == 0)
Chris@40 1624 { unlink (filename) ;
Chris@40 1625 puts ("no stereo : ok") ;
Chris@40 1626 return ;
Chris@40 1627 } ;
Chris@40 1628
Chris@40 1629 stereo_20bit_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 1630
Chris@40 1631 /* New read/write test. Not sure if this is needed yet. */
Chris@40 1632
Chris@40 1633 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
Chris@40 1634 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
Chris@40 1635 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 1636 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 1637 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 1638 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 1639 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 1640 )
Chris@40 1641 new_rdwr_20bit_test (filename, format, allow_fd) ;
Chris@40 1642
Chris@40 1643 delete_file (format, filename) ;
Chris@40 1644
Chris@40 1645 puts ("ok") ;
Chris@40 1646 return ;
Chris@40 1647 } /* pcm_test_20bit */
Chris@40 1648
Chris@40 1649 static void
Chris@40 1650 mono_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 1651 { SNDFILE *file ;
Chris@40 1652 SF_INFO sfinfo ;
Chris@40 1653 int *orig, *test ;
Chris@40 1654 sf_count_t count ;
Chris@40 1655 int k, items, total ;
Chris@40 1656
Chris@40 1657 sfinfo.samplerate = 44100 ;
Chris@40 1658 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 1659 sfinfo.channels = 1 ;
Chris@40 1660 sfinfo.format = format ;
Chris@40 1661
Chris@40 1662 orig = orig_data.i ;
Chris@40 1663 test = test_data.i ;
Chris@40 1664
Chris@40 1665 items = DATA_LENGTH ;
Chris@40 1666
Chris@40 1667 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 1668
Chris@40 1669 if (sfinfo.frames || sfinfo.sections || sfinfo.seekable)
Chris@40 1670 { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ;
Chris@40 1671 exit (1) ;
Chris@40 1672 } ;
Chris@40 1673
Chris@40 1674 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 1675
Chris@40 1676 test_write_int_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 1677 sf_write_sync (file) ;
Chris@40 1678 test_write_int_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 1679 sf_write_sync (file) ;
Chris@40 1680
Chris@40 1681 /* Add non-audio data after the audio. */
Chris@40 1682 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 1683
Chris@40 1684 sf_close (file) ;
Chris@40 1685
Chris@40 1686 memset (test, 0, items * sizeof (int)) ;
Chris@40 1687
Chris@40 1688 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 1689 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 1690
Chris@40 1691 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 1692
Chris@40 1693 if (sfinfo.format != format)
Chris@40 1694 { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 1695 exit (1) ;
Chris@40 1696 } ;
Chris@40 1697
Chris@40 1698 if (sfinfo.frames < 2 * items)
Chris@40 1699 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 1700 exit (1) ;
Chris@40 1701 } ;
Chris@40 1702
Chris@40 1703 if (! long_file_ok && sfinfo.frames > 2 * items)
Chris@40 1704 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 1705 exit (1) ;
Chris@40 1706 } ;
Chris@40 1707
Chris@40 1708 if (sfinfo.channels != 1)
Chris@40 1709 { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 1710 exit (1) ;
Chris@40 1711 } ;
Chris@40 1712
Chris@40 1713 if (sfinfo.seekable != 1)
Chris@40 1714 { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ;
Chris@40 1715 exit (1) ;
Chris@40 1716 } ;
Chris@40 1717
Chris@40 1718 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 1719
Chris@40 1720 test_read_int_or_die (file, 0, test, items, __LINE__) ;
Chris@40 1721 for (k = 0 ; k < items ; k++)
Chris@40 1722 if (BIT_20_ERROR (orig [k], test [k]))
Chris@40 1723 { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1724 oct_save_int (orig, test, items) ;
Chris@40 1725 exit (1) ;
Chris@40 1726 } ;
Chris@40 1727
Chris@40 1728 /* Test multiple short reads. */
Chris@40 1729 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 1730
Chris@40 1731 total = 0 ;
Chris@40 1732 for (k = 1 ; k <= 32 ; k++)
Chris@40 1733 { int ik ;
Chris@40 1734
Chris@40 1735 test_read_int_or_die (file, 0, test + total, k, __LINE__) ;
Chris@40 1736 total += k ;
Chris@40 1737
Chris@40 1738 for (ik = 0 ; ik < total ; ik++)
Chris@40 1739 if (BIT_20_ERROR (orig [ik], test [ik]))
Chris@40 1740 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ;
Chris@40 1741 exit (1) ;
Chris@40 1742 } ;
Chris@40 1743 } ;
Chris@40 1744
Chris@40 1745 /* Seek to start of file. */
Chris@40 1746 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 1747
Chris@40 1748 test_read_int_or_die (file, 0, test, 4, __LINE__) ;
Chris@40 1749 for (k = 0 ; k < 4 ; k++)
Chris@40 1750 if (BIT_20_ERROR (orig [k], test [k]))
Chris@40 1751 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1752 exit (1) ;
Chris@40 1753 } ;
Chris@40 1754
Chris@40 1755 /* For some codecs we can't go past here. */
Chris@40 1756 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 1757 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 1758 { sf_close (file) ;
Chris@40 1759 unlink (filename) ;
Chris@40 1760 printf ("no seek : ") ;
Chris@40 1761 return ;
Chris@40 1762 } ;
Chris@40 1763
Chris@40 1764 /* Seek to offset from start of file. */
Chris@40 1765 test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ;
Chris@40 1766
Chris@40 1767 test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 1768 for (k = 10 ; k < 14 ; k++)
Chris@40 1769 if (BIT_20_ERROR (orig [k], test [k]))
Chris@40 1770 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 1771 exit (1) ;
Chris@40 1772 } ;
Chris@40 1773
Chris@40 1774 /* Seek to offset from current position. */
Chris@40 1775 test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ;
Chris@40 1776
Chris@40 1777 test_read_int_or_die (file, 0, test + 20, 4, __LINE__) ;
Chris@40 1778 for (k = 20 ; k < 24 ; k++)
Chris@40 1779 if (BIT_20_ERROR (orig [k], test [k]))
Chris@40 1780 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 1781 exit (1) ;
Chris@40 1782 } ;
Chris@40 1783
Chris@40 1784 /* Seek to offset from end of file. */
Chris@40 1785 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 1786
Chris@40 1787 test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 1788 for (k = 10 ; k < 14 ; k++)
Chris@40 1789 if (BIT_20_ERROR (orig [k], test [k]))
Chris@40 1790 { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 1791 exit (1) ;
Chris@40 1792 } ;
Chris@40 1793
Chris@40 1794 /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */
Chris@40 1795 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 1796
Chris@40 1797 count = 0 ;
Chris@40 1798 while (count < sfinfo.frames)
Chris@40 1799 count += sf_read_int (file, test, 311) ;
Chris@40 1800
Chris@40 1801 /* Check that no error has occurred. */
Chris@40 1802 if (sf_error (file))
Chris@40 1803 { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ;
Chris@40 1804 puts (sf_strerror (file)) ;
Chris@40 1805 exit (1) ;
Chris@40 1806 } ;
Chris@40 1807
Chris@40 1808 /* Check that we haven't read beyond EOF. */
Chris@40 1809 if (count > sfinfo.frames)
Chris@40 1810 { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
Chris@40 1811 exit (1) ;
Chris@40 1812 } ;
Chris@40 1813
Chris@40 1814 test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ;
Chris@40 1815
Chris@40 1816 sf_close (file) ;
Chris@40 1817
Chris@40 1818 multi_seek_test (filename, format) ;
Chris@40 1819 write_seek_extend_test (filename, format) ;
Chris@40 1820
Chris@40 1821 } /* mono_20bit_test */
Chris@40 1822
Chris@40 1823 static void
Chris@40 1824 stereo_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 1825 { SNDFILE *file ;
Chris@40 1826 SF_INFO sfinfo ;
Chris@40 1827 int *orig, *test ;
Chris@40 1828 int k, items, frames ;
Chris@40 1829
Chris@40 1830 sfinfo.samplerate = 44100 ;
Chris@40 1831 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 1832 sfinfo.channels = 2 ;
Chris@40 1833 sfinfo.format = format ;
Chris@40 1834
Chris@40 1835 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F00000)) ;
Chris@40 1836
Chris@40 1837 orig = orig_data.i ;
Chris@40 1838 test = test_data.i ;
Chris@40 1839
Chris@40 1840 /* Make this a macro so gdb steps over it in one go. */
Chris@40 1841 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 1842
Chris@40 1843 items = DATA_LENGTH ;
Chris@40 1844 frames = items / sfinfo.channels ;
Chris@40 1845
Chris@40 1846 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 1847
Chris@40 1848 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 1849
Chris@40 1850 test_writef_int_or_die (file, 0, orig, frames, __LINE__) ;
Chris@40 1851
Chris@40 1852 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 1853
Chris@40 1854 sf_close (file) ;
Chris@40 1855
Chris@40 1856 memset (test, 0, items * sizeof (int)) ;
Chris@40 1857
Chris@40 1858 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 1859 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 1860
Chris@40 1861 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 1862
Chris@40 1863 if (sfinfo.format != format)
Chris@40 1864 { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n",
Chris@40 1865 __LINE__, format, sfinfo.format) ;
Chris@40 1866 exit (1) ;
Chris@40 1867 } ;
Chris@40 1868
Chris@40 1869 if (sfinfo.frames < frames)
Chris@40 1870 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
Chris@40 1871 __LINE__, sfinfo.frames, frames) ;
Chris@40 1872 exit (1) ;
Chris@40 1873 } ;
Chris@40 1874
Chris@40 1875 if (! long_file_ok && sfinfo.frames > frames)
Chris@40 1876 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
Chris@40 1877 __LINE__, sfinfo.frames, frames) ;
Chris@40 1878 exit (1) ;
Chris@40 1879 } ;
Chris@40 1880
Chris@40 1881 if (sfinfo.channels != 2)
Chris@40 1882 { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 1883 exit (1) ;
Chris@40 1884 } ;
Chris@40 1885
Chris@40 1886 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 1887
Chris@40 1888 test_readf_int_or_die (file, 0, test, frames, __LINE__) ;
Chris@40 1889 for (k = 0 ; k < items ; k++)
Chris@40 1890 if (BIT_20_ERROR (test [k], orig [k]))
Chris@40 1891 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1892 exit (1) ;
Chris@40 1893 } ;
Chris@40 1894
Chris@40 1895 /* Seek to start of file. */
Chris@40 1896 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 1897
Chris@40 1898 test_readf_int_or_die (file, 0, test, 2, __LINE__) ;
Chris@40 1899 for (k = 0 ; k < 4 ; k++)
Chris@40 1900 if (BIT_20_ERROR (test [k], orig [k]))
Chris@40 1901 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1902 exit (1) ;
Chris@40 1903 } ;
Chris@40 1904
Chris@40 1905 /* Seek to offset from start of file. */
Chris@40 1906 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
Chris@40 1907
Chris@40 1908 /* Check for errors here. */
Chris@40 1909 if (sf_error (file))
Chris@40 1910 { printf ("Line %d: Should NOT return an error.\n", __LINE__) ;
Chris@40 1911 puts (sf_strerror (file)) ;
Chris@40 1912 exit (1) ;
Chris@40 1913 } ;
Chris@40 1914
Chris@40 1915 if (sf_read_int (file, test, 1) > 0)
Chris@40 1916 { printf ("Line %d: Should return 0.\n", __LINE__) ;
Chris@40 1917 exit (1) ;
Chris@40 1918 } ;
Chris@40 1919
Chris@40 1920 if (! sf_error (file))
Chris@40 1921 { printf ("Line %d: Should return an error.\n", __LINE__) ;
Chris@40 1922 exit (1) ;
Chris@40 1923 } ;
Chris@40 1924 /*-----------------------*/
Chris@40 1925
Chris@40 1926 test_readf_int_or_die (file, 0, test + 10, 2, __LINE__) ;
Chris@40 1927 for (k = 20 ; k < 24 ; k++)
Chris@40 1928 if (BIT_20_ERROR (test [k], orig [k]))
Chris@40 1929 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1930 exit (1) ;
Chris@40 1931 } ;
Chris@40 1932
Chris@40 1933 /* Seek to offset from current position. */
Chris@40 1934 test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
Chris@40 1935
Chris@40 1936 test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 1937 for (k = 40 ; k < 44 ; k++)
Chris@40 1938 if (BIT_20_ERROR (test [k], orig [k]))
Chris@40 1939 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1940 exit (1) ;
Chris@40 1941 } ;
Chris@40 1942
Chris@40 1943 /* Seek to offset from end of file. */
Chris@40 1944 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 1945
Chris@40 1946 test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 1947 for (k = 20 ; k < 24 ; k++)
Chris@40 1948 if (BIT_20_ERROR (test [k], orig [k]))
Chris@40 1949 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 1950 exit (1) ;
Chris@40 1951 } ;
Chris@40 1952
Chris@40 1953 sf_close (file) ;
Chris@40 1954 } /* stereo_20bit_test */
Chris@40 1955
Chris@40 1956 static void
Chris@40 1957 mono_rdwr_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 1958 { SNDFILE *file ;
Chris@40 1959 SF_INFO sfinfo ;
Chris@40 1960 int *orig, *test ;
Chris@40 1961 int k, pass ;
Chris@40 1962
Chris@40 1963 switch (format & SF_FORMAT_SUBMASK)
Chris@40 1964 { case SF_FORMAT_ALAC_16 :
Chris@40 1965 case SF_FORMAT_ALAC_20 :
Chris@40 1966 case SF_FORMAT_ALAC_24 :
Chris@40 1967 case SF_FORMAT_ALAC_32 :
Chris@40 1968 allow_fd = 0 ;
Chris@40 1969 break ;
Chris@40 1970
Chris@40 1971 default :
Chris@40 1972 break ;
Chris@40 1973 } ;
Chris@40 1974
Chris@40 1975 orig = orig_data.i ;
Chris@40 1976 test = test_data.i ;
Chris@40 1977
Chris@40 1978 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 1979 sfinfo.frames = DATA_LENGTH ;
Chris@40 1980 sfinfo.channels = 1 ;
Chris@40 1981 sfinfo.format = format ;
Chris@40 1982
Chris@40 1983 if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW
Chris@40 1984 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU
Chris@40 1985 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2)
Chris@40 1986 unlink (filename) ;
Chris@40 1987 else
Chris@40 1988 { /* Create a short file. */
Chris@40 1989 create_short_file (filename) ;
Chris@40 1990
Chris@40 1991 /* Opening a already existing short file (ie invalid header) RDWR is disallowed.
Chris@40 1992 ** If this returns a valif pointer sf_open() screwed up.
Chris@40 1993 */
Chris@40 1994 if ((file = sf_open (filename, SFM_RDWR, &sfinfo)))
Chris@40 1995 { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ;
Chris@40 1996 exit (1) ;
Chris@40 1997 } ;
Chris@40 1998
Chris@40 1999 /* Truncate the file to zero bytes. */
Chris@40 2000 if (truncate (filename, 0) < 0)
Chris@40 2001 { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ;
Chris@40 2002 perror (NULL) ;
Chris@40 2003 exit (1) ;
Chris@40 2004 } ;
Chris@40 2005 } ;
Chris@40 2006
Chris@40 2007 /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain
Chris@40 2008 ** all the usual data required when opening the file in WRITE mode.
Chris@40 2009 */
Chris@40 2010 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 2011 sfinfo.frames = DATA_LENGTH ;
Chris@40 2012 sfinfo.channels = 1 ;
Chris@40 2013 sfinfo.format = format ;
Chris@40 2014
Chris@40 2015 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2016
Chris@40 2017 /* Do 3 writes followed by reads. After each, check the data and the current
Chris@40 2018 ** read and write offsets.
Chris@40 2019 */
Chris@40 2020 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 2021 { orig [20] = pass * 2 ;
Chris@40 2022
Chris@40 2023 /* Write some data. */
Chris@40 2024 test_write_int_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ;
Chris@40 2025
Chris@40 2026 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 2027
Chris@40 2028 /* Read what we just wrote. */
Chris@40 2029 test_read_int_or_die (file, 0, test, DATA_LENGTH, __LINE__) ;
Chris@40 2030
Chris@40 2031 /* Check the data. */
Chris@40 2032 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 2033 if (BIT_20_ERROR (orig [k], test [k]))
Chris@40 2034 { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 2035 oct_save_int (orig, test, DATA_LENGTH) ;
Chris@40 2036 exit (1) ;
Chris@40 2037 } ;
Chris@40 2038
Chris@40 2039 test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 2040 } ; /* for (pass ...) */
Chris@40 2041
Chris@40 2042 sf_close (file) ;
Chris@40 2043
Chris@40 2044 /* Open the file again to check the data. */
Chris@40 2045 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2046
Chris@40 2047 if (sfinfo.format != format)
Chris@40 2048 { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 2049 exit (1) ;
Chris@40 2050 } ;
Chris@40 2051
Chris@40 2052 if (sfinfo.frames < 3 * DATA_LENGTH)
Chris@40 2053 { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 2054 exit (1) ;
Chris@40 2055 }
Chris@40 2056
Chris@40 2057 if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
Chris@40 2058 { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 2059 exit (1) ;
Chris@40 2060 } ;
Chris@40 2061
Chris@40 2062 if (sfinfo.channels != 1)
Chris@40 2063 { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 2064 exit (1) ;
Chris@40 2065 } ;
Chris@40 2066
Chris@40 2067 if (! long_file_ok)
Chris@40 2068 test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ;
Chris@40 2069 else
Chris@40 2070 test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ;
Chris@40 2071
Chris@40 2072 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 2073 { orig [20] = pass * 2 ;
Chris@40 2074
Chris@40 2075 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ;
Chris@40 2076
Chris@40 2077 /* Read what we just wrote. */
Chris@40 2078 test_read_int_or_die (file, pass, test, DATA_LENGTH, __LINE__) ;
Chris@40 2079
Chris@40 2080 /* Check the data. */
Chris@40 2081 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 2082 if (BIT_20_ERROR (orig [k], test [k]))
Chris@40 2083 { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 2084 oct_save_int (orig, test, DATA_LENGTH) ;
Chris@40 2085 exit (1) ;
Chris@40 2086 } ;
Chris@40 2087
Chris@40 2088 } ; /* for (pass ...) */
Chris@40 2089
Chris@40 2090 sf_close (file) ;
Chris@40 2091 } /* mono_rdwr_int_test */
Chris@40 2092
Chris@40 2093 static void
Chris@40 2094 new_rdwr_20bit_test (const char *filename, int format, int allow_fd)
Chris@40 2095 { SNDFILE *wfile, *rwfile ;
Chris@40 2096 SF_INFO sfinfo ;
Chris@40 2097 int *orig, *test ;
Chris@40 2098 int items, frames ;
Chris@40 2099
Chris@40 2100 orig = orig_data.i ;
Chris@40 2101 test = test_data.i ;
Chris@40 2102
Chris@40 2103 sfinfo.samplerate = 44100 ;
Chris@40 2104 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 2105 sfinfo.channels = 2 ;
Chris@40 2106 sfinfo.format = format ;
Chris@40 2107
Chris@40 2108 items = DATA_LENGTH ;
Chris@40 2109 frames = items / sfinfo.channels ;
Chris@40 2110
Chris@40 2111 wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2112 sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
Chris@40 2113 test_writef_int_or_die (wfile, 1, orig, frames, __LINE__) ;
Chris@40 2114 sf_write_sync (wfile) ;
Chris@40 2115 test_writef_int_or_die (wfile, 2, orig, frames, __LINE__) ;
Chris@40 2116 sf_write_sync (wfile) ;
Chris@40 2117
Chris@40 2118 rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2119 if (sfinfo.frames != 2 * frames)
Chris@40 2120 { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
Chris@40 2121 exit (1) ;
Chris@40 2122 } ;
Chris@40 2123
Chris@40 2124 test_writef_int_or_die (wfile, 3, orig, frames, __LINE__) ;
Chris@40 2125
Chris@40 2126 test_readf_int_or_die (rwfile, 1, test, frames, __LINE__) ;
Chris@40 2127 test_readf_int_or_die (rwfile, 2, test, frames, __LINE__) ;
Chris@40 2128
Chris@40 2129 sf_close (wfile) ;
Chris@40 2130 sf_close (rwfile) ;
Chris@40 2131 } /* new_rdwr_20bit_test */
Chris@40 2132
Chris@40 2133
Chris@40 2134 /*======================================================================================
Chris@40 2135 */
Chris@40 2136
Chris@40 2137 static void mono_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 2138 static void stereo_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 2139 static void mono_rdwr_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 2140 static void new_rdwr_24bit_test (const char *filename, int format, int allow_fd) ;
Chris@40 2141 static void multi_seek_test (const char * filename, int format) ;
Chris@40 2142 static void write_seek_extend_test (const char * filename, int format) ;
Chris@40 2143
Chris@40 2144 static void
Chris@40 2145 pcm_test_24bit (const char *filename, int format, int long_file_ok)
Chris@40 2146 { SF_INFO sfinfo ;
Chris@40 2147 int *orig ;
Chris@40 2148 int k, allow_fd ;
Chris@40 2149
Chris@40 2150 /* Sd2 files cannot be opened from an existing file descriptor. */
Chris@40 2151 allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ;
Chris@40 2152
Chris@40 2153 print_test_name ("pcm_test_24bit", filename) ;
Chris@40 2154
Chris@40 2155 sfinfo.samplerate = 44100 ;
Chris@40 2156 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 2157 sfinfo.channels = 1 ;
Chris@40 2158 sfinfo.format = format ;
Chris@40 2159
Chris@40 2160 test_sf_format_or_die (&sfinfo, __LINE__) ;
Chris@40 2161
Chris@40 2162 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F000000)) ;
Chris@40 2163
Chris@40 2164 orig = orig_data.i ;
Chris@40 2165
Chris@40 2166 /* Make this a macro so gdb steps over it in one go. */
Chris@40 2167 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 2168
Chris@40 2169 /* Some test broken out here. */
Chris@40 2170
Chris@40 2171 mono_24bit_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 2172
Chris@40 2173 /* Sub format DWVW does not allow seeking. */
Chris@40 2174 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 2175 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 2176 { unlink (filename) ;
Chris@40 2177 printf ("no seek : ok\n") ;
Chris@40 2178 return ;
Chris@40 2179 } ;
Chris@40 2180
Chris@40 2181 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 2182 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 2183 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 2184 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 2185 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 2186 )
Chris@40 2187 mono_rdwr_24bit_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 2188
Chris@40 2189 /* If the format doesn't support stereo we're done. */
Chris@40 2190 sfinfo.channels = 2 ;
Chris@40 2191 if (sf_format_check (&sfinfo) == 0)
Chris@40 2192 { unlink (filename) ;
Chris@40 2193 puts ("no stereo : ok") ;
Chris@40 2194 return ;
Chris@40 2195 } ;
Chris@40 2196
Chris@40 2197 stereo_24bit_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 2198
Chris@40 2199 /* New read/write test. Not sure if this is needed yet. */
Chris@40 2200
Chris@40 2201 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
Chris@40 2202 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
Chris@40 2203 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 2204 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 2205 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 2206 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 2207 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 2208 )
Chris@40 2209 new_rdwr_24bit_test (filename, format, allow_fd) ;
Chris@40 2210
Chris@40 2211 delete_file (format, filename) ;
Chris@40 2212
Chris@40 2213 puts ("ok") ;
Chris@40 2214 return ;
Chris@40 2215 } /* pcm_test_24bit */
Chris@40 2216
Chris@40 2217 static void
Chris@40 2218 mono_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 2219 { SNDFILE *file ;
Chris@40 2220 SF_INFO sfinfo ;
Chris@40 2221 int *orig, *test ;
Chris@40 2222 sf_count_t count ;
Chris@40 2223 int k, items, total ;
Chris@40 2224
Chris@40 2225 sfinfo.samplerate = 44100 ;
Chris@40 2226 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 2227 sfinfo.channels = 1 ;
Chris@40 2228 sfinfo.format = format ;
Chris@40 2229
Chris@40 2230 orig = orig_data.i ;
Chris@40 2231 test = test_data.i ;
Chris@40 2232
Chris@40 2233 items = DATA_LENGTH ;
Chris@40 2234
Chris@40 2235 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2236
Chris@40 2237 if (sfinfo.frames || sfinfo.sections || sfinfo.seekable)
Chris@40 2238 { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ;
Chris@40 2239 exit (1) ;
Chris@40 2240 } ;
Chris@40 2241
Chris@40 2242 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 2243
Chris@40 2244 test_write_int_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 2245 sf_write_sync (file) ;
Chris@40 2246 test_write_int_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 2247 sf_write_sync (file) ;
Chris@40 2248
Chris@40 2249 /* Add non-audio data after the audio. */
Chris@40 2250 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 2251
Chris@40 2252 sf_close (file) ;
Chris@40 2253
Chris@40 2254 memset (test, 0, items * sizeof (int)) ;
Chris@40 2255
Chris@40 2256 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 2257 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 2258
Chris@40 2259 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2260
Chris@40 2261 if (sfinfo.format != format)
Chris@40 2262 { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 2263 exit (1) ;
Chris@40 2264 } ;
Chris@40 2265
Chris@40 2266 if (sfinfo.frames < 2 * items)
Chris@40 2267 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 2268 exit (1) ;
Chris@40 2269 } ;
Chris@40 2270
Chris@40 2271 if (! long_file_ok && sfinfo.frames > 2 * items)
Chris@40 2272 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 2273 exit (1) ;
Chris@40 2274 } ;
Chris@40 2275
Chris@40 2276 if (sfinfo.channels != 1)
Chris@40 2277 { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 2278 exit (1) ;
Chris@40 2279 } ;
Chris@40 2280
Chris@40 2281 if (sfinfo.seekable != 1)
Chris@40 2282 { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ;
Chris@40 2283 exit (1) ;
Chris@40 2284 } ;
Chris@40 2285
Chris@40 2286 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 2287
Chris@40 2288 test_read_int_or_die (file, 0, test, items, __LINE__) ;
Chris@40 2289 for (k = 0 ; k < items ; k++)
Chris@40 2290 if (TRIBYTE_ERROR (orig [k], test [k]))
Chris@40 2291 { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 2292 oct_save_int (orig, test, items) ;
Chris@40 2293 exit (1) ;
Chris@40 2294 } ;
Chris@40 2295
Chris@40 2296 /* Test multiple short reads. */
Chris@40 2297 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 2298
Chris@40 2299 total = 0 ;
Chris@40 2300 for (k = 1 ; k <= 32 ; k++)
Chris@40 2301 { int ik ;
Chris@40 2302
Chris@40 2303 test_read_int_or_die (file, 0, test + total, k, __LINE__) ;
Chris@40 2304 total += k ;
Chris@40 2305
Chris@40 2306 for (ik = 0 ; ik < total ; ik++)
Chris@40 2307 if (TRIBYTE_ERROR (orig [ik], test [ik]))
Chris@40 2308 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ;
Chris@40 2309 exit (1) ;
Chris@40 2310 } ;
Chris@40 2311 } ;
Chris@40 2312
Chris@40 2313 /* Seek to start of file. */
Chris@40 2314 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 2315
Chris@40 2316 test_read_int_or_die (file, 0, test, 4, __LINE__) ;
Chris@40 2317 for (k = 0 ; k < 4 ; k++)
Chris@40 2318 if (TRIBYTE_ERROR (orig [k], test [k]))
Chris@40 2319 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 2320 exit (1) ;
Chris@40 2321 } ;
Chris@40 2322
Chris@40 2323 /* For some codecs we can't go past here. */
Chris@40 2324 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 2325 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 2326 { sf_close (file) ;
Chris@40 2327 unlink (filename) ;
Chris@40 2328 printf ("no seek : ") ;
Chris@40 2329 return ;
Chris@40 2330 } ;
Chris@40 2331
Chris@40 2332 /* Seek to offset from start of file. */
Chris@40 2333 test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ;
Chris@40 2334
Chris@40 2335 test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 2336 for (k = 10 ; k < 14 ; k++)
Chris@40 2337 if (TRIBYTE_ERROR (orig [k], test [k]))
Chris@40 2338 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 2339 exit (1) ;
Chris@40 2340 } ;
Chris@40 2341
Chris@40 2342 /* Seek to offset from current position. */
Chris@40 2343 test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ;
Chris@40 2344
Chris@40 2345 test_read_int_or_die (file, 0, test + 20, 4, __LINE__) ;
Chris@40 2346 for (k = 20 ; k < 24 ; k++)
Chris@40 2347 if (TRIBYTE_ERROR (orig [k], test [k]))
Chris@40 2348 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 2349 exit (1) ;
Chris@40 2350 } ;
Chris@40 2351
Chris@40 2352 /* Seek to offset from end of file. */
Chris@40 2353 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 2354
Chris@40 2355 test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 2356 for (k = 10 ; k < 14 ; k++)
Chris@40 2357 if (TRIBYTE_ERROR (orig [k], test [k]))
Chris@40 2358 { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 2359 exit (1) ;
Chris@40 2360 } ;
Chris@40 2361
Chris@40 2362 /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */
Chris@40 2363 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 2364
Chris@40 2365 count = 0 ;
Chris@40 2366 while (count < sfinfo.frames)
Chris@40 2367 count += sf_read_int (file, test, 311) ;
Chris@40 2368
Chris@40 2369 /* Check that no error has occurred. */
Chris@40 2370 if (sf_error (file))
Chris@40 2371 { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ;
Chris@40 2372 puts (sf_strerror (file)) ;
Chris@40 2373 exit (1) ;
Chris@40 2374 } ;
Chris@40 2375
Chris@40 2376 /* Check that we haven't read beyond EOF. */
Chris@40 2377 if (count > sfinfo.frames)
Chris@40 2378 { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
Chris@40 2379 exit (1) ;
Chris@40 2380 } ;
Chris@40 2381
Chris@40 2382 test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ;
Chris@40 2383
Chris@40 2384 sf_close (file) ;
Chris@40 2385
Chris@40 2386 multi_seek_test (filename, format) ;
Chris@40 2387 write_seek_extend_test (filename, format) ;
Chris@40 2388
Chris@40 2389 } /* mono_24bit_test */
Chris@40 2390
Chris@40 2391 static void
Chris@40 2392 stereo_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 2393 { SNDFILE *file ;
Chris@40 2394 SF_INFO sfinfo ;
Chris@40 2395 int *orig, *test ;
Chris@40 2396 int k, items, frames ;
Chris@40 2397
Chris@40 2398 sfinfo.samplerate = 44100 ;
Chris@40 2399 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 2400 sfinfo.channels = 2 ;
Chris@40 2401 sfinfo.format = format ;
Chris@40 2402
Chris@40 2403 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F000000)) ;
Chris@40 2404
Chris@40 2405 orig = orig_data.i ;
Chris@40 2406 test = test_data.i ;
Chris@40 2407
Chris@40 2408 /* Make this a macro so gdb steps over it in one go. */
Chris@40 2409 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 2410
Chris@40 2411 items = DATA_LENGTH ;
Chris@40 2412 frames = items / sfinfo.channels ;
Chris@40 2413
Chris@40 2414 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2415
Chris@40 2416 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 2417
Chris@40 2418 test_writef_int_or_die (file, 0, orig, frames, __LINE__) ;
Chris@40 2419
Chris@40 2420 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 2421
Chris@40 2422 sf_close (file) ;
Chris@40 2423
Chris@40 2424 memset (test, 0, items * sizeof (int)) ;
Chris@40 2425
Chris@40 2426 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 2427 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 2428
Chris@40 2429 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2430
Chris@40 2431 if (sfinfo.format != format)
Chris@40 2432 { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n",
Chris@40 2433 __LINE__, format, sfinfo.format) ;
Chris@40 2434 exit (1) ;
Chris@40 2435 } ;
Chris@40 2436
Chris@40 2437 if (sfinfo.frames < frames)
Chris@40 2438 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
Chris@40 2439 __LINE__, sfinfo.frames, frames) ;
Chris@40 2440 exit (1) ;
Chris@40 2441 } ;
Chris@40 2442
Chris@40 2443 if (! long_file_ok && sfinfo.frames > frames)
Chris@40 2444 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
Chris@40 2445 __LINE__, sfinfo.frames, frames) ;
Chris@40 2446 exit (1) ;
Chris@40 2447 } ;
Chris@40 2448
Chris@40 2449 if (sfinfo.channels != 2)
Chris@40 2450 { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 2451 exit (1) ;
Chris@40 2452 } ;
Chris@40 2453
Chris@40 2454 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 2455
Chris@40 2456 test_readf_int_or_die (file, 0, test, frames, __LINE__) ;
Chris@40 2457 for (k = 0 ; k < items ; k++)
Chris@40 2458 if (TRIBYTE_ERROR (test [k], orig [k]))
Chris@40 2459 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 2460 exit (1) ;
Chris@40 2461 } ;
Chris@40 2462
Chris@40 2463 /* Seek to start of file. */
Chris@40 2464 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 2465
Chris@40 2466 test_readf_int_or_die (file, 0, test, 2, __LINE__) ;
Chris@40 2467 for (k = 0 ; k < 4 ; k++)
Chris@40 2468 if (TRIBYTE_ERROR (test [k], orig [k]))
Chris@40 2469 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 2470 exit (1) ;
Chris@40 2471 } ;
Chris@40 2472
Chris@40 2473 /* Seek to offset from start of file. */
Chris@40 2474 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
Chris@40 2475
Chris@40 2476 /* Check for errors here. */
Chris@40 2477 if (sf_error (file))
Chris@40 2478 { printf ("Line %d: Should NOT return an error.\n", __LINE__) ;
Chris@40 2479 puts (sf_strerror (file)) ;
Chris@40 2480 exit (1) ;
Chris@40 2481 } ;
Chris@40 2482
Chris@40 2483 if (sf_read_int (file, test, 1) > 0)
Chris@40 2484 { printf ("Line %d: Should return 0.\n", __LINE__) ;
Chris@40 2485 exit (1) ;
Chris@40 2486 } ;
Chris@40 2487
Chris@40 2488 if (! sf_error (file))
Chris@40 2489 { printf ("Line %d: Should return an error.\n", __LINE__) ;
Chris@40 2490 exit (1) ;
Chris@40 2491 } ;
Chris@40 2492 /*-----------------------*/
Chris@40 2493
Chris@40 2494 test_readf_int_or_die (file, 0, test + 10, 2, __LINE__) ;
Chris@40 2495 for (k = 20 ; k < 24 ; k++)
Chris@40 2496 if (TRIBYTE_ERROR (test [k], orig [k]))
Chris@40 2497 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 2498 exit (1) ;
Chris@40 2499 } ;
Chris@40 2500
Chris@40 2501 /* Seek to offset from current position. */
Chris@40 2502 test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
Chris@40 2503
Chris@40 2504 test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 2505 for (k = 40 ; k < 44 ; k++)
Chris@40 2506 if (TRIBYTE_ERROR (test [k], orig [k]))
Chris@40 2507 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 2508 exit (1) ;
Chris@40 2509 } ;
Chris@40 2510
Chris@40 2511 /* Seek to offset from end of file. */
Chris@40 2512 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 2513
Chris@40 2514 test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 2515 for (k = 20 ; k < 24 ; k++)
Chris@40 2516 if (TRIBYTE_ERROR (test [k], orig [k]))
Chris@40 2517 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 2518 exit (1) ;
Chris@40 2519 } ;
Chris@40 2520
Chris@40 2521 sf_close (file) ;
Chris@40 2522 } /* stereo_24bit_test */
Chris@40 2523
Chris@40 2524 static void
Chris@40 2525 mono_rdwr_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 2526 { SNDFILE *file ;
Chris@40 2527 SF_INFO sfinfo ;
Chris@40 2528 int *orig, *test ;
Chris@40 2529 int k, pass ;
Chris@40 2530
Chris@40 2531 switch (format & SF_FORMAT_SUBMASK)
Chris@40 2532 { case SF_FORMAT_ALAC_16 :
Chris@40 2533 case SF_FORMAT_ALAC_20 :
Chris@40 2534 case SF_FORMAT_ALAC_24 :
Chris@40 2535 case SF_FORMAT_ALAC_32 :
Chris@40 2536 allow_fd = 0 ;
Chris@40 2537 break ;
Chris@40 2538
Chris@40 2539 default :
Chris@40 2540 break ;
Chris@40 2541 } ;
Chris@40 2542
Chris@40 2543 orig = orig_data.i ;
Chris@40 2544 test = test_data.i ;
Chris@40 2545
Chris@40 2546 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 2547 sfinfo.frames = DATA_LENGTH ;
Chris@40 2548 sfinfo.channels = 1 ;
Chris@40 2549 sfinfo.format = format ;
Chris@40 2550
Chris@40 2551 if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW
Chris@40 2552 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU
Chris@40 2553 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2)
Chris@40 2554 unlink (filename) ;
Chris@40 2555 else
Chris@40 2556 { /* Create a short file. */
Chris@40 2557 create_short_file (filename) ;
Chris@40 2558
Chris@40 2559 /* Opening a already existing short file (ie invalid header) RDWR is disallowed.
Chris@40 2560 ** If this returns a valif pointer sf_open() screwed up.
Chris@40 2561 */
Chris@40 2562 if ((file = sf_open (filename, SFM_RDWR, &sfinfo)))
Chris@40 2563 { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ;
Chris@40 2564 exit (1) ;
Chris@40 2565 } ;
Chris@40 2566
Chris@40 2567 /* Truncate the file to zero bytes. */
Chris@40 2568 if (truncate (filename, 0) < 0)
Chris@40 2569 { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ;
Chris@40 2570 perror (NULL) ;
Chris@40 2571 exit (1) ;
Chris@40 2572 } ;
Chris@40 2573 } ;
Chris@40 2574
Chris@40 2575 /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain
Chris@40 2576 ** all the usual data required when opening the file in WRITE mode.
Chris@40 2577 */
Chris@40 2578 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 2579 sfinfo.frames = DATA_LENGTH ;
Chris@40 2580 sfinfo.channels = 1 ;
Chris@40 2581 sfinfo.format = format ;
Chris@40 2582
Chris@40 2583 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2584
Chris@40 2585 /* Do 3 writes followed by reads. After each, check the data and the current
Chris@40 2586 ** read and write offsets.
Chris@40 2587 */
Chris@40 2588 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 2589 { orig [20] = pass * 2 ;
Chris@40 2590
Chris@40 2591 /* Write some data. */
Chris@40 2592 test_write_int_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ;
Chris@40 2593
Chris@40 2594 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 2595
Chris@40 2596 /* Read what we just wrote. */
Chris@40 2597 test_read_int_or_die (file, 0, test, DATA_LENGTH, __LINE__) ;
Chris@40 2598
Chris@40 2599 /* Check the data. */
Chris@40 2600 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 2601 if (TRIBYTE_ERROR (orig [k], test [k]))
Chris@40 2602 { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 2603 oct_save_int (orig, test, DATA_LENGTH) ;
Chris@40 2604 exit (1) ;
Chris@40 2605 } ;
Chris@40 2606
Chris@40 2607 test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 2608 } ; /* for (pass ...) */
Chris@40 2609
Chris@40 2610 sf_close (file) ;
Chris@40 2611
Chris@40 2612 /* Open the file again to check the data. */
Chris@40 2613 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2614
Chris@40 2615 if (sfinfo.format != format)
Chris@40 2616 { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 2617 exit (1) ;
Chris@40 2618 } ;
Chris@40 2619
Chris@40 2620 if (sfinfo.frames < 3 * DATA_LENGTH)
Chris@40 2621 { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 2622 exit (1) ;
Chris@40 2623 }
Chris@40 2624
Chris@40 2625 if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
Chris@40 2626 { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 2627 exit (1) ;
Chris@40 2628 } ;
Chris@40 2629
Chris@40 2630 if (sfinfo.channels != 1)
Chris@40 2631 { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 2632 exit (1) ;
Chris@40 2633 } ;
Chris@40 2634
Chris@40 2635 if (! long_file_ok)
Chris@40 2636 test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ;
Chris@40 2637 else
Chris@40 2638 test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ;
Chris@40 2639
Chris@40 2640 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 2641 { orig [20] = pass * 2 ;
Chris@40 2642
Chris@40 2643 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ;
Chris@40 2644
Chris@40 2645 /* Read what we just wrote. */
Chris@40 2646 test_read_int_or_die (file, pass, test, DATA_LENGTH, __LINE__) ;
Chris@40 2647
Chris@40 2648 /* Check the data. */
Chris@40 2649 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 2650 if (TRIBYTE_ERROR (orig [k], test [k]))
Chris@40 2651 { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 2652 oct_save_int (orig, test, DATA_LENGTH) ;
Chris@40 2653 exit (1) ;
Chris@40 2654 } ;
Chris@40 2655
Chris@40 2656 } ; /* for (pass ...) */
Chris@40 2657
Chris@40 2658 sf_close (file) ;
Chris@40 2659 } /* mono_rdwr_int_test */
Chris@40 2660
Chris@40 2661 static void
Chris@40 2662 new_rdwr_24bit_test (const char *filename, int format, int allow_fd)
Chris@40 2663 { SNDFILE *wfile, *rwfile ;
Chris@40 2664 SF_INFO sfinfo ;
Chris@40 2665 int *orig, *test ;
Chris@40 2666 int items, frames ;
Chris@40 2667
Chris@40 2668 orig = orig_data.i ;
Chris@40 2669 test = test_data.i ;
Chris@40 2670
Chris@40 2671 sfinfo.samplerate = 44100 ;
Chris@40 2672 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 2673 sfinfo.channels = 2 ;
Chris@40 2674 sfinfo.format = format ;
Chris@40 2675
Chris@40 2676 items = DATA_LENGTH ;
Chris@40 2677 frames = items / sfinfo.channels ;
Chris@40 2678
Chris@40 2679 wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2680 sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
Chris@40 2681 test_writef_int_or_die (wfile, 1, orig, frames, __LINE__) ;
Chris@40 2682 sf_write_sync (wfile) ;
Chris@40 2683 test_writef_int_or_die (wfile, 2, orig, frames, __LINE__) ;
Chris@40 2684 sf_write_sync (wfile) ;
Chris@40 2685
Chris@40 2686 rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2687 if (sfinfo.frames != 2 * frames)
Chris@40 2688 { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
Chris@40 2689 exit (1) ;
Chris@40 2690 } ;
Chris@40 2691
Chris@40 2692 test_writef_int_or_die (wfile, 3, orig, frames, __LINE__) ;
Chris@40 2693
Chris@40 2694 test_readf_int_or_die (rwfile, 1, test, frames, __LINE__) ;
Chris@40 2695 test_readf_int_or_die (rwfile, 2, test, frames, __LINE__) ;
Chris@40 2696
Chris@40 2697 sf_close (wfile) ;
Chris@40 2698 sf_close (rwfile) ;
Chris@40 2699 } /* new_rdwr_24bit_test */
Chris@40 2700
Chris@40 2701
Chris@40 2702 /*======================================================================================
Chris@40 2703 */
Chris@40 2704
Chris@40 2705 static void mono_int_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 2706 static void stereo_int_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 2707 static void mono_rdwr_int_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 2708 static void new_rdwr_int_test (const char *filename, int format, int allow_fd) ;
Chris@40 2709 static void multi_seek_test (const char * filename, int format) ;
Chris@40 2710 static void write_seek_extend_test (const char * filename, int format) ;
Chris@40 2711
Chris@40 2712 static void
Chris@40 2713 pcm_test_int (const char *filename, int format, int long_file_ok)
Chris@40 2714 { SF_INFO sfinfo ;
Chris@40 2715 int *orig ;
Chris@40 2716 int k, allow_fd ;
Chris@40 2717
Chris@40 2718 /* Sd2 files cannot be opened from an existing file descriptor. */
Chris@40 2719 allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ;
Chris@40 2720
Chris@40 2721 print_test_name ("pcm_test_int", filename) ;
Chris@40 2722
Chris@40 2723 sfinfo.samplerate = 44100 ;
Chris@40 2724 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 2725 sfinfo.channels = 1 ;
Chris@40 2726 sfinfo.format = format ;
Chris@40 2727
Chris@40 2728 test_sf_format_or_die (&sfinfo, __LINE__) ;
Chris@40 2729
Chris@40 2730 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F000000)) ;
Chris@40 2731
Chris@40 2732 orig = orig_data.i ;
Chris@40 2733
Chris@40 2734 /* Make this a macro so gdb steps over it in one go. */
Chris@40 2735 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 2736
Chris@40 2737 /* Some test broken out here. */
Chris@40 2738
Chris@40 2739 mono_int_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 2740
Chris@40 2741 /* Sub format DWVW does not allow seeking. */
Chris@40 2742 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 2743 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 2744 { unlink (filename) ;
Chris@40 2745 printf ("no seek : ok\n") ;
Chris@40 2746 return ;
Chris@40 2747 } ;
Chris@40 2748
Chris@40 2749 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 2750 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 2751 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 2752 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 2753 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 2754 )
Chris@40 2755 mono_rdwr_int_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 2756
Chris@40 2757 /* If the format doesn't support stereo we're done. */
Chris@40 2758 sfinfo.channels = 2 ;
Chris@40 2759 if (sf_format_check (&sfinfo) == 0)
Chris@40 2760 { unlink (filename) ;
Chris@40 2761 puts ("no stereo : ok") ;
Chris@40 2762 return ;
Chris@40 2763 } ;
Chris@40 2764
Chris@40 2765 stereo_int_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 2766
Chris@40 2767 /* New read/write test. Not sure if this is needed yet. */
Chris@40 2768
Chris@40 2769 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
Chris@40 2770 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
Chris@40 2771 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 2772 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 2773 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 2774 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 2775 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 2776 )
Chris@40 2777 new_rdwr_int_test (filename, format, allow_fd) ;
Chris@40 2778
Chris@40 2779 delete_file (format, filename) ;
Chris@40 2780
Chris@40 2781 puts ("ok") ;
Chris@40 2782 return ;
Chris@40 2783 } /* pcm_test_int */
Chris@40 2784
Chris@40 2785 static void
Chris@40 2786 mono_int_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 2787 { SNDFILE *file ;
Chris@40 2788 SF_INFO sfinfo ;
Chris@40 2789 int *orig, *test ;
Chris@40 2790 sf_count_t count ;
Chris@40 2791 int k, items, total ;
Chris@40 2792
Chris@40 2793 sfinfo.samplerate = 44100 ;
Chris@40 2794 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 2795 sfinfo.channels = 1 ;
Chris@40 2796 sfinfo.format = format ;
Chris@40 2797
Chris@40 2798 orig = orig_data.i ;
Chris@40 2799 test = test_data.i ;
Chris@40 2800
Chris@40 2801 items = DATA_LENGTH ;
Chris@40 2802
Chris@40 2803 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2804
Chris@40 2805 if (sfinfo.frames || sfinfo.sections || sfinfo.seekable)
Chris@40 2806 { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ;
Chris@40 2807 exit (1) ;
Chris@40 2808 } ;
Chris@40 2809
Chris@40 2810 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 2811
Chris@40 2812 test_write_int_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 2813 sf_write_sync (file) ;
Chris@40 2814 test_write_int_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 2815 sf_write_sync (file) ;
Chris@40 2816
Chris@40 2817 /* Add non-audio data after the audio. */
Chris@40 2818 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 2819
Chris@40 2820 sf_close (file) ;
Chris@40 2821
Chris@40 2822 memset (test, 0, items * sizeof (int)) ;
Chris@40 2823
Chris@40 2824 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 2825 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 2826
Chris@40 2827 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2828
Chris@40 2829 if (sfinfo.format != format)
Chris@40 2830 { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 2831 exit (1) ;
Chris@40 2832 } ;
Chris@40 2833
Chris@40 2834 if (sfinfo.frames < 2 * items)
Chris@40 2835 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 2836 exit (1) ;
Chris@40 2837 } ;
Chris@40 2838
Chris@40 2839 if (! long_file_ok && sfinfo.frames > 2 * items)
Chris@40 2840 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 2841 exit (1) ;
Chris@40 2842 } ;
Chris@40 2843
Chris@40 2844 if (sfinfo.channels != 1)
Chris@40 2845 { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 2846 exit (1) ;
Chris@40 2847 } ;
Chris@40 2848
Chris@40 2849 if (sfinfo.seekable != 1)
Chris@40 2850 { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ;
Chris@40 2851 exit (1) ;
Chris@40 2852 } ;
Chris@40 2853
Chris@40 2854 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 2855
Chris@40 2856 test_read_int_or_die (file, 0, test, items, __LINE__) ;
Chris@40 2857 for (k = 0 ; k < items ; k++)
Chris@40 2858 if (INT_ERROR (orig [k], test [k]))
Chris@40 2859 { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 2860 oct_save_int (orig, test, items) ;
Chris@40 2861 exit (1) ;
Chris@40 2862 } ;
Chris@40 2863
Chris@40 2864 /* Test multiple short reads. */
Chris@40 2865 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 2866
Chris@40 2867 total = 0 ;
Chris@40 2868 for (k = 1 ; k <= 32 ; k++)
Chris@40 2869 { int ik ;
Chris@40 2870
Chris@40 2871 test_read_int_or_die (file, 0, test + total, k, __LINE__) ;
Chris@40 2872 total += k ;
Chris@40 2873
Chris@40 2874 for (ik = 0 ; ik < total ; ik++)
Chris@40 2875 if (INT_ERROR (orig [ik], test [ik]))
Chris@40 2876 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ;
Chris@40 2877 exit (1) ;
Chris@40 2878 } ;
Chris@40 2879 } ;
Chris@40 2880
Chris@40 2881 /* Seek to start of file. */
Chris@40 2882 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 2883
Chris@40 2884 test_read_int_or_die (file, 0, test, 4, __LINE__) ;
Chris@40 2885 for (k = 0 ; k < 4 ; k++)
Chris@40 2886 if (INT_ERROR (orig [k], test [k]))
Chris@40 2887 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 2888 exit (1) ;
Chris@40 2889 } ;
Chris@40 2890
Chris@40 2891 /* For some codecs we can't go past here. */
Chris@40 2892 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 2893 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 2894 { sf_close (file) ;
Chris@40 2895 unlink (filename) ;
Chris@40 2896 printf ("no seek : ") ;
Chris@40 2897 return ;
Chris@40 2898 } ;
Chris@40 2899
Chris@40 2900 /* Seek to offset from start of file. */
Chris@40 2901 test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ;
Chris@40 2902
Chris@40 2903 test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 2904 for (k = 10 ; k < 14 ; k++)
Chris@40 2905 if (INT_ERROR (orig [k], test [k]))
Chris@40 2906 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 2907 exit (1) ;
Chris@40 2908 } ;
Chris@40 2909
Chris@40 2910 /* Seek to offset from current position. */
Chris@40 2911 test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ;
Chris@40 2912
Chris@40 2913 test_read_int_or_die (file, 0, test + 20, 4, __LINE__) ;
Chris@40 2914 for (k = 20 ; k < 24 ; k++)
Chris@40 2915 if (INT_ERROR (orig [k], test [k]))
Chris@40 2916 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 2917 exit (1) ;
Chris@40 2918 } ;
Chris@40 2919
Chris@40 2920 /* Seek to offset from end of file. */
Chris@40 2921 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 2922
Chris@40 2923 test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 2924 for (k = 10 ; k < 14 ; k++)
Chris@40 2925 if (INT_ERROR (orig [k], test [k]))
Chris@40 2926 { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 2927 exit (1) ;
Chris@40 2928 } ;
Chris@40 2929
Chris@40 2930 /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */
Chris@40 2931 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 2932
Chris@40 2933 count = 0 ;
Chris@40 2934 while (count < sfinfo.frames)
Chris@40 2935 count += sf_read_int (file, test, 311) ;
Chris@40 2936
Chris@40 2937 /* Check that no error has occurred. */
Chris@40 2938 if (sf_error (file))
Chris@40 2939 { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ;
Chris@40 2940 puts (sf_strerror (file)) ;
Chris@40 2941 exit (1) ;
Chris@40 2942 } ;
Chris@40 2943
Chris@40 2944 /* Check that we haven't read beyond EOF. */
Chris@40 2945 if (count > sfinfo.frames)
Chris@40 2946 { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
Chris@40 2947 exit (1) ;
Chris@40 2948 } ;
Chris@40 2949
Chris@40 2950 test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ;
Chris@40 2951
Chris@40 2952 sf_close (file) ;
Chris@40 2953
Chris@40 2954 multi_seek_test (filename, format) ;
Chris@40 2955 write_seek_extend_test (filename, format) ;
Chris@40 2956
Chris@40 2957 } /* mono_int_test */
Chris@40 2958
Chris@40 2959 static void
Chris@40 2960 stereo_int_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 2961 { SNDFILE *file ;
Chris@40 2962 SF_INFO sfinfo ;
Chris@40 2963 int *orig, *test ;
Chris@40 2964 int k, items, frames ;
Chris@40 2965
Chris@40 2966 sfinfo.samplerate = 44100 ;
Chris@40 2967 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 2968 sfinfo.channels = 2 ;
Chris@40 2969 sfinfo.format = format ;
Chris@40 2970
Chris@40 2971 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F000000)) ;
Chris@40 2972
Chris@40 2973 orig = orig_data.i ;
Chris@40 2974 test = test_data.i ;
Chris@40 2975
Chris@40 2976 /* Make this a macro so gdb steps over it in one go. */
Chris@40 2977 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 2978
Chris@40 2979 items = DATA_LENGTH ;
Chris@40 2980 frames = items / sfinfo.channels ;
Chris@40 2981
Chris@40 2982 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2983
Chris@40 2984 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 2985
Chris@40 2986 test_writef_int_or_die (file, 0, orig, frames, __LINE__) ;
Chris@40 2987
Chris@40 2988 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 2989
Chris@40 2990 sf_close (file) ;
Chris@40 2991
Chris@40 2992 memset (test, 0, items * sizeof (int)) ;
Chris@40 2993
Chris@40 2994 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 2995 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 2996
Chris@40 2997 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 2998
Chris@40 2999 if (sfinfo.format != format)
Chris@40 3000 { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n",
Chris@40 3001 __LINE__, format, sfinfo.format) ;
Chris@40 3002 exit (1) ;
Chris@40 3003 } ;
Chris@40 3004
Chris@40 3005 if (sfinfo.frames < frames)
Chris@40 3006 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
Chris@40 3007 __LINE__, sfinfo.frames, frames) ;
Chris@40 3008 exit (1) ;
Chris@40 3009 } ;
Chris@40 3010
Chris@40 3011 if (! long_file_ok && sfinfo.frames > frames)
Chris@40 3012 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
Chris@40 3013 __LINE__, sfinfo.frames, frames) ;
Chris@40 3014 exit (1) ;
Chris@40 3015 } ;
Chris@40 3016
Chris@40 3017 if (sfinfo.channels != 2)
Chris@40 3018 { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 3019 exit (1) ;
Chris@40 3020 } ;
Chris@40 3021
Chris@40 3022 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 3023
Chris@40 3024 test_readf_int_or_die (file, 0, test, frames, __LINE__) ;
Chris@40 3025 for (k = 0 ; k < items ; k++)
Chris@40 3026 if (INT_ERROR (test [k], orig [k]))
Chris@40 3027 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3028 exit (1) ;
Chris@40 3029 } ;
Chris@40 3030
Chris@40 3031 /* Seek to start of file. */
Chris@40 3032 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 3033
Chris@40 3034 test_readf_int_or_die (file, 0, test, 2, __LINE__) ;
Chris@40 3035 for (k = 0 ; k < 4 ; k++)
Chris@40 3036 if (INT_ERROR (test [k], orig [k]))
Chris@40 3037 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3038 exit (1) ;
Chris@40 3039 } ;
Chris@40 3040
Chris@40 3041 /* Seek to offset from start of file. */
Chris@40 3042 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
Chris@40 3043
Chris@40 3044 /* Check for errors here. */
Chris@40 3045 if (sf_error (file))
Chris@40 3046 { printf ("Line %d: Should NOT return an error.\n", __LINE__) ;
Chris@40 3047 puts (sf_strerror (file)) ;
Chris@40 3048 exit (1) ;
Chris@40 3049 } ;
Chris@40 3050
Chris@40 3051 if (sf_read_int (file, test, 1) > 0)
Chris@40 3052 { printf ("Line %d: Should return 0.\n", __LINE__) ;
Chris@40 3053 exit (1) ;
Chris@40 3054 } ;
Chris@40 3055
Chris@40 3056 if (! sf_error (file))
Chris@40 3057 { printf ("Line %d: Should return an error.\n", __LINE__) ;
Chris@40 3058 exit (1) ;
Chris@40 3059 } ;
Chris@40 3060 /*-----------------------*/
Chris@40 3061
Chris@40 3062 test_readf_int_or_die (file, 0, test + 10, 2, __LINE__) ;
Chris@40 3063 for (k = 20 ; k < 24 ; k++)
Chris@40 3064 if (INT_ERROR (test [k], orig [k]))
Chris@40 3065 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3066 exit (1) ;
Chris@40 3067 } ;
Chris@40 3068
Chris@40 3069 /* Seek to offset from current position. */
Chris@40 3070 test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
Chris@40 3071
Chris@40 3072 test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 3073 for (k = 40 ; k < 44 ; k++)
Chris@40 3074 if (INT_ERROR (test [k], orig [k]))
Chris@40 3075 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3076 exit (1) ;
Chris@40 3077 } ;
Chris@40 3078
Chris@40 3079 /* Seek to offset from end of file. */
Chris@40 3080 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 3081
Chris@40 3082 test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 3083 for (k = 20 ; k < 24 ; k++)
Chris@40 3084 if (INT_ERROR (test [k], orig [k]))
Chris@40 3085 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3086 exit (1) ;
Chris@40 3087 } ;
Chris@40 3088
Chris@40 3089 sf_close (file) ;
Chris@40 3090 } /* stereo_int_test */
Chris@40 3091
Chris@40 3092 static void
Chris@40 3093 mono_rdwr_int_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 3094 { SNDFILE *file ;
Chris@40 3095 SF_INFO sfinfo ;
Chris@40 3096 int *orig, *test ;
Chris@40 3097 int k, pass ;
Chris@40 3098
Chris@40 3099 switch (format & SF_FORMAT_SUBMASK)
Chris@40 3100 { case SF_FORMAT_ALAC_16 :
Chris@40 3101 case SF_FORMAT_ALAC_20 :
Chris@40 3102 case SF_FORMAT_ALAC_24 :
Chris@40 3103 case SF_FORMAT_ALAC_32 :
Chris@40 3104 allow_fd = 0 ;
Chris@40 3105 break ;
Chris@40 3106
Chris@40 3107 default :
Chris@40 3108 break ;
Chris@40 3109 } ;
Chris@40 3110
Chris@40 3111 orig = orig_data.i ;
Chris@40 3112 test = test_data.i ;
Chris@40 3113
Chris@40 3114 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 3115 sfinfo.frames = DATA_LENGTH ;
Chris@40 3116 sfinfo.channels = 1 ;
Chris@40 3117 sfinfo.format = format ;
Chris@40 3118
Chris@40 3119 if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW
Chris@40 3120 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU
Chris@40 3121 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2)
Chris@40 3122 unlink (filename) ;
Chris@40 3123 else
Chris@40 3124 { /* Create a short file. */
Chris@40 3125 create_short_file (filename) ;
Chris@40 3126
Chris@40 3127 /* Opening a already existing short file (ie invalid header) RDWR is disallowed.
Chris@40 3128 ** If this returns a valif pointer sf_open() screwed up.
Chris@40 3129 */
Chris@40 3130 if ((file = sf_open (filename, SFM_RDWR, &sfinfo)))
Chris@40 3131 { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ;
Chris@40 3132 exit (1) ;
Chris@40 3133 } ;
Chris@40 3134
Chris@40 3135 /* Truncate the file to zero bytes. */
Chris@40 3136 if (truncate (filename, 0) < 0)
Chris@40 3137 { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ;
Chris@40 3138 perror (NULL) ;
Chris@40 3139 exit (1) ;
Chris@40 3140 } ;
Chris@40 3141 } ;
Chris@40 3142
Chris@40 3143 /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain
Chris@40 3144 ** all the usual data required when opening the file in WRITE mode.
Chris@40 3145 */
Chris@40 3146 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 3147 sfinfo.frames = DATA_LENGTH ;
Chris@40 3148 sfinfo.channels = 1 ;
Chris@40 3149 sfinfo.format = format ;
Chris@40 3150
Chris@40 3151 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3152
Chris@40 3153 /* Do 3 writes followed by reads. After each, check the data and the current
Chris@40 3154 ** read and write offsets.
Chris@40 3155 */
Chris@40 3156 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 3157 { orig [20] = pass * 2 ;
Chris@40 3158
Chris@40 3159 /* Write some data. */
Chris@40 3160 test_write_int_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ;
Chris@40 3161
Chris@40 3162 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 3163
Chris@40 3164 /* Read what we just wrote. */
Chris@40 3165 test_read_int_or_die (file, 0, test, DATA_LENGTH, __LINE__) ;
Chris@40 3166
Chris@40 3167 /* Check the data. */
Chris@40 3168 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 3169 if (INT_ERROR (orig [k], test [k]))
Chris@40 3170 { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 3171 oct_save_int (orig, test, DATA_LENGTH) ;
Chris@40 3172 exit (1) ;
Chris@40 3173 } ;
Chris@40 3174
Chris@40 3175 test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 3176 } ; /* for (pass ...) */
Chris@40 3177
Chris@40 3178 sf_close (file) ;
Chris@40 3179
Chris@40 3180 /* Open the file again to check the data. */
Chris@40 3181 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3182
Chris@40 3183 if (sfinfo.format != format)
Chris@40 3184 { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 3185 exit (1) ;
Chris@40 3186 } ;
Chris@40 3187
Chris@40 3188 if (sfinfo.frames < 3 * DATA_LENGTH)
Chris@40 3189 { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 3190 exit (1) ;
Chris@40 3191 }
Chris@40 3192
Chris@40 3193 if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
Chris@40 3194 { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 3195 exit (1) ;
Chris@40 3196 } ;
Chris@40 3197
Chris@40 3198 if (sfinfo.channels != 1)
Chris@40 3199 { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 3200 exit (1) ;
Chris@40 3201 } ;
Chris@40 3202
Chris@40 3203 if (! long_file_ok)
Chris@40 3204 test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ;
Chris@40 3205 else
Chris@40 3206 test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ;
Chris@40 3207
Chris@40 3208 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 3209 { orig [20] = pass * 2 ;
Chris@40 3210
Chris@40 3211 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ;
Chris@40 3212
Chris@40 3213 /* Read what we just wrote. */
Chris@40 3214 test_read_int_or_die (file, pass, test, DATA_LENGTH, __LINE__) ;
Chris@40 3215
Chris@40 3216 /* Check the data. */
Chris@40 3217 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 3218 if (INT_ERROR (orig [k], test [k]))
Chris@40 3219 { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 3220 oct_save_int (orig, test, DATA_LENGTH) ;
Chris@40 3221 exit (1) ;
Chris@40 3222 } ;
Chris@40 3223
Chris@40 3224 } ; /* for (pass ...) */
Chris@40 3225
Chris@40 3226 sf_close (file) ;
Chris@40 3227 } /* mono_rdwr_int_test */
Chris@40 3228
Chris@40 3229 static void
Chris@40 3230 new_rdwr_int_test (const char *filename, int format, int allow_fd)
Chris@40 3231 { SNDFILE *wfile, *rwfile ;
Chris@40 3232 SF_INFO sfinfo ;
Chris@40 3233 int *orig, *test ;
Chris@40 3234 int items, frames ;
Chris@40 3235
Chris@40 3236 orig = orig_data.i ;
Chris@40 3237 test = test_data.i ;
Chris@40 3238
Chris@40 3239 sfinfo.samplerate = 44100 ;
Chris@40 3240 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 3241 sfinfo.channels = 2 ;
Chris@40 3242 sfinfo.format = format ;
Chris@40 3243
Chris@40 3244 items = DATA_LENGTH ;
Chris@40 3245 frames = items / sfinfo.channels ;
Chris@40 3246
Chris@40 3247 wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3248 sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
Chris@40 3249 test_writef_int_or_die (wfile, 1, orig, frames, __LINE__) ;
Chris@40 3250 sf_write_sync (wfile) ;
Chris@40 3251 test_writef_int_or_die (wfile, 2, orig, frames, __LINE__) ;
Chris@40 3252 sf_write_sync (wfile) ;
Chris@40 3253
Chris@40 3254 rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3255 if (sfinfo.frames != 2 * frames)
Chris@40 3256 { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
Chris@40 3257 exit (1) ;
Chris@40 3258 } ;
Chris@40 3259
Chris@40 3260 test_writef_int_or_die (wfile, 3, orig, frames, __LINE__) ;
Chris@40 3261
Chris@40 3262 test_readf_int_or_die (rwfile, 1, test, frames, __LINE__) ;
Chris@40 3263 test_readf_int_or_die (rwfile, 2, test, frames, __LINE__) ;
Chris@40 3264
Chris@40 3265 sf_close (wfile) ;
Chris@40 3266 sf_close (rwfile) ;
Chris@40 3267 } /* new_rdwr_int_test */
Chris@40 3268
Chris@40 3269
Chris@40 3270 /*======================================================================================
Chris@40 3271 */
Chris@40 3272
Chris@40 3273 static void mono_float_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 3274 static void stereo_float_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 3275 static void mono_rdwr_float_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 3276 static void new_rdwr_float_test (const char *filename, int format, int allow_fd) ;
Chris@40 3277 static void multi_seek_test (const char * filename, int format) ;
Chris@40 3278 static void write_seek_extend_test (const char * filename, int format) ;
Chris@40 3279
Chris@40 3280 static void
Chris@40 3281 pcm_test_float (const char *filename, int format, int long_file_ok)
Chris@40 3282 { SF_INFO sfinfo ;
Chris@40 3283 float *orig ;
Chris@40 3284 int k, allow_fd ;
Chris@40 3285
Chris@40 3286 /* Sd2 files cannot be opened from an existing file descriptor. */
Chris@40 3287 allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ;
Chris@40 3288
Chris@40 3289 print_test_name ("pcm_test_float", filename) ;
Chris@40 3290
Chris@40 3291 sfinfo.samplerate = 44100 ;
Chris@40 3292 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 3293 sfinfo.channels = 1 ;
Chris@40 3294 sfinfo.format = format ;
Chris@40 3295
Chris@40 3296 test_sf_format_or_die (&sfinfo, __LINE__) ;
Chris@40 3297
Chris@40 3298 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 1.0) ;
Chris@40 3299
Chris@40 3300 orig = orig_data.f ;
Chris@40 3301
Chris@40 3302 /* Make this a macro so gdb steps over it in one go. */
Chris@40 3303 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 3304
Chris@40 3305 /* Some test broken out here. */
Chris@40 3306
Chris@40 3307 mono_float_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 3308
Chris@40 3309 /* Sub format DWVW does not allow seeking. */
Chris@40 3310 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 3311 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 3312 { unlink (filename) ;
Chris@40 3313 printf ("no seek : ok\n") ;
Chris@40 3314 return ;
Chris@40 3315 } ;
Chris@40 3316
Chris@40 3317 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 3318 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 3319 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 3320 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 3321 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 3322 )
Chris@40 3323 mono_rdwr_float_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 3324
Chris@40 3325 /* If the format doesn't support stereo we're done. */
Chris@40 3326 sfinfo.channels = 2 ;
Chris@40 3327 if (sf_format_check (&sfinfo) == 0)
Chris@40 3328 { unlink (filename) ;
Chris@40 3329 puts ("no stereo : ok") ;
Chris@40 3330 return ;
Chris@40 3331 } ;
Chris@40 3332
Chris@40 3333 stereo_float_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 3334
Chris@40 3335 /* New read/write test. Not sure if this is needed yet. */
Chris@40 3336
Chris@40 3337 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
Chris@40 3338 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
Chris@40 3339 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 3340 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 3341 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 3342 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 3343 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 3344 )
Chris@40 3345 new_rdwr_float_test (filename, format, allow_fd) ;
Chris@40 3346
Chris@40 3347 delete_file (format, filename) ;
Chris@40 3348
Chris@40 3349 puts ("ok") ;
Chris@40 3350 return ;
Chris@40 3351 } /* pcm_test_float */
Chris@40 3352
Chris@40 3353 static void
Chris@40 3354 mono_float_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 3355 { SNDFILE *file ;
Chris@40 3356 SF_INFO sfinfo ;
Chris@40 3357 float *orig, *test ;
Chris@40 3358 sf_count_t count ;
Chris@40 3359 int k, items, total ;
Chris@40 3360
Chris@40 3361 sfinfo.samplerate = 44100 ;
Chris@40 3362 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 3363 sfinfo.channels = 1 ;
Chris@40 3364 sfinfo.format = format ;
Chris@40 3365
Chris@40 3366 orig = orig_data.f ;
Chris@40 3367 test = test_data.f ;
Chris@40 3368
Chris@40 3369 items = DATA_LENGTH ;
Chris@40 3370
Chris@40 3371 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3372
Chris@40 3373 if (sfinfo.frames || sfinfo.sections || sfinfo.seekable)
Chris@40 3374 { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ;
Chris@40 3375 exit (1) ;
Chris@40 3376 } ;
Chris@40 3377
Chris@40 3378 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 3379
Chris@40 3380 test_write_float_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 3381 sf_write_sync (file) ;
Chris@40 3382 test_write_float_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 3383 sf_write_sync (file) ;
Chris@40 3384
Chris@40 3385 /* Add non-audio data after the audio. */
Chris@40 3386 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 3387
Chris@40 3388 sf_close (file) ;
Chris@40 3389
Chris@40 3390 memset (test, 0, items * sizeof (float)) ;
Chris@40 3391
Chris@40 3392 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 3393 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 3394
Chris@40 3395 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3396
Chris@40 3397 if (sfinfo.format != format)
Chris@40 3398 { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 3399 exit (1) ;
Chris@40 3400 } ;
Chris@40 3401
Chris@40 3402 if (sfinfo.frames < 2 * items)
Chris@40 3403 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 3404 exit (1) ;
Chris@40 3405 } ;
Chris@40 3406
Chris@40 3407 if (! long_file_ok && sfinfo.frames > 2 * items)
Chris@40 3408 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 3409 exit (1) ;
Chris@40 3410 } ;
Chris@40 3411
Chris@40 3412 if (sfinfo.channels != 1)
Chris@40 3413 { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 3414 exit (1) ;
Chris@40 3415 } ;
Chris@40 3416
Chris@40 3417 if (sfinfo.seekable != 1)
Chris@40 3418 { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ;
Chris@40 3419 exit (1) ;
Chris@40 3420 } ;
Chris@40 3421
Chris@40 3422 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 3423
Chris@40 3424 test_read_float_or_die (file, 0, test, items, __LINE__) ;
Chris@40 3425 for (k = 0 ; k < items ; k++)
Chris@40 3426 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 3427 { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3428 oct_save_float (orig, test, items) ;
Chris@40 3429 exit (1) ;
Chris@40 3430 } ;
Chris@40 3431
Chris@40 3432 /* Test multiple short reads. */
Chris@40 3433 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 3434
Chris@40 3435 total = 0 ;
Chris@40 3436 for (k = 1 ; k <= 32 ; k++)
Chris@40 3437 { int ik ;
Chris@40 3438
Chris@40 3439 test_read_float_or_die (file, 0, test + total, k, __LINE__) ;
Chris@40 3440 total += k ;
Chris@40 3441
Chris@40 3442 for (ik = 0 ; ik < total ; ik++)
Chris@40 3443 if (FLOAT_ERROR (orig [ik], test [ik]))
Chris@40 3444 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, ik, orig [ik], test [ik]) ;
Chris@40 3445 exit (1) ;
Chris@40 3446 } ;
Chris@40 3447 } ;
Chris@40 3448
Chris@40 3449 /* Seek to start of file. */
Chris@40 3450 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 3451
Chris@40 3452 test_read_float_or_die (file, 0, test, 4, __LINE__) ;
Chris@40 3453 for (k = 0 ; k < 4 ; k++)
Chris@40 3454 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 3455 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3456 exit (1) ;
Chris@40 3457 } ;
Chris@40 3458
Chris@40 3459 /* For some codecs we can't go past here. */
Chris@40 3460 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 3461 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 3462 { sf_close (file) ;
Chris@40 3463 unlink (filename) ;
Chris@40 3464 printf ("no seek : ") ;
Chris@40 3465 return ;
Chris@40 3466 } ;
Chris@40 3467
Chris@40 3468 /* Seek to offset from start of file. */
Chris@40 3469 test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ;
Chris@40 3470
Chris@40 3471 test_read_float_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 3472 for (k = 10 ; k < 14 ; k++)
Chris@40 3473 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 3474 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 3475 exit (1) ;
Chris@40 3476 } ;
Chris@40 3477
Chris@40 3478 /* Seek to offset from current position. */
Chris@40 3479 test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ;
Chris@40 3480
Chris@40 3481 test_read_float_or_die (file, 0, test + 20, 4, __LINE__) ;
Chris@40 3482 for (k = 20 ; k < 24 ; k++)
Chris@40 3483 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 3484 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 3485 exit (1) ;
Chris@40 3486 } ;
Chris@40 3487
Chris@40 3488 /* Seek to offset from end of file. */
Chris@40 3489 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 3490
Chris@40 3491 test_read_float_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 3492 for (k = 10 ; k < 14 ; k++)
Chris@40 3493 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 3494 { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 3495 exit (1) ;
Chris@40 3496 } ;
Chris@40 3497
Chris@40 3498 /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */
Chris@40 3499 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 3500
Chris@40 3501 count = 0 ;
Chris@40 3502 while (count < sfinfo.frames)
Chris@40 3503 count += sf_read_float (file, test, 311) ;
Chris@40 3504
Chris@40 3505 /* Check that no error has occurred. */
Chris@40 3506 if (sf_error (file))
Chris@40 3507 { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ;
Chris@40 3508 puts (sf_strerror (file)) ;
Chris@40 3509 exit (1) ;
Chris@40 3510 } ;
Chris@40 3511
Chris@40 3512 /* Check that we haven't read beyond EOF. */
Chris@40 3513 if (count > sfinfo.frames)
Chris@40 3514 { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
Chris@40 3515 exit (1) ;
Chris@40 3516 } ;
Chris@40 3517
Chris@40 3518 test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ;
Chris@40 3519
Chris@40 3520 sf_close (file) ;
Chris@40 3521
Chris@40 3522 multi_seek_test (filename, format) ;
Chris@40 3523 write_seek_extend_test (filename, format) ;
Chris@40 3524
Chris@40 3525 } /* mono_float_test */
Chris@40 3526
Chris@40 3527 static void
Chris@40 3528 stereo_float_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 3529 { SNDFILE *file ;
Chris@40 3530 SF_INFO sfinfo ;
Chris@40 3531 float *orig, *test ;
Chris@40 3532 int k, items, frames ;
Chris@40 3533
Chris@40 3534 sfinfo.samplerate = 44100 ;
Chris@40 3535 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 3536 sfinfo.channels = 2 ;
Chris@40 3537 sfinfo.format = format ;
Chris@40 3538
Chris@40 3539 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 1.0) ;
Chris@40 3540
Chris@40 3541 orig = orig_data.f ;
Chris@40 3542 test = test_data.f ;
Chris@40 3543
Chris@40 3544 /* Make this a macro so gdb steps over it in one go. */
Chris@40 3545 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 3546
Chris@40 3547 items = DATA_LENGTH ;
Chris@40 3548 frames = items / sfinfo.channels ;
Chris@40 3549
Chris@40 3550 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3551
Chris@40 3552 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 3553
Chris@40 3554 test_writef_float_or_die (file, 0, orig, frames, __LINE__) ;
Chris@40 3555
Chris@40 3556 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 3557
Chris@40 3558 sf_close (file) ;
Chris@40 3559
Chris@40 3560 memset (test, 0, items * sizeof (float)) ;
Chris@40 3561
Chris@40 3562 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 3563 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 3564
Chris@40 3565 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3566
Chris@40 3567 if (sfinfo.format != format)
Chris@40 3568 { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n",
Chris@40 3569 __LINE__, format, sfinfo.format) ;
Chris@40 3570 exit (1) ;
Chris@40 3571 } ;
Chris@40 3572
Chris@40 3573 if (sfinfo.frames < frames)
Chris@40 3574 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
Chris@40 3575 __LINE__, sfinfo.frames, frames) ;
Chris@40 3576 exit (1) ;
Chris@40 3577 } ;
Chris@40 3578
Chris@40 3579 if (! long_file_ok && sfinfo.frames > frames)
Chris@40 3580 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
Chris@40 3581 __LINE__, sfinfo.frames, frames) ;
Chris@40 3582 exit (1) ;
Chris@40 3583 } ;
Chris@40 3584
Chris@40 3585 if (sfinfo.channels != 2)
Chris@40 3586 { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 3587 exit (1) ;
Chris@40 3588 } ;
Chris@40 3589
Chris@40 3590 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 3591
Chris@40 3592 test_readf_float_or_die (file, 0, test, frames, __LINE__) ;
Chris@40 3593 for (k = 0 ; k < items ; k++)
Chris@40 3594 if (FLOAT_ERROR (test [k], orig [k]))
Chris@40 3595 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3596 exit (1) ;
Chris@40 3597 } ;
Chris@40 3598
Chris@40 3599 /* Seek to start of file. */
Chris@40 3600 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 3601
Chris@40 3602 test_readf_float_or_die (file, 0, test, 2, __LINE__) ;
Chris@40 3603 for (k = 0 ; k < 4 ; k++)
Chris@40 3604 if (FLOAT_ERROR (test [k], orig [k]))
Chris@40 3605 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3606 exit (1) ;
Chris@40 3607 } ;
Chris@40 3608
Chris@40 3609 /* Seek to offset from start of file. */
Chris@40 3610 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
Chris@40 3611
Chris@40 3612 /* Check for errors here. */
Chris@40 3613 if (sf_error (file))
Chris@40 3614 { printf ("Line %d: Should NOT return an error.\n", __LINE__) ;
Chris@40 3615 puts (sf_strerror (file)) ;
Chris@40 3616 exit (1) ;
Chris@40 3617 } ;
Chris@40 3618
Chris@40 3619 if (sf_read_float (file, test, 1) > 0)
Chris@40 3620 { printf ("Line %d: Should return 0.\n", __LINE__) ;
Chris@40 3621 exit (1) ;
Chris@40 3622 } ;
Chris@40 3623
Chris@40 3624 if (! sf_error (file))
Chris@40 3625 { printf ("Line %d: Should return an error.\n", __LINE__) ;
Chris@40 3626 exit (1) ;
Chris@40 3627 } ;
Chris@40 3628 /*-----------------------*/
Chris@40 3629
Chris@40 3630 test_readf_float_or_die (file, 0, test + 10, 2, __LINE__) ;
Chris@40 3631 for (k = 20 ; k < 24 ; k++)
Chris@40 3632 if (FLOAT_ERROR (test [k], orig [k]))
Chris@40 3633 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3634 exit (1) ;
Chris@40 3635 } ;
Chris@40 3636
Chris@40 3637 /* Seek to offset from current position. */
Chris@40 3638 test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
Chris@40 3639
Chris@40 3640 test_readf_float_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 3641 for (k = 40 ; k < 44 ; k++)
Chris@40 3642 if (FLOAT_ERROR (test [k], orig [k]))
Chris@40 3643 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3644 exit (1) ;
Chris@40 3645 } ;
Chris@40 3646
Chris@40 3647 /* Seek to offset from end of file. */
Chris@40 3648 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 3649
Chris@40 3650 test_readf_float_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 3651 for (k = 20 ; k < 24 ; k++)
Chris@40 3652 if (FLOAT_ERROR (test [k], orig [k]))
Chris@40 3653 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3654 exit (1) ;
Chris@40 3655 } ;
Chris@40 3656
Chris@40 3657 sf_close (file) ;
Chris@40 3658 } /* stereo_float_test */
Chris@40 3659
Chris@40 3660 static void
Chris@40 3661 mono_rdwr_float_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 3662 { SNDFILE *file ;
Chris@40 3663 SF_INFO sfinfo ;
Chris@40 3664 float *orig, *test ;
Chris@40 3665 int k, pass ;
Chris@40 3666
Chris@40 3667 switch (format & SF_FORMAT_SUBMASK)
Chris@40 3668 { case SF_FORMAT_ALAC_16 :
Chris@40 3669 case SF_FORMAT_ALAC_20 :
Chris@40 3670 case SF_FORMAT_ALAC_24 :
Chris@40 3671 case SF_FORMAT_ALAC_32 :
Chris@40 3672 allow_fd = 0 ;
Chris@40 3673 break ;
Chris@40 3674
Chris@40 3675 default :
Chris@40 3676 break ;
Chris@40 3677 } ;
Chris@40 3678
Chris@40 3679 orig = orig_data.f ;
Chris@40 3680 test = test_data.f ;
Chris@40 3681
Chris@40 3682 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 3683 sfinfo.frames = DATA_LENGTH ;
Chris@40 3684 sfinfo.channels = 1 ;
Chris@40 3685 sfinfo.format = format ;
Chris@40 3686
Chris@40 3687 if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW
Chris@40 3688 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU
Chris@40 3689 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2)
Chris@40 3690 unlink (filename) ;
Chris@40 3691 else
Chris@40 3692 { /* Create a short file. */
Chris@40 3693 create_short_file (filename) ;
Chris@40 3694
Chris@40 3695 /* Opening a already existing short file (ie invalid header) RDWR is disallowed.
Chris@40 3696 ** If this returns a valif pointer sf_open() screwed up.
Chris@40 3697 */
Chris@40 3698 if ((file = sf_open (filename, SFM_RDWR, &sfinfo)))
Chris@40 3699 { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ;
Chris@40 3700 exit (1) ;
Chris@40 3701 } ;
Chris@40 3702
Chris@40 3703 /* Truncate the file to zero bytes. */
Chris@40 3704 if (truncate (filename, 0) < 0)
Chris@40 3705 { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ;
Chris@40 3706 perror (NULL) ;
Chris@40 3707 exit (1) ;
Chris@40 3708 } ;
Chris@40 3709 } ;
Chris@40 3710
Chris@40 3711 /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain
Chris@40 3712 ** all the usual data required when opening the file in WRITE mode.
Chris@40 3713 */
Chris@40 3714 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 3715 sfinfo.frames = DATA_LENGTH ;
Chris@40 3716 sfinfo.channels = 1 ;
Chris@40 3717 sfinfo.format = format ;
Chris@40 3718
Chris@40 3719 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3720
Chris@40 3721 /* Do 3 writes followed by reads. After each, check the data and the current
Chris@40 3722 ** read and write offsets.
Chris@40 3723 */
Chris@40 3724 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 3725 { orig [20] = pass * 2 ;
Chris@40 3726
Chris@40 3727 /* Write some data. */
Chris@40 3728 test_write_float_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ;
Chris@40 3729
Chris@40 3730 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 3731
Chris@40 3732 /* Read what we just wrote. */
Chris@40 3733 test_read_float_or_die (file, 0, test, DATA_LENGTH, __LINE__) ;
Chris@40 3734
Chris@40 3735 /* Check the data. */
Chris@40 3736 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 3737 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 3738 { printf ("\n\nLine %d (pass %d) A : Error at sample %d (%g => %g).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 3739 oct_save_float (orig, test, DATA_LENGTH) ;
Chris@40 3740 exit (1) ;
Chris@40 3741 } ;
Chris@40 3742
Chris@40 3743 test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 3744 } ; /* for (pass ...) */
Chris@40 3745
Chris@40 3746 sf_close (file) ;
Chris@40 3747
Chris@40 3748 /* Open the file again to check the data. */
Chris@40 3749 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3750
Chris@40 3751 if (sfinfo.format != format)
Chris@40 3752 { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 3753 exit (1) ;
Chris@40 3754 } ;
Chris@40 3755
Chris@40 3756 if (sfinfo.frames < 3 * DATA_LENGTH)
Chris@40 3757 { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 3758 exit (1) ;
Chris@40 3759 }
Chris@40 3760
Chris@40 3761 if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
Chris@40 3762 { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 3763 exit (1) ;
Chris@40 3764 } ;
Chris@40 3765
Chris@40 3766 if (sfinfo.channels != 1)
Chris@40 3767 { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 3768 exit (1) ;
Chris@40 3769 } ;
Chris@40 3770
Chris@40 3771 if (! long_file_ok)
Chris@40 3772 test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ;
Chris@40 3773 else
Chris@40 3774 test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ;
Chris@40 3775
Chris@40 3776 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 3777 { orig [20] = pass * 2 ;
Chris@40 3778
Chris@40 3779 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ;
Chris@40 3780
Chris@40 3781 /* Read what we just wrote. */
Chris@40 3782 test_read_float_or_die (file, pass, test, DATA_LENGTH, __LINE__) ;
Chris@40 3783
Chris@40 3784 /* Check the data. */
Chris@40 3785 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 3786 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 3787 { printf ("\n\nLine %d (pass %d) B : Error at sample %d (%g => %g).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 3788 oct_save_float (orig, test, DATA_LENGTH) ;
Chris@40 3789 exit (1) ;
Chris@40 3790 } ;
Chris@40 3791
Chris@40 3792 } ; /* for (pass ...) */
Chris@40 3793
Chris@40 3794 sf_close (file) ;
Chris@40 3795 } /* mono_rdwr_float_test */
Chris@40 3796
Chris@40 3797 static void
Chris@40 3798 new_rdwr_float_test (const char *filename, int format, int allow_fd)
Chris@40 3799 { SNDFILE *wfile, *rwfile ;
Chris@40 3800 SF_INFO sfinfo ;
Chris@40 3801 float *orig, *test ;
Chris@40 3802 int items, frames ;
Chris@40 3803
Chris@40 3804 orig = orig_data.f ;
Chris@40 3805 test = test_data.f ;
Chris@40 3806
Chris@40 3807 sfinfo.samplerate = 44100 ;
Chris@40 3808 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 3809 sfinfo.channels = 2 ;
Chris@40 3810 sfinfo.format = format ;
Chris@40 3811
Chris@40 3812 items = DATA_LENGTH ;
Chris@40 3813 frames = items / sfinfo.channels ;
Chris@40 3814
Chris@40 3815 wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3816 sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
Chris@40 3817 test_writef_float_or_die (wfile, 1, orig, frames, __LINE__) ;
Chris@40 3818 sf_write_sync (wfile) ;
Chris@40 3819 test_writef_float_or_die (wfile, 2, orig, frames, __LINE__) ;
Chris@40 3820 sf_write_sync (wfile) ;
Chris@40 3821
Chris@40 3822 rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3823 if (sfinfo.frames != 2 * frames)
Chris@40 3824 { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
Chris@40 3825 exit (1) ;
Chris@40 3826 } ;
Chris@40 3827
Chris@40 3828 test_writef_float_or_die (wfile, 3, orig, frames, __LINE__) ;
Chris@40 3829
Chris@40 3830 test_readf_float_or_die (rwfile, 1, test, frames, __LINE__) ;
Chris@40 3831 test_readf_float_or_die (rwfile, 2, test, frames, __LINE__) ;
Chris@40 3832
Chris@40 3833 sf_close (wfile) ;
Chris@40 3834 sf_close (rwfile) ;
Chris@40 3835 } /* new_rdwr_float_test */
Chris@40 3836
Chris@40 3837
Chris@40 3838 /*======================================================================================
Chris@40 3839 */
Chris@40 3840
Chris@40 3841 static void mono_double_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 3842 static void stereo_double_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 3843 static void mono_rdwr_double_test (const char *filename, int format, int long_file_ok, int allow_fd) ;
Chris@40 3844 static void new_rdwr_double_test (const char *filename, int format, int allow_fd) ;
Chris@40 3845 static void multi_seek_test (const char * filename, int format) ;
Chris@40 3846 static void write_seek_extend_test (const char * filename, int format) ;
Chris@40 3847
Chris@40 3848 static void
Chris@40 3849 pcm_test_double (const char *filename, int format, int long_file_ok)
Chris@40 3850 { SF_INFO sfinfo ;
Chris@40 3851 double *orig ;
Chris@40 3852 int k, allow_fd ;
Chris@40 3853
Chris@40 3854 /* Sd2 files cannot be opened from an existing file descriptor. */
Chris@40 3855 allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ;
Chris@40 3856
Chris@40 3857 print_test_name ("pcm_test_double", filename) ;
Chris@40 3858
Chris@40 3859 sfinfo.samplerate = 44100 ;
Chris@40 3860 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 3861 sfinfo.channels = 1 ;
Chris@40 3862 sfinfo.format = format ;
Chris@40 3863
Chris@40 3864 test_sf_format_or_die (&sfinfo, __LINE__) ;
Chris@40 3865
Chris@40 3866 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 1.0) ;
Chris@40 3867
Chris@40 3868 orig = orig_data.d ;
Chris@40 3869
Chris@40 3870 /* Make this a macro so gdb steps over it in one go. */
Chris@40 3871 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 3872
Chris@40 3873 /* Some test broken out here. */
Chris@40 3874
Chris@40 3875 mono_double_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 3876
Chris@40 3877 /* Sub format DWVW does not allow seeking. */
Chris@40 3878 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 3879 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 3880 { unlink (filename) ;
Chris@40 3881 printf ("no seek : ok\n") ;
Chris@40 3882 return ;
Chris@40 3883 } ;
Chris@40 3884
Chris@40 3885 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 3886 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 3887 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 3888 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 3889 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 3890 )
Chris@40 3891 mono_rdwr_double_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 3892
Chris@40 3893 /* If the format doesn't support stereo we're done. */
Chris@40 3894 sfinfo.channels = 2 ;
Chris@40 3895 if (sf_format_check (&sfinfo) == 0)
Chris@40 3896 { unlink (filename) ;
Chris@40 3897 puts ("no stereo : ok") ;
Chris@40 3898 return ;
Chris@40 3899 } ;
Chris@40 3900
Chris@40 3901 stereo_double_test (filename, format, long_file_ok, allow_fd) ;
Chris@40 3902
Chris@40 3903 /* New read/write test. Not sure if this is needed yet. */
Chris@40 3904
Chris@40 3905 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF
Chris@40 3906 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC
Chris@40 3907 && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC
Chris@40 3908 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16
Chris@40 3909 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20
Chris@40 3910 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24
Chris@40 3911 && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32
Chris@40 3912 )
Chris@40 3913 new_rdwr_double_test (filename, format, allow_fd) ;
Chris@40 3914
Chris@40 3915 delete_file (format, filename) ;
Chris@40 3916
Chris@40 3917 puts ("ok") ;
Chris@40 3918 return ;
Chris@40 3919 } /* pcm_test_double */
Chris@40 3920
Chris@40 3921 static void
Chris@40 3922 mono_double_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 3923 { SNDFILE *file ;
Chris@40 3924 SF_INFO sfinfo ;
Chris@40 3925 double *orig, *test ;
Chris@40 3926 sf_count_t count ;
Chris@40 3927 int k, items, total ;
Chris@40 3928
Chris@40 3929 sfinfo.samplerate = 44100 ;
Chris@40 3930 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 3931 sfinfo.channels = 1 ;
Chris@40 3932 sfinfo.format = format ;
Chris@40 3933
Chris@40 3934 orig = orig_data.d ;
Chris@40 3935 test = test_data.d ;
Chris@40 3936
Chris@40 3937 items = DATA_LENGTH ;
Chris@40 3938
Chris@40 3939 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3940
Chris@40 3941 if (sfinfo.frames || sfinfo.sections || sfinfo.seekable)
Chris@40 3942 { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ;
Chris@40 3943 exit (1) ;
Chris@40 3944 } ;
Chris@40 3945
Chris@40 3946 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 3947
Chris@40 3948 test_write_double_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 3949 sf_write_sync (file) ;
Chris@40 3950 test_write_double_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 3951 sf_write_sync (file) ;
Chris@40 3952
Chris@40 3953 /* Add non-audio data after the audio. */
Chris@40 3954 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 3955
Chris@40 3956 sf_close (file) ;
Chris@40 3957
Chris@40 3958 memset (test, 0, items * sizeof (double)) ;
Chris@40 3959
Chris@40 3960 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 3961 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 3962
Chris@40 3963 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 3964
Chris@40 3965 if (sfinfo.format != format)
Chris@40 3966 { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 3967 exit (1) ;
Chris@40 3968 } ;
Chris@40 3969
Chris@40 3970 if (sfinfo.frames < 2 * items)
Chris@40 3971 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 3972 exit (1) ;
Chris@40 3973 } ;
Chris@40 3974
Chris@40 3975 if (! long_file_ok && sfinfo.frames > 2 * items)
Chris@40 3976 { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ;
Chris@40 3977 exit (1) ;
Chris@40 3978 } ;
Chris@40 3979
Chris@40 3980 if (sfinfo.channels != 1)
Chris@40 3981 { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 3982 exit (1) ;
Chris@40 3983 } ;
Chris@40 3984
Chris@40 3985 if (sfinfo.seekable != 1)
Chris@40 3986 { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ;
Chris@40 3987 exit (1) ;
Chris@40 3988 } ;
Chris@40 3989
Chris@40 3990 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 3991
Chris@40 3992 test_read_double_or_die (file, 0, test, items, __LINE__) ;
Chris@40 3993 for (k = 0 ; k < items ; k++)
Chris@40 3994 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 3995 { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 3996 oct_save_double (orig, test, items) ;
Chris@40 3997 exit (1) ;
Chris@40 3998 } ;
Chris@40 3999
Chris@40 4000 /* Test multiple short reads. */
Chris@40 4001 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 4002
Chris@40 4003 total = 0 ;
Chris@40 4004 for (k = 1 ; k <= 32 ; k++)
Chris@40 4005 { int ik ;
Chris@40 4006
Chris@40 4007 test_read_double_or_die (file, 0, test + total, k, __LINE__) ;
Chris@40 4008 total += k ;
Chris@40 4009
Chris@40 4010 for (ik = 0 ; ik < total ; ik++)
Chris@40 4011 if (FLOAT_ERROR (orig [ik], test [ik]))
Chris@40 4012 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, ik, orig [ik], test [ik]) ;
Chris@40 4013 exit (1) ;
Chris@40 4014 } ;
Chris@40 4015 } ;
Chris@40 4016
Chris@40 4017 /* Seek to start of file. */
Chris@40 4018 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 4019
Chris@40 4020 test_read_double_or_die (file, 0, test, 4, __LINE__) ;
Chris@40 4021 for (k = 0 ; k < 4 ; k++)
Chris@40 4022 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 4023 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 4024 exit (1) ;
Chris@40 4025 } ;
Chris@40 4026
Chris@40 4027 /* For some codecs we can't go past here. */
Chris@40 4028 if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 ||
Chris@40 4029 (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24)
Chris@40 4030 { sf_close (file) ;
Chris@40 4031 unlink (filename) ;
Chris@40 4032 printf ("no seek : ") ;
Chris@40 4033 return ;
Chris@40 4034 } ;
Chris@40 4035
Chris@40 4036 /* Seek to offset from start of file. */
Chris@40 4037 test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ;
Chris@40 4038
Chris@40 4039 test_read_double_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 4040 for (k = 10 ; k < 14 ; k++)
Chris@40 4041 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 4042 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 4043 exit (1) ;
Chris@40 4044 } ;
Chris@40 4045
Chris@40 4046 /* Seek to offset from current position. */
Chris@40 4047 test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ;
Chris@40 4048
Chris@40 4049 test_read_double_or_die (file, 0, test + 20, 4, __LINE__) ;
Chris@40 4050 for (k = 20 ; k < 24 ; k++)
Chris@40 4051 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 4052 { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 4053 exit (1) ;
Chris@40 4054 } ;
Chris@40 4055
Chris@40 4056 /* Seek to offset from end of file. */
Chris@40 4057 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 4058
Chris@40 4059 test_read_double_or_die (file, 0, test + 10, 4, __LINE__) ;
Chris@40 4060 for (k = 10 ; k < 14 ; k++)
Chris@40 4061 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 4062 { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ;
Chris@40 4063 exit (1) ;
Chris@40 4064 } ;
Chris@40 4065
Chris@40 4066 /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */
Chris@40 4067 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 4068
Chris@40 4069 count = 0 ;
Chris@40 4070 while (count < sfinfo.frames)
Chris@40 4071 count += sf_read_double (file, test, 311) ;
Chris@40 4072
Chris@40 4073 /* Check that no error has occurred. */
Chris@40 4074 if (sf_error (file))
Chris@40 4075 { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ;
Chris@40 4076 puts (sf_strerror (file)) ;
Chris@40 4077 exit (1) ;
Chris@40 4078 } ;
Chris@40 4079
Chris@40 4080 /* Check that we haven't read beyond EOF. */
Chris@40 4081 if (count > sfinfo.frames)
Chris@40 4082 { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ;
Chris@40 4083 exit (1) ;
Chris@40 4084 } ;
Chris@40 4085
Chris@40 4086 test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ;
Chris@40 4087
Chris@40 4088 sf_close (file) ;
Chris@40 4089
Chris@40 4090 multi_seek_test (filename, format) ;
Chris@40 4091 write_seek_extend_test (filename, format) ;
Chris@40 4092
Chris@40 4093 } /* mono_double_test */
Chris@40 4094
Chris@40 4095 static void
Chris@40 4096 stereo_double_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 4097 { SNDFILE *file ;
Chris@40 4098 SF_INFO sfinfo ;
Chris@40 4099 double *orig, *test ;
Chris@40 4100 int k, items, frames ;
Chris@40 4101
Chris@40 4102 sfinfo.samplerate = 44100 ;
Chris@40 4103 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 4104 sfinfo.channels = 2 ;
Chris@40 4105 sfinfo.format = format ;
Chris@40 4106
Chris@40 4107 gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 1.0) ;
Chris@40 4108
Chris@40 4109 orig = orig_data.d ;
Chris@40 4110 test = test_data.d ;
Chris@40 4111
Chris@40 4112 /* Make this a macro so gdb steps over it in one go. */
Chris@40 4113 CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ;
Chris@40 4114
Chris@40 4115 items = DATA_LENGTH ;
Chris@40 4116 frames = items / sfinfo.channels ;
Chris@40 4117
Chris@40 4118 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 4119
Chris@40 4120 sf_set_string (file, SF_STR_ARTIST, "Your name here") ;
Chris@40 4121
Chris@40 4122 test_writef_double_or_die (file, 0, orig, frames, __LINE__) ;
Chris@40 4123
Chris@40 4124 sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ;
Chris@40 4125
Chris@40 4126 sf_close (file) ;
Chris@40 4127
Chris@40 4128 memset (test, 0, items * sizeof (double)) ;
Chris@40 4129
Chris@40 4130 if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
Chris@40 4131 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 4132
Chris@40 4133 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ;
Chris@40 4134
Chris@40 4135 if (sfinfo.format != format)
Chris@40 4136 { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n",
Chris@40 4137 __LINE__, format, sfinfo.format) ;
Chris@40 4138 exit (1) ;
Chris@40 4139 } ;
Chris@40 4140
Chris@40 4141 if (sfinfo.frames < frames)
Chris@40 4142 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n",
Chris@40 4143 __LINE__, sfinfo.frames, frames) ;
Chris@40 4144 exit (1) ;
Chris@40 4145 } ;
Chris@40 4146
Chris@40 4147 if (! long_file_ok && sfinfo.frames > frames)
Chris@40 4148 { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n",
Chris@40 4149 __LINE__, sfinfo.frames, frames) ;
Chris@40 4150 exit (1) ;
Chris@40 4151 } ;
Chris@40 4152
Chris@40 4153 if (sfinfo.channels != 2)
Chris@40 4154 { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 4155 exit (1) ;
Chris@40 4156 } ;
Chris@40 4157
Chris@40 4158 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 4159
Chris@40 4160 test_readf_double_or_die (file, 0, test, frames, __LINE__) ;
Chris@40 4161 for (k = 0 ; k < items ; k++)
Chris@40 4162 if (FLOAT_ERROR (test [k], orig [k]))
Chris@40 4163 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 4164 exit (1) ;
Chris@40 4165 } ;
Chris@40 4166
Chris@40 4167 /* Seek to start of file. */
Chris@40 4168 test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
Chris@40 4169
Chris@40 4170 test_readf_double_or_die (file, 0, test, 2, __LINE__) ;
Chris@40 4171 for (k = 0 ; k < 4 ; k++)
Chris@40 4172 if (FLOAT_ERROR (test [k], orig [k]))
Chris@40 4173 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 4174 exit (1) ;
Chris@40 4175 } ;
Chris@40 4176
Chris@40 4177 /* Seek to offset from start of file. */
Chris@40 4178 test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
Chris@40 4179
Chris@40 4180 /* Check for errors here. */
Chris@40 4181 if (sf_error (file))
Chris@40 4182 { printf ("Line %d: Should NOT return an error.\n", __LINE__) ;
Chris@40 4183 puts (sf_strerror (file)) ;
Chris@40 4184 exit (1) ;
Chris@40 4185 } ;
Chris@40 4186
Chris@40 4187 if (sf_read_double (file, test, 1) > 0)
Chris@40 4188 { printf ("Line %d: Should return 0.\n", __LINE__) ;
Chris@40 4189 exit (1) ;
Chris@40 4190 } ;
Chris@40 4191
Chris@40 4192 if (! sf_error (file))
Chris@40 4193 { printf ("Line %d: Should return an error.\n", __LINE__) ;
Chris@40 4194 exit (1) ;
Chris@40 4195 } ;
Chris@40 4196 /*-----------------------*/
Chris@40 4197
Chris@40 4198 test_readf_double_or_die (file, 0, test + 10, 2, __LINE__) ;
Chris@40 4199 for (k = 20 ; k < 24 ; k++)
Chris@40 4200 if (FLOAT_ERROR (test [k], orig [k]))
Chris@40 4201 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 4202 exit (1) ;
Chris@40 4203 } ;
Chris@40 4204
Chris@40 4205 /* Seek to offset from current position. */
Chris@40 4206 test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
Chris@40 4207
Chris@40 4208 test_readf_double_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 4209 for (k = 40 ; k < 44 ; k++)
Chris@40 4210 if (FLOAT_ERROR (test [k], orig [k]))
Chris@40 4211 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 4212 exit (1) ;
Chris@40 4213 } ;
Chris@40 4214
Chris@40 4215 /* Seek to offset from end of file. */
Chris@40 4216 test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
Chris@40 4217
Chris@40 4218 test_readf_double_or_die (file, 0, test + 20, 2, __LINE__) ;
Chris@40 4219 for (k = 20 ; k < 24 ; k++)
Chris@40 4220 if (FLOAT_ERROR (test [k], orig [k]))
Chris@40 4221 { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ;
Chris@40 4222 exit (1) ;
Chris@40 4223 } ;
Chris@40 4224
Chris@40 4225 sf_close (file) ;
Chris@40 4226 } /* stereo_double_test */
Chris@40 4227
Chris@40 4228 static void
Chris@40 4229 mono_rdwr_double_test (const char *filename, int format, int long_file_ok, int allow_fd)
Chris@40 4230 { SNDFILE *file ;
Chris@40 4231 SF_INFO sfinfo ;
Chris@40 4232 double *orig, *test ;
Chris@40 4233 int k, pass ;
Chris@40 4234
Chris@40 4235 switch (format & SF_FORMAT_SUBMASK)
Chris@40 4236 { case SF_FORMAT_ALAC_16 :
Chris@40 4237 case SF_FORMAT_ALAC_20 :
Chris@40 4238 case SF_FORMAT_ALAC_24 :
Chris@40 4239 case SF_FORMAT_ALAC_32 :
Chris@40 4240 allow_fd = 0 ;
Chris@40 4241 break ;
Chris@40 4242
Chris@40 4243 default :
Chris@40 4244 break ;
Chris@40 4245 } ;
Chris@40 4246
Chris@40 4247 orig = orig_data.d ;
Chris@40 4248 test = test_data.d ;
Chris@40 4249
Chris@40 4250 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 4251 sfinfo.frames = DATA_LENGTH ;
Chris@40 4252 sfinfo.channels = 1 ;
Chris@40 4253 sfinfo.format = format ;
Chris@40 4254
Chris@40 4255 if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW
Chris@40 4256 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU
Chris@40 4257 || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2)
Chris@40 4258 unlink (filename) ;
Chris@40 4259 else
Chris@40 4260 { /* Create a short file. */
Chris@40 4261 create_short_file (filename) ;
Chris@40 4262
Chris@40 4263 /* Opening a already existing short file (ie invalid header) RDWR is disallowed.
Chris@40 4264 ** If this returns a valif pointer sf_open() screwed up.
Chris@40 4265 */
Chris@40 4266 if ((file = sf_open (filename, SFM_RDWR, &sfinfo)))
Chris@40 4267 { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ;
Chris@40 4268 exit (1) ;
Chris@40 4269 } ;
Chris@40 4270
Chris@40 4271 /* Truncate the file to zero bytes. */
Chris@40 4272 if (truncate (filename, 0) < 0)
Chris@40 4273 { printf ("\n\nLine %d: truncate (%s) failed", __LINE__, filename) ;
Chris@40 4274 perror (NULL) ;
Chris@40 4275 exit (1) ;
Chris@40 4276 } ;
Chris@40 4277 } ;
Chris@40 4278
Chris@40 4279 /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain
Chris@40 4280 ** all the usual data required when opening the file in WRITE mode.
Chris@40 4281 */
Chris@40 4282 sfinfo.samplerate = SAMPLE_RATE ;
Chris@40 4283 sfinfo.frames = DATA_LENGTH ;
Chris@40 4284 sfinfo.channels = 1 ;
Chris@40 4285 sfinfo.format = format ;
Chris@40 4286
Chris@40 4287 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 4288
Chris@40 4289 /* Do 3 writes followed by reads. After each, check the data and the current
Chris@40 4290 ** read and write offsets.
Chris@40 4291 */
Chris@40 4292 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 4293 { orig [20] = pass * 2 ;
Chris@40 4294
Chris@40 4295 /* Write some data. */
Chris@40 4296 test_write_double_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ;
Chris@40 4297
Chris@40 4298 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 4299
Chris@40 4300 /* Read what we just wrote. */
Chris@40 4301 test_read_double_or_die (file, 0, test, DATA_LENGTH, __LINE__) ;
Chris@40 4302
Chris@40 4303 /* Check the data. */
Chris@40 4304 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 4305 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 4306 { printf ("\n\nLine %d (pass %d) A : Error at sample %d (%g => %g).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 4307 oct_save_double (orig, test, DATA_LENGTH) ;
Chris@40 4308 exit (1) ;
Chris@40 4309 } ;
Chris@40 4310
Chris@40 4311 test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ;
Chris@40 4312 } ; /* for (pass ...) */
Chris@40 4313
Chris@40 4314 sf_close (file) ;
Chris@40 4315
Chris@40 4316 /* Open the file again to check the data. */
Chris@40 4317 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 4318
Chris@40 4319 if (sfinfo.format != format)
Chris@40 4320 { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 4321 exit (1) ;
Chris@40 4322 } ;
Chris@40 4323
Chris@40 4324 if (sfinfo.frames < 3 * DATA_LENGTH)
Chris@40 4325 { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 4326 exit (1) ;
Chris@40 4327 }
Chris@40 4328
Chris@40 4329 if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH)
Chris@40 4330 { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ;
Chris@40 4331 exit (1) ;
Chris@40 4332 } ;
Chris@40 4333
Chris@40 4334 if (sfinfo.channels != 1)
Chris@40 4335 { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 4336 exit (1) ;
Chris@40 4337 } ;
Chris@40 4338
Chris@40 4339 if (! long_file_ok)
Chris@40 4340 test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ;
Chris@40 4341 else
Chris@40 4342 test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ;
Chris@40 4343
Chris@40 4344 for (pass = 1 ; pass <= 3 ; pass ++)
Chris@40 4345 { orig [20] = pass * 2 ;
Chris@40 4346
Chris@40 4347 test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ;
Chris@40 4348
Chris@40 4349 /* Read what we just wrote. */
Chris@40 4350 test_read_double_or_die (file, pass, test, DATA_LENGTH, __LINE__) ;
Chris@40 4351
Chris@40 4352 /* Check the data. */
Chris@40 4353 for (k = 0 ; k < DATA_LENGTH ; k++)
Chris@40 4354 if (FLOAT_ERROR (orig [k], test [k]))
Chris@40 4355 { printf ("\n\nLine %d (pass %d) B : Error at sample %d (%g => %g).\n", __LINE__, pass, k, orig [k], test [k]) ;
Chris@40 4356 oct_save_double (orig, test, DATA_LENGTH) ;
Chris@40 4357 exit (1) ;
Chris@40 4358 } ;
Chris@40 4359
Chris@40 4360 } ; /* for (pass ...) */
Chris@40 4361
Chris@40 4362 sf_close (file) ;
Chris@40 4363 } /* mono_rdwr_double_test */
Chris@40 4364
Chris@40 4365 static void
Chris@40 4366 new_rdwr_double_test (const char *filename, int format, int allow_fd)
Chris@40 4367 { SNDFILE *wfile, *rwfile ;
Chris@40 4368 SF_INFO sfinfo ;
Chris@40 4369 double *orig, *test ;
Chris@40 4370 int items, frames ;
Chris@40 4371
Chris@40 4372 orig = orig_data.d ;
Chris@40 4373 test = test_data.d ;
Chris@40 4374
Chris@40 4375 sfinfo.samplerate = 44100 ;
Chris@40 4376 sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */
Chris@40 4377 sfinfo.channels = 2 ;
Chris@40 4378 sfinfo.format = format ;
Chris@40 4379
Chris@40 4380 items = DATA_LENGTH ;
Chris@40 4381 frames = items / sfinfo.channels ;
Chris@40 4382
Chris@40 4383 wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ;
Chris@40 4384 sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
Chris@40 4385 test_writef_double_or_die (wfile, 1, orig, frames, __LINE__) ;
Chris@40 4386 sf_write_sync (wfile) ;
Chris@40 4387 test_writef_double_or_die (wfile, 2, orig, frames, __LINE__) ;
Chris@40 4388 sf_write_sync (wfile) ;
Chris@40 4389
Chris@40 4390 rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ;
Chris@40 4391 if (sfinfo.frames != 2 * frames)
Chris@40 4392 { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ;
Chris@40 4393 exit (1) ;
Chris@40 4394 } ;
Chris@40 4395
Chris@40 4396 test_writef_double_or_die (wfile, 3, orig, frames, __LINE__) ;
Chris@40 4397
Chris@40 4398 test_readf_double_or_die (rwfile, 1, test, frames, __LINE__) ;
Chris@40 4399 test_readf_double_or_die (rwfile, 2, test, frames, __LINE__) ;
Chris@40 4400
Chris@40 4401 sf_close (wfile) ;
Chris@40 4402 sf_close (rwfile) ;
Chris@40 4403 } /* new_rdwr_double_test */
Chris@40 4404
Chris@40 4405
Chris@40 4406
Chris@40 4407 /*----------------------------------------------------------------------------------------
Chris@40 4408 */
Chris@40 4409
Chris@40 4410 static void
Chris@40 4411 empty_file_test (const char *filename, int format)
Chris@40 4412 { SNDFILE *file ;
Chris@40 4413 SF_INFO info ;
Chris@40 4414 int allow_fd ;
Chris@40 4415
Chris@40 4416 /* Sd2 files cannot be opened from an existing file descriptor. */
Chris@40 4417 allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ;
Chris@40 4418
Chris@40 4419 print_test_name ("empty_file_test", filename) ;
Chris@40 4420
Chris@40 4421 unlink (filename) ;
Chris@40 4422
Chris@40 4423 info.samplerate = 48000 ;
Chris@40 4424 info.channels = 2 ;
Chris@40 4425 info.format = format ;
Chris@40 4426 info.frames = 0 ;
Chris@40 4427
Chris@40 4428 if (sf_format_check (&info) == SF_FALSE)
Chris@40 4429 { info.channels = 1 ;
Chris@40 4430 if (sf_format_check (&info) == SF_FALSE)
Chris@40 4431 { puts ("invalid file format") ;
Chris@40 4432 return ;
Chris@40 4433 } ;
Chris@40 4434 } ;
Chris@40 4435
Chris@40 4436 /* Create an empty file. */
Chris@40 4437 file = test_open_file_or_die (filename, SFM_WRITE, &info, allow_fd, __LINE__) ;
Chris@40 4438 sf_close (file) ;
Chris@40 4439
Chris@40 4440 /* Open for read and check the length. */
Chris@40 4441 file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ;
Chris@40 4442
Chris@40 4443 if (info.frames != 0)
Chris@40 4444 { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ;
Chris@40 4445 exit (1) ;
Chris@40 4446 } ;
Chris@40 4447
Chris@40 4448 sf_close (file) ;
Chris@40 4449
Chris@40 4450 /* Open for read/write and check the length. */
Chris@40 4451 file = test_open_file_or_die (filename, SFM_RDWR, &info, allow_fd, __LINE__) ;
Chris@40 4452
Chris@40 4453 if (info.frames != 0)
Chris@40 4454 { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ;
Chris@40 4455 exit (1) ;
Chris@40 4456 } ;
Chris@40 4457
Chris@40 4458 sf_close (file) ;
Chris@40 4459
Chris@40 4460 /* Open for read and check the length. */
Chris@40 4461 file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ;
Chris@40 4462
Chris@40 4463 if (info.frames != 0)
Chris@40 4464 { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ;
Chris@40 4465 exit (1) ;
Chris@40 4466 } ;
Chris@40 4467
Chris@40 4468 sf_close (file) ;
Chris@40 4469
Chris@40 4470 check_open_file_count_or_die (__LINE__) ;
Chris@40 4471
Chris@40 4472 unlink (filename) ;
Chris@40 4473 puts ("ok") ;
Chris@40 4474
Chris@40 4475 return ;
Chris@40 4476 } /* empty_file_test */
Chris@40 4477
Chris@40 4478
Chris@40 4479 /*----------------------------------------------------------------------------------------
Chris@40 4480 */
Chris@40 4481
Chris@40 4482 static void
Chris@40 4483 create_short_file (const char *filename)
Chris@40 4484 { FILE *file ;
Chris@40 4485
Chris@40 4486 if (! (file = fopen (filename, "w")))
Chris@40 4487 { printf ("create_short_file : fopen (%s, \"w\") failed.", filename) ;
Chris@40 4488 fflush (stdout) ;
Chris@40 4489 perror (NULL) ;
Chris@40 4490 exit (1) ;
Chris@40 4491 } ;
Chris@40 4492
Chris@40 4493 fprintf (file, "This is the file data.\n") ;
Chris@40 4494
Chris@40 4495 fclose (file) ;
Chris@40 4496 } /* create_short_file */
Chris@40 4497
Chris@40 4498
Chris@40 4499 static void
Chris@40 4500 multi_seek_test (const char * filename, int format)
Chris@40 4501 { SNDFILE * file ;
Chris@40 4502 SF_INFO info ;
Chris@40 4503 sf_count_t pos ;
Chris@40 4504 int k ;
Chris@40 4505
Chris@40 4506 /* This test doesn't work on the following. */
Chris@40 4507 switch (format & SF_FORMAT_TYPEMASK)
Chris@40 4508 { case SF_FORMAT_RAW :
Chris@40 4509 return ;
Chris@40 4510
Chris@40 4511 default :
Chris@40 4512 break ;
Chris@40 4513 } ;
Chris@40 4514
Chris@40 4515 memset (&info, 0, sizeof (info)) ;
Chris@40 4516
Chris@40 4517 generate_file (filename, format, 88200) ;
Chris@40 4518
Chris@40 4519 file = test_open_file_or_die (filename, SFM_READ, &info, SF_FALSE, __LINE__) ;
Chris@40 4520
Chris@40 4521 for (k = 0 ; k < 10 ; k++)
Chris@40 4522 { pos = info.frames / (k + 2) ;
Chris@40 4523 test_seek_or_die (file, pos, SEEK_SET, pos, info.channels, __LINE__) ;
Chris@40 4524 } ;
Chris@40 4525
Chris@40 4526 sf_close (file) ;
Chris@40 4527 } /* multi_seek_test */
Chris@40 4528
Chris@40 4529 static void
Chris@40 4530 write_seek_extend_test (const char * filename, int format)
Chris@40 4531 { SNDFILE * file ;
Chris@40 4532 SF_INFO info ;
Chris@40 4533 short *orig, *test ;
Chris@40 4534 unsigned items, k ;
Chris@40 4535
Chris@40 4536 /* This test doesn't work on the following container formats. */
Chris@40 4537 switch (format & SF_FORMAT_TYPEMASK)
Chris@40 4538 { case SF_FORMAT_FLAC :
Chris@40 4539 case SF_FORMAT_HTK :
Chris@40 4540 case SF_FORMAT_PAF :
Chris@40 4541 case SF_FORMAT_SDS :
Chris@40 4542 case SF_FORMAT_SVX :
Chris@40 4543 return ;
Chris@40 4544
Chris@40 4545 default :
Chris@40 4546 break ;
Chris@40 4547 } ;
Chris@40 4548
Chris@40 4549 /* This test doesn't work on the following codec formats. */
Chris@40 4550 switch (format & SF_FORMAT_SUBMASK)
Chris@40 4551 { case SF_FORMAT_ALAC_16 :
Chris@40 4552 case SF_FORMAT_ALAC_20 :
Chris@40 4553 case SF_FORMAT_ALAC_24 :
Chris@40 4554 case SF_FORMAT_ALAC_32 :
Chris@40 4555 return ;
Chris@40 4556
Chris@40 4557 default :
Chris@40 4558 break ;
Chris@40 4559 } ;
Chris@40 4560
Chris@40 4561 memset (&info, 0, sizeof (info)) ;
Chris@40 4562
Chris@40 4563 info.samplerate = 48000 ;
Chris@40 4564 info.channels = 1 ;
Chris@40 4565 info.format = format ;
Chris@40 4566
Chris@40 4567 items = 512 ;
Chris@40 4568 exit_if_true (items > ARRAY_LEN (orig_data.s), "Line %d : Bad assumption.\n", __LINE__) ;
Chris@40 4569
Chris@40 4570 orig = orig_data.s ;
Chris@40 4571 test = test_data.s ;
Chris@40 4572
Chris@40 4573 for (k = 0 ; k < ARRAY_LEN (orig_data.s) ; k++)
Chris@40 4574 orig [k] = 0x3fff ;
Chris@40 4575
Chris@40 4576 file = test_open_file_or_die (filename, SFM_WRITE, &info, SF_FALSE, __LINE__) ;
Chris@40 4577 test_write_short_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 4578
Chris@40 4579 /* Extend the file using a seek. */
Chris@40 4580 test_seek_or_die (file, 2 * items, SEEK_SET, 2 * items, info.channels, __LINE__) ;
Chris@40 4581
Chris@40 4582 test_writef_short_or_die (file, 0, orig, items, __LINE__) ;
Chris@40 4583 sf_close (file) ;
Chris@40 4584
Chris@40 4585 file = test_open_file_or_die (filename, SFM_READ, &info, SF_FALSE, __LINE__) ;
Chris@40 4586 test_read_short_or_die (file, 0, test, 3 * items, __LINE__) ;
Chris@40 4587 sf_close (file) ;
Chris@40 4588
Chris@40 4589 /* Can't do these formats due to scaling. */
Chris@40 4590 switch (format & SF_FORMAT_SUBMASK)
Chris@40 4591 { case SF_FORMAT_PCM_S8 :
Chris@40 4592 case SF_FORMAT_PCM_U8 :
Chris@40 4593 return ;
Chris@40 4594 default :
Chris@40 4595 break ;
Chris@40 4596 } ;
Chris@40 4597
Chris@40 4598 for (k = 0 ; k < items ; k++)
Chris@40 4599 { exit_if_true (test [k] != 0x3fff, "Line %d : test [%d] == %d, should be 0x3fff.\n", __LINE__, k, test [k]) ;
Chris@40 4600 exit_if_true (test [items + k] != 0, "Line %d : test [%d] == %d, should be 0.\n", __LINE__, items + k, test [items + k]) ;
Chris@40 4601 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]) ;
Chris@40 4602 } ;
Chris@40 4603
Chris@40 4604 return ;
Chris@40 4605 } /* write_seek_extend_test */
Chris@40 4606
Chris@40 4607