annotate src/libsndfile-1.0.25/tests/header_test.tpl @ 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 [+ AutoGen5 template c +]
Chris@0 2 /*
Chris@0 3 ** Copyright (C) 2001-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@0 4 **
Chris@0 5 ** This program is free software ; you can redistribute it and/or modify
Chris@0 6 ** it under the terms of the GNU General Public License as published by
Chris@0 7 ** the Free Software Foundation ; either version 2 of the License, or
Chris@0 8 ** (at your option) any later version.
Chris@0 9 **
Chris@0 10 ** This program is distributed in the hope that it will be useful,
Chris@0 11 ** but WITHOUT ANY WARRANTY ; without even the implied warranty of
Chris@0 12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 13 ** GNU General Public License for more details.
Chris@0 14 **
Chris@0 15 ** You should have received a copy of the GNU General Public License
Chris@0 16 ** along with this program ; if not, write to the Free Software
Chris@0 17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Chris@0 18 */
Chris@0 19
Chris@0 20 #include "sfconfig.h"
Chris@0 21
Chris@0 22 #include <stdio.h>
Chris@0 23 #include <stdlib.h>
Chris@0 24 #include <string.h>
Chris@0 25
Chris@0 26 #include <sys/stat.h>
Chris@0 27 #include <math.h>
Chris@0 28
Chris@0 29 #if HAVE_UNISTD_H
Chris@0 30 #include <unistd.h>
Chris@0 31 #endif
Chris@0 32
Chris@0 33 #if (HAVE_DECL_S_IRGRP == 0)
Chris@0 34 #include <sf_unistd.h>
Chris@0 35 #endif
Chris@0 36
Chris@0 37 #if (defined (WIN32) || defined (_WIN32))
Chris@0 38 #include <io.h>
Chris@0 39 #include <direct.h>
Chris@0 40 #endif
Chris@0 41
Chris@0 42 #include <sndfile.h>
Chris@0 43
Chris@0 44 #include "utils.h"
Chris@0 45
Chris@0 46 #define BUFFER_LEN (1<<10)
Chris@0 47 #define LOG_BUFFER_SIZE 1024
Chris@0 48
Chris@0 49 static void update_header_test (const char *filename, int typemajor) ;
Chris@0 50
Chris@0 51 [+ FOR data_type
Chris@0 52 +]static void update_seek_[+ (get "name") +]_test (const char *filename, int filetype) ;
Chris@0 53 [+ ENDFOR data_type
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 [+ FOR data_type
Chris@0 329 +]static void
Chris@0 330 update_seek_[+ (get "name") +]_test (const char *filename, int filetype)
Chris@0 331 { SNDFILE *outfile, *infile ;
Chris@0 332 SF_INFO sfinfo ;
Chris@0 333 sf_count_t frames ;
Chris@0 334 [+ (get "name") +] buffer [8] ;
Chris@0 335 int k ;
Chris@0 336
Chris@0 337 print_test_name ("update_seek_[+ (get "name") +]_test", filename) ;
Chris@0 338
Chris@0 339 memset (buffer, 0, sizeof (buffer)) ;
Chris@0 340
Chris@0 341 /* Create sound outfile with no data. */
Chris@0 342 sfinfo.format = filetype | [+ (get "format") +] ;
Chris@0 343 sfinfo.samplerate = 48000 ;
Chris@0 344 sfinfo.channels = 2 ;
Chris@0 345
Chris@0 346 if (sf_format_check (&sfinfo) == SF_FALSE)
Chris@0 347 sfinfo.channels = 1 ;
Chris@0 348
Chris@0 349 outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 350 sf_close (outfile) ;
Chris@0 351
Chris@0 352 /* Open again for read/write. */
Chris@0 353 outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 354
Chris@0 355 /*
Chris@0 356 ** In auto header update mode, seeking to the end of the file with
Chris@0 357 ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END
Chris@0 358 ** will seek to 0 anyway
Chris@0 359 */
Chris@0 360 if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
Chris@0 361 { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
Chris@0 362 exit (1) ;
Chris@0 363 } ;
Chris@0 364
Chris@0 365 /* Now write some frames. */
Chris@0 366 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
Chris@0 367
Chris@0 368 for (k = 0 ; k < 6 ; k++)
Chris@0 369 { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ;
Chris@0 370 test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ;
Chris@0 371
Chris@0 372 /* Open file again and make sure no errors in log buffer. */
Chris@0 373 infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 374 check_log_buffer_or_die (infile, __LINE__) ;
Chris@0 375 sf_close (infile) ;
Chris@0 376
Chris@0 377 if (sfinfo.frames != k * frames)
Chris@0 378 { 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 379 dump_log_buffer (infile) ;
Chris@0 380 exit (1) ;
Chris@0 381 } ;
Chris@0 382
Chris@0 383 if ((k & 1) == 0)
Chris@0 384 test_write_[+ (get "name") +]_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ;
Chris@0 385 else
Chris@0 386 test_writef_[+ (get "name") +]_or_die (outfile, k, buffer, frames, __LINE__) ;
Chris@0 387 } ;
Chris@0 388
Chris@0 389 sf_close (outfile) ;
Chris@0 390 unlink (filename) ;
Chris@0 391
Chris@0 392 puts ("ok") ;
Chris@0 393 return ;
Chris@0 394 } /* update_seek_[+ (get "name") +]_test */
Chris@0 395
Chris@0 396 [+ ENDFOR data_type
Chris@0 397 +]
Chris@0 398
Chris@0 399 static void
Chris@0 400 header_shrink_test (const char *filename, int filetype)
Chris@0 401 { SNDFILE *outfile, *infile ;
Chris@0 402 SF_INFO sfinfo ;
Chris@0 403 sf_count_t frames ;
Chris@0 404 float buffer [8], bufferin [8] ;
Chris@0 405
Chris@0 406 print_test_name ("header_shrink_test", filename) ;
Chris@0 407
Chris@0 408 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@0 409 sfinfo.samplerate = 44100 ;
Chris@0 410 sfinfo.format = filetype | SF_FORMAT_FLOAT ;
Chris@0 411 sfinfo.channels = 1 ;
Chris@0 412
Chris@0 413 memset (buffer, 0xA0, sizeof (buffer)) ;
Chris@0 414
Chris@0 415 /* Now write some frames. */
Chris@0 416 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
Chris@0 417
Chris@0 418 /* Test the file with extra header data. */
Chris@0 419 outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
Chris@0 420
Chris@0 421 sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ;
Chris@0 422 sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, SF_FALSE) ;
Chris@0 423 sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ;
Chris@0 424
Chris@0 425 test_writef_float_or_die (outfile, 0, buffer, frames, __LINE__) ;
Chris@0 426 sf_close (outfile) ;
Chris@0 427
Chris@0 428 /* Open again for read. */
Chris@0 429 infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
Chris@0 430
Chris@0 431 test_readf_float_or_die (infile, 0, bufferin, frames, __LINE__) ;
Chris@0 432 sf_close (infile) ;
Chris@0 433
Chris@0 434 compare_float_or_die (buffer, bufferin, frames, __LINE__) ;
Chris@0 435
Chris@0 436 unlink (filename) ;
Chris@0 437 puts ("ok") ;
Chris@0 438 return ;
Chris@0 439 } /* header_shrink_test */
Chris@0 440
Chris@0 441
Chris@0 442 static void
Chris@0 443 extra_header_test (const char *filename, int filetype)
Chris@0 444 { SNDFILE *outfile, *infile ;
Chris@0 445 SF_INFO sfinfo ;
Chris@0 446 sf_count_t frames ;
Chris@0 447 short buffer [8] ;
Chris@0 448 int k = 0 ;
Chris@0 449
Chris@0 450 print_test_name ("extra_header_test", filename) ;
Chris@0 451
Chris@0 452 sfinfo.samplerate = 44100 ;
Chris@0 453 sfinfo.format = (filetype | SF_FORMAT_PCM_16) ;
Chris@0 454 sfinfo.channels = 1 ;
Chris@0 455
Chris@0 456 memset (buffer, 0xA0, sizeof (buffer)) ;
Chris@0 457
Chris@0 458 /* Now write some frames. */
Chris@0 459 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
Chris@0 460
Chris@0 461 /* Test the file with extra header data. */
Chris@0 462 outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, [+ (tpl-file-line "%2$d") +]) ;
Chris@0 463 sf_set_string (outfile, SF_STR_TITLE, filename) ;
Chris@0 464 test_writef_short_or_die (outfile, k, buffer, frames, [+ (tpl-file-line "%2$d") +]) ;
Chris@0 465 sf_set_string (outfile, SF_STR_COPYRIGHT, "(c) 1980 Erik") ;
Chris@0 466 sf_close (outfile) ;
Chris@0 467
Chris@0 468 #if 1
Chris@0 469 /*
Chris@0 470 ** Erik de Castro Lopo <erikd@mega-nerd.com> May 23 2004.
Chris@0 471 **
Chris@0 472 ** This file has extra string data in the header and therefore cannot
Chris@0 473 ** currently be opened in SFM_RDWR mode. This is fixable, but its in
Chris@0 474 ** a part of the code I don't want to fiddle with until the Ogg/Vorbis
Chris@0 475 ** integration is done.
Chris@0 476 */
Chris@0 477
Chris@0 478 if ((infile = sf_open (filename, SFM_RDWR, &sfinfo)) != NULL)
Chris@0 479 { printf ("\n\nError : should not be able to open this file in SFM_RDWR.\n\n") ;
Chris@0 480 exit (1) ;
Chris@0 481 } ;
Chris@0 482
Chris@0 483 unlink (filename) ;
Chris@0 484 puts ("ok") ;
Chris@0 485 return ;
Chris@0 486 #else
Chris@0 487
Chris@0 488 hexdump_file (filename, 0, 100000) ;
Chris@0 489
Chris@0 490 /* Open again for read/write. */
Chris@0 491 outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, [+ (tpl-file-line "%2$d") +]) ;
Chris@0 492
Chris@0 493 /*
Chris@0 494 ** In auto header update mode, seeking to the end of the file with
Chris@0 495 ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END
Chris@0 496 ** will seek to 0 anyway
Chris@0 497 */
Chris@0 498 if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0)
Chris@0 499 { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ;
Chris@0 500 exit (1) ;
Chris@0 501 } ;
Chris@0 502
Chris@0 503 /* Now write some frames. */
Chris@0 504 frames = ARRAY_LEN (buffer) / sfinfo.channels ;
Chris@0 505
Chris@0 506 for (k = 1 ; k < 6 ; k++)
Chris@0 507 {
Chris@0 508 printf ("\n*** pass %d\n", k) ;
Chris@0 509 memset (buffer, 0xA0 + k, sizeof (buffer)) ;
Chris@0 510
Chris@0 511
Chris@0 512 test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, [+ (tpl-file-line "%2$d") +]) ;
Chris@0 513 test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, [+ (tpl-file-line "%2$d") +]) ;
Chris@0 514
Chris@0 515 /* Open file again and make sure no errors in log buffer. */
Chris@0 516 if (0)
Chris@0 517 { infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, [+ (tpl-file-line "%2$d") +]) ;
Chris@0 518 check_log_buffer_or_die (infile, [+ (tpl-file-line "%2$d") +]) ;
Chris@0 519 sf_close (infile) ;
Chris@0 520 } ;
Chris@0 521
Chris@0 522 if (sfinfo.frames != k * frames)
Chris@0 523 { printf ("\n\nLine %d : Incorrect sample count (%ld should be %ld)\n", [+ (tpl-file-line "%2$d") +], SF_COUNT_TO_LONG (sfinfo.frames), SF_COUNT_TO_LONG (k + frames)) ;
Chris@0 524 dump_log_buffer (infile) ;
Chris@0 525 exit (1) ;
Chris@0 526 } ;
Chris@0 527
Chris@0 528 if ((k & 1) == 0)
Chris@0 529 test_write_short_or_die (outfile, k, buffer, sfinfo.channels * frames, [+ (tpl-file-line "%2$d") +]) ;
Chris@0 530 else
Chris@0 531 test_writef_short_or_die (outfile, k, buffer, frames, [+ (tpl-file-line "%2$d") +]) ;
Chris@0 532 hexdump_file (filename, 0, 100000) ;
Chris@0 533 } ;
Chris@0 534
Chris@0 535 sf_close (outfile) ;
Chris@0 536 unlink (filename) ;
Chris@0 537
Chris@0 538 puts ("ok") ;
Chris@0 539 return ;
Chris@0 540 #endif
Chris@0 541 } /* extra_header_test */
Chris@0 542