write_read_test.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:26k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /*
  2. ** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
  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 <stdio.h>
  19. #include <string.h>
  20. #include <unistd.h>
  21. #include <math.h>
  22. #include <sndfile.h>
  23. #define BUFFER_SIZE (1<<15)
  24. static void pcm_test_char (char *str, char *filename, int typemajor, int typeminor) ;
  25. static void pcm_test_short (char *str, char *filename, int typemajor, int typeminor) ;
  26. static void pcm_test_24bit (char *str, char *filename, int typemajor, int typeminor, int long_file_ok) ;
  27. static void pcm_test_int (char *str, char *filename, int typemajor, int typeminor) ;
  28. static void pcm_float_test (char *str, char *filename, int typemajor) ;
  29. /* Force the start of this buffer to be double aligned. Sparc-solaris will
  30. ** choke if its not.
  31. */
  32. static double test_buffer [(BUFFER_SIZE/sizeof(double))+1] ;
  33. int main (int argc, char *argv[])
  34. { char *filename ;
  35. int bDoAll = 0 ;
  36. int nTests = 0 ;
  37. if (argc != 2)
  38. { printf ("Usage : %s <test>n", argv [0]) ;
  39. printf ("    Where <test> is one of the following:n") ;
  40. printf ("           wav  - test WAV file functions (little endian)n") ;
  41. printf ("           aiff - test AIFF file functions (big endian)n") ;
  42. printf ("           au   - test AU file functions (big endian)n") ;
  43. printf ("           aule - test little endian AU file functionsn") ;
  44. printf ("           raw  - test RAW header-less PCM file functionsn") ;
  45. printf ("           paf  - test PAF file functionsn") ;
  46. printf ("           svx  - test 8SVX/16SV file functionsn") ;
  47. printf ("           all  - perform all testsn") ;
  48. exit (1) ;
  49. } ;
  50. bDoAll=!strcmp (argv [1], "all");
  51. if (bDoAll || ! strcmp (argv [1], "wav"))
  52. { filename = "test.wav" ;
  53. pcm_test_char  ("wav", filename, SF_FORMAT_WAV, SF_FORMAT_PCM) ;
  54. pcm_test_short ("wav", filename, SF_FORMAT_WAV, SF_FORMAT_PCM) ;
  55. pcm_test_24bit ("wav", filename, SF_FORMAT_WAV, SF_FORMAT_PCM, 0) ;
  56. pcm_test_int ("wav", filename, SF_FORMAT_WAV, SF_FORMAT_PCM) ;
  57. pcm_float_test ("wav", filename, SF_FORMAT_WAV) ;
  58. unlink (filename) ;
  59. nTests++ ;
  60. } ;
  61. if (bDoAll || ! strcmp (argv [1], "aiff"))
  62. { filename = "test.aiff" ;
  63. pcm_test_char  ("aiff", filename, SF_FORMAT_AIFF, SF_FORMAT_PCM) ;
  64. pcm_test_short ("aiff", filename, SF_FORMAT_AIFF, SF_FORMAT_PCM) ;
  65. pcm_test_24bit ("aiff", filename, SF_FORMAT_AIFF, SF_FORMAT_PCM, 0) ;
  66. pcm_test_int   ("aiff", filename, SF_FORMAT_AIFF, SF_FORMAT_PCM) ;
  67. unlink (filename) ;
  68. nTests++ ;
  69. } ;
  70. if (bDoAll || ! strcmp (argv [1], "au"))
  71. { filename = "test.au" ;
  72. pcm_test_char  ("au", filename, SF_FORMAT_AU, SF_FORMAT_PCM) ;
  73. pcm_test_short ("au", filename, SF_FORMAT_AU, SF_FORMAT_PCM) ;
  74. pcm_test_24bit ("au", filename, SF_FORMAT_AU, SF_FORMAT_PCM, 0) ;
  75. pcm_test_int   ("au", filename, SF_FORMAT_AU, SF_FORMAT_PCM) ;
  76. unlink (filename) ;
  77. nTests++ ;
  78. } ;
  79. if (bDoAll || ! strcmp (argv [1], "aule"))
  80. { filename = "test.au" ;
  81. pcm_test_char  ("aule", filename, SF_FORMAT_AULE, SF_FORMAT_PCM) ;
  82. pcm_test_short ("aule", filename, SF_FORMAT_AULE, SF_FORMAT_PCM) ;
  83. pcm_test_24bit ("aule", filename, SF_FORMAT_AULE, SF_FORMAT_PCM, 0) ;
  84. pcm_test_int   ("aule", filename, SF_FORMAT_AULE, SF_FORMAT_PCM) ;
  85. unlink (filename) ;
  86. nTests++ ;
  87. } ;
  88. if (bDoAll || ! strcmp (argv [1], "raw"))
  89. { filename = "test.raw" ;
  90. pcm_test_char  ("raw-s8", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_S8) ;
  91. pcm_test_char  ("raw-u8", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_U8) ;
  92. pcm_test_short ("raw-le", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_LE) ;
  93. pcm_test_short ("raw-be", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_BE) ;
  94. pcm_test_24bit ("raw-le", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_LE, 0) ;
  95. pcm_test_24bit ("raw-be", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_BE, 0) ;
  96. pcm_test_int   ("raw-le", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_LE) ;
  97. pcm_test_int   ("raw-be", filename, SF_FORMAT_RAW, SF_FORMAT_PCM_BE) ;
  98. unlink (filename) ;
  99. nTests++ ;
  100. } ;
  101. if (bDoAll || ! strcmp (argv [1], "paf"))
  102. { filename = "test.paf" ;
  103. pcm_test_short ("paf-le", filename, SF_FORMAT_PAF, SF_FORMAT_PCM_LE) ;
  104. pcm_test_short ("paf-be", filename, SF_FORMAT_PAF, SF_FORMAT_PCM_BE) ;
  105. pcm_test_24bit ("paf-le", filename, SF_FORMAT_PAF, SF_FORMAT_PCM_LE, 1) ;
  106. pcm_test_24bit ("paf-be", filename, SF_FORMAT_PAF, SF_FORMAT_PCM_BE, 1) ;
  107. unlink (filename) ;
  108. nTests++ ;
  109. } ;
  110. if (bDoAll || ! strcmp (argv [1], "svx"))
  111. { filename = "test.svx" ;
  112. pcm_test_char  ("svx", filename, SF_FORMAT_SVX, SF_FORMAT_PCM) ;
  113. pcm_test_short ("svx", filename, SF_FORMAT_SVX, SF_FORMAT_PCM) ;
  114. unlink (filename) ;
  115. nTests++ ;
  116. } ;
  117. if (nTests == 0)
  118. { printf ("Mono : ************************************n") ;
  119. printf ("Mono : *  No '%s' test defined.n", argv [1]) ;
  120. printf ("Mono : ************************************n") ;
  121. return 1 ;
  122. } ;
  123. return 0;
  124. } /* main */
  125. /*============================================================================================
  126.  * Here are the test functions.
  127.  */ 
  128. static
  129. void pcm_test_char (char *str, char *filename, int typemajor, int typeminor)
  130. { SNDFILE *file ;
  131. SF_INFO sfinfo ;
  132. unsigned int k, items, frames ;
  133. short *data ;
  134. printf ("    pcm_test_char  : %s ... ", str) ;
  135. items = 127 ;
  136. data = (short*) test_buffer ;
  137. for (k = 0 ; k < items ; k++)
  138. data [k] = k * ((k % 2) ? 1 : -1) ;
  139. sfinfo.samplerate  = 44100 ;
  140. sfinfo.samples     = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  141. sfinfo.channels    = 1 ;
  142. sfinfo.pcmbitwidth = 8 ;
  143. sfinfo.format     = (typemajor | typeminor) ;
  144. if (! (file = sf_open_write (filename, &sfinfo)))
  145. { printf ("Mono : sf_open_write failed with error : ") ;
  146. sf_perror (NULL) ;
  147. exit (1) ;
  148. } ;
  149. if ((k = sf_write_short (file, data, items)) != items)
  150. { printf ("Mono : sf_write_short failed with short write (%d => %d).n", items, k) ;
  151. sf_perror (file) ;
  152. exit (1) ;
  153. } ;
  154. sf_close (file) ;
  155. memset (data, 0, items * sizeof (short)) ;
  156. if (typemajor != SF_FORMAT_RAW)
  157. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  158. if (! (file = sf_open_read (filename, &sfinfo)))
  159. { printf ("Mono : sf_open_read failed with error : ") ;
  160. sf_perror (NULL) ;
  161. exit (1) ;
  162. } ;
  163. if (sfinfo.format != (typemajor | typeminor))
  164. { printf ("Mono : Returned format incorrect (0x%08X => 0x%08X).n", (typemajor | typeminor), sfinfo.format) ;
  165. exit (1) ;
  166. } ;
  167. if (sfinfo.samples != items)
  168. { printf ("Mono : Incorrect number of samples in file. (%u => %u)n", items, sfinfo.samples) ;
  169. exit (1) ;
  170. } ;
  171. if (sfinfo.channels != 1)
  172. { printf ("Mono : Incorrect number of channels in file.n") ;
  173. exit (1) ;
  174. } ;
  175. if (sfinfo.pcmbitwidth != 8)
  176. { printf ("Mono : Incorrect bit width (%d).n", sfinfo.pcmbitwidth) ;
  177. exit (1) ;
  178. } ;
  179. if ((k = sf_read_short (file, data, items)) != items)
  180. { printf ("Mono : short read (%d).n", k) ;
  181. exit (1) ;
  182. } ;
  183. for (k = 0 ; k < items ; k++)
  184. if (data [k] != k * ((k % 2) ? 1 : -1))
  185. { printf ("Mono : Incorrect sample (#%d : %d => %d).n", k, k * ((k % 2) ? 1 : -1), data [k]) ;
  186. exit (1) ;
  187. } ;
  188. sf_close (file) ;
  189. /* Now test Stereo. */
  190. if (typemajor == SF_FORMAT_SVX)
  191. { printf ("okn") ;
  192. return ;
  193. } ;
  194. items = 126 ;
  195. data = (short*) test_buffer ;
  196. for (k = 0 ; k < items ; k++)
  197. data [k] = k * ((k % 2) ? 1 : -1) ;
  198. sfinfo.samplerate  = 44100 ;
  199. sfinfo.samples     = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  200. sfinfo.channels    = 2 ;
  201. sfinfo.pcmbitwidth = 8 ;
  202. sfinfo.format     = (typemajor | typeminor) ;
  203. frames = items / sfinfo.channels ;
  204. if (! (file = sf_open_write (filename, &sfinfo)))
  205. { printf ("Stereo : sf_open_write failed with error : ") ;
  206. sf_perror (NULL) ;
  207. exit (1) ;
  208. } ;
  209. if ((k = sf_writef_short (file, data, frames)) != frames)
  210. { printf ("Stereo : sf_writef_short failed with short write (%d => %d).n", frames, k) ;
  211. sf_perror (file) ;
  212. exit (1) ;
  213. } ;
  214. sf_close (file) ;
  215. memset (data, 0, items * sizeof (short)) ;
  216. if (typemajor != SF_FORMAT_RAW)
  217. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  218. if (! (file = sf_open_read (filename, &sfinfo)))
  219. { printf ("Stereo : sf_open_read failed with error : ") ;
  220. sf_perror (NULL) ;
  221. exit (1) ;
  222. } ;
  223. if (sfinfo.format != (typemajor | typeminor))
  224. { printf ("Stereo : Returned format incorrect (0x%08X => 0x%08X).n", (typemajor | typeminor), sfinfo.format) ;
  225. exit (1) ;
  226. } ;
  227. if (sfinfo.samples != frames)
  228. { printf ("Stereo : Incorrect number of samples in file. (%u => %u)n", frames, sfinfo.samples) ;
  229. exit (1) ;
  230. } ;
  231. if (sfinfo.channels != 2)
  232. { printf ("Stereo : Incorrect number of channels in file.n") ;
  233. exit (1) ;
  234. } ;
  235. if (sfinfo.pcmbitwidth != 8)
  236. { printf ("Stereo : Incorrect bit width (%d).n", sfinfo.pcmbitwidth) ;
  237. exit (1) ;
  238. } ;
  239. if ((k = sf_readf_short (file, data, frames)) != frames)
  240. { printf ("Stereo : short read (%d).n", k) ;
  241. exit (1) ;
  242. } ;
  243. sf_close (file) ;
  244. for (k = 0 ; k < items ; k++)
  245. if (data [k] != k * ((k % 2) ? 1 : -1))
  246. { printf ("Stereo : Incorrect sample (#%d : %d => %d).n", k, k * ((k % 2) ? 1 : -1), data [k]) ;
  247. exit (1) ;
  248. } ;
  249. printf ("okn") ;
  250. } /* pcm_test_char */
  251. static
  252. void pcm_test_short (char *str, char *filename, int typemajor, int typeminor)
  253. { SNDFILE *file ;
  254. SF_INFO sfinfo ;
  255. unsigned int k, items, frames ;
  256. short *data ;
  257. printf ("    pcm_test_short : %s ... ", str) ;
  258. items = BUFFER_SIZE / sizeof (short) ;
  259. data = (short*) test_buffer ;
  260. for (k = 0 ; k < items ; k++)
  261. data [k] = k * ((k % 2) ? 1 : -1) ;
  262. sfinfo.samplerate  = 44100 ;
  263. sfinfo.samples     = items ;
  264. sfinfo.channels    = 1 ;
  265. sfinfo.pcmbitwidth = 16 ;
  266. sfinfo.format     = (typemajor | typeminor) ;
  267. if (! (file = sf_open_write (filename, &sfinfo)))
  268. { printf ("Mono : sf_open_write failed with error : ") ;
  269. sf_perror (NULL) ;
  270. exit (1) ;
  271. } ;
  272. if ((k = sf_write_short (file, data, items)) != items)
  273. { printf ("Mono : sf_write_short failed with short write (%d => %d).n", items, k) ;
  274. sf_perror (file) ;
  275. exit (1) ;
  276. } ;
  277. sf_close (file) ;
  278. memset (data, 0, items * sizeof (short)) ;
  279. if (typemajor != SF_FORMAT_RAW)
  280. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  281. if (! (file = sf_open_read (filename, &sfinfo)))
  282. { printf ("Mono : sf_open_read failed with error : ") ;
  283. sf_perror (NULL) ;
  284. exit (1) ;
  285. } ;
  286. if (sfinfo.format != (typemajor | typeminor))
  287. { printf ("Mono : Returned format incorrect (0x%08X => 0x%08X).n", (typemajor | typeminor), sfinfo.format) ;
  288. exit (1) ;
  289. } ;
  290. if (sfinfo.samples != items)
  291. { printf ("Mono : Incorrect number of samples in file. (%d => %d)n", items, sfinfo.samples) ;
  292. exit (1) ;
  293. } ;
  294. if (sfinfo.channels != 1)
  295. { printf ("Mono : Incorrect number of channels in file.n") ;
  296. exit (1) ;
  297. } ;
  298. if (sfinfo.pcmbitwidth != 16)
  299. { printf ("Mono : Incorrect bit width (%d).n", sfinfo.pcmbitwidth) ;
  300. exit (1) ;
  301. } ;
  302. if ((k = sf_read_short (file, data, items)) != items)
  303. { printf ("Mono : short read (%d).n", k) ;
  304. exit (1) ;
  305. } ;
  306. for (k = 0 ; k < items ; k++)
  307. if (data [k] != k * ((k % 2) ? 1 : -1))
  308. { printf ("Mono : Incorrect sample (#%d : %d => %d).n", k, k * ((k % 2) ? 1 : -1), data [k]) ;
  309. exit (1) ;
  310. } ;
  311. sf_close (file) ;
  312. /* Now test Stereo. */
  313. if (typemajor == SF_FORMAT_SVX)
  314. { printf ("okn") ;
  315. return ;
  316. } ;
  317. items = BUFFER_SIZE / sizeof (short) ;
  318. data = (short*) test_buffer ;
  319. for (k = 0 ; k < items ; k++)
  320. data [k] = k * ((k % 2) ? 1 : -1) ;
  321. sfinfo.samplerate  = 44100 ;
  322. sfinfo.samples     = items ;
  323. sfinfo.channels    = 2 ;
  324. sfinfo.pcmbitwidth = 16 ;
  325. sfinfo.format     = (typemajor | typeminor) ;
  326. frames = items / sfinfo.channels ;
  327. if (! (file = sf_open_write (filename, &sfinfo)))
  328. { printf ("Stereo : sf_open_write failed with error : ") ;
  329. sf_perror (NULL) ;
  330. exit (1) ;
  331. } ;
  332. if ((k = sf_writef_short (file, data, frames)) != frames)
  333. { printf ("Stereo : sf_writef_short failed with short write (%d => %d).n", frames, k) ;
  334. sf_perror (file) ;
  335. exit (1) ;
  336. } ;
  337. sf_close (file) ;
  338. memset (data, 0, items * sizeof (short)) ;
  339. if (typemajor != SF_FORMAT_RAW)
  340. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  341. if (! (file = sf_open_read (filename, &sfinfo)))
  342. { printf ("Stereo : sf_open_read failed with error : ") ;
  343. sf_perror (NULL) ;
  344. exit (1) ;
  345. } ;
  346. if (sfinfo.format != (typemajor | typeminor))
  347. { printf ("Stereo : Returned format incorrect (0x%08X => 0x%08X).n", (typemajor | typeminor), sfinfo.format) ;
  348. exit (1) ;
  349. } ;
  350. if (sfinfo.samples != frames)
  351. { printf ("Stereo : Incorrect number of samples in file. (%d => %d)n", frames, sfinfo.samples) ;
  352. exit (1) ;
  353. } ;
  354. if (sfinfo.channels != 2)
  355. { printf ("Stereo : Incorrect number of channels in file.n") ;
  356. exit (1) ;
  357. } ;
  358. if (sfinfo.pcmbitwidth != 16)
  359. { printf ("Stereo : Incorrect bit width (%d).n", sfinfo.pcmbitwidth) ;
  360. exit (1) ;
  361. } ;
  362. if ((k = sf_readf_short (file, data, frames)) != frames)
  363. { printf ("Stereo : short read (%d).n", k) ;
  364. exit (1) ;
  365. } ;
  366. for (k = 0 ; k < items ; k++)
  367. if (data [k] != k * ((k % 2) ? 1 : -1))
  368. { printf ("Stereo : Incorrect sample (#%d : %d => %d).n", k, k * ((k % 2) ? 1 : -1), data [k]) ;
  369. exit (1) ;
  370. } ;
  371. sf_close (file) ;
  372. printf ("okn") ;
  373. } /* pcm_test_short */
  374. static
  375. void pcm_test_24bit (char *str, char *filename, int typemajor, int typeminor, int long_file_ok)
  376. { SNDFILE *file ;
  377. SF_INFO sfinfo ;
  378. unsigned int k, items, frames ;
  379. int *data ;
  380. printf ("    pcm_test_24bit : %s ... ", str) ;
  381. items = BUFFER_SIZE / sizeof (int) ;
  382. data = (int*) test_buffer ;
  383. for (k = 0 ; k < items ; k++)
  384. data [k] = k * 256 * ((k % 2) ? 1 : -1) ;
  385. sfinfo.samplerate  = 44100 ;
  386. sfinfo.samples     = items ;
  387. sfinfo.channels    = 1 ;
  388. sfinfo.pcmbitwidth = 24 ;
  389. sfinfo.format     = (typemajor | typeminor) ;
  390. if (! (file = sf_open_write (filename, &sfinfo)))
  391. { printf ("Mono : sf_open_write failed with error : ") ;
  392. sf_perror (NULL) ;
  393. exit (1) ;
  394. } ;
  395. if (sf_write_int (file, data, items) != items)
  396. { printf ("Mono : sf_write_int failed with error : ") ;
  397. sf_perror (file) ;
  398. exit (1) ;
  399. } ;
  400. sf_close (file) ;
  401. memset (data, 0, items * 3) ;
  402. if (typemajor != SF_FORMAT_RAW)
  403. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  404. if (! (file = sf_open_read (filename, &sfinfo)))
  405. { printf ("Mono : sf_open_read failed with error : ") ;
  406. sf_perror (NULL) ;
  407. exit (1) ;
  408. } ;
  409. if (sfinfo.format != (typemajor | typeminor))
  410. { printf ("Mono : Returned format incorrect (0x%08X => 0x%08X).n", (typemajor | typeminor), sfinfo.format) ;
  411. exit (1) ;
  412. } ;
  413. if (sfinfo.samples < items)
  414. { printf ("Mono : Incorrect number of samples in file (too short). (%d should be %d)n", sfinfo.samples, items) ;
  415. exit (1) ;
  416. } ;
  417. if (! long_file_ok && sfinfo.samples > items)
  418. { printf ("Mono : Incorrect number of samples in file (too long). (%d should be %d)n", sfinfo.samples, items) ;
  419. exit (1) ;
  420. } ;
  421. if (sfinfo.channels != 1)
  422. { printf ("Mono : Incorrect number of channels in file.n") ;
  423. exit (1) ;
  424. } ;
  425. if (sfinfo.pcmbitwidth != 24)
  426. { printf ("Mono : Incorrect bit width (%d).n", sfinfo.pcmbitwidth) ;
  427. exit (1) ;
  428. } ;
  429. if ((k = sf_read_int (file, data, items)) != items)
  430. { printf ("Mono : short read (%d).n", k) ;
  431. exit (1) ;
  432. } ;
  433. for (k = 0 ; k < items ; k++)
  434. if (data [k] != k * 256 * ((k % 2) ? 1 : -1))
  435. { printf ("Mono : Incorrect sample (#%d : %d => %d).n", k, k * 256 * ((k % 2) ? 1 : -1), data [k]) ;
  436. exit (1) ;
  437. } ;
  438. sf_close (file) ;
  439. /* Now test Stereo. */
  440. if (typemajor == SF_FORMAT_SVX)
  441. { printf ("okn") ;
  442. return ;
  443. } ;
  444. items = BUFFER_SIZE / sizeof (int) ;
  445. data = (int*) test_buffer ;
  446. for (k = 0 ; k < items ; k++)
  447. data [k] = k * 256 * ((k % 2) ? 1 : -1) ;
  448. sfinfo.samplerate  = 44100 ;
  449. sfinfo.samples     = items ;
  450. sfinfo.channels    = 2 ;
  451. sfinfo.pcmbitwidth = 24 ;
  452. sfinfo.format     = (typemajor | typeminor) ;
  453. frames = items / sfinfo.channels ;
  454. if (! (file = sf_open_write (filename, &sfinfo)))
  455. { printf ("Stereo : sf_open_write failed with error : ") ;
  456. sf_perror (NULL) ;
  457. exit (1) ;
  458. } ;
  459. if (sf_writef_int (file, data, frames) != frames)
  460. { printf ("Stereo : sf_writef_int failed with error : ") ;
  461. sf_perror (file) ;
  462. exit (1) ;
  463. } ;
  464. sf_close (file) ;
  465. memset (data, 0, items * 3) ;
  466. if (typemajor != SF_FORMAT_RAW)
  467. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  468. if (! (file = sf_open_read (filename, &sfinfo)))
  469. { printf ("Stereo : sf_open_read failed with error : ") ;
  470. sf_perror (NULL) ;
  471. exit (1) ;
  472. } ;
  473. if (sfinfo.format != (typemajor | typeminor))
  474. { printf ("Stereo : Returned format incorrect (0x%08X => 0x%08X).n", (typemajor | typeminor), sfinfo.format) ;
  475. exit (1) ;
  476. } ;
  477. if (sfinfo.samples < frames)
  478. { printf ("Stereo : Incorrect number of samples in file (too short). (%d should be %d)n", sfinfo.samples, frames) ;
  479. exit (1) ;
  480. } ;
  481. if (! long_file_ok && sfinfo.samples > frames)
  482. { printf ("Stereo : Incorrect number of samples in file (too long). (%d should be %d)n", sfinfo.samples, frames) ;
  483. exit (1) ;
  484. } ;
  485. if (sfinfo.channels != 2)
  486. { printf ("Stereo : Incorrect number of channels in file.n") ;
  487. exit (1) ;
  488. } ;
  489. if (sfinfo.pcmbitwidth != 24)
  490. { printf ("Stereo : Incorrect bit width (%d).n", sfinfo.pcmbitwidth) ;
  491. exit (1) ;
  492. } ;
  493. if ((k = sf_readf_int (file, data, frames)) != frames)
  494. { printf ("Stereo : short read (%d).n", k) ;
  495. exit (1) ;
  496. } ;
  497. for (k = 0 ; k < items ; k++)
  498. if (data [k] != k * 256 * ((k % 2) ? 1 : -1))
  499. { printf ("Stereo : Incorrect sample (#%d : %d => %d).n", k, k * 256 * ((k % 2) ? 1 : -1), data [k]) ;
  500. exit (1) ;
  501. } ;
  502. sf_close (file) ;
  503. printf ("okn") ;
  504. } /* pcm_test_24bit */
  505. static
  506. void pcm_test_int (char *str, char *filename, int typemajor, int typeminor)
  507. { SNDFILE *file ;
  508. SF_INFO sfinfo ;
  509. unsigned int k, items, frames ;
  510. int sign, *data ;
  511. printf ("    pcm_test_int   : %s ... ", str) ;
  512. items = BUFFER_SIZE / sizeof (int) ;
  513. data = (int*) test_buffer ;
  514. for (sign = 1, k = 0 ; k < items ; k++)
  515. data [k] = k * 200000 * ((k % 2) ? 1 : -1) ;
  516. sfinfo.samplerate  = 44100 ;
  517. sfinfo.samples     = items ;
  518. sfinfo.channels    = 1 ;
  519. sfinfo.pcmbitwidth = 32 ;
  520. sfinfo.format     = (typemajor | typeminor) ;
  521. if (! (file = sf_open_write (filename, &sfinfo)))
  522. { printf ("Mono : sf_open_write failed with error : ") ;
  523. sf_perror (NULL) ;
  524. exit (1) ;
  525. } ;
  526. if (sf_write_int (file, data, items) != items)
  527. { printf ("Mono : sf_write_int failed with error : ") ;
  528. sf_perror (file) ;
  529. exit (1) ;
  530. } ;
  531. sf_close (file) ;
  532. memset (data, 0, items * sizeof (short)) ;
  533. if (typemajor != SF_FORMAT_RAW)
  534. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  535. if (! (file = sf_open_read (filename, &sfinfo)))
  536. { printf ("Mono : sf_open_read failed with error : ") ;
  537. sf_perror (NULL) ;
  538. exit (1) ;
  539. } ;
  540. if (sfinfo.format != (typemajor | typeminor))
  541. { printf ("Mono : Returned format incorrect (0x%08X => 0x%08X).n", (typemajor | typeminor), sfinfo.format) ;
  542. exit (1) ;
  543. } ;
  544. if (sfinfo.samples != items)
  545. { printf ("Mono : Incorrect number of samples in file. (%d => %d)n", items, sfinfo.samples) ;
  546. exit (1) ;
  547. } ;
  548. if (sfinfo.channels != 1)
  549. { printf ("Mono : Incorrect number of channels in file.n") ;
  550. exit (1) ;
  551. } ;
  552. if (sfinfo.pcmbitwidth != 32)
  553. { printf ("Mono : Incorrect bit width (%d).n", sfinfo.pcmbitwidth) ;
  554. exit (1) ;
  555. } ;
  556. if ((k = sf_read_int (file, data, items)) != items)
  557. { printf ("Mono : short read (%d).n", k) ;
  558. exit (1) ;
  559. } ;
  560. for (sign = 1, k = 0 ; k < items ; k++)
  561. if (data [k] != k * 200000 * ((k % 2) ? 1 : -1))
  562. { printf ("Mono : Incorrect sample (#%d : %d => %d).n", k, (k % 2) ? 1 : -1, data [k]) ;
  563. exit (1) ;
  564. } ;
  565. sf_close (file) ;
  566. /* Now test Stereo. */
  567. if (typemajor == SF_FORMAT_SVX)
  568. { printf ("okn") ;
  569. return ;
  570. } ;
  571. items = BUFFER_SIZE / sizeof (int) ;
  572. data = (int*) test_buffer ;
  573. for (sign = 1, k = 0 ; k < items ; k++)
  574. data [k] = k * 200000 * ((k % 2) ? 1 : -1) ;
  575. sfinfo.samplerate  = 44100 ;
  576. sfinfo.samples     = items ;
  577. sfinfo.channels    = 2 ;
  578. sfinfo.pcmbitwidth = 32 ;
  579. sfinfo.format     = (typemajor | typeminor) ;
  580. frames = items / sfinfo.channels ;
  581. if (! (file = sf_open_write (filename, &sfinfo)))
  582. { printf ("Stereo : sf_open_write failed with error : ") ;
  583. sf_perror (NULL) ;
  584. exit (1) ;
  585. } ;
  586. if (sf_writef_int (file, data, frames) != frames)
  587. { printf ("Stereo : sf_writef_int failed with error : ") ;
  588. sf_perror (file) ;
  589. exit (1) ;
  590. } ;
  591. sf_close (file) ;
  592. memset (data, 0, items * sizeof (short)) ;
  593. if (typemajor != SF_FORMAT_RAW)
  594. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  595. if (! (file = sf_open_read (filename, &sfinfo)))
  596. { printf ("Stereo : sf_open_read failed with error : ") ;
  597. sf_perror (NULL) ;
  598. exit (1) ;
  599. } ;
  600. if (sfinfo.format != (typemajor | typeminor))
  601. { printf ("Stereo : Returned format incorrect (0x%08X => 0x%08X).n", (typemajor | typeminor), sfinfo.format) ;
  602. exit (1) ;
  603. } ;
  604. if (sfinfo.samples != frames)
  605. { printf ("Stereo : Incorrect number of samples in file. (%d => %d)n", frames, sfinfo.samples) ;
  606. exit (1) ;
  607. } ;
  608. if (sfinfo.channels != 2)
  609. { printf ("Stereo : Incorrect number of channels in file.n") ;
  610. exit (1) ;
  611. } ;
  612. if (sfinfo.pcmbitwidth != 32)
  613. { printf ("Stereo : Incorrect bit width (%d).n", sfinfo.pcmbitwidth) ;
  614. exit (1) ;
  615. } ;
  616. if ((k = sf_readf_int (file, data, frames)) != frames)
  617. { printf ("Stereo : short read (%d).n", k) ;
  618. exit (1) ;
  619. } ;
  620. for (sign = 1, k = 0 ; k < items ; k++)
  621. if (data [k] != k * 200000 * ((k % 2) ? 1 : -1))
  622. { printf ("Stereo : Incorrect sample (#%d : %d => %d).n", k, (k % 2) ? 1 : -1, data [k]) ;
  623. exit (1) ;
  624. } ;
  625. sf_close (file) ;
  626. printf ("okn") ;
  627. } /* pcm_test_int */
  628. static
  629. void pcm_float_test (char *str, char *filename, int typemajor)
  630. { SNDFILE *file ;
  631. SF_INFO sfinfo ;
  632. unsigned int k, items, frames ;
  633. int sign ;
  634. double *data, error ;
  635. printf ("    pcm_float_test : %s ... ", str) ;
  636. items = BUFFER_SIZE / sizeof (double) ;
  637. data = (double*) test_buffer ;
  638. for (sign = 1, k = 0 ; k < items ; k++)
  639. data [k] = ((double) k) / 100.0 * (sign *= -1) ;
  640. sfinfo.samplerate = 44100 ;
  641. sfinfo.samples    = items ;
  642. sfinfo.channels   = 1 ;
  643. sfinfo.pcmbitwidth   = 32 ;
  644. sfinfo.format    = (typemajor | SF_FORMAT_FLOAT) ;
  645. if (! (file = sf_open_write (filename, &sfinfo)))
  646. { printf ("Mono : sf_open_write failed with error : ") ;
  647. sf_perror (NULL) ;
  648. exit (1) ;
  649. } ;
  650. if (sf_write_double (file, data, items, 0) != items)
  651. { printf ("Mono : sf_write_int failed with error : ") ;
  652. sf_perror (file) ;
  653. exit (1) ;
  654. } ;
  655. sf_close (file) ;
  656. memset (data, 0, items * sizeof (double)) ;
  657. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  658. if (! (file = sf_open_read (filename, &sfinfo)))
  659. { printf ("Mono : sf_open_read failed with error : ") ;
  660. sf_perror (NULL) ;
  661. exit (1) ;
  662. } ;
  663. if (sfinfo.format != (typemajor | SF_FORMAT_FLOAT))
  664. { printf ("Mono : Returned format incorrect (0x%08X => 0x%08X).n", (typemajor | SF_FORMAT_FLOAT), sfinfo.format) ;
  665. exit (1) ;
  666. } ;
  667. if (sfinfo.samples != items)
  668. { printf ("Mono : Incorrect number of samples in file. (%d => %d)n", items, sfinfo.samples) ;
  669. exit (1) ;
  670. } ;
  671. if (sfinfo.channels != 1)
  672. { printf ("Mono : Incorrect number of channels in file.n") ;
  673. exit (1) ;
  674. } ;
  675. if (sfinfo.pcmbitwidth != 32)
  676. { printf ("Mono : Incorrect bit width (%d).n", sfinfo.pcmbitwidth) ;
  677. exit (1) ;
  678. } ;
  679. if ((k = sf_read_double (file, data, items, 0)) != items)
  680. { printf ("Mono : short read (%d).n", k) ;
  681. exit (1) ;
  682. } ;
  683. for (sign = 1, k = 0 ; k < items ; k++)
  684. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  685. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  686. { printf ("Mono : Incorrect sample (#%d : %f => %f).n", k, ((double) k) / 100.0, data [k]) ;
  687. exit (1) ;
  688. } ;
  689. } ;
  690. sf_close (file) ;
  691. /* Now test Stereo. */
  692. if (typemajor == SF_FORMAT_SVX)
  693. { printf ("okn") ;
  694. return ;
  695. } ;
  696. items = BUFFER_SIZE / sizeof (double) ;
  697. data = (double*) test_buffer ;
  698. for (sign = 1, k = 0 ; k < items ; k++)
  699. data [k] = ((double) k) / 100.0 * (sign *= -1) ;
  700. sfinfo.samplerate = 44100 ;
  701. sfinfo.samples    = items ;
  702. sfinfo.channels   = 2 ;
  703. sfinfo.pcmbitwidth   = 32 ;
  704. sfinfo.format    = (typemajor | SF_FORMAT_FLOAT) ;
  705. frames = items / sfinfo.channels ;
  706. if (! (file = sf_open_write (filename, &sfinfo)))
  707. { printf ("Stereo : sf_open_write failed with error : ") ;
  708. sf_perror (NULL) ;
  709. exit (1) ;
  710. } ;
  711. if (sf_writef_double (file, data, frames, 0) != frames)
  712. { printf ("Stereo : sf_writef_int failed with error : ") ;
  713. sf_perror (file) ;
  714. exit (1) ;
  715. } ;
  716. sf_close (file) ;
  717. memset (data, 0, items * sizeof (double)) ;
  718. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  719. if (! (file = sf_open_read (filename, &sfinfo)))
  720. { printf ("Stereo : sf_open_read failed with error : ") ;
  721. sf_perror (NULL) ;
  722. exit (1) ;
  723. } ;
  724. if (sfinfo.format != (typemajor | SF_FORMAT_FLOAT))
  725. { printf ("Stereo : Returned format incorrect (0x%08X => 0x%08X).n", (typemajor | SF_FORMAT_FLOAT), sfinfo.format) ;
  726. exit (1) ;
  727. } ;
  728. if (sfinfo.samples != frames)
  729. { printf ("Stereo : Incorrect number of samples in file. (%d => %d)n", frames, sfinfo.samples) ;
  730. exit (1) ;
  731. } ;
  732. if (sfinfo.channels != 2)
  733. { printf ("Stereo : Incorrect number of channels in file.n") ;
  734. exit (1) ;
  735. } ;
  736. if (sfinfo.pcmbitwidth != 32)
  737. { printf ("Stereo : Incorrect bit width (%d).n", sfinfo.pcmbitwidth) ;
  738. exit (1) ;
  739. } ;
  740. if ((k = sf_readf_double (file, data, frames, 0)) != frames)
  741. { printf ("Stereo : short read (%d).n", k) ;
  742. exit (1) ;
  743. } ;
  744. for (sign = 1, k = 0 ; k < items ; k++)
  745. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  746. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  747. { printf ("Stereo : Incorrect sample (#%d : %f => %f).n", k, ((double) k) / 100.0, data [k]) ;
  748. exit (1) ;
  749. } ;
  750. } ;
  751. sf_close (file) ;
  752. printf ("okn") ;
  753. } /* pcm_float_test */