header_test.c
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:23k
源码类别:

Audio

开发平台:

Unix_Linux

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