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