annotate src/libsndfile-1.0.27/tests/write_read_test.c @ 84:08ae793730bd

Add null config files
author Chris Cannam
date Mon, 02 Mar 2020 14:03:47 +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