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

Add null config files
author Chris Cannam
date Mon, 02 Mar 2020 14:03:47 +0000
parents 1df64224f5ac
children
rev   line source
Chris@40 1 /*
Chris@40 2 ** Copyright (C) 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 */