annotate src/libsndfile-1.0.25/tests/header_test.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents c7265573341e
children
rev   line source
Chris@0 1 /*
Chris@0 2 ** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@0 3 **
Chris@0 4 ** This program is free software ; you can redistribute it and/or modify
Chris@0 5 ** it under the terms of the GNU General Public License as published by
Chris@0 6 ** the Free Software Foundation ; either version 2 of the License, or
Chris@0 7 ** (at your option) any later version.
Chris@0 8 **
Chris@0 9 ** This program is distributed in the hope that it will be useful,
Chris@0 10 ** but WITHOUT ANY WARRANTY ; without even the implied warranty of
Chris@0 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 ** GNU General Public License for more details.
Chris@0 13 **
Chris@0 14 ** You should have received a copy of the GNU General Public License
Chris@0 15 ** along with this program ; if not, write to the Free Software
Chris@0 16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Chris@0 17 */
Chris@0 18
Chris@0 19 #include "sfconfig.h"
Chris@0 20
Chris@0 21 #include <stdio.h>
Chris@0 22 #include <stdlib.h>
Chris@0 23 #include <string.h>
Chris@0 24
Chris@0 25 #include <sys/stat.h>
Chris@0 26 #include <math.h>
Chris@0 27
Chris@0 28 #if HAVE_UNISTD_H
Chris@0 29 #include <unistd.h>
Chris@0 30 #endif
Chris@0 31
Chris@0 32 #if (HAVE_DECL_S_IRGRP == 0)
Chris@0 33 #include <sf_unistd.h>
Chris@0 34 #endif
Chris@0 35
Chris@0 36 #if (defined (WIN32) || defined (_WIN32))
Chris@0 37 #include <io.h>
Chris@0 38 #include <direct.h>
Chris@0 39 #endif
Chris@0 40
Chris@0 41 #include <sndfile.h>
Chris@0 42
Chris@0 43 #include "utils.h"
Chris@0 44
Chris@0 45 #define BUFFER_LEN (1<<10)
Chris@0 46 #define LOG_BUFFER_SIZE 1024
Chris@0 47
Chris@0 48 static void update_header_test (const char *filename, int typemajor) ;
Chris@0 49
Chris@0 50 static void update_seek_short_test (const char *filename, int filetype) ;
Chris@0 51 static void update_seek_int_test (const char *filename, int filetype) ;
Chris@0 52 static void update_seek_float_test (const char *filename, int filetype) ;
Chris@0 53 static void update_seek_double_test (const char *filename, int filetype) ;
Chris@0 54
Chris@0 55
Chris@0 56 static void extra_header_test (const char *filename, int filetype) ;
Chris@0 57
Chris@0 58 static void header_shrink_test (const char *filename, int filetype) ;
Chris@0 59
Chris@0 60 /* Force the start of this buffer to be double aligned. Sparc-solaris will
Chris@0 61 ** choke if its not.
Chris@0 62 */
Chris@0 63 static int data_out [BUFFER_LEN] ;
Chris@0 64 static int data_in [BUFFER_LEN] ;
Chris@0 65
Chris@0 66 int
Chris@0 67 main (int argc, char *argv [])
Chris@0 68 { int do_all = 0 ;
Chris@0 69 int test_count = 0 ;
Chris@0 70
Chris@0 71 if (argc != 2)
Chris@0 72 { printf ("Usage : %s <test>\n", argv [0]) ;
Chris@0 73 printf (" Where <test> is one of the following:\n") ;
Chris@0 74 printf (" wav - test WAV file peak chunk\n") ;
Chris@0 75 printf (" aiff - test AIFF file PEAK chunk\n") ;
Chris@0 76 printf (" all - perform all tests\n") ;
Chris@0 77 exit (1) ;
Chris@0 78 } ;
Chris@0 79
Chris@0 80 do_all=!strcmp (argv [1], "all") ;
Chris@0 81
Chris@0 82 if (do_all || ! strcmp (argv [1], "wav"))
Chris@0 83 { update_header_test ("header.wav", SF_FORMAT_WAV) ;
Chris@0 84 update_seek_short_test ("header_short.wav", SF_FORMAT_WAV) ;
Chris@0 85 update_seek_int_test ("header_int.wav", SF_FORMAT_WAV) ;
Chris@0 86 update_seek_float_test ("header_float.wav", SF_FORMAT_WAV) ;
Chris@0 87 update_seek_double_test ("header_double.wav", SF_FORMAT_WAV) ;
Chris@0 88 header_shrink_test ("header_shrink.wav", SF_FORMAT_WAV) ;
Chris@0 89 extra_header_test ("extra.wav", SF_FORMAT_WAV) ;
Chris@0 90
Chris@0 91 update_header_test ("header.wavex", SF_FORMAT_WAVEX) ;
Chris@0 92 update_seek_short_test ("header_short.wavex", SF_FORMAT_WAVEX) ;
Chris@0 93 update_seek_int_test ("header_int.wavex", SF_FORMAT_WAVEX) ;
Chris@0 94 update_seek_float_test ("header_float.wavex", SF_FORMAT_WAVEX) ;
Chris@0 95 update_seek_double_test ("header_double.wavex", SF_FORMAT_WAVEX) ;
Chris@0 96 header_shrink_test ("header_shrink.wavex", SF_FORMAT_WAVEX) ;
Chris@0 97 extra_header_test ("extra.wavex", SF_FORMAT_WAVEX) ;
Chris@0 98 test_count++ ;
Chris@0 99 } ;
Chris@0 100
Chris@0 101 if (do_all || ! strcmp (argv [1], "aiff"))
Chris@0 102 { update_header_test ("header.aiff", SF_FORMAT_AIFF) ;
Chris@0 103 update_seek_short_test ("header_short.aiff", SF_FORMAT_AIFF) ;
Chris@0 104 update_seek_int_test ("header_int.aiff", SF_FORMAT_AIFF) ;
Chris@0 105 update_seek_float_test ("header_float.aiff", SF_FORMAT_AIFF) ;
Chris@0 106 update_seek_double_test ("header_double.aiff", SF_FORMAT_AIFF) ;
Chris@0 107 header_shrink_test ("header_shrink.wav", SF_FORMAT_AIFF) ;
Chris@0 108 extra_header_test ("extra.aiff", SF_FORMAT_AIFF) ;
Chris@0 109 test_count++ ;
Chris@0 110 } ;
Chris@0 111
Chris@0 112 if (do_all || ! strcmp (argv [1], "au"))
Chris@0 113 { update_header_test ("header.au", SF_FORMAT_AU) ;
Chris@0 114 update_seek_short_test ("header_short.au", SF_FORMAT_AU) ;
Chris@0 115 update_seek_int_test ("header_int.au", SF_FORMAT_AU) ;
Chris@0 116 update_seek_float_test ("header_float.au", SF_FORMAT_AU) ;
Chris@0 117 update_seek_double_test ("header_double.au", SF_FORMAT_AU) ;
Chris@0 118 test_count++ ;
Chris@0 119 } ;
Chris@0 120
Chris@0 121 if (do_all || ! strcmp (argv [1], "caf"))
Chris@0 122 { update_header_test ("header.caf", SF_FORMAT_CAF) ;
Chris@0 123 update_seek_short_test ("header_short.caf", SF_FORMAT_CAF) ;
Chris@0 124 update_seek_int_test ("header_int.caf", SF_FORMAT_CAF) ;
Chris@0 125 update_seek_float_test ("header_float.caf", SF_FORMAT_CAF) ;
Chris@0 126 update_seek_double_test ("header_double.caf", SF_FORMAT_CAF) ;
Chris@0 127 /* extra_header_test ("extra.caf", SF_FORMAT_CAF) ; */
Chris@0 128 test_count++ ;
Chris@0 129 } ;
Chris@0 130
Chris@0 131 if (do_all || ! strcmp (argv [1], "nist"))
Chris@0 132 { update_header_test ("header.nist", SF_FORMAT_NIST) ;
Chris@0 133 update_seek_short_test ("header_short.nist", SF_FORMAT_NIST) ;
Chris@0 134 update_seek_int_test ("header_int.nist", SF_FORMAT_NIST) ;
Chris@0 135 test_count++ ;
Chris@0 136 } ;
Chris@0 137
Chris@0 138 if (do_all || ! strcmp (argv [1], "paf"))
Chris@0 139 { update_header_test ("header.paf", SF_FORMAT_PAF) ;
Chris@0 140 update_seek_short_test ("header_short.paf", SF_FORMAT_PAF) ;
Chris@0 141 test_count++ ;
Chris@0 142 } ;
Chris@0 143
Chris@0 144 if (do_all || ! strcmp (argv [1], "ircam"))
Chris@0 145 { update_header_test ("header.ircam", SF_FORMAT_IRCAM) ;
Chris@0 146 update_seek_short_test ("header_short.ircam", SF_FORMAT_IRCAM) ;
Chris@0 147 test_count++ ;
Chris@0 148 } ;
Chris@0 149
Chris@0 150 if (do_all || ! strcmp (argv [1], "w64"))
Chris@0 151 { update_header_test ("header.w64", SF_FORMAT_W64) ;
Chris@0 152 update_seek_short_test ("header_short.w64", SF_FORMAT_W64) ;
Chris@0 153 update_seek_int_test ("header_int.w64", SF_FORMAT_W64) ;
Chris@0 154 update_seek_float_test ("header_float.w64", SF_FORMAT_W64) ;
Chris@0 155 update_seek_double_test ("header_double.w64", SF_FORMAT_W64) ;
Chris@0 156 test_count++ ;
Chris@0 157 } ;
Chris@0 158
Chris@0 159 if (do_all || ! strcmp (argv [1], "rf64"))
Chris@0 160 { update_header_test ("header.rf64", SF_FORMAT_RF64) ;
Chris@0 161 update_seek_short_test ("header_short.rf64", SF_FORMAT_RF64) ;
Chris@0 162 update_seek_int_test ("header_int.rf64", SF_FORMAT_RF64) ;
Chris@0 163 update_seek_float_test ("header_float.rf64", SF_FORMAT_RF64) ;
Chris@0 164 update_seek_double_test ("header_double.rf64", SF_FORMAT_RF64) ;
Chris@0 165 test_count++ ;
Chris@0 166 } ;
Chris@0 167
Chris@0 168 if (do_all || ! strcmp (argv [1], "mat4"))
Chris@0 169 { update_header_test ("header.mat4", SF_FORMAT_MAT4) ;
Chris@0 170 update_seek_short_test ("header_short.mat4", SF_FORMAT_MAT4) ;
Chris@0 171 update_seek_int_test ("header_int.mat4", SF_FORMAT_MAT4) ;
Chris@0 172 update_seek_float_test ("header_float.mat4", SF_FORMAT_MAT4) ;
Chris@0 173 update_seek_double_test ("header_double.mat4", SF_FORMAT_MAT4) ;
Chris@0 174 test_count++ ;
Chris@0 175 } ;
Chris@0 176
Chris@0 177 if (do_all || ! strcmp (argv [1], "mat5"))
Chris@0 178 { update_header_test ("header.mat5", SF_FORMAT_MAT5) ;
Chris@0 179 update_seek_short_test ("header_short.mat5", SF_FORMAT_MAT5) ;
Chris@0 180 update_seek_int_test ("header_int.mat5", SF_FORMAT_MAT5) ;
Chris@0 181 update_seek_float_test ("header_float.mat5", SF_FORMAT_MAT5) ;
Chris@0 182 update_seek_double_test ("header_double.mat5", SF_FORMAT_MAT5) ;
Chris@0 183 test_count++ ;
Chris@0 184 } ;
Chris@0 185
Chris@0 186 if (do_all || ! strcmp (argv [1], "pvf"))
Chris@0 187 { update_header_test ("header.pvf", SF_FORMAT_PVF) ;
Chris@0 188 update_seek_short_test ("header_short.pvf", SF_FORMAT_PVF) ;
Chris@0 189 test_count++ ;
Chris@0 190 } ;
Chris@0 191
Chris@0 192 if (do_all || ! strcmp (argv [1], "avr"))
Chris@0 193 { update_header_test ("header.avr", SF_FORMAT_AVR) ;
Chris@0 194 update_seek_short_test ("header_short.avr", SF_FORMAT_AVR) ;
Chris@0 195 test_count++ ;
Chris@0 196 } ;
Chris@0 197
Chris@0 198 if (do_all || ! strcmp (argv [1], "htk"))
Chris@0 199 { update_header_test ("header.htk", SF_FORMAT_HTK) ;
Chris@0 200 update_seek_short_test ("header_short.htk", SF_FORMAT_HTK) ;
Chris@0 201 test_count++ ;
Chris@0 202 } ;
Chris@0 203
Chris@0 204 if (do_all || ! strcmp (argv [1], "svx"))
Chris@0 205 { update_header_test ("header.svx", SF_FORMAT_SVX) ;
Chris@0 206 update_seek_short_test ("header_short.svx", SF_FORMAT_SVX) ;
Chris@0 207 test_count++ ;
Chris@0 208 } ;
Chris@0 209
Chris@0 210 if (do_all || ! strcmp (argv [1], "voc"))
Chris@0 211 { update_header_test ("header.voc", SF_FORMAT_VOC) ;
Chris@0 212 /*-update_seek_short_test ("header_short.voc", SF_FORMAT_VOC) ;-*/
Chris@0 213 test_count++ ;
Chris@0 214 } ;
Chris@0 215
Chris@0 216 if (do_all || ! strcmp (argv [1], "sds"))
Chris@0 217 { update_header_test ("header.sds", SF_FORMAT_SDS) ;
Chris@0 218 /*-update_seek_short_test ("header_short.sds", SF_FORMAT_SDS) ;-*/
Chris@0 219 test_count++ ;
Chris@0 220 } ;
Chris@0 221
Chris@0 222 if (do_all || ! strcmp (argv [1], "mpc2k"))
Chris@0 223 { update_header_test ("header.mpc", SF_FORMAT_MPC2K) ;
Chris@0 224 update_seek_short_test ("header_short.mpc", SF_FORMAT_MPC2K) ;
Chris@0 225 test_count++ ;
Chris@0 226 } ;
Chris@0 227
Chris@0 228 if (test_count == 0)
Chris@0 229 { printf ("Mono : ************************************\n") ;
Chris@0 230 printf ("Mono : * No '%s' test defined.\n", argv [1]) ;
Chris@0 231 printf ("Mono : ************************************\n") ;
Chris@0 232 return 1 ;
Chris@0 233 } ;
Chris@0 234
Chris@0 235 return 0 ;
Chris@0 236 } /* main */
Chris@0 237
Chris@0 238
Chris@0 239 /*============================================================================================
Chris@0 240 ** Here are the test functions.
Chris@0 241 */
Chris@0 242
Chris@0 243 static void
Chris@0 244 update_header_sub (const char *filename, int typemajor, int write_mode)
Chris@0 245 { SNDFILE *outfile, *infile ;
Chris@0 246 SF_INFO sfinfo ;
Chris@0 247 int k ;
Chris@0 248
Chris@0 249 sfinfo.samplerate = 44100 ;
Chris@0 250 sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ;
Chris@0 251 sfinfo.channels = 1 ;
Chris@0 252 sfinfo.frames = 0 ;
Chris@0 253
Chris@0 254 outfile = test_open_file_or_die (filename, write_mode, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 255
Chris@0 256 for (k = 0 ; k < BUFFER_LEN ; k++)
Chris@0 257 data_out [k] = k + 1 ;
Chris@0 258 test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ;
Chris@0 259
Chris@0 260 if (typemajor != SF_FORMAT_HTK)
Chris@0 261 { /* The HTK header is not correct when the file is first written. */
Chris@0 262 infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 263 sf_close (infile) ;
Chris@0 264 } ;
Chris@0 265
Chris@0 266 sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, 0) ;
Chris@0 267
Chris@0 268 /*
Chris@0 269 ** Open file and check log buffer for an error. If header update failed
Chris@0 270 ** the the log buffer will contain errors.
Chris@0 271 */
Chris@0 272 infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 273 check_log_buffer_or_die (infile, __LINE__) ;
Chris@0 274
Chris@0 275 if (sfinfo.frames < BUFFER_LEN || sfinfo.frames > BUFFER_LEN + 50)
Chris@0 276 { printf ("\n\nLine %d : Incorrect sample count (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), BUFFER_LEN) ;
Chris@0 277 dump_log_buffer (infile) ;
Chris@0 278 exit (1) ;
Chris@0 279 } ;
Chris@0 280
Chris@0 281 test_read_int_or_die (infile, 0, data_in, BUFFER_LEN, __LINE__) ;
Chris@0 282 for (k = 0 ; k < BUFFER_LEN ; k++)
Chris@0 283 if (data_out [k] != k + 1)
Chris@0 284 printf ("Error : line %d\n", __LINE__) ;
Chris@0 285
Chris@0 286 sf_close (infile) ;
Chris@0 287
Chris@0 288 /* Set auto update on. */
Chris@0 289 sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ;
Chris@0 290
Chris@0 291 /* Write more data_out. */
Chris@0 292 for (k = 0 ; k < BUFFER_LEN ; k++)
Chris@0 293 data_out [k] = k + 2 ;
Chris@0 294 test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ;
Chris@0 295
Chris@0 296 /* Open file again and make sure no errors in log buffer. */
Chris@0 297 infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 298 check_log_buffer_or_die (infile, __LINE__) ;
Chris@0 299
Chris@0 300 if (sfinfo.frames < 2 * BUFFER_LEN || sfinfo.frames > 2 * BUFFER_LEN + 50)
Chris@0 301 { printf ("\n\nLine %d : Incorrect sample count (%ld should be %d)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), 2 * BUFFER_LEN) ;
Chris@0 302 dump_log_buffer (infile) ;
Chris@0 303 exit (1) ;
Chris@0 304 } ;
Chris@0 305
Chris@0 306 sf_close (infile) ;
Chris@0 307
Chris@0 308 sf_close (outfile) ;
Chris@0 309
Chris@0 310 unlink (filename) ;
Chris@0 311 } /* update_header_sub */
Chris@0 312
Chris@0 313 static void
Chris@0 314 update_header_test (const char *filename, int typemajor)
Chris@0 315 {
Chris@0 316 print_test_name ("update_header_test", filename) ;
Chris@0 317
Chris@0 318 update_header_sub (filename, typemajor, SFM_WRITE) ;
Chris@0 319 update_header_sub (filename, typemajor, SFM_RDWR) ;
Chris@0 320
Chris@0 321 unlink (filename) ;
Chris@0 322 puts ("ok") ;
Chris@0 323 } /* update_header_test */
Chris@0 324
Chris@0 325 /*==============================================================================
Chris@0 326 */
Chris@0 327
Chris@0 328 static void
Chris@0 329 update_seek_short_test (const char *filename, int filetype)
Chris@0 330 { SNDFILE *outfile, *infile ;
Chris@0 331 SF_INFO sfinfo ;
Chris@0 332 sf_count_t frames ;
Chris@0 333 short buffer [8] ;
Chris@0 334 int k ;
Chris@0 335
Chris@0 336 print_test_name ("update_seek_short_test", filename) ;
Chris@0 337
Chris@0 338 memset (buffer, 0, sizeof (buffer)) ;
Chris@0 339
Chris@0 340 /* Create sound outfile with no data. */
Chris@0 341 sfinfo.format = filetype | SF_FORMAT_PCM_16 ;
Chris@0 342 sfinfo.samplerate = 48000 ;
Chris@0 343 sfinfo.channels = 2 ;
Chris@0 344
Chris@0 345 if (sf_format_check (&sfinfo) == SF_FALSE)
Chris@0 346 sfinfo.channels = 1 ;
Chris@0 347
Chris@0 348 outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 349 sf_close (outfile) ;
Chris@0 350
Chris@0 351 /* Open again for read/write. */
Chris@0 352 outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 353
Chris@0 354 /*
Chris@0 355 ** In auto header update mode, seeking to the end of the file with
Chris@0 356 ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END
Chris@0 357 ** will seek to 0 anyway
Chris@0 358 */
Chris@0 359 if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
Chris@0 360 { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
Chris@0 361 exit (1) ;
Chris@0 362 } ;
Chris@0 363
Chris@0 364 /* Now write some frames. */
Chris@0 365 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
Chris@0 366
Chris@0 367 for (k = 0 ; k < 6 ; k++)
Chris@0 368 { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ;
Chris@0 369 test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ;
Chris@0 370
Chris@0 371 /* Open file again and make sure no errors in log buffer. */
Chris@0 372 infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 373 check_log_buffer_or_die (infile, __LINE__) ;
Chris@0 374 sf_close (infile) ;
Chris@0 375
Chris@0 376 if (sfinfo.frames != k * frames)
Chris@0 377 { printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
Chris@0 378 dump_log_buffer (infile) ;
Chris@0 379 exit (1) ;
Chris@0 380 } ;
Chris@0 381
Chris@0 382 if ((k & 1) == 0)
Chris@0 383 test_write_short_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ;
Chris@0 384 else
Chris@0 385 test_writef_short_or_die (outfile, k, buffer, frames, __LINE__) ;
Chris@0 386 } ;
Chris@0 387
Chris@0 388 sf_close (outfile) ;
Chris@0 389 unlink (filename) ;
Chris@0 390
Chris@0 391 puts ("ok") ;
Chris@0 392 return ;
Chris@0 393 } /* update_seek_short_test */
Chris@0 394
Chris@0 395 static void
Chris@0 396 update_seek_int_test (const char *filename, int filetype)
Chris@0 397 { SNDFILE *outfile, *infile ;
Chris@0 398 SF_INFO sfinfo ;
Chris@0 399 sf_count_t frames ;
Chris@0 400 int buffer [8] ;
Chris@0 401 int k ;
Chris@0 402
Chris@0 403 print_test_name ("update_seek_int_test", filename) ;
Chris@0 404
Chris@0 405 memset (buffer, 0, sizeof (buffer)) ;
Chris@0 406
Chris@0 407 /* Create sound outfile with no data. */
Chris@0 408 sfinfo.format = filetype | SF_FORMAT_PCM_32 ;
Chris@0 409 sfinfo.samplerate = 48000 ;
Chris@0 410 sfinfo.channels = 2 ;
Chris@0 411
Chris@0 412 if (sf_format_check (&sfinfo) == SF_FALSE)
Chris@0 413 sfinfo.channels = 1 ;
Chris@0 414
Chris@0 415 outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 416 sf_close (outfile) ;
Chris@0 417
Chris@0 418 /* Open again for read/write. */
Chris@0 419 outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 420
Chris@0 421 /*
Chris@0 422 ** In auto header update mode, seeking to the end of the file with
Chris@0 423 ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END
Chris@0 424 ** will seek to 0 anyway
Chris@0 425 */
Chris@0 426 if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
Chris@0 427 { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
Chris@0 428 exit (1) ;
Chris@0 429 } ;
Chris@0 430
Chris@0 431 /* Now write some frames. */
Chris@0 432 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
Chris@0 433
Chris@0 434 for (k = 0 ; k < 6 ; k++)
Chris@0 435 { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ;
Chris@0 436 test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ;
Chris@0 437
Chris@0 438 /* Open file again and make sure no errors in log buffer. */
Chris@0 439 infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 440 check_log_buffer_or_die (infile, __LINE__) ;
Chris@0 441 sf_close (infile) ;
Chris@0 442
Chris@0 443 if (sfinfo.frames != k * frames)
Chris@0 444 { printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
Chris@0 445 dump_log_buffer (infile) ;
Chris@0 446 exit (1) ;
Chris@0 447 } ;
Chris@0 448
Chris@0 449 if ((k & 1) == 0)
Chris@0 450 test_write_int_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ;
Chris@0 451 else
Chris@0 452 test_writef_int_or_die (outfile, k, buffer, frames, __LINE__) ;
Chris@0 453 } ;
Chris@0 454
Chris@0 455 sf_close (outfile) ;
Chris@0 456 unlink (filename) ;
Chris@0 457
Chris@0 458 puts ("ok") ;
Chris@0 459 return ;
Chris@0 460 } /* update_seek_int_test */
Chris@0 461
Chris@0 462 static void
Chris@0 463 update_seek_float_test (const char *filename, int filetype)
Chris@0 464 { SNDFILE *outfile, *infile ;
Chris@0 465 SF_INFO sfinfo ;
Chris@0 466 sf_count_t frames ;
Chris@0 467 float buffer [8] ;
Chris@0 468 int k ;
Chris@0 469
Chris@0 470 print_test_name ("update_seek_float_test", filename) ;
Chris@0 471
Chris@0 472 memset (buffer, 0, sizeof (buffer)) ;
Chris@0 473
Chris@0 474 /* Create sound outfile with no data. */
Chris@0 475 sfinfo.format = filetype | SF_FORMAT_FLOAT ;
Chris@0 476 sfinfo.samplerate = 48000 ;
Chris@0 477 sfinfo.channels = 2 ;
Chris@0 478
Chris@0 479 if (sf_format_check (&sfinfo) == SF_FALSE)
Chris@0 480 sfinfo.channels = 1 ;
Chris@0 481
Chris@0 482 outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 483 sf_close (outfile) ;
Chris@0 484
Chris@0 485 /* Open again for read/write. */
Chris@0 486 outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 487
Chris@0 488 /*
Chris@0 489 ** In auto header update mode, seeking to the end of the file with
Chris@0 490 ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END
Chris@0 491 ** will seek to 0 anyway
Chris@0 492 */
Chris@0 493 if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
Chris@0 494 { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
Chris@0 495 exit (1) ;
Chris@0 496 } ;
Chris@0 497
Chris@0 498 /* Now write some frames. */
Chris@0 499 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
Chris@0 500
Chris@0 501 for (k = 0 ; k < 6 ; k++)
Chris@0 502 { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ;
Chris@0 503 test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ;
Chris@0 504
Chris@0 505 /* Open file again and make sure no errors in log buffer. */
Chris@0 506 infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 507 check_log_buffer_or_die (infile, __LINE__) ;
Chris@0 508 sf_close (infile) ;
Chris@0 509
Chris@0 510 if (sfinfo.frames != k * frames)
Chris@0 511 { printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
Chris@0 512 dump_log_buffer (infile) ;
Chris@0 513 exit (1) ;
Chris@0 514 } ;
Chris@0 515
Chris@0 516 if ((k & 1) == 0)
Chris@0 517 test_write_float_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ;
Chris@0 518 else
Chris@0 519 test_writef_float_or_die (outfile, k, buffer, frames, __LINE__) ;
Chris@0 520 } ;
Chris@0 521
Chris@0 522 sf_close (outfile) ;
Chris@0 523 unlink (filename) ;
Chris@0 524
Chris@0 525 puts ("ok") ;
Chris@0 526 return ;
Chris@0 527 } /* update_seek_float_test */
Chris@0 528
Chris@0 529 static void
Chris@0 530 update_seek_double_test (const char *filename, int filetype)
Chris@0 531 { SNDFILE *outfile, *infile ;
Chris@0 532 SF_INFO sfinfo ;
Chris@0 533 sf_count_t frames ;
Chris@0 534 double buffer [8] ;
Chris@0 535 int k ;
Chris@0 536
Chris@0 537 print_test_name ("update_seek_double_test", filename) ;
Chris@0 538
Chris@0 539 memset (buffer, 0, sizeof (buffer)) ;
Chris@0 540
Chris@0 541 /* Create sound outfile with no data. */
Chris@0 542 sfinfo.format = filetype | SF_FORMAT_DOUBLE ;
Chris@0 543 sfinfo.samplerate = 48000 ;
Chris@0 544 sfinfo.channels = 2 ;
Chris@0 545
Chris@0 546 if (sf_format_check (&sfinfo) == SF_FALSE)
Chris@0 547 sfinfo.channels = 1 ;
Chris@0 548
Chris@0 549 outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 550 sf_close (outfile) ;
Chris@0 551
Chris@0 552 /* Open again for read/write. */
Chris@0 553 outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 554
Chris@0 555 /*
Chris@0 556 ** In auto header update mode, seeking to the end of the file with
Chris@0 557 ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END
Chris@0 558 ** will seek to 0 anyway
Chris@0 559 */
Chris@0 560 if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
Chris@0 561 { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
Chris@0 562 exit (1) ;
Chris@0 563 } ;
Chris@0 564
Chris@0 565 /* Now write some frames. */
Chris@0 566 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
Chris@0 567
Chris@0 568 for (k = 0 ; k < 6 ; k++)
Chris@0 569 { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ;
Chris@0 570 test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ;
Chris@0 571
Chris@0 572 /* Open file again and make sure no errors in log buffer. */
Chris@0 573 infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 574 check_log_buffer_or_die (infile, __LINE__) ;
Chris@0 575 sf_close (infile) ;
Chris@0 576
Chris@0 577 if (sfinfo.frames != k * frames)
Chris@0 578 { printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", __LINE__, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
Chris@0 579 dump_log_buffer (infile) ;
Chris@0 580 exit (1) ;
Chris@0 581 } ;
Chris@0 582
Chris@0 583 if ((k & 1) == 0)
Chris@0 584 test_write_double_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ;
Chris@0 585 else
Chris@0 586 test_writef_double_or_die (outfile, k, buffer, frames, __LINE__) ;
Chris@0 587 } ;
Chris@0 588
Chris@0 589 sf_close (outfile) ;
Chris@0 590 unlink (filename) ;
Chris@0 591
Chris@0 592 puts ("ok") ;
Chris@0 593 return ;
Chris@0 594 } /* update_seek_double_test */
Chris@0 595
Chris@0 596
Chris@0 597
Chris@0 598 static void
Chris@0 599 header_shrink_test (const char *filename, int filetype)
Chris@0 600 { SNDFILE *outfile, *infile ;
Chris@0 601 SF_INFO sfinfo ;
Chris@0 602 sf_count_t frames ;
Chris@0 603 float buffer [8], bufferin [8] ;
Chris@0 604
Chris@0 605 print_test_name ("header_shrink_test", filename) ;
Chris@0 606
Chris@0 607 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@0 608 sfinfo.samplerate = 44100 ;
Chris@0 609 sfinfo.format = filetype | SF_FORMAT_FLOAT ;
Chris@0 610 sfinfo.channels = 1 ;
Chris@0 611
Chris@0 612 memset (buffer, 0xA0, sizeof (buffer)) ;
Chris@0 613
Chris@0 614 /* Now write some frames. */
Chris@0 615 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
Chris@0 616
Chris@0 617 /* Test the file with extra header data. */
Chris@0 618 outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
Chris@0 619
Chris@0 620 sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ;
Chris@0 621 sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, SF_FALSE) ;
Chris@0 622 sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ;
Chris@0 623
Chris@0 624 test_writef_float_or_die (outfile, 0, buffer, frames, __LINE__) ;
Chris@0 625 sf_close (outfile) ;
Chris@0 626
Chris@0 627 /* Open again for read. */
Chris@0 628 infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
Chris@0 629
Chris@0 630 test_readf_float_or_die (infile, 0, bufferin, frames, __LINE__) ;
Chris@0 631 sf_close (infile) ;
Chris@0 632
Chris@0 633 compare_float_or_die (buffer, bufferin, frames, __LINE__) ;
Chris@0 634
Chris@0 635 unlink (filename) ;
Chris@0 636 puts ("ok") ;
Chris@0 637 return ;
Chris@0 638 } /* header_shrink_test */
Chris@0 639
Chris@0 640
Chris@0 641 static void
Chris@0 642 extra_header_test (const char *filename, int filetype)
Chris@0 643 { SNDFILE *outfile, *infile ;
Chris@0 644 SF_INFO sfinfo ;
Chris@0 645 sf_count_t frames ;
Chris@0 646 short buffer [8] ;
Chris@0 647 int k = 0 ;
Chris@0 648
Chris@0 649 print_test_name ("extra_header_test", filename) ;
Chris@0 650
Chris@0 651 sfinfo.samplerate = 44100 ;
Chris@0 652 sfinfo.format = (filetype | SF_FORMAT_PCM_16) ;
Chris@0 653 sfinfo.channels = 1 ;
Chris@0 654
Chris@0 655 memset (buffer, 0xA0, sizeof (buffer)) ;
Chris@0 656
Chris@0 657 /* Now write some frames. */
Chris@0 658 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
Chris@0 659
Chris@0 660 /* Test the file with extra header data. */
Chris@0 661 outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, 462) ;
Chris@0 662 sf_set_string (outfile, SF_STR_TITLE, filename) ;
Chris@0 663 test_writef_short_or_die (outfile, k, buffer, frames, 464) ;
Chris@0 664 sf_set_string (outfile, SF_STR_COPYRIGHT, "(c) 1980 Erik") ;
Chris@0 665 sf_close (outfile) ;
Chris@0 666
Chris@0 667 #if 1
Chris@0 668 /*
Chris@0 669 ** Erik de Castro Lopo <erikd@mega-nerd.com> May 23 2004.
Chris@0 670 **
Chris@0 671 ** This file has extra string data in the header and therefore cannot
Chris@0 672 ** currently be opened in SFM_RDWR mode. This is fixable, but its in
Chris@0 673 ** a part of the code I don't want to fiddle with until the Ogg/Vorbis
Chris@0 674 ** integration is done.
Chris@0 675 */
Chris@0 676
Chris@0 677 if ((infile = sf_open (filename, SFM_RDWR, &sfinfo)) != NULL)
Chris@0 678 { printf ("\n\nError : should not be able to open this file in SFM_RDWR.\n\n") ;
Chris@0 679 exit (1) ;
Chris@0 680 } ;
Chris@0 681
Chris@0 682 unlink (filename) ;
Chris@0 683 puts ("ok") ;
Chris@0 684 return ;
Chris@0 685 #else
Chris@0 686
Chris@0 687 hexdump_file (filename, 0, 100000) ;
Chris@0 688
Chris@0 689 /* Open again for read/write. */
Chris@0 690 outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, 491) ;
Chris@0 691
Chris@0 692 /*
Chris@0 693 ** In auto header update mode, seeking to the end of the file with
Chris@0 694 ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END
Chris@0 695 ** will seek to 0 anyway
Chris@0 696 */
Chris@0 697 if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
Chris@0 698 { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
Chris@0 699 exit (1) ;
Chris@0 700 } ;
Chris@0 701
Chris@0 702 /* Now write some frames. */
Chris@0 703 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
Chris@0 704
Chris@0 705 for (k = 1 ; k < 6 ; k++)
Chris@0 706 {
Chris@0 707 printf ("\n*** pass %d\n", k) ;
Chris@0 708 memset (buffer, 0xA0 + k, sizeof (buffer)) ;
Chris@0 709
Chris@0 710
Chris@0 711 test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, 512) ;
Chris@0 712 test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, 513) ;
Chris@0 713
Chris@0 714 /* Open file again and make sure no errors in log buffer. */
Chris@0 715 if (0)
Chris@0 716 { infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, 517) ;
Chris@0 717 check_log_buffer_or_die (infile, 518) ;
Chris@0 718 sf_close (infile) ;
Chris@0 719 } ;
Chris@0 720
Chris@0 721 if (sfinfo.frames != k * frames)
Chris@0 722 { printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", 523, SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
Chris@0 723 dump_log_buffer (infile) ;
Chris@0 724 exit (1) ;
Chris@0 725 } ;
Chris@0 726
Chris@0 727 if ((k & 1) == 0)
Chris@0 728 test_write_short_or_die (outfile, k, buffer, sfinfo.channels * frames, 529) ;
Chris@0 729 else
Chris@0 730 test_writef_short_or_die (outfile, k, buffer, frames, 531) ;
Chris@0 731 hexdump_file (filename, 0, 100000) ;
Chris@0 732 } ;
Chris@0 733
Chris@0 734 sf_close (outfile) ;
Chris@0 735 unlink (filename) ;
Chris@0 736
Chris@0 737 puts ("ok") ;
Chris@0 738 return ;
Chris@0 739 #endif
Chris@0 740 } /* extra_header_test */
Chris@0 741