annotate src/libsndfile-1.0.27/tests/command_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-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 <stdint.h>
Chris@40 24 #include <inttypes.h>
Chris@40 25 #include <string.h>
Chris@40 26 #include <time.h>
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 <math.h>
Chris@40 33
Chris@40 34 #include <sndfile.h>
Chris@40 35
Chris@40 36 #include "sfendian.h"
Chris@40 37 #include "utils.h"
Chris@40 38
Chris@40 39 #define BUFFER_LEN (1 << 10)
Chris@40 40 #define LOG_BUFFER_SIZE 1024
Chris@40 41 #define data_MARKER MAKE_MARKER ('d', 'a', 't', 'a')
Chris@40 42
Chris@40 43 static void float_norm_test (const char *filename) ;
Chris@40 44 static void double_norm_test (const char *filename) ;
Chris@40 45 static void format_tests (void) ;
Chris@40 46 static void calc_peak_test (int filetype, const char *filename, int channels) ;
Chris@40 47 static void truncate_test (const char *filename, int filetype) ;
Chris@40 48 static void instrument_test (const char *filename, int filetype) ;
Chris@40 49 static void cue_test (const char *filename, int filetype) ;
Chris@40 50 static void channel_map_test (const char *filename, int filetype) ;
Chris@40 51 static void current_sf_info_test (const char *filename) ;
Chris@40 52 static void raw_needs_endswap_test (const char *filename, int filetype) ;
Chris@40 53
Chris@40 54 static void broadcast_test (const char *filename, int filetype) ;
Chris@40 55 static void broadcast_rdwr_test (const char *filename, int filetype) ;
Chris@40 56 static void broadcast_coding_history_test (const char *filename) ;
Chris@40 57 static void broadcast_coding_history_size (const char *filename) ;
Chris@40 58
Chris@40 59 /* Cart Chunk tests */
Chris@40 60 static void cart_test (const char *filename, int filetype) ;
Chris@40 61 static void cart_rdwr_test (const char *filename, int filetype) ;
Chris@40 62
Chris@40 63 /* Force the start of this buffer to be double aligned. Sparc-solaris will
Chris@40 64 ** choke if its not.
Chris@40 65 */
Chris@40 66
Chris@40 67 static int int_data [BUFFER_LEN] ;
Chris@40 68 static float float_data [BUFFER_LEN] ;
Chris@40 69 static double double_data [BUFFER_LEN] ;
Chris@40 70
Chris@40 71 int
Chris@40 72 main (int argc, char *argv [])
Chris@40 73 { int do_all = 0 ;
Chris@40 74 int test_count = 0 ;
Chris@40 75
Chris@40 76 if (argc != 2)
Chris@40 77 { printf ("Usage : %s <test>\n", argv [0]) ;
Chris@40 78 printf (" Where <test> is one of the following:\n") ;
Chris@40 79 printf (" ver - test sf_command (SFC_GETLIB_VERSION)\n") ;
Chris@40 80 printf (" norm - test floating point normalisation\n") ;
Chris@40 81 printf (" format - test format string commands\n") ;
Chris@40 82 printf (" peak - test peak calculation\n") ;
Chris@40 83 printf (" trunc - test file truncation\n") ;
Chris@40 84 printf (" inst - test set/get of SF_INSTRUMENT.\n") ;
Chris@40 85 printf (" cue - test set/get of SF_CUES.\n") ;
Chris@40 86 printf (" chanmap - test set/get of channel map data..\n") ;
Chris@40 87 printf (" bext - test set/get of SF_BROADCAST_INFO.\n") ;
Chris@40 88 printf (" bextch - test set/get of SF_BROADCAST_INFO coding_history.\n") ;
Chris@40 89 printf (" cart - test set/get of SF_CART_INFO.\n") ;
Chris@40 90 printf (" rawend - test SFC_RAW_NEEDS_ENDSWAP.\n") ;
Chris@40 91 printf (" all - perform all tests\n") ;
Chris@40 92 exit (1) ;
Chris@40 93 } ;
Chris@40 94
Chris@40 95 do_all = ! strcmp (argv [1], "all") ;
Chris@40 96
Chris@40 97 if (do_all || strcmp (argv [1], "ver") == 0)
Chris@40 98 { char buffer [128] ;
Chris@40 99
Chris@40 100 print_test_name ("version_test", "(none)") ;
Chris@40 101 buffer [0] = 0 ;
Chris@40 102 sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ;
Chris@40 103 if (strlen (buffer) < 1)
Chris@40 104 { printf ("Line %d: could not retrieve lib version.\n", __LINE__) ;
Chris@40 105 exit (1) ;
Chris@40 106 } ;
Chris@40 107 puts ("ok") ;
Chris@40 108 test_count ++ ;
Chris@40 109 } ;
Chris@40 110
Chris@40 111 if (do_all || strcmp (argv [1], "norm") == 0)
Chris@40 112 { /* Preliminary float/double normalisation tests. More testing
Chris@40 113 ** is done in the program 'floating_point_test'.
Chris@40 114 */
Chris@40 115 float_norm_test ("float.wav") ;
Chris@40 116 double_norm_test ("double.wav") ;
Chris@40 117 test_count ++ ;
Chris@40 118 } ;
Chris@40 119
Chris@40 120 if (do_all || strcmp (argv [1], "peak") == 0)
Chris@40 121 { calc_peak_test (SF_ENDIAN_BIG | SF_FORMAT_RAW, "be-peak.raw", 1) ;
Chris@40 122 calc_peak_test (SF_ENDIAN_LITTLE | SF_FORMAT_RAW, "le-peak.raw", 1) ;
Chris@40 123 calc_peak_test (SF_ENDIAN_BIG | SF_FORMAT_RAW, "be-peak.raw", 7) ;
Chris@40 124 calc_peak_test (SF_ENDIAN_LITTLE | SF_FORMAT_RAW, "le-peak.raw", 7) ;
Chris@40 125 test_count ++ ;
Chris@40 126 } ;
Chris@40 127
Chris@40 128 if (do_all || ! strcmp (argv [1], "format"))
Chris@40 129 { format_tests () ;
Chris@40 130 test_count ++ ;
Chris@40 131 } ;
Chris@40 132
Chris@40 133 if (do_all || strcmp (argv [1], "trunc") == 0)
Chris@40 134 { truncate_test ("truncate.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_32) ;
Chris@40 135 truncate_test ("truncate.au" , SF_FORMAT_AU | SF_FORMAT_PCM_16) ;
Chris@40 136 test_count ++ ;
Chris@40 137 } ;
Chris@40 138
Chris@40 139 if (do_all || strcmp (argv [1], "inst") == 0)
Chris@40 140 { instrument_test ("instrument.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@40 141 instrument_test ("instrument.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_24) ;
Chris@40 142 /*-instrument_test ("instrument.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16) ;-*/
Chris@40 143 test_count ++ ;
Chris@40 144 } ;
Chris@40 145
Chris@40 146 if (do_all || strcmp (argv [1], "cue") == 0)
Chris@40 147 { cue_test ("cue.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@40 148 cue_test ("cue.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_24) ;
Chris@40 149 test_count ++ ;
Chris@40 150 } ;
Chris@40 151
Chris@40 152 if (do_all || strcmp (argv [1], "current_sf_info") == 0)
Chris@40 153 { current_sf_info_test ("current.wav") ;
Chris@40 154 test_count ++ ;
Chris@40 155 } ;
Chris@40 156
Chris@40 157 if (do_all || strcmp (argv [1], "bext") == 0)
Chris@40 158 { broadcast_test ("broadcast.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@40 159 broadcast_rdwr_test ("broadcast.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@40 160
Chris@40 161 broadcast_test ("broadcast.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ;
Chris@40 162 broadcast_rdwr_test ("broadcast.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ;
Chris@40 163
Chris@40 164 broadcast_test ("broadcast.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
Chris@40 165 broadcast_rdwr_test ("broadcast.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
Chris@40 166 test_count ++ ;
Chris@40 167 } ;
Chris@40 168
Chris@40 169 if (do_all || strcmp (argv [1], "cart") == 0)
Chris@40 170 { cart_test ("cart.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@40 171 cart_rdwr_test ("cart.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@40 172 cart_test ("cart.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
Chris@40 173 cart_rdwr_test ("cart.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
Chris@40 174 test_count ++ ;
Chris@40 175 } ;
Chris@40 176
Chris@40 177 if (do_all || strcmp (argv [1], "bextch") == 0)
Chris@40 178 { broadcast_coding_history_test ("coding_history.wav") ;
Chris@40 179 broadcast_coding_history_size ("coding_hist_size.wav") ;
Chris@40 180 test_count ++ ;
Chris@40 181 } ;
Chris@40 182
Chris@40 183 if (do_all || strcmp (argv [1], "chanmap") == 0)
Chris@40 184 { channel_map_test ("chanmap.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ;
Chris@40 185 channel_map_test ("chanmap.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ;
Chris@40 186 channel_map_test ("chanmap.aifc" , SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ;
Chris@40 187 channel_map_test ("chanmap.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_16) ;
Chris@40 188 test_count ++ ;
Chris@40 189 } ;
Chris@40 190
Chris@40 191 if (do_all || strcmp (argv [1], "rawend") == 0)
Chris@40 192 { raw_needs_endswap_test ("raw_end.wav", SF_FORMAT_WAV) ;
Chris@40 193 raw_needs_endswap_test ("raw_end.wavex", SF_FORMAT_WAVEX) ;
Chris@40 194 raw_needs_endswap_test ("raw_end.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ;
Chris@40 195 raw_needs_endswap_test ("raw_end.aiff", SF_FORMAT_AIFF) ;
Chris@40 196 raw_needs_endswap_test ("raw_end.aiff_le", SF_ENDIAN_LITTLE | SF_FORMAT_AIFF) ;
Chris@40 197 test_count ++ ;
Chris@40 198 } ;
Chris@40 199
Chris@40 200 if (test_count == 0)
Chris@40 201 { printf ("Mono : ************************************\n") ;
Chris@40 202 printf ("Mono : * No '%s' test defined.\n", argv [1]) ;
Chris@40 203 printf ("Mono : ************************************\n") ;
Chris@40 204 return 1 ;
Chris@40 205 } ;
Chris@40 206
Chris@40 207 return 0 ;
Chris@40 208 } /* main */
Chris@40 209
Chris@40 210 /*============================================================================================
Chris@40 211 ** Here are the test functions.
Chris@40 212 */
Chris@40 213
Chris@40 214 static void
Chris@40 215 float_norm_test (const char *filename)
Chris@40 216 { SNDFILE *file ;
Chris@40 217 SF_INFO sfinfo ;
Chris@40 218 unsigned int k ;
Chris@40 219
Chris@40 220 print_test_name ("float_norm_test", filename) ;
Chris@40 221
Chris@40 222 sfinfo.samplerate = 44100 ;
Chris@40 223 sfinfo.format = (SF_FORMAT_RAW | SF_FORMAT_PCM_16) ;
Chris@40 224 sfinfo.channels = 1 ;
Chris@40 225 sfinfo.frames = BUFFER_LEN ;
Chris@40 226
Chris@40 227 /* Create float_data with all values being less than 1.0. */
Chris@40 228 for (k = 0 ; k < BUFFER_LEN / 2 ; k++)
Chris@40 229 float_data [k] = (k + 5) / (2.0 * BUFFER_LEN) ;
Chris@40 230 for (k = BUFFER_LEN / 2 ; k < BUFFER_LEN ; k++)
Chris@40 231 float_data [k] = (k + 5) ;
Chris@40 232
Chris@40 233 if (! (file = sf_open (filename, SFM_WRITE, &sfinfo)))
Chris@40 234 { printf ("Line %d: sf_open_write failed with error : ", __LINE__) ;
Chris@40 235 fflush (stdout) ;
Chris@40 236 puts (sf_strerror (NULL)) ;
Chris@40 237 exit (1) ;
Chris@40 238 } ;
Chris@40 239
Chris@40 240 /* Normalisation is on by default so no need to do anything here. */
Chris@40 241
Chris@40 242 if ((k = sf_write_float (file, float_data, BUFFER_LEN / 2)) != BUFFER_LEN / 2)
Chris@40 243 { printf ("Line %d: sf_write_float failed with short write (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ;
Chris@40 244 exit (1) ;
Chris@40 245 } ;
Chris@40 246
Chris@40 247 /* Turn normalisation off. */
Chris@40 248 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
Chris@40 249
Chris@40 250 if ((k = sf_write_float (file, float_data + BUFFER_LEN / 2, BUFFER_LEN / 2)) != BUFFER_LEN / 2)
Chris@40 251 { printf ("Line %d: sf_write_float failed with short write (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ;
Chris@40 252 exit (1) ;
Chris@40 253 } ;
Chris@40 254
Chris@40 255 sf_close (file) ;
Chris@40 256
Chris@40 257 /* sfinfo struct should still contain correct data. */
Chris@40 258 if (! (file = sf_open (filename, SFM_READ, &sfinfo)))
Chris@40 259 { printf ("Line %d: sf_open_read failed with error : ", __LINE__) ;
Chris@40 260 fflush (stdout) ;
Chris@40 261 puts (sf_strerror (NULL)) ;
Chris@40 262 exit (1) ;
Chris@40 263 } ;
Chris@40 264
Chris@40 265 if (sfinfo.format != (SF_FORMAT_RAW | SF_FORMAT_PCM_16))
Chris@40 266 { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, (SF_FORMAT_RAW | SF_FORMAT_PCM_16), sfinfo.format) ;
Chris@40 267 exit (1) ;
Chris@40 268 } ;
Chris@40 269
Chris@40 270 if (sfinfo.frames != BUFFER_LEN)
Chris@40 271 { printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_LEN, sfinfo.frames) ;
Chris@40 272 exit (1) ;
Chris@40 273 } ;
Chris@40 274
Chris@40 275 if (sfinfo.channels != 1)
Chris@40 276 { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 277 exit (1) ;
Chris@40 278 } ;
Chris@40 279
Chris@40 280 /* Read float_data and check that it is normalised (ie default). */
Chris@40 281 if ((k = sf_read_float (file, float_data, BUFFER_LEN)) != BUFFER_LEN)
Chris@40 282 { printf ("\n\nLine %d: sf_read_float failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ;
Chris@40 283 exit (1) ;
Chris@40 284 } ;
Chris@40 285
Chris@40 286 for (k = 0 ; k < BUFFER_LEN ; k++)
Chris@40 287 if (float_data [k] >= 1.0)
Chris@40 288 { printf ("\n\nLine %d: float_data [%d] == %f which is greater than 1.0\n", __LINE__, k, float_data [k]) ;
Chris@40 289 exit (1) ;
Chris@40 290 } ;
Chris@40 291
Chris@40 292 /* Seek to start of file, turn normalisation off, read float_data and check again. */
Chris@40 293 sf_seek (file, 0, SEEK_SET) ;
Chris@40 294 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
Chris@40 295
Chris@40 296 if ((k = sf_read_float (file, float_data, BUFFER_LEN)) != BUFFER_LEN)
Chris@40 297 { printf ("\n\nLine %d: sf_read_float failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ;
Chris@40 298 exit (1) ;
Chris@40 299 } ;
Chris@40 300
Chris@40 301 for (k = 0 ; k < BUFFER_LEN ; k++)
Chris@40 302 if (float_data [k] < 1.0)
Chris@40 303 { printf ("\n\nLine %d: float_data [%d] == %f which is less than 1.0\n", __LINE__, k, float_data [k]) ;
Chris@40 304 exit (1) ;
Chris@40 305 } ;
Chris@40 306
Chris@40 307 /* Seek to start of file, turn normalisation on, read float_data and do final check. */
Chris@40 308 sf_seek (file, 0, SEEK_SET) ;
Chris@40 309 sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_TRUE) ;
Chris@40 310
Chris@40 311 if ((k = sf_read_float (file, float_data, BUFFER_LEN)) != BUFFER_LEN)
Chris@40 312 { printf ("\n\nLine %d: sf_read_float failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ;
Chris@40 313 exit (1) ;
Chris@40 314 } ;
Chris@40 315
Chris@40 316 for (k = 0 ; k < BUFFER_LEN ; k++)
Chris@40 317 if (float_data [k] > 1.0)
Chris@40 318 { printf ("\n\nLine %d: float_data [%d] == %f which is greater than 1.0\n", __LINE__, k, float_data [k]) ;
Chris@40 319 exit (1) ;
Chris@40 320 } ;
Chris@40 321
Chris@40 322
Chris@40 323 sf_close (file) ;
Chris@40 324
Chris@40 325 unlink (filename) ;
Chris@40 326
Chris@40 327 printf ("ok\n") ;
Chris@40 328 } /* float_norm_test */
Chris@40 329
Chris@40 330 static void
Chris@40 331 double_norm_test (const char *filename)
Chris@40 332 { SNDFILE *file ;
Chris@40 333 SF_INFO sfinfo ;
Chris@40 334 unsigned int k ;
Chris@40 335
Chris@40 336 print_test_name ("double_norm_test", filename) ;
Chris@40 337
Chris@40 338 sfinfo.samplerate = 44100 ;
Chris@40 339 sfinfo.format = (SF_FORMAT_RAW | SF_FORMAT_PCM_16) ;
Chris@40 340 sfinfo.channels = 1 ;
Chris@40 341 sfinfo.frames = BUFFER_LEN ;
Chris@40 342
Chris@40 343 /* Create double_data with all values being less than 1.0. */
Chris@40 344 for (k = 0 ; k < BUFFER_LEN / 2 ; k++)
Chris@40 345 double_data [k] = (k + 5) / (2.0 * BUFFER_LEN) ;
Chris@40 346 for (k = BUFFER_LEN / 2 ; k < BUFFER_LEN ; k++)
Chris@40 347 double_data [k] = (k + 5) ;
Chris@40 348
Chris@40 349 if (! (file = sf_open (filename, SFM_WRITE, &sfinfo)))
Chris@40 350 { printf ("Line %d: sf_open_write failed with error : ", __LINE__) ;
Chris@40 351 fflush (stdout) ;
Chris@40 352 puts (sf_strerror (NULL)) ;
Chris@40 353 exit (1) ;
Chris@40 354 } ;
Chris@40 355
Chris@40 356 /* Normailsation is on by default so no need to do anything here. */
Chris@40 357 /*-sf_command (file, "set-norm-double", "true", 0) ;-*/
Chris@40 358
Chris@40 359 if ((k = sf_write_double (file, double_data, BUFFER_LEN / 2)) != BUFFER_LEN / 2)
Chris@40 360 { printf ("Line %d: sf_write_double failed with short write (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ;
Chris@40 361 exit (1) ;
Chris@40 362 } ;
Chris@40 363
Chris@40 364 /* Turn normalisation off. */
Chris@40 365 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
Chris@40 366
Chris@40 367 if ((k = sf_write_double (file, double_data + BUFFER_LEN / 2, BUFFER_LEN / 2)) != BUFFER_LEN / 2)
Chris@40 368 { printf ("Line %d: sf_write_double failed with short write (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ;
Chris@40 369 exit (1) ;
Chris@40 370 } ;
Chris@40 371
Chris@40 372 sf_close (file) ;
Chris@40 373
Chris@40 374 if (! (file = sf_open (filename, SFM_READ, &sfinfo)))
Chris@40 375 { printf ("Line %d: sf_open_read failed with error : ", __LINE__) ;
Chris@40 376 fflush (stdout) ;
Chris@40 377 puts (sf_strerror (NULL)) ;
Chris@40 378 exit (1) ;
Chris@40 379 } ;
Chris@40 380
Chris@40 381 if (sfinfo.format != (SF_FORMAT_RAW | SF_FORMAT_PCM_16))
Chris@40 382 { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, (SF_FORMAT_RAW | SF_FORMAT_PCM_16), sfinfo.format) ;
Chris@40 383 exit (1) ;
Chris@40 384 } ;
Chris@40 385
Chris@40 386 if (sfinfo.frames != BUFFER_LEN)
Chris@40 387 { printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_LEN, sfinfo.frames) ;
Chris@40 388 exit (1) ;
Chris@40 389 } ;
Chris@40 390
Chris@40 391 if (sfinfo.channels != 1)
Chris@40 392 { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 393 exit (1) ;
Chris@40 394 } ;
Chris@40 395
Chris@40 396 /* Read double_data and check that it is normalised (ie default). */
Chris@40 397 if ((k = sf_read_double (file, double_data, BUFFER_LEN)) != BUFFER_LEN)
Chris@40 398 { printf ("\n\nLine %d: sf_read_double failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ;
Chris@40 399 exit (1) ;
Chris@40 400 } ;
Chris@40 401
Chris@40 402 for (k = 0 ; k < BUFFER_LEN ; k++)
Chris@40 403 if (double_data [k] >= 1.0)
Chris@40 404 { printf ("\n\nLine %d: double_data [%d] == %f which is greater than 1.0\n", __LINE__, k, double_data [k]) ;
Chris@40 405 exit (1) ;
Chris@40 406 } ;
Chris@40 407
Chris@40 408 /* Seek to start of file, turn normalisation off, read double_data and check again. */
Chris@40 409 sf_seek (file, 0, SEEK_SET) ;
Chris@40 410 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
Chris@40 411
Chris@40 412 if ((k = sf_read_double (file, double_data, BUFFER_LEN)) != BUFFER_LEN)
Chris@40 413 { printf ("\n\nLine %d: sf_read_double failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ;
Chris@40 414 exit (1) ;
Chris@40 415 } ;
Chris@40 416
Chris@40 417 for (k = 0 ; k < BUFFER_LEN ; k++)
Chris@40 418 if (double_data [k] < 1.0)
Chris@40 419 { printf ("\n\nLine %d: double_data [%d] == %f which is less than 1.0\n", __LINE__, k, double_data [k]) ;
Chris@40 420 exit (1) ;
Chris@40 421 } ;
Chris@40 422
Chris@40 423 /* Seek to start of file, turn normalisation on, read double_data and do final check. */
Chris@40 424 sf_seek (file, 0, SEEK_SET) ;
Chris@40 425 sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_TRUE) ;
Chris@40 426
Chris@40 427 if ((k = sf_read_double (file, double_data, BUFFER_LEN)) != BUFFER_LEN)
Chris@40 428 { printf ("\n\nLine %d: sf_read_double failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ;
Chris@40 429 exit (1) ;
Chris@40 430 } ;
Chris@40 431
Chris@40 432 for (k = 0 ; k < BUFFER_LEN ; k++)
Chris@40 433 if (double_data [k] > 1.0)
Chris@40 434 { printf ("\n\nLine %d: double_data [%d] == %f which is greater than 1.0\n", __LINE__, k, double_data [k]) ;
Chris@40 435 exit (1) ;
Chris@40 436 } ;
Chris@40 437
Chris@40 438
Chris@40 439 sf_close (file) ;
Chris@40 440
Chris@40 441 unlink (filename) ;
Chris@40 442
Chris@40 443 printf ("ok\n") ;
Chris@40 444 } /* double_norm_test */
Chris@40 445
Chris@40 446 static void
Chris@40 447 format_tests (void)
Chris@40 448 { SF_FORMAT_INFO format_info ;
Chris@40 449 SF_INFO sfinfo ;
Chris@40 450 const char *last_name ;
Chris@40 451 int k, count ;
Chris@40 452
Chris@40 453 print_test_name ("format_tests", "(null)") ;
Chris@40 454
Chris@40 455 /* Clear out SF_INFO struct and set channels > 0. */
Chris@40 456 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 457 sfinfo.channels = 1 ;
Chris@40 458
Chris@40 459 /* First test simple formats. */
Chris@40 460
Chris@40 461 sf_command (NULL, SFC_GET_SIMPLE_FORMAT_COUNT, &count, sizeof (int)) ;
Chris@40 462
Chris@40 463 if (count < 0 || count > 30)
Chris@40 464 { printf ("Line %d: Weird count.\n", __LINE__) ;
Chris@40 465 exit (1) ;
Chris@40 466 } ;
Chris@40 467
Chris@40 468 format_info.format = 0 ;
Chris@40 469 sf_command (NULL, SFC_GET_SIMPLE_FORMAT, &format_info, sizeof (format_info)) ;
Chris@40 470
Chris@40 471 last_name = format_info.name ;
Chris@40 472 for (k = 1 ; k < count ; k ++)
Chris@40 473 { format_info.format = k ;
Chris@40 474 sf_command (NULL, SFC_GET_SIMPLE_FORMAT, &format_info, sizeof (format_info)) ;
Chris@40 475 if (strcmp (last_name, format_info.name) >= 0)
Chris@40 476 { printf ("\n\nLine %d: format names out of sequence `%s' < `%s'.\n", __LINE__, last_name, format_info.name) ;
Chris@40 477 exit (1) ;
Chris@40 478 } ;
Chris@40 479 sfinfo.format = format_info.format ;
Chris@40 480
Chris@40 481 if (! sf_format_check (&sfinfo))
Chris@40 482 { printf ("\n\nLine %d: sf_format_check failed.\n", __LINE__) ;
Chris@40 483 printf (" Name : %s\n", format_info.name) ;
Chris@40 484 printf (" Format : 0x%X\n", sfinfo.format) ;
Chris@40 485 printf (" Channels : 0x%X\n", sfinfo.channels) ;
Chris@40 486 printf (" Sample Rate : 0x%X\n", sfinfo.samplerate) ;
Chris@40 487 exit (1) ;
Chris@40 488 } ;
Chris@40 489 last_name = format_info.name ;
Chris@40 490 } ;
Chris@40 491 format_info.format = 666 ;
Chris@40 492 sf_command (NULL, SFC_GET_SIMPLE_FORMAT, &format_info, sizeof (format_info)) ;
Chris@40 493
Chris@40 494 /* Now test major formats. */
Chris@40 495 sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int)) ;
Chris@40 496
Chris@40 497 if (count < 0 || count > 30)
Chris@40 498 { printf ("Line %d: Weird count.\n", __LINE__) ;
Chris@40 499 exit (1) ;
Chris@40 500 } ;
Chris@40 501
Chris@40 502 format_info.format = 0 ;
Chris@40 503 sf_command (NULL, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)) ;
Chris@40 504
Chris@40 505 last_name = format_info.name ;
Chris@40 506 for (k = 1 ; k < count ; k ++)
Chris@40 507 { format_info.format = k ;
Chris@40 508 sf_command (NULL, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)) ;
Chris@40 509 if (strcmp (last_name, format_info.name) >= 0)
Chris@40 510 { printf ("\n\nLine %d: format names out of sequence (%d) `%s' < `%s'.\n", __LINE__, k, last_name, format_info.name) ;
Chris@40 511 exit (1) ;
Chris@40 512 } ;
Chris@40 513
Chris@40 514 last_name = format_info.name ;
Chris@40 515 } ;
Chris@40 516 format_info.format = 666 ;
Chris@40 517 sf_command (NULL, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)) ;
Chris@40 518
Chris@40 519 /* Now test subtype formats. */
Chris@40 520 sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)) ;
Chris@40 521
Chris@40 522 if (count < 0 || count > 30)
Chris@40 523 { printf ("Line %d: Weird count.\n", __LINE__) ;
Chris@40 524 exit (1) ;
Chris@40 525 } ;
Chris@40 526
Chris@40 527 format_info.format = 0 ;
Chris@40 528 sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ;
Chris@40 529
Chris@40 530 last_name = format_info.name ;
Chris@40 531 for (k = 1 ; k < count ; k ++)
Chris@40 532 { format_info.format = k ;
Chris@40 533 sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ;
Chris@40 534 } ;
Chris@40 535 format_info.format = 666 ;
Chris@40 536 sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ;
Chris@40 537
Chris@40 538
Chris@40 539 printf ("ok\n") ;
Chris@40 540 } /* format_tests */
Chris@40 541
Chris@40 542 static void
Chris@40 543 calc_peak_test (int filetype, const char *filename, int channels)
Chris@40 544 { SNDFILE *file ;
Chris@40 545 SF_INFO sfinfo ;
Chris@40 546 char label [128] ;
Chris@40 547 int k, format ;
Chris@40 548 sf_count_t buffer_len, frame_count ;
Chris@40 549 double peak ;
Chris@40 550
Chris@40 551 snprintf (label, sizeof (label), "calc_peak_test (%d channels)", channels) ;
Chris@40 552 print_test_name (label, filename) ;
Chris@40 553
Chris@40 554 format = filetype | SF_FORMAT_PCM_16 ;
Chris@40 555
Chris@40 556 buffer_len = BUFFER_LEN - (BUFFER_LEN % channels) ;
Chris@40 557 frame_count = buffer_len / channels ;
Chris@40 558
Chris@40 559 sfinfo.samplerate = 44100 ;
Chris@40 560 sfinfo.format = format ;
Chris@40 561 sfinfo.channels = channels ;
Chris@40 562 sfinfo.frames = frame_count ;
Chris@40 563
Chris@40 564 /* Create double_data with max value of 0.5. */
Chris@40 565 for (k = 0 ; k < buffer_len ; k++)
Chris@40 566 double_data [k] = (k + 1) / (2.0 * buffer_len) ;
Chris@40 567
Chris@40 568 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 569
Chris@40 570 test_writef_double_or_die (file, 0, double_data, frame_count, __LINE__) ;
Chris@40 571
Chris@40 572 sf_close (file) ;
Chris@40 573
Chris@40 574 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 575
Chris@40 576 if (sfinfo.format != format)
Chris@40 577 { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 578 exit (1) ;
Chris@40 579 } ;
Chris@40 580
Chris@40 581 if (sfinfo.frames != frame_count)
Chris@40 582 { printf ("\n\nLine %d: Incorrect number of frames in file. (%" PRId64 " => %" PRId64 ")\n", __LINE__, frame_count, sfinfo.frames) ;
Chris@40 583 exit (1) ;
Chris@40 584 } ;
Chris@40 585
Chris@40 586 if (sfinfo.channels != channels)
Chris@40 587 { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 588 exit (1) ;
Chris@40 589 } ;
Chris@40 590
Chris@40 591 sf_command (file, SFC_CALC_SIGNAL_MAX, &peak, sizeof (peak)) ;
Chris@40 592 if (fabs (peak - (1 << 14)) > 1.0)
Chris@40 593 { printf ("Line %d : Peak value should be %d (is %f).\n", __LINE__, (1 << 14), peak) ;
Chris@40 594 exit (1) ;
Chris@40 595 } ;
Chris@40 596
Chris@40 597 sf_command (file, SFC_CALC_NORM_SIGNAL_MAX, &peak, sizeof (peak)) ;
Chris@40 598 if (fabs (peak - 0.5) > 4e-5)
Chris@40 599 { printf ("Line %d : Peak value should be %f (is %f).\n", __LINE__, 0.5, peak) ;
Chris@40 600 exit (1) ;
Chris@40 601 } ;
Chris@40 602
Chris@40 603 sf_close (file) ;
Chris@40 604
Chris@40 605 format = (filetype | SF_FORMAT_FLOAT) ;
Chris@40 606 sfinfo.samplerate = 44100 ;
Chris@40 607 sfinfo.format = format ;
Chris@40 608 sfinfo.channels = channels ;
Chris@40 609 sfinfo.frames = frame_count ;
Chris@40 610
Chris@40 611 /* Create double_data with max value of 0.5. */
Chris@40 612 for (k = 0 ; k < buffer_len ; k++)
Chris@40 613 double_data [k] = (k + 1) / (2.0 * buffer_len) ;
Chris@40 614
Chris@40 615 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 616
Chris@40 617 test_writef_double_or_die (file, 0, double_data, frame_count, __LINE__) ;
Chris@40 618
Chris@40 619 sf_close (file) ;
Chris@40 620
Chris@40 621 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 622
Chris@40 623 if (sfinfo.format != format)
Chris@40 624 { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ;
Chris@40 625 exit (1) ;
Chris@40 626 } ;
Chris@40 627
Chris@40 628 if (sfinfo.frames != frame_count)
Chris@40 629 { printf ("\n\nLine %d: Incorrect number of.frames in file. (%" PRId64 " => %" PRId64 ")\n", __LINE__, frame_count, sfinfo.frames) ;
Chris@40 630 exit (1) ;
Chris@40 631 } ;
Chris@40 632
Chris@40 633 if (sfinfo.channels != channels)
Chris@40 634 { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ;
Chris@40 635 exit (1) ;
Chris@40 636 } ;
Chris@40 637
Chris@40 638 sf_command (file, SFC_CALC_SIGNAL_MAX, &peak, sizeof (peak)) ;
Chris@40 639 if (fabs (peak - 0.5) > 1e-5)
Chris@40 640 { printf ("Line %d : Peak value should be %f (is %f).\n", __LINE__, 0.5, peak) ;
Chris@40 641 exit (1) ;
Chris@40 642 } ;
Chris@40 643
Chris@40 644 sf_command (file, SFC_CALC_NORM_SIGNAL_MAX, &peak, sizeof (peak)) ;
Chris@40 645 if (fabs (peak - 0.5) > 1e-5)
Chris@40 646 { printf ("Line %d : Peak value should be %f (is %f).\n", __LINE__, 0.5, peak) ;
Chris@40 647 exit (1) ;
Chris@40 648 } ;
Chris@40 649
Chris@40 650 sf_close (file) ;
Chris@40 651
Chris@40 652 unlink (filename) ;
Chris@40 653
Chris@40 654 printf ("ok\n") ;
Chris@40 655 } /* calc_peak_test */
Chris@40 656
Chris@40 657 static void
Chris@40 658 truncate_test (const char *filename, int filetype)
Chris@40 659 { SNDFILE *file ;
Chris@40 660 SF_INFO sfinfo ;
Chris@40 661 sf_count_t len ;
Chris@40 662
Chris@40 663 print_test_name ("truncate_test", filename) ;
Chris@40 664
Chris@40 665 sfinfo.samplerate = 11025 ;
Chris@40 666 sfinfo.format = filetype ;
Chris@40 667 sfinfo.channels = 2 ;
Chris@40 668
Chris@40 669 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 670
Chris@40 671 test_write_int_or_die (file, 0, int_data, BUFFER_LEN, __LINE__) ;
Chris@40 672
Chris@40 673 len = 100 ;
Chris@40 674 if (sf_command (file, SFC_FILE_TRUNCATE, &len, sizeof (len)))
Chris@40 675 { printf ("Line %d: sf_command (SFC_FILE_TRUNCATE) returned error.\n", __LINE__) ;
Chris@40 676 exit (1) ;
Chris@40 677 } ;
Chris@40 678
Chris@40 679 test_seek_or_die (file, 0, SEEK_CUR, len, 2, __LINE__) ;
Chris@40 680 test_seek_or_die (file, 0, SEEK_END, len, 2, __LINE__) ;
Chris@40 681
Chris@40 682 sf_close (file) ;
Chris@40 683
Chris@40 684 unlink (filename) ;
Chris@40 685 puts ("ok") ;
Chris@40 686 } /* truncate_test */
Chris@40 687
Chris@40 688 /*------------------------------------------------------------------------------
Chris@40 689 */
Chris@40 690
Chris@40 691 static void
Chris@40 692 instrumet_rw_test (const char *filename)
Chris@40 693 { SNDFILE *sndfile ;
Chris@40 694 SF_INFO sfinfo ;
Chris@40 695 SF_INSTRUMENT inst ;
Chris@40 696 memset (&sfinfo, 0, sizeof (SF_INFO)) ;
Chris@40 697
Chris@40 698 sndfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ;
Chris@40 699
Chris@40 700 if (sf_command (sndfile, SFC_GET_INSTRUMENT, &inst, sizeof (inst)) == SF_TRUE)
Chris@40 701 { inst.basenote = 22 ;
Chris@40 702
Chris@40 703 if (sf_command (sndfile, SFC_SET_INSTRUMENT, &inst, sizeof (inst)) == SF_TRUE)
Chris@40 704 printf ("Sucess: [%s] updated\n", filename) ;
Chris@40 705 else
Chris@40 706 printf ("Error: SFC_SET_INSTRUMENT on [%s] [%s]\n", filename, sf_strerror (sndfile)) ;
Chris@40 707 }
Chris@40 708 else
Chris@40 709 printf ("Error: SFC_GET_INSTRUMENT on [%s] [%s]\n", filename, sf_strerror (sndfile)) ;
Chris@40 710
Chris@40 711
Chris@40 712 if (sf_command (sndfile, SFC_UPDATE_HEADER_NOW, NULL, 0) != 0)
Chris@40 713 printf ("Error: SFC_UPDATE_HEADER_NOW on [%s] [%s]\n", filename, sf_strerror (sndfile)) ;
Chris@40 714
Chris@40 715 sf_write_sync (sndfile) ;
Chris@40 716 sf_close (sndfile) ;
Chris@40 717
Chris@40 718 return ;
Chris@40 719 } /* instrumet_rw_test */
Chris@40 720
Chris@40 721 static void
Chris@40 722 instrument_test (const char *filename, int filetype)
Chris@40 723 { static SF_INSTRUMENT write_inst =
Chris@40 724 { 2, /* gain */
Chris@40 725 3, /* detune */
Chris@40 726 4, /* basenote */
Chris@40 727 5, 6, /* key low and high */
Chris@40 728 7, 8, /* velocity low and high */
Chris@40 729 2, /* loop_count */
Chris@40 730 { { 801, 2, 3, 0 },
Chris@40 731 { 801, 3, 4, 0 },
Chris@40 732 }
Chris@40 733 } ;
Chris@40 734 SF_INSTRUMENT read_inst ;
Chris@40 735 SNDFILE *file ;
Chris@40 736 SF_INFO sfinfo ;
Chris@40 737
Chris@40 738 print_test_name ("instrument_test", filename) ;
Chris@40 739
Chris@40 740 sfinfo.samplerate = 11025 ;
Chris@40 741 sfinfo.format = filetype ;
Chris@40 742 sfinfo.channels = 1 ;
Chris@40 743
Chris@40 744 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 745 if (sf_command (file, SFC_SET_INSTRUMENT, &write_inst, sizeof (write_inst)) == SF_FALSE)
Chris@40 746 { printf ("\n\nLine %d : sf_command (SFC_SET_INSTRUMENT) failed.\n\n", __LINE__) ;
Chris@40 747 exit (1) ;
Chris@40 748 } ;
Chris@40 749 test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 750 sf_close (file) ;
Chris@40 751
Chris@40 752 memset (&read_inst, 0, sizeof (read_inst)) ;
Chris@40 753
Chris@40 754 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 755 if (sf_command (file, SFC_GET_INSTRUMENT, &read_inst, sizeof (read_inst)) == SF_FALSE)
Chris@40 756 { printf ("\n\nLine %d : sf_command (SFC_GET_INSTRUMENT) failed.\n\n", __LINE__) ;
Chris@40 757 exit (1) ;
Chris@40 758 return ;
Chris@40 759 } ;
Chris@40 760 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 761 sf_close (file) ;
Chris@40 762
Chris@40 763 if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV)
Chris@40 764 { /*
Chris@40 765 ** For all the fields that WAV doesn't support, modify the
Chris@40 766 ** write_inst struct to hold the default value that the WAV
Chris@40 767 ** module should hold.
Chris@40 768 */
Chris@40 769 write_inst.detune = 0 ;
Chris@40 770 write_inst.key_lo = write_inst.velocity_lo = 0 ;
Chris@40 771 write_inst.key_hi = write_inst.velocity_hi = 127 ;
Chris@40 772 write_inst.gain = 1 ;
Chris@40 773 } ;
Chris@40 774
Chris@40 775 if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_XI)
Chris@40 776 { /*
Chris@40 777 ** For all the fields that XI doesn't support, modify the
Chris@40 778 ** write_inst struct to hold the default value that the XI
Chris@40 779 ** module should hold.
Chris@40 780 */
Chris@40 781 write_inst.basenote = 0 ;
Chris@40 782 write_inst.detune = 0 ;
Chris@40 783 write_inst.key_lo = write_inst.velocity_lo = 0 ;
Chris@40 784 write_inst.key_hi = write_inst.velocity_hi = 127 ;
Chris@40 785 write_inst.gain = 1 ;
Chris@40 786 } ;
Chris@40 787
Chris@40 788 if (memcmp (&write_inst, &read_inst, sizeof (write_inst)) != 0)
Chris@40 789 { printf ("\n\nLine %d : instrument comparison failed.\n\n", __LINE__) ;
Chris@40 790 printf ("W Base Note : %u\n"
Chris@40 791 " Detune : %u\n"
Chris@40 792 " Low Note : %u\tHigh Note : %u\n"
Chris@40 793 " Low Vel. : %u\tHigh Vel. : %u\n"
Chris@40 794 " Gain : %d\tCount : %d\n"
Chris@40 795 " mode : %d\n"
Chris@40 796 " start : %d\tend : %d\tcount :%d\n"
Chris@40 797 " mode : %d\n"
Chris@40 798 " start : %d\tend : %d\tcount :%d\n\n",
Chris@40 799 write_inst.basenote,
Chris@40 800 write_inst.detune,
Chris@40 801 write_inst.key_lo, write_inst.key_hi,
Chris@40 802 write_inst.velocity_lo, write_inst.velocity_hi,
Chris@40 803 write_inst.gain, write_inst.loop_count,
Chris@40 804 write_inst.loops [0].mode, write_inst.loops [0].start,
Chris@40 805 write_inst.loops [0].end, write_inst.loops [0].count,
Chris@40 806 write_inst.loops [1].mode, write_inst.loops [1].start,
Chris@40 807 write_inst.loops [1].end, write_inst.loops [1].count) ;
Chris@40 808 printf ("R Base Note : %u\n"
Chris@40 809 " Detune : %u\n"
Chris@40 810 " Low Note : %u\tHigh Note : %u\n"
Chris@40 811 " Low Vel. : %u\tHigh Vel. : %u\n"
Chris@40 812 " Gain : %d\tCount : %d\n"
Chris@40 813 " mode : %d\n"
Chris@40 814 " start : %d\tend : %d\tcount :%d\n"
Chris@40 815 " mode : %d\n"
Chris@40 816 " start : %d\tend : %d\tcount :%d\n\n",
Chris@40 817 read_inst.basenote,
Chris@40 818 read_inst.detune,
Chris@40 819 read_inst.key_lo, read_inst.key_hi,
Chris@40 820 read_inst.velocity_lo, read_inst.velocity_hi,
Chris@40 821 read_inst.gain, read_inst.loop_count,
Chris@40 822 read_inst.loops [0].mode, read_inst.loops [0].start,
Chris@40 823 read_inst.loops [0].end, read_inst.loops [0].count,
Chris@40 824 read_inst.loops [1].mode, read_inst.loops [1].start,
Chris@40 825 read_inst.loops [1].end, read_inst.loops [1].count) ;
Chris@40 826
Chris@40 827 if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_XI)
Chris@40 828 exit (1) ;
Chris@40 829 } ;
Chris@40 830
Chris@40 831 if (0) instrumet_rw_test (filename) ;
Chris@40 832
Chris@40 833 unlink (filename) ;
Chris@40 834 puts ("ok") ;
Chris@40 835 } /* instrument_test */
Chris@40 836
Chris@40 837 static void
Chris@40 838 cue_rw_test (const char *filename)
Chris@40 839 { SNDFILE *sndfile ;
Chris@40 840 SF_INFO sfinfo ;
Chris@40 841 SF_CUES cues ;
Chris@40 842 memset (&sfinfo, 0, sizeof (SF_INFO)) ;
Chris@40 843
Chris@40 844 sndfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ;
Chris@40 845
Chris@40 846 exit_if_true (
Chris@40 847 sf_command (sndfile, SFC_GET_CUE_COUNT, &cues.cue_count, sizeof (cues.cue_count)) != SF_TRUE,
Chris@40 848 "\nLine %d: SFC_GET_CUE_COUNT command failed.\n\n", __LINE__
Chris@40 849 ) ;
Chris@40 850
Chris@40 851 exit_if_true (
Chris@40 852 cues.cue_count != 3,
Chris@40 853 "\nLine %d: Expected cue_count (%u) to be 3.\n\n", __LINE__, cues.cue_count
Chris@40 854 ) ;
Chris@40 855
Chris@40 856 if (sf_command (sndfile, SFC_GET_CUE, &cues, sizeof (cues)) == SF_TRUE)
Chris@40 857 { cues.cue_points [1].sample_offset = 3 ;
Chris@40 858
Chris@40 859 if (sf_command (sndfile, SFC_SET_CUE, &cues, sizeof (cues)) == SF_TRUE)
Chris@40 860 printf ("Sucess: [%s] updated\n", filename) ;
Chris@40 861 else
Chris@40 862 printf ("Error: SFC_SET_CUE on [%s] [%s]\n", filename, sf_strerror (sndfile)) ;
Chris@40 863 }
Chris@40 864 else
Chris@40 865 printf ("Error: SFC_GET_CUE on [%s] [%s]\n", filename, sf_strerror (sndfile)) ;
Chris@40 866
Chris@40 867
Chris@40 868 if (sf_command (sndfile, SFC_UPDATE_HEADER_NOW, NULL, 0) != 0)
Chris@40 869 printf ("Error: SFC_UPDATE_HEADER_NOW on [%s] [%s]\n", filename, sf_strerror (sndfile)) ;
Chris@40 870
Chris@40 871 sf_write_sync (sndfile) ;
Chris@40 872 sf_close (sndfile) ;
Chris@40 873
Chris@40 874 return ;
Chris@40 875 } /* cue_rw_test */
Chris@40 876
Chris@40 877 static void
Chris@40 878 cue_test (const char *filename, int filetype)
Chris@40 879 { SF_CUES write_cue ;
Chris@40 880 SF_CUES read_cue ;
Chris@40 881 SNDFILE *file ;
Chris@40 882 SF_INFO sfinfo ;
Chris@40 883
Chris@40 884 if (filetype == (SF_FORMAT_WAV | SF_FORMAT_PCM_16))
Chris@40 885 { write_cue = (SF_CUES)
Chris@40 886 { 2, /* cue_count */
Chris@40 887 { { 1, 0, data_MARKER, 0, 0, 1, "" },
Chris@40 888 { 2, 0, data_MARKER, 0, 0, 2, "" },
Chris@40 889 }
Chris@40 890 } ;
Chris@40 891 }
Chris@40 892 else
Chris@40 893 { write_cue = (SF_CUES)
Chris@40 894 { 2, /* cue_count */
Chris@40 895 { { 1, 0, data_MARKER, 0, 0, 1, "Cue1" },
Chris@40 896 { 2, 0, data_MARKER, 0, 0, 2, "Cue2" },
Chris@40 897 }
Chris@40 898 } ;
Chris@40 899 }
Chris@40 900
Chris@40 901 print_test_name ("cue_test", filename) ;
Chris@40 902
Chris@40 903 sfinfo.samplerate = 11025 ;
Chris@40 904 sfinfo.format = filetype ;
Chris@40 905 sfinfo.channels = 1 ;
Chris@40 906
Chris@40 907 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 908 if (sf_command (file, SFC_SET_CUE, &write_cue, sizeof (write_cue)) == SF_FALSE)
Chris@40 909 { printf ("\n\nLine %d : sf_command (SFC_SET_CUE) failed.\n\n", __LINE__) ;
Chris@40 910 exit (1) ;
Chris@40 911 } ;
Chris@40 912 test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 913 sf_close (file) ;
Chris@40 914
Chris@40 915 memset (&read_cue, 0, sizeof (read_cue)) ;
Chris@40 916
Chris@40 917 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 918 if (sf_command (file, SFC_GET_CUE, &read_cue, sizeof (read_cue)) == SF_FALSE)
Chris@40 919 { printf ("\n\nLine %d : sf_command (SFC_GET_CUE) failed.\n\n", __LINE__) ;
Chris@40 920 exit (1) ;
Chris@40 921 return ;
Chris@40 922 } ;
Chris@40 923 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 924 sf_close (file) ;
Chris@40 925
Chris@40 926 if (memcmp (&write_cue, &read_cue, sizeof (write_cue)) != 0)
Chris@40 927 { printf ("\n\nLine %d : cue comparison failed.\n\n", __LINE__) ;
Chris@40 928 printf ("W Cue count : %d\n"
Chris@40 929 " indx : %d\n"
Chris@40 930 " position : %u\n"
Chris@40 931 " fcc_chunk : %x\n"
Chris@40 932 " chunk_start : %d\n"
Chris@40 933 " block_start : %d\n"
Chris@40 934 " sample_offset : %u\n"
Chris@40 935 " name : %s\n"
Chris@40 936 " indx : %d\n"
Chris@40 937 " position : %u\n"
Chris@40 938 " fcc_chunk : %x\n"
Chris@40 939 " chunk_start : %d\n"
Chris@40 940 " block_start : %d\n"
Chris@40 941 " sample_offset : %u\n"
Chris@40 942 " name : %s\n",
Chris@40 943 write_cue.cue_count,
Chris@40 944 write_cue.cue_points [0].indx,
Chris@40 945 write_cue.cue_points [0].position,
Chris@40 946 write_cue.cue_points [0].fcc_chunk,
Chris@40 947 write_cue.cue_points [0].chunk_start,
Chris@40 948 write_cue.cue_points [0].block_start,
Chris@40 949 write_cue.cue_points [0].sample_offset,
Chris@40 950 write_cue.cue_points [0].name,
Chris@40 951 write_cue.cue_points [1].indx,
Chris@40 952 write_cue.cue_points [1].position,
Chris@40 953 write_cue.cue_points [1].fcc_chunk,
Chris@40 954 write_cue.cue_points [1].chunk_start,
Chris@40 955 write_cue.cue_points [1].block_start,
Chris@40 956 write_cue.cue_points [1].sample_offset,
Chris@40 957 write_cue.cue_points [1].name) ;
Chris@40 958 printf ("R Cue count : %d\n"
Chris@40 959 " indx : %d\n"
Chris@40 960 " position : %u\n"
Chris@40 961 " fcc_chunk : %x\n"
Chris@40 962 " chunk_start : %d\n"
Chris@40 963 " block_start : %d\n"
Chris@40 964 " sample_offset : %u\n"
Chris@40 965 " name : %s\n"
Chris@40 966 " indx : %d\n"
Chris@40 967 " position : %u\n"
Chris@40 968 " fcc_chunk : %x\n"
Chris@40 969 " chunk_start : %d\n"
Chris@40 970 " block_start : %d\n"
Chris@40 971 " sample_offset : %u\n"
Chris@40 972 " name : %s\n",
Chris@40 973 read_cue.cue_count,
Chris@40 974 read_cue.cue_points [0].indx,
Chris@40 975 read_cue.cue_points [0].position,
Chris@40 976 read_cue.cue_points [0].fcc_chunk,
Chris@40 977 read_cue.cue_points [0].chunk_start,
Chris@40 978 read_cue.cue_points [0].block_start,
Chris@40 979 read_cue.cue_points [0].sample_offset,
Chris@40 980 read_cue.cue_points [0].name,
Chris@40 981 read_cue.cue_points [1].indx,
Chris@40 982 read_cue.cue_points [1].position,
Chris@40 983 read_cue.cue_points [1].fcc_chunk,
Chris@40 984 read_cue.cue_points [1].chunk_start,
Chris@40 985 read_cue.cue_points [1].block_start,
Chris@40 986 read_cue.cue_points [1].sample_offset,
Chris@40 987 read_cue.cue_points [1].name) ;
Chris@40 988
Chris@40 989 exit (1) ;
Chris@40 990 } ;
Chris@40 991
Chris@40 992 if (0) cue_rw_test (filename) ;
Chris@40 993
Chris@40 994 unlink (filename) ;
Chris@40 995 puts ("ok") ;
Chris@40 996 } /* cue_test */
Chris@40 997
Chris@40 998 static void
Chris@40 999 current_sf_info_test (const char *filename)
Chris@40 1000 { SNDFILE *outfile, *infile ;
Chris@40 1001 SF_INFO outinfo, ininfo ;
Chris@40 1002
Chris@40 1003 print_test_name ("current_sf_info_test", filename) ;
Chris@40 1004
Chris@40 1005 outinfo.samplerate = 44100 ;
Chris@40 1006 outinfo.format = (SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
Chris@40 1007 outinfo.channels = 1 ;
Chris@40 1008 outinfo.frames = 0 ;
Chris@40 1009
Chris@40 1010 outfile = test_open_file_or_die (filename, SFM_WRITE, &outinfo, SF_TRUE, __LINE__) ;
Chris@40 1011 sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, 0) ;
Chris@40 1012
Chris@40 1013 exit_if_true (outinfo.frames != 0,
Chris@40 1014 "\n\nLine %d : Initial sfinfo.frames is not zero.\n\n", __LINE__
Chris@40 1015 ) ;
Chris@40 1016
Chris@40 1017 test_write_double_or_die (outfile, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 1018 sf_command (outfile, SFC_GET_CURRENT_SF_INFO, &outinfo, sizeof (outinfo)) ;
Chris@40 1019
Chris@40 1020 exit_if_true (outinfo.frames != BUFFER_LEN,
Chris@40 1021 "\n\nLine %d : Initial sfinfo.frames (%" PRId64 ") should be %d.\n\n", __LINE__,
Chris@40 1022 outinfo.frames, BUFFER_LEN
Chris@40 1023 ) ;
Chris@40 1024
Chris@40 1025 /* Read file making sure no channel map exists. */
Chris@40 1026 memset (&ininfo, 0, sizeof (ininfo)) ;
Chris@40 1027 infile = test_open_file_or_die (filename, SFM_READ, &ininfo, SF_TRUE, __LINE__) ;
Chris@40 1028
Chris@40 1029 test_write_double_or_die (outfile, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 1030
Chris@40 1031 sf_command (infile, SFC_GET_CURRENT_SF_INFO, &ininfo, sizeof (ininfo)) ;
Chris@40 1032
Chris@40 1033 exit_if_true (ininfo.frames != BUFFER_LEN,
Chris@40 1034 "\n\nLine %d : Initial sfinfo.frames (%" PRId64 ") should be %d.\n\n", __LINE__,
Chris@40 1035 ininfo.frames, BUFFER_LEN
Chris@40 1036 ) ;
Chris@40 1037
Chris@40 1038 sf_close (outfile) ;
Chris@40 1039 sf_close (infile) ;
Chris@40 1040
Chris@40 1041 unlink (filename) ;
Chris@40 1042 puts ("ok") ;
Chris@40 1043 } /* current_sf_info_test */
Chris@40 1044
Chris@40 1045 static void
Chris@40 1046 broadcast_test (const char *filename, int filetype)
Chris@40 1047 { static SF_BROADCAST_INFO bc_write, bc_read ;
Chris@40 1048 SNDFILE *file ;
Chris@40 1049 SF_INFO sfinfo ;
Chris@40 1050 int errors = 0 ;
Chris@40 1051
Chris@40 1052 print_test_name ("broadcast_test", filename) ;
Chris@40 1053
Chris@40 1054 sfinfo.samplerate = 11025 ;
Chris@40 1055 sfinfo.format = filetype ;
Chris@40 1056 sfinfo.channels = 1 ;
Chris@40 1057
Chris@40 1058 memset (&bc_write, 0, sizeof (bc_write)) ;
Chris@40 1059
Chris@40 1060 snprintf (bc_write.description, sizeof (bc_write.description), "Test description") ;
Chris@40 1061 snprintf (bc_write.originator, sizeof (bc_write.originator), "Test originator") ;
Chris@40 1062 snprintf (bc_write.originator_reference, sizeof (bc_write.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ;
Chris@40 1063 snprintf (bc_write.origination_date, sizeof (bc_write.origination_date), "%d/%02d/%02d", 2006, 3, 30) ;
Chris@40 1064 snprintf (bc_write.origination_time, sizeof (bc_write.origination_time), "%02d:%02d:%02d", 20, 27, 0) ;
Chris@40 1065 snprintf (bc_write.umid, sizeof (bc_write.umid), "Some umid") ;
Chris@40 1066 bc_write.coding_history_size = 0 ;
Chris@40 1067
Chris@40 1068 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1069 if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE)
Chris@40 1070 { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ;
Chris@40 1071 exit (1) ;
Chris@40 1072 } ;
Chris@40 1073 test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 1074 sf_close (file) ;
Chris@40 1075
Chris@40 1076 memset (&bc_read, 0, sizeof (bc_read)) ;
Chris@40 1077
Chris@40 1078 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1079 if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE)
Chris@40 1080 { printf ("\n\nLine %d : sf_command (SFC_GET_BROADCAST_INFO) failed.\n\n", __LINE__) ;
Chris@40 1081 exit (1) ;
Chris@40 1082 return ;
Chris@40 1083 } ;
Chris@40 1084 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 1085 sf_close (file) ;
Chris@40 1086
Chris@40 1087 if (bc_read.version != 1)
Chris@40 1088 { printf ("\n\nLine %d : Read bad version number %d.\n\n", __LINE__, bc_read.version) ;
Chris@40 1089 exit (1) ;
Chris@40 1090 return ;
Chris@40 1091 } ;
Chris@40 1092
Chris@40 1093 bc_read.version = bc_write.version = 0 ;
Chris@40 1094
Chris@40 1095 if (memcmp (bc_write.description, bc_read.description, sizeof (bc_write.description)) != 0)
Chris@40 1096 { printf ("\n\nLine %d : description mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.description, bc_read.description) ;
Chris@40 1097 errors ++ ;
Chris@40 1098 } ;
Chris@40 1099
Chris@40 1100 if (memcmp (bc_write.originator, bc_read.originator, sizeof (bc_write.originator)) != 0)
Chris@40 1101 { printf ("\n\nLine %d : originator mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.originator, bc_read.originator) ;
Chris@40 1102 errors ++ ;
Chris@40 1103 } ;
Chris@40 1104
Chris@40 1105 if (memcmp (bc_write.originator_reference, bc_read.originator_reference, sizeof (bc_write.originator_reference)) != 0)
Chris@40 1106 { printf ("\n\nLine %d : originator_reference mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.originator_reference, bc_read.originator_reference) ;
Chris@40 1107 errors ++ ;
Chris@40 1108 } ;
Chris@40 1109
Chris@40 1110 if (memcmp (bc_write.origination_date, bc_read.origination_date, sizeof (bc_write.origination_date)) != 0)
Chris@40 1111 { printf ("\n\nLine %d : origination_date mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.origination_date, bc_read.origination_date) ;
Chris@40 1112 errors ++ ;
Chris@40 1113 } ;
Chris@40 1114
Chris@40 1115 if (memcmp (bc_write.origination_time, bc_read.origination_time, sizeof (bc_write.origination_time)) != 0)
Chris@40 1116 { printf ("\n\nLine %d : origination_time mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.origination_time, bc_read.origination_time) ;
Chris@40 1117 errors ++ ;
Chris@40 1118 } ;
Chris@40 1119
Chris@40 1120 if (memcmp (bc_write.umid, bc_read.umid, sizeof (bc_write.umid)) != 0)
Chris@40 1121 { printf ("\n\nLine %d : umid mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.umid, bc_read.umid) ;
Chris@40 1122 errors ++ ;
Chris@40 1123 } ;
Chris@40 1124
Chris@40 1125 if (errors)
Chris@40 1126 exit (1) ;
Chris@40 1127
Chris@40 1128 unlink (filename) ;
Chris@40 1129 puts ("ok") ;
Chris@40 1130 } /* broadcast_test */
Chris@40 1131
Chris@40 1132 static void
Chris@40 1133 broadcast_rdwr_test (const char *filename, int filetype)
Chris@40 1134 { SF_BROADCAST_INFO binfo ;
Chris@40 1135 SNDFILE *file ;
Chris@40 1136 SF_INFO sfinfo ;
Chris@40 1137 sf_count_t frames ;
Chris@40 1138
Chris@40 1139 print_test_name (__func__, filename) ;
Chris@40 1140
Chris@40 1141 create_short_sndfile (filename, filetype, 2) ;
Chris@40 1142
Chris@40 1143 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 1144 memset (&binfo, 0, sizeof (binfo)) ;
Chris@40 1145
Chris@40 1146 snprintf (binfo.description, sizeof (binfo.description), "Test description") ;
Chris@40 1147 snprintf (binfo.originator, sizeof (binfo.originator), "Test originator") ;
Chris@40 1148 snprintf (binfo.originator_reference, sizeof (binfo.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ;
Chris@40 1149 snprintf (binfo.origination_date, sizeof (binfo.origination_date), "%d/%02d/%02d", 2006, 3, 30) ;
Chris@40 1150 snprintf (binfo.origination_time, sizeof (binfo.origination_time), "%02d:%02d:%02d", 20, 27, 0) ;
Chris@40 1151 snprintf (binfo.umid, sizeof (binfo.umid), "Some umid") ;
Chris@40 1152 binfo.coding_history_size = 0 ;
Chris@40 1153
Chris@40 1154 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1155 frames = sfinfo.frames ;
Chris@40 1156 if (sf_command (file, SFC_SET_BROADCAST_INFO, &binfo, sizeof (binfo)) != SF_FALSE)
Chris@40 1157 { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) should have failed but didn't.\n\n", __LINE__) ;
Chris@40 1158 exit (1) ;
Chris@40 1159 } ;
Chris@40 1160 sf_close (file) ;
Chris@40 1161
Chris@40 1162 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1163 sf_close (file) ;
Chris@40 1164 exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ;
Chris@40 1165
Chris@40 1166 unlink (filename) ;
Chris@40 1167 puts ("ok") ;
Chris@40 1168 } /* broadcast_rdwr_test */
Chris@40 1169
Chris@40 1170 static void
Chris@40 1171 check_coding_history_newlines (const char *filename)
Chris@40 1172 { static SF_BROADCAST_INFO bc_write, bc_read ;
Chris@40 1173 SNDFILE *file ;
Chris@40 1174 SF_INFO sfinfo ;
Chris@40 1175 unsigned k ;
Chris@40 1176
Chris@40 1177 sfinfo.samplerate = 22050 ;
Chris@40 1178 sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ;
Chris@40 1179 sfinfo.channels = 1 ;
Chris@40 1180
Chris@40 1181 memset (&bc_write, 0, sizeof (bc_write)) ;
Chris@40 1182
Chris@40 1183 snprintf (bc_write.description, sizeof (bc_write.description), "Test description") ;
Chris@40 1184 snprintf (bc_write.originator, sizeof (bc_write.originator), "Test originator") ;
Chris@40 1185 snprintf (bc_write.originator_reference, sizeof (bc_write.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ;
Chris@40 1186 snprintf (bc_write.origination_date, sizeof (bc_write.origination_date), "%d/%02d/%02d", 2006, 3, 30) ;
Chris@40 1187 snprintf (bc_write.origination_time, sizeof (bc_write.origination_time), "%02d:%02d:%02d", 20, 27, 0) ;
Chris@40 1188 snprintf (bc_write.umid, sizeof (bc_write.umid), "Some umid") ;
Chris@40 1189 bc_write.coding_history_size = snprintf (bc_write.coding_history, sizeof (bc_write.coding_history), "This has\nUnix\nand\rMac OS9\rline endings.\nLast line") ; ;
Chris@40 1190
Chris@40 1191 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1192 if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE)
Chris@40 1193 { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ;
Chris@40 1194 exit (1) ;
Chris@40 1195 } ;
Chris@40 1196
Chris@40 1197 test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 1198 sf_close (file) ;
Chris@40 1199
Chris@40 1200 memset (&bc_read, 0, sizeof (bc_read)) ;
Chris@40 1201
Chris@40 1202 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1203 if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE)
Chris@40 1204 { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ;
Chris@40 1205 exit (1) ;
Chris@40 1206 } ;
Chris@40 1207 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 1208 sf_close (file) ;
Chris@40 1209
Chris@40 1210 if (bc_read.coding_history_size == 0)
Chris@40 1211 { printf ("\n\nLine %d : missing coding history.\n\n", __LINE__) ;
Chris@40 1212 exit (1) ;
Chris@40 1213 } ;
Chris@40 1214
Chris@40 1215 if (strstr (bc_read.coding_history, "Last line") == NULL)
Chris@40 1216 { printf ("\n\nLine %d : coding history truncated.\n\n", __LINE__) ;
Chris@40 1217 exit (1) ;
Chris@40 1218 } ;
Chris@40 1219
Chris@40 1220 for (k = 1 ; k < bc_read.coding_history_size ; k++)
Chris@40 1221 { if (bc_read.coding_history [k] == '\n' && bc_read.coding_history [k - 1] != '\r')
Chris@40 1222 { printf ("\n\nLine %d : '\\n' without '\\r' before.\n\n", __LINE__) ;
Chris@40 1223 exit (1) ;
Chris@40 1224 } ;
Chris@40 1225
Chris@40 1226 if (bc_read.coding_history [k] == '\r' && bc_read.coding_history [k + 1] != '\n')
Chris@40 1227 { printf ("\n\nLine %d : '\\r' without '\\n' after.\n\n", __LINE__) ;
Chris@40 1228 exit (1) ;
Chris@40 1229 } ;
Chris@40 1230
Chris@40 1231 if (bc_read.coding_history [k] == 0 && k < bc_read.coding_history_size - 1)
Chris@40 1232 { printf ("\n\nLine %d : '\\0' within coding history at index %d of %d.\n\n", __LINE__, k, bc_read.coding_history_size) ;
Chris@40 1233 exit (1) ;
Chris@40 1234 } ;
Chris@40 1235 } ;
Chris@40 1236
Chris@40 1237 return ;
Chris@40 1238 } /* check_coding_history_newlines */
Chris@40 1239
Chris@40 1240 static void
Chris@40 1241 broadcast_coding_history_test (const char *filename)
Chris@40 1242 { static SF_BROADCAST_INFO bc_write, bc_read ;
Chris@40 1243 SNDFILE *file ;
Chris@40 1244 SF_INFO sfinfo ;
Chris@40 1245 const char *default_history = "A=PCM,F=22050,W=16,M=mono" ;
Chris@40 1246 const char *supplied_history =
Chris@40 1247 "A=PCM,F=44100,W=24,M=mono,T=other\r\n"
Chris@40 1248 "A=PCM,F=22050,W=16,M=mono,T=yet_another\r\n" ;
Chris@40 1249
Chris@40 1250 print_test_name ("broadcast_coding_history_test", filename) ;
Chris@40 1251
Chris@40 1252 sfinfo.samplerate = 22050 ;
Chris@40 1253 sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ;
Chris@40 1254 sfinfo.channels = 1 ;
Chris@40 1255
Chris@40 1256 memset (&bc_write, 0, sizeof (bc_write)) ;
Chris@40 1257
Chris@40 1258 snprintf (bc_write.description, sizeof (bc_write.description), "Test description") ;
Chris@40 1259 snprintf (bc_write.originator, sizeof (bc_write.originator), "Test originator") ;
Chris@40 1260 snprintf (bc_write.originator_reference, sizeof (bc_write.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ;
Chris@40 1261 snprintf (bc_write.origination_date, sizeof (bc_write.origination_date), "%d/%02d/%02d", 2006, 3, 30) ;
Chris@40 1262 snprintf (bc_write.origination_time, sizeof (bc_write.origination_time), "%02d:%02d:%02d", 20, 27, 0) ;
Chris@40 1263 snprintf (bc_write.umid, sizeof (bc_write.umid), "Some umid") ;
Chris@40 1264 /* Coding history will be filled in by the library. */
Chris@40 1265 bc_write.coding_history_size = 0 ;
Chris@40 1266
Chris@40 1267 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1268 if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE)
Chris@40 1269 { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ;
Chris@40 1270 exit (1) ;
Chris@40 1271 } ;
Chris@40 1272
Chris@40 1273 test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 1274 sf_close (file) ;
Chris@40 1275
Chris@40 1276 memset (&bc_read, 0, sizeof (bc_read)) ;
Chris@40 1277
Chris@40 1278 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1279 if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE)
Chris@40 1280 { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ;
Chris@40 1281 exit (1) ;
Chris@40 1282 } ;
Chris@40 1283 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 1284 sf_close (file) ;
Chris@40 1285
Chris@40 1286 if (bc_read.coding_history_size == 0)
Chris@40 1287 { printf ("\n\nLine %d : missing coding history.\n\n", __LINE__) ;
Chris@40 1288 exit (1) ;
Chris@40 1289 } ;
Chris@40 1290
Chris@40 1291 if (bc_read.coding_history_size < strlen (default_history) || memcmp (bc_read.coding_history, default_history, strlen (default_history)) != 0)
Chris@40 1292 { printf ("\n\n"
Chris@40 1293 "Line %d : unexpected coding history '%.*s',\n"
Chris@40 1294 " should be '%s'\n\n", __LINE__, bc_read.coding_history_size, bc_read.coding_history, default_history) ;
Chris@40 1295 exit (1) ;
Chris@40 1296 } ;
Chris@40 1297
Chris@40 1298 bc_write.coding_history_size = strlen (supplied_history) ;
Chris@40 1299 bc_write.coding_history_size = snprintf (bc_write.coding_history, sizeof (bc_write.coding_history), "%s", supplied_history) ;
Chris@40 1300
Chris@40 1301 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1302 if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE)
Chris@40 1303 { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ;
Chris@40 1304 exit (1) ;
Chris@40 1305 } ;
Chris@40 1306
Chris@40 1307 test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 1308 sf_close (file) ;
Chris@40 1309
Chris@40 1310 memset (&bc_read, 0, sizeof (bc_read)) ;
Chris@40 1311
Chris@40 1312 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1313 if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE)
Chris@40 1314 { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\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 sf_close (file) ;
Chris@40 1320
Chris@40 1321 if (strstr (bc_read.coding_history, supplied_history) != bc_read.coding_history)
Chris@40 1322 { printf ("\n\nLine %d : unexpected coding history :\n"
Chris@40 1323 "----------------------------------------------------\n%s"
Chris@40 1324 "----------------------------------------------------\n"
Chris@40 1325 "should be this :\n"
Chris@40 1326 "----------------------------------------------------\n%s"
Chris@40 1327 "----------------------------------------------------\n"
Chris@40 1328 "with one more line at the end.\n\n",
Chris@40 1329 __LINE__, bc_read.coding_history, supplied_history) ;
Chris@40 1330 exit (1) ;
Chris@40 1331 } ;
Chris@40 1332
Chris@40 1333 check_coding_history_newlines (filename) ;
Chris@40 1334
Chris@40 1335 unlink (filename) ;
Chris@40 1336 puts ("ok") ;
Chris@40 1337 } /* broadcast_coding_history_test */
Chris@40 1338
Chris@40 1339 /*==============================================================================
Chris@40 1340 */
Chris@40 1341
Chris@40 1342 static void
Chris@40 1343 broadcast_coding_history_size (const char *filename)
Chris@40 1344 { /* SF_BROADCAST_INFO struct with coding_history field of 1024 bytes. */
Chris@40 1345 static SF_BROADCAST_INFO_VAR (1024) bc_write ;
Chris@40 1346 static SF_BROADCAST_INFO_VAR (1024) bc_read ;
Chris@40 1347 SNDFILE *file ;
Chris@40 1348 SF_INFO sfinfo ;
Chris@40 1349 int k ;
Chris@40 1350
Chris@40 1351 print_test_name (__func__, filename) ;
Chris@40 1352
Chris@40 1353 sfinfo.samplerate = 22050 ;
Chris@40 1354 sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ;
Chris@40 1355 sfinfo.channels = 1 ;
Chris@40 1356
Chris@40 1357 memset (&bc_write, 0, sizeof (bc_write)) ;
Chris@40 1358
Chris@40 1359 snprintf (bc_write.description, sizeof (bc_write.description), "Test description") ;
Chris@40 1360 snprintf (bc_write.originator, sizeof (bc_write.originator), "Test originator") ;
Chris@40 1361 snprintf (bc_write.originator_reference, sizeof (bc_write.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ;
Chris@40 1362 snprintf (bc_write.origination_date, sizeof (bc_write.origination_date), "%d/%02d/%02d", 2006, 3, 30) ;
Chris@40 1363 snprintf (bc_write.origination_time, sizeof (bc_write.origination_time), "%02d:%02d:%02d", 20, 27, 0) ;
Chris@40 1364 snprintf (bc_write.umid, sizeof (bc_write.umid), "Some umid") ;
Chris@40 1365 bc_write.coding_history_size = 0 ;
Chris@40 1366
Chris@40 1367 for (k = 0 ; bc_write.coding_history_size < 512 ; k++)
Chris@40 1368 { snprintf (bc_write.coding_history + bc_write.coding_history_size,
Chris@40 1369 sizeof (bc_write.coding_history) - bc_write.coding_history_size, "line %4d\n", k) ;
Chris@40 1370 bc_write.coding_history_size = strlen (bc_write.coding_history) ;
Chris@40 1371 } ;
Chris@40 1372
Chris@40 1373 exit_if_true (bc_write.coding_history_size < 512,
Chris@40 1374 "\n\nLine %d : bc_write.coding_history_size (%d) should be > 512.\n\n", __LINE__, bc_write.coding_history_size) ;
Chris@40 1375
Chris@40 1376 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1377 if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE)
Chris@40 1378 { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ;
Chris@40 1379 exit (1) ;
Chris@40 1380 } ;
Chris@40 1381
Chris@40 1382 test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 1383 sf_close (file) ;
Chris@40 1384
Chris@40 1385 memset (&bc_read, 0, sizeof (bc_read)) ;
Chris@40 1386
Chris@40 1387 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1388 if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE)
Chris@40 1389 { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ;
Chris@40 1390 exit (1) ;
Chris@40 1391 } ;
Chris@40 1392 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 1393 sf_close (file) ;
Chris@40 1394
Chris@40 1395 exit_if_true (bc_read.coding_history_size < 512,
Chris@40 1396 "\n\nLine %d : unexpected coding history size %d (should be > 512).\n\n", __LINE__, bc_read.coding_history_size) ;
Chris@40 1397
Chris@40 1398 exit_if_true (strstr (bc_read.coding_history, "libsndfile") == NULL,
Chris@40 1399 "\n\nLine %d : coding history incomplete (should contain 'libsndfile').\n\n", __LINE__) ;
Chris@40 1400
Chris@40 1401 unlink (filename) ;
Chris@40 1402 puts ("ok") ;
Chris@40 1403 } /* broadcast_coding_history_size */
Chris@40 1404
Chris@40 1405 /*==============================================================================
Chris@40 1406 */
Chris@40 1407 static void
Chris@40 1408 cart_test (const char *filename, int filetype)
Chris@40 1409 { static SF_CART_INFO ca_write, ca_read ;
Chris@40 1410 SNDFILE *file ;
Chris@40 1411 SF_INFO sfinfo ;
Chris@40 1412 int errors = 0 ;
Chris@40 1413
Chris@40 1414 print_test_name ("cart_test", filename) ;
Chris@40 1415
Chris@40 1416 sfinfo.samplerate = 11025 ;
Chris@40 1417 sfinfo.format = filetype ;
Chris@40 1418 sfinfo.channels = 1 ;
Chris@40 1419 memset (&ca_write, 0, sizeof (ca_write)) ;
Chris@40 1420
Chris@40 1421 // example test data
Chris@40 1422 snprintf (ca_write.artist, sizeof (ca_write.artist), "Test artist") ;
Chris@40 1423 snprintf (ca_write.version, sizeof (ca_write.version), "Test version") ;
Chris@40 1424 snprintf (ca_write.cut_id, sizeof (ca_write.cut_id), "Test cut ID") ;
Chris@40 1425 snprintf (ca_write.client_id, sizeof (ca_write.client_id), "Test client ID") ;
Chris@40 1426 snprintf (ca_write.category, sizeof (ca_write.category), "Test category") ;
Chris@40 1427 snprintf (ca_write.classification, sizeof (ca_write.classification), "Test classification") ;
Chris@40 1428 snprintf (ca_write.out_cue, sizeof (ca_write.out_cue), "Test out cue") ;
Chris@40 1429 snprintf (ca_write.start_date, sizeof (ca_write.start_date), "%d/%02d/%02d", 2006, 3, 30) ;
Chris@40 1430 snprintf (ca_write.start_time, sizeof (ca_write.start_time), "%02d:%02d:%02d", 20, 27, 0) ;
Chris@40 1431 snprintf (ca_write.end_date, sizeof (ca_write.end_date), "%d/%02d/%02d", 2006, 3, 30) ;
Chris@40 1432 snprintf (ca_write.end_time, sizeof (ca_write.end_time), "%02d:%02d:%02d", 20, 27, 0) ;
Chris@40 1433 snprintf (ca_write.producer_app_id, sizeof (ca_write.producer_app_id), "Test producer app id") ;
Chris@40 1434 snprintf (ca_write.producer_app_version, sizeof (ca_write.producer_app_version), "Test producer app version") ;
Chris@40 1435 snprintf (ca_write.user_def, sizeof (ca_write.user_def), "test user def test test") ;
Chris@40 1436 ca_write.level_reference = 42 ;
Chris@40 1437 snprintf (ca_write.url, sizeof (ca_write.url), "http://www.test.com/test_url") ;
Chris@40 1438 snprintf (ca_write.tag_text, sizeof (ca_write.tag_text), "tag text test! \r\n") ; // must be terminated \r\n to be valid
Chris@40 1439 ca_write.tag_text_size = strlen (ca_write.tag_text) ;
Chris@40 1440
Chris@40 1441 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1442 if (sf_command (file, SFC_SET_CART_INFO, &ca_write, sizeof (ca_write)) == SF_FALSE)
Chris@40 1443 exit (1) ;
Chris@40 1444
Chris@40 1445 test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 1446 sf_close (file) ;
Chris@40 1447
Chris@40 1448 memset (&ca_read, 0, sizeof (ca_read)) ;
Chris@40 1449
Chris@40 1450 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1451 if (sf_command (file, SFC_GET_CART_INFO, &ca_read, sizeof (ca_read)) == SF_FALSE)
Chris@40 1452 { printf ("\n\nLine %d : sf_command (SFC_GET_CART_INFO) failed.\n\n", __LINE__) ;
Chris@40 1453 exit (1) ;
Chris@40 1454 return ;
Chris@40 1455 } ;
Chris@40 1456 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 1457 sf_close (file) ;
Chris@40 1458
Chris@40 1459
Chris@40 1460 if (memcmp (ca_write.artist, ca_read.artist, sizeof (ca_write.artist)) != 0)
Chris@40 1461 { printf ("\n\nLine %d : artist mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.artist, ca_read.artist) ;
Chris@40 1462 errors ++ ;
Chris@40 1463 } ;
Chris@40 1464
Chris@40 1465 if (memcmp (ca_write.version, ca_read.version, sizeof (ca_write.version)) != 0)
Chris@40 1466 { printf ("\n\nLine %d : version mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.version, ca_read.version) ;
Chris@40 1467 errors ++ ;
Chris@40 1468 } ;
Chris@40 1469
Chris@40 1470 if (memcmp (ca_write.title, ca_read.title, sizeof (ca_write.title)) != 0)
Chris@40 1471 { printf ("\n\nLine %d : title mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.title, ca_read.title) ;
Chris@40 1472 errors ++ ;
Chris@40 1473 } ;
Chris@40 1474
Chris@40 1475 if (memcmp (ca_write.cut_id, ca_read.cut_id, sizeof (ca_write.cut_id)) != 0)
Chris@40 1476 { printf ("\n\nLine %d : cut_id mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.cut_id, ca_read.cut_id) ;
Chris@40 1477 errors ++ ;
Chris@40 1478 } ;
Chris@40 1479
Chris@40 1480 if (memcmp (ca_write.client_id, ca_read.client_id, sizeof (ca_write.client_id)) != 0)
Chris@40 1481 { printf ("\n\nLine %d : client_id mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.client_id, ca_read.client_id) ;
Chris@40 1482 errors ++ ;
Chris@40 1483 } ;
Chris@40 1484
Chris@40 1485 if (memcmp (ca_write.category, ca_read.category, sizeof (ca_write.category)) != 0)
Chris@40 1486 { printf ("\n\nLine %d : category mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.category, ca_read.category) ;
Chris@40 1487 errors ++ ;
Chris@40 1488 } ;
Chris@40 1489
Chris@40 1490 if (memcmp (ca_write.out_cue, ca_read.out_cue, sizeof (ca_write.out_cue)) != 0)
Chris@40 1491 { printf ("\n\nLine %d : out_cue mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.out_cue, ca_read.out_cue) ;
Chris@40 1492 errors ++ ;
Chris@40 1493 } ;
Chris@40 1494
Chris@40 1495 if (memcmp (ca_write.start_date, ca_read.start_date, sizeof (ca_write.start_date)) != 0)
Chris@40 1496 { printf ("\n\nLine %d : start_date mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.start_date, ca_read.start_date) ;
Chris@40 1497 errors ++ ;
Chris@40 1498 } ;
Chris@40 1499
Chris@40 1500
Chris@40 1501 if (memcmp (ca_write.start_time, ca_read.start_time, sizeof (ca_write.start_time)) != 0)
Chris@40 1502 { printf ("\n\nLine %d : start_time mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.start_time, ca_read.start_time) ;
Chris@40 1503 errors ++ ;
Chris@40 1504 } ;
Chris@40 1505
Chris@40 1506
Chris@40 1507 if (memcmp (ca_write.end_date, ca_read.end_date, sizeof (ca_write.end_date)) != 0)
Chris@40 1508 { printf ("\n\nLine %d : end_date mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.end_date, ca_read.end_date) ;
Chris@40 1509 errors ++ ;
Chris@40 1510 } ;
Chris@40 1511
Chris@40 1512
Chris@40 1513 if (memcmp (ca_write.end_time, ca_read.end_time, sizeof (ca_write.end_time)) != 0)
Chris@40 1514 { printf ("\n\nLine %d : end_time mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.end_time, ca_read.end_time) ;
Chris@40 1515 errors ++ ;
Chris@40 1516 } ;
Chris@40 1517
Chris@40 1518
Chris@40 1519 if (memcmp (ca_write.producer_app_id, ca_read.producer_app_id, sizeof (ca_write.producer_app_id)) != 0)
Chris@40 1520 { printf ("\n\nLine %d : producer_app_id mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.producer_app_id, ca_read.producer_app_id) ;
Chris@40 1521 errors ++ ;
Chris@40 1522 } ;
Chris@40 1523
Chris@40 1524
Chris@40 1525 if (memcmp (ca_write.producer_app_version, ca_read.producer_app_version, sizeof (ca_write.producer_app_version)) != 0)
Chris@40 1526 { printf ("\n\nLine %d : producer_app_version mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.producer_app_version, ca_read.producer_app_version) ;
Chris@40 1527 errors ++ ;
Chris@40 1528 } ;
Chris@40 1529
Chris@40 1530
Chris@40 1531 if (memcmp (ca_write.user_def, ca_read.user_def, sizeof (ca_write.user_def)) != 0)
Chris@40 1532 { printf ("\n\nLine %d : user_def mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.user_def, ca_read.user_def) ;
Chris@40 1533 errors ++ ;
Chris@40 1534 } ;
Chris@40 1535
Chris@40 1536
Chris@40 1537 if (ca_write.level_reference != ca_read.level_reference)
Chris@40 1538 { printf ("\n\nLine %d : level_reference mismatch :\n\twrite : '%d'\n\tread : '%d'\n\n", __LINE__, ca_write.level_reference, ca_read.level_reference) ;
Chris@40 1539 errors ++ ;
Chris@40 1540 } ;
Chris@40 1541
Chris@40 1542 // TODO: make this more helpful
Chris@40 1543 if (memcmp (ca_write.post_timers, ca_read.post_timers, sizeof (ca_write.post_timers)) != 0)
Chris@40 1544 { printf ("\n\nLine %d : post_timers mismatch :\n'\n\n", __LINE__) ;
Chris@40 1545 errors ++ ;
Chris@40 1546 } ;
Chris@40 1547
Chris@40 1548 if (memcmp (ca_write.url, ca_read.url, sizeof (ca_write.url)) != 0)
Chris@40 1549 { printf ("\n\nLine %d : url mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.url, ca_read.url) ;
Chris@40 1550 errors ++ ;
Chris@40 1551 } ;
Chris@40 1552
Chris@40 1553
Chris@40 1554 if (memcmp (ca_write.tag_text, ca_read.tag_text, (size_t) (ca_read.tag_text_size)) != 0)
Chris@40 1555 { printf ("\n\nLine %d : tag_text mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.tag_text, ca_read.tag_text) ;
Chris@40 1556 errors ++ ;
Chris@40 1557 } ;
Chris@40 1558
Chris@40 1559
Chris@40 1560 if (errors)
Chris@40 1561 exit (1) ;
Chris@40 1562
Chris@40 1563 unlink (filename) ;
Chris@40 1564 puts ("ok") ;
Chris@40 1565 } /* cart_test */
Chris@40 1566
Chris@40 1567 static void
Chris@40 1568 cart_rdwr_test (const char *filename, int filetype)
Chris@40 1569 { SF_CART_INFO cinfo ;
Chris@40 1570 SNDFILE *file ;
Chris@40 1571 SF_INFO sfinfo ;
Chris@40 1572 sf_count_t frames ;
Chris@40 1573
Chris@40 1574 print_test_name (__func__, filename) ;
Chris@40 1575
Chris@40 1576 create_short_sndfile (filename, filetype, 2) ;
Chris@40 1577
Chris@40 1578 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 1579 memset (&cinfo, 0, sizeof (cinfo)) ;
Chris@40 1580
Chris@40 1581 snprintf (cinfo.artist, sizeof (cinfo.artist), "Test artist") ;
Chris@40 1582 snprintf (cinfo.version, sizeof (cinfo.version), "Test version") ;
Chris@40 1583 snprintf (cinfo.cut_id, sizeof (cinfo.cut_id), "Test cut ID") ;
Chris@40 1584 snprintf (cinfo.client_id, sizeof (cinfo.client_id), "Test client ID") ;
Chris@40 1585 snprintf (cinfo.category, sizeof (cinfo.category), "Test category") ;
Chris@40 1586 snprintf (cinfo.classification, sizeof (cinfo.classification), "Test classification") ;
Chris@40 1587 snprintf (cinfo.out_cue, sizeof (cinfo.out_cue), "Test out cue") ;
Chris@40 1588 snprintf (cinfo.start_date, sizeof (cinfo.start_date), "%d/%02d/%02d", 2006, 3, 30) ;
Chris@40 1589 snprintf (cinfo.start_time, sizeof (cinfo.start_time), "%02d:%02d:%02d", 20, 27, 0) ;
Chris@40 1590 snprintf (cinfo.end_date, sizeof (cinfo.end_date), "%d/%02d/%02d", 2006, 3, 30) ;
Chris@40 1591 snprintf (cinfo.end_time, sizeof (cinfo.end_time), "%02d:%02d:%02d", 20, 27, 0) ;
Chris@40 1592 snprintf (cinfo.producer_app_id, sizeof (cinfo.producer_app_id), "Test producer app id") ;
Chris@40 1593 snprintf (cinfo.producer_app_version, sizeof (cinfo.producer_app_version), "Test producer app version") ;
Chris@40 1594 snprintf (cinfo.user_def, sizeof (cinfo.user_def), "test user def test test") ;
Chris@40 1595 cinfo.level_reference = 42 ;
Chris@40 1596 snprintf (cinfo.url, sizeof (cinfo.url), "http://www.test.com/test_url") ;
Chris@40 1597 snprintf (cinfo.tag_text, sizeof (cinfo.tag_text), "tag text test!\r\n") ;
Chris@40 1598 cinfo.tag_text_size = strlen (cinfo.tag_text) ;
Chris@40 1599
Chris@40 1600 file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1601 frames = sfinfo.frames ;
Chris@40 1602 if (sf_command (file, SFC_SET_CART_INFO, &cinfo, sizeof (cinfo)) != SF_FALSE)
Chris@40 1603 { printf ("\n\nLine %d : sf_command (SFC_SET_CART_INFO) should have failed but didn't.\n\n", __LINE__) ;
Chris@40 1604 exit (1) ;
Chris@40 1605 } ;
Chris@40 1606 sf_close (file) ;
Chris@40 1607
Chris@40 1608 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1609 sf_close (file) ;
Chris@40 1610 exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ;
Chris@40 1611
Chris@40 1612 unlink (filename) ;
Chris@40 1613 puts ("ok") ;
Chris@40 1614 } /* cart_rdwr_test */
Chris@40 1615
Chris@40 1616 /*==============================================================================
Chris@40 1617 */
Chris@40 1618
Chris@40 1619 static void
Chris@40 1620 channel_map_test (const char *filename, int filetype)
Chris@40 1621 { SNDFILE *file ;
Chris@40 1622 SF_INFO sfinfo ;
Chris@40 1623 int channel_map_read [4], channel_map_write [4] =
Chris@40 1624 { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE,
Chris@40 1625 SF_CHANNEL_MAP_REAR_CENTER
Chris@40 1626 } ;
Chris@40 1627
Chris@40 1628 print_test_name ("channel_map_test", filename) ;
Chris@40 1629
Chris@40 1630 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 1631 sfinfo.samplerate = 11025 ;
Chris@40 1632 sfinfo.format = filetype ;
Chris@40 1633 sfinfo.channels = ARRAY_LEN (channel_map_read) ;
Chris@40 1634
Chris@40 1635 switch (filetype & SF_FORMAT_TYPEMASK)
Chris@40 1636 { /* WAVEX and RF64 have a default channel map, even if you don't specify one. */
Chris@40 1637 case SF_FORMAT_WAVEX :
Chris@40 1638 case SF_FORMAT_RF64 :
Chris@40 1639 /* Write file without channel map. */
Chris@40 1640 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1641 test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 1642 sf_close (file) ;
Chris@40 1643
Chris@40 1644 /* Read file making default channel map exists. */
Chris@40 1645 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1646 exit_if_true (
Chris@40 1647 sf_command (file, SFC_GET_CHANNEL_MAP_INFO, channel_map_read, sizeof (channel_map_read)) == SF_FALSE,
Chris@40 1648 "\n\nLine %d : sf_command (SFC_GET_CHANNEL_MAP_INFO) should not have failed.\n\n", __LINE__
Chris@40 1649 ) ;
Chris@40 1650 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 1651 sf_close (file) ;
Chris@40 1652 break ;
Chris@40 1653
Chris@40 1654 default :
Chris@40 1655 break ;
Chris@40 1656 } ;
Chris@40 1657
Chris@40 1658 /* Write file with a channel map. */
Chris@40 1659 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1660 exit_if_true (
Chris@40 1661 sf_command (file, SFC_SET_CHANNEL_MAP_INFO, channel_map_write, sizeof (channel_map_write)) == SF_FALSE,
Chris@40 1662 "\n\nLine %d : sf_command (SFC_SET_CHANNEL_MAP_INFO) failed.\n\n", __LINE__
Chris@40 1663 ) ;
Chris@40 1664 test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 1665 sf_close (file) ;
Chris@40 1666
Chris@40 1667 /* Read file making sure no channel map exists. */
Chris@40 1668 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1669 exit_if_true (
Chris@40 1670 sf_command (file, SFC_GET_CHANNEL_MAP_INFO, channel_map_read, sizeof (channel_map_read)) != SF_TRUE,
Chris@40 1671 "\n\nLine %d : sf_command (SFC_GET_CHANNEL_MAP_INFO) failed.\n\n", __LINE__
Chris@40 1672 ) ;
Chris@40 1673 check_log_buffer_or_die (file, __LINE__) ;
Chris@40 1674 sf_close (file) ;
Chris@40 1675
Chris@40 1676 exit_if_true (
Chris@40 1677 memcmp (channel_map_read, channel_map_write, sizeof (channel_map_read)) != 0,
Chris@40 1678 "\n\nLine %d : Channel map read does not match channel map written.\n\n", __LINE__
Chris@40 1679 ) ;
Chris@40 1680
Chris@40 1681 unlink (filename) ;
Chris@40 1682 puts ("ok") ;
Chris@40 1683 } /* channel_map_test */
Chris@40 1684
Chris@40 1685 static void
Chris@40 1686 raw_needs_endswap_test (const char *filename, int filetype)
Chris@40 1687 { static int subtypes [] =
Chris@40 1688 { SF_FORMAT_FLOAT, SF_FORMAT_DOUBLE,
Chris@40 1689 SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32
Chris@40 1690 } ;
Chris@40 1691 SNDFILE *file ;
Chris@40 1692 SF_INFO sfinfo ;
Chris@40 1693 unsigned k ;
Chris@40 1694 int needs_endswap ;
Chris@40 1695
Chris@40 1696 print_test_name (__func__, filename) ;
Chris@40 1697
Chris@40 1698 for (k = 0 ; k < ARRAY_LEN (subtypes) ; k++)
Chris@40 1699 {
Chris@40 1700 if (filetype == (SF_ENDIAN_LITTLE | SF_FORMAT_AIFF))
Chris@40 1701 switch (subtypes [k])
Chris@40 1702 { /* Little endian AIFF does not AFAIK support fl32 and fl64. */
Chris@40 1703 case SF_FORMAT_FLOAT :
Chris@40 1704 case SF_FORMAT_DOUBLE :
Chris@40 1705 continue ;
Chris@40 1706 default :
Chris@40 1707 break ;
Chris@40 1708 } ;
Chris@40 1709
Chris@40 1710 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 1711 sfinfo.samplerate = 11025 ;
Chris@40 1712 sfinfo.format = filetype | subtypes [k] ;
Chris@40 1713 sfinfo.channels = 1 ;
Chris@40 1714
Chris@40 1715 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1716 test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ;
Chris@40 1717 sf_close (file) ;
Chris@40 1718
Chris@40 1719 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@40 1720 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
Chris@40 1721
Chris@40 1722 needs_endswap = sf_command (file, SFC_RAW_DATA_NEEDS_ENDSWAP, NULL, 0) ;
Chris@40 1723
Chris@40 1724 switch (filetype)
Chris@40 1725 { case SF_FORMAT_WAV :
Chris@40 1726 case SF_FORMAT_WAVEX :
Chris@40 1727 case SF_FORMAT_AIFF | SF_ENDIAN_LITTLE :
Chris@40 1728 exit_if_true (needs_endswap != CPU_IS_BIG_ENDIAN,
Chris@40 1729 "\n\nLine %d : SFC_RAW_DATA_NEEDS_ENDSWAP failed for (%d | %d).\n\n", __LINE__, filetype, k) ;
Chris@40 1730 break ;
Chris@40 1731
Chris@40 1732 case SF_FORMAT_AIFF :
Chris@40 1733 case SF_FORMAT_WAV | SF_ENDIAN_BIG :
Chris@40 1734 exit_if_true (needs_endswap != CPU_IS_LITTLE_ENDIAN,
Chris@40 1735 "\n\nLine %d : SFC_RAW_DATA_NEEDS_ENDSWAP failed for (%d | %d).\n\n", __LINE__, filetype, k) ;
Chris@40 1736 break ;
Chris@40 1737
Chris@40 1738 default :
Chris@40 1739 printf ("\n\nLine %d : bad format value %d.\n\n", __LINE__, filetype) ;
Chris@40 1740 exit (1) ;
Chris@40 1741 break ;
Chris@40 1742 } ;
Chris@40 1743
Chris@40 1744 sf_close (file) ;
Chris@40 1745 } ;
Chris@40 1746
Chris@40 1747 unlink (filename) ;
Chris@40 1748 puts ("ok") ;
Chris@40 1749 } /* raw_needs_endswap_test */