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

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (C) 1999-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 <math.h>
  23. #if HAVE_UNISTD_H
  24. #include <unistd.h>
  25. #endif
  26. #include <sndfile.h>
  27. #include "utils.h"
  28. #define BUFFER_SIZE (1<<12)
  29. static void lrintf_test (void) ;
  30. static void pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash) ;
  31. static void pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash) ;
  32. static void pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash) ;
  33. static void pcm_test_bits_32 (const char *filename, int filetype, uint64_t hash) ;
  34. static void pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float) ;
  35. static void pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float) ;
  36. typedef union
  37. { double d [BUFFER_SIZE + 1] ;
  38. float f [BUFFER_SIZE + 1] ;
  39. int i [BUFFER_SIZE + 1] ;
  40. short s [BUFFER_SIZE + 1] ;
  41. } BUFFER ;
  42. /* Data written to the file. */
  43. static BUFFER data_out ;
  44. /* Data read back from the file. */
  45. static BUFFER data_in ;
  46. int
  47. main (void)
  48. {
  49. lrintf_test () ;
  50. pcm_test_bits_8 ("pcm-s8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_S8, 0x1cda335091249dbfLL) ;
  51. pcm_test_bits_8 ("pcm-u8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_U8, 0x7f748c433d695f3fLL) ;
  52. pcm_test_bits_16 ("le-pcm16.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0x3a2b956c881ebf08LL) ;
  53. pcm_test_bits_16 ("be-pcm16.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0xd9e2f840c55750f8LL) ;
  54. pcm_test_bits_24 ("le-pcm24.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0x933b6a759ab496f8LL) ;
  55. pcm_test_bits_24 ("be-pcm24.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xbb1f3eaf9c30b6f8LL) ;
  56. pcm_test_bits_32 ("le-pcm32.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0xa77aece1c1c17f08LL) ;
  57. pcm_test_bits_32 ("be-pcm32.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0x3099ddf142d0b0f8LL) ;
  58. /* Lite remove start */
  59. pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x3c2ad04f7554267aLL, SF_FALSE) ;
  60. pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x074de3e248fa9186LL, SF_FALSE) ;
  61. pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xc682726f958f669cLL, SF_FALSE) ;
  62. pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xd9a3583f8ee51164LL, SF_FALSE) ;
  63. pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x3c2ad04f7554267aLL, SF_TRUE) ;
  64. pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0x074de3e248fa9186LL, SF_TRUE) ;
  65. pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xc682726f958f669cLL, SF_TRUE) ;
  66. pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0xd9a3583f8ee51164LL, SF_TRUE) ;
  67. /* Lite remove end */
  68. return 0 ;
  69. } /* main */
  70. /*============================================================================================
  71. ** Here are the test functions.
  72. */
  73. static void
  74. lrintf_test (void)
  75. { int k, items ;
  76. float *float_data ;
  77. int *int_data ;
  78. print_test_name ("lrintf_test", "") ;
  79. items = 1024 ;
  80. float_data = data_out.f ;
  81. int_data = data_in.i ;
  82. for (k = 0 ; k < items ; k++)
  83. float_data [k] = (k * ((k % 2) ? 333333.0 : -333333.0)) ;
  84. for (k = 0 ; k < items ; k++)
  85. int_data [k] = lrintf (float_data [k]) ;
  86. for (k = 0 ; k < items ; k++)
  87. if (fabs (int_data [k] - float_data [k]) > 1.0)
  88. { printf ("nnLine %d: float : Incorrect sample (#%d : %f => %d).n", __LINE__, k, float_data [k], int_data [k]) ;
  89. exit (1) ;
  90. } ;
  91. printf ("okn") ;
  92. } /* lrintf_test */
  93. static void
  94. pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash)
  95. { SNDFILE *file ;
  96. SF_INFO sfinfo ;
  97. int k, items, zero_count ;
  98. short *short_out, *short_in ;
  99. int *int_out, *int_in ;
  100. /* Lite remove start */
  101. float *float_out, *float_in ;
  102. double *double_out, *double_in ;
  103. /* Lite remove end */
  104. print_test_name ("pcm_test_bits_8", filename) ;
  105. items = 127 ;
  106. short_out = data_out.s ;
  107. short_in = data_in.s ;
  108. zero_count = 0 ;
  109. for (k = 0 ; k < items ; k++)
  110. { short_out [k] = ((k * ((k % 2) ? 1 : -1)) << 8) ;
  111. zero_count = short_out [k] ? zero_count : zero_count + 1 ;
  112. } ;
  113. if (zero_count > items / 4)
  114. { printf ("nnLine %d: too many zeros.n", __LINE__) ;
  115. exit (1) ;
  116. } ;
  117. sfinfo.samplerate = 44100 ;
  118. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  119. sfinfo.channels = 1 ;
  120. sfinfo.format = filetype ;
  121. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  122. test_write_short_or_die (file, 0, short_out, items, __LINE__) ;
  123. sf_close (file) ;
  124. memset (short_in, 0, items * sizeof (short)) ;
  125. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  126. if (sfinfo.format != filetype)
  127. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  128. exit (1) ;
  129. } ;
  130. if (sfinfo.frames != items)
  131. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  132. exit (1) ;
  133. } ;
  134. if (sfinfo.channels != 1)
  135. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  136. exit (1) ;
  137. } ;
  138. check_log_buffer_or_die (file, __LINE__) ;
  139. test_read_short_or_die (file, 0, short_in, items, __LINE__) ;
  140. for (k = 0 ; k < items ; k++)
  141. if (short_out [k] != short_in [k])
  142. { printf ("nnLine %d: Incorrect sample (#%d : 0x%x => 0x%x).n", __LINE__, k, short_out [k], short_in [k]) ;
  143. exit (1) ;
  144. } ;
  145. sf_close (file) ;
  146. /* Finally, check the file hash. */
  147. check_file_hash_or_die (filename, hash, __LINE__) ;
  148. /*--------------------------------------------------------------------------
  149. ** Test sf_read/write_int ()
  150. */
  151. zero_count = 0 ;
  152. int_out = data_out.i ;
  153. int_in = data_in.i ;
  154. for (k = 0 ; k < items ; k++)
  155. { int_out [k] = ((k * ((k % 2) ? 1 : -1)) << 24) ;
  156. zero_count = int_out [k] ? zero_count : zero_count + 1 ;
  157. } ;
  158. if (zero_count > items / 4)
  159. { printf ("nnLine %d: too many zeros.n", __LINE__) ;
  160. exit (1) ;
  161. } ;
  162. sfinfo.samplerate = 44100 ;
  163. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  164. sfinfo.channels = 1 ;
  165. sfinfo.format = filetype ;
  166. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  167. test_write_int_or_die (file, 0, int_out, items, __LINE__) ;
  168. sf_close (file) ;
  169. memset (int_in, 0, items * sizeof (int)) ;
  170. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  171. if (sfinfo.format != filetype)
  172. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  173. exit (1) ;
  174. } ;
  175. if (sfinfo.frames != items)
  176. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  177. exit (1) ;
  178. } ;
  179. if (sfinfo.channels != 1)
  180. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  181. exit (1) ;
  182. } ;
  183. check_log_buffer_or_die (file, __LINE__) ;
  184. test_read_int_or_die (file, 0, int_in, items, __LINE__) ;
  185. for (k = 0 ; k < items ; k++)
  186. if (int_out [k] != int_in [k])
  187. { printf ("nnLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).n", __LINE__, k, int_out [k], int_in [k]) ;
  188. exit (1) ;
  189. } ;
  190. sf_close (file) ;
  191. /* Lite remove start */
  192. /*--------------------------------------------------------------------------
  193. ** Test sf_read/write_float ()
  194. */
  195. zero_count = 0 ;
  196. float_out = data_out.f ;
  197. float_in = data_in.f ;
  198. for (k = 0 ; k < items ; k++)
  199. { float_out [k] = (k * ((k % 2) ? 1 : -1)) ;
  200. zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
  201. } ;
  202. if (zero_count > items / 4)
  203. { printf ("nnLine %d: too many zeros (%d/%d).n", __LINE__, zero_count, items) ;
  204. exit (1) ;
  205. } ;
  206. sfinfo.samplerate = 44100 ;
  207. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  208. sfinfo.channels = 1 ;
  209. sfinfo.format = filetype ;
  210. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  211. sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
  212. test_write_float_or_die (file, 0, float_out, items, __LINE__) ;
  213. sf_close (file) ;
  214. memset (float_in, 0, items * sizeof (float)) ;
  215. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  216. if (sfinfo.format != filetype)
  217. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  218. exit (1) ;
  219. } ;
  220. if (sfinfo.frames != items)
  221. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  222. exit (1) ;
  223. } ;
  224. if (sfinfo.channels != 1)
  225. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  226. exit (1) ;
  227. } ;
  228. check_log_buffer_or_die (file, __LINE__) ;
  229. sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
  230. test_read_float_or_die (file, 0, float_in, items, __LINE__) ;
  231. for (k = 0 ; k < items ; k++)
  232. if (fabs (float_out [k] - float_in [k]) > 1e-10)
  233. { printf ("nnLine %d: float : Incorrect sample (#%d : %f => %f).n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ;
  234. exit (1) ;
  235. break ;
  236. } ;
  237. sf_close (file) ;
  238. /*--------------------------------------------------------------------------
  239. ** Test sf_read/write_double ()
  240. */
  241. zero_count = 0 ;
  242. double_out = data_out.d ;
  243. double_in = data_in.d ;
  244. for (k = 0 ; k < items ; k++)
  245. { double_out [k] = (k * ((k % 2) ? 1 : -1)) ;
  246. zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
  247. } ;
  248. if (zero_count > items / 4)
  249. { printf ("nnLine %d: too many zeros (%d/%d).n", __LINE__, zero_count, items) ;
  250. exit (1) ;
  251. } ;
  252. sfinfo.samplerate = 44100 ;
  253. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  254. sfinfo.channels = 1 ;
  255. sfinfo.format = filetype ;
  256. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  257. sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
  258. test_write_double_or_die (file, 0, double_out, items, __LINE__) ;
  259. sf_close (file) ;
  260. memset (double_in, 0, items * sizeof (double)) ;
  261. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  262. if (sfinfo.format != filetype)
  263. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  264. exit (1) ;
  265. } ;
  266. if (sfinfo.frames != items)
  267. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  268. exit (1) ;
  269. } ;
  270. if (sfinfo.channels != 1)
  271. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  272. exit (1) ;
  273. } ;
  274. check_log_buffer_or_die (file, __LINE__) ;
  275. sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
  276. test_read_double_or_die (file, 0, double_in, items, __LINE__) ;
  277. for (k = 0 ; k < items ; k++)
  278. if (fabs (double_out [k] - double_in [k]) > 1e-10)
  279. { printf ("nnLine %d: double : Incorrect sample (#%d : %f => %f).n", __LINE__, k, double_out [k], double_in [k]) ;
  280. exit (1) ;
  281. } ;
  282. sf_close (file) ;
  283. /* Lite remove end */
  284. unlink (filename) ;
  285. puts ("ok") ;
  286. } /* pcm_test_bits_8 */
  287. static void
  288. pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash)
  289. { SNDFILE *file ;
  290. SF_INFO sfinfo ;
  291. int k, items, zero_count ;
  292. short *short_out, *short_in ;
  293. int *int_out, *int_in ;
  294. /* Lite remove start */
  295. float *float_out, *float_in ;
  296. double *double_out, *double_in ;
  297. /* Lite remove end */
  298. print_test_name ("pcm_test_bits_16", filename) ;
  299. items = 1024 ;
  300. short_out = data_out.s ;
  301. short_in = data_in.s ;
  302. zero_count = 0 ;
  303. for (k = 0 ; k < items ; k++)
  304. { short_out [k] = (k * ((k % 2) ? 3 : -3)) ;
  305. zero_count = short_out [k] ? zero_count : zero_count + 1 ;
  306. } ;
  307. if (zero_count > items / 4)
  308. { printf ("nnLine %d: too many zeros.n", __LINE__) ;
  309. exit (1) ;
  310. } ;
  311. sfinfo.samplerate = 44100 ;
  312. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  313. sfinfo.channels = 1 ;
  314. sfinfo.format = filetype ;
  315. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  316. test_write_short_or_die (file, 0, short_out, items, __LINE__) ;
  317. sf_close (file) ;
  318. memset (short_in, 0, items * sizeof (short)) ;
  319. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  320. if (sfinfo.format != filetype)
  321. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  322. exit (1) ;
  323. } ;
  324. if (sfinfo.frames != items)
  325. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  326. exit (1) ;
  327. } ;
  328. if (sfinfo.channels != 1)
  329. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  330. exit (1) ;
  331. } ;
  332. check_log_buffer_or_die (file, __LINE__) ;
  333. test_read_short_or_die (file, 0, short_in, items, __LINE__) ;
  334. for (k = 0 ; k < items ; k++)
  335. if (short_out [k] != short_in [k])
  336. { printf ("nnLine %d: Incorrect sample (#%d : 0x%x => 0x%x).n", __LINE__, k, short_out [k], short_in [k]) ;
  337. exit (1) ;
  338. } ;
  339. sf_close (file) ;
  340. /* Finally, check the file hash. */
  341. check_file_hash_or_die (filename, hash, __LINE__) ;
  342. /*--------------------------------------------------------------------------
  343. ** Test sf_read/write_int ()
  344. */
  345. zero_count = 0 ;
  346. int_out = data_out.i ;
  347. int_in = data_in.i ;
  348. for (k = 0 ; k < items ; k++)
  349. { int_out [k] = ((k * ((k % 2) ? 3 : -3)) << 16) ;
  350. zero_count = int_out [k] ? zero_count : zero_count + 1 ;
  351. } ;
  352. if (zero_count > items / 4)
  353. { printf ("nnLine %d: too many zeros.n", __LINE__) ;
  354. exit (1) ;
  355. } ;
  356. sfinfo.samplerate = 44100 ;
  357. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  358. sfinfo.channels = 1 ;
  359. sfinfo.format = filetype ;
  360. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  361. test_write_int_or_die (file, 0, int_out, items, __LINE__) ;
  362. sf_close (file) ;
  363. memset (int_in, 0, items * sizeof (int)) ;
  364. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  365. if (sfinfo.format != filetype)
  366. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  367. exit (1) ;
  368. } ;
  369. if (sfinfo.frames != items)
  370. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  371. exit (1) ;
  372. } ;
  373. if (sfinfo.channels != 1)
  374. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  375. exit (1) ;
  376. } ;
  377. check_log_buffer_or_die (file, __LINE__) ;
  378. test_read_int_or_die (file, 0, int_in, items, __LINE__) ;
  379. for (k = 0 ; k < items ; k++)
  380. if (int_out [k] != int_in [k])
  381. { printf ("nnLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).n", __LINE__, k, int_out [k], int_in [k]) ;
  382. exit (1) ;
  383. } ;
  384. sf_close (file) ;
  385. /* Lite remove start */
  386. /*--------------------------------------------------------------------------
  387. ** Test sf_read/write_float ()
  388. */
  389. zero_count = 0 ;
  390. float_out = data_out.f ;
  391. float_in = data_in.f ;
  392. for (k = 0 ; k < items ; k++)
  393. { float_out [k] = (k * ((k % 2) ? 3 : -3)) ;
  394. zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
  395. } ;
  396. if (zero_count > items / 4)
  397. { printf ("nnLine %d: too many zeros (%d/%d).n", __LINE__, zero_count, items) ;
  398. exit (1) ;
  399. } ;
  400. sfinfo.samplerate = 44100 ;
  401. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  402. sfinfo.channels = 1 ;
  403. sfinfo.format = filetype ;
  404. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  405. sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
  406. test_write_float_or_die (file, 0, float_out, items, __LINE__) ;
  407. sf_close (file) ;
  408. memset (float_in, 0, items * sizeof (float)) ;
  409. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  410. if (sfinfo.format != filetype)
  411. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  412. exit (1) ;
  413. } ;
  414. if (sfinfo.frames != items)
  415. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  416. exit (1) ;
  417. } ;
  418. if (sfinfo.channels != 1)
  419. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  420. exit (1) ;
  421. } ;
  422. check_log_buffer_or_die (file, __LINE__) ;
  423. sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
  424. test_read_float_or_die (file, 0, float_in, items, __LINE__) ;
  425. for (k = 0 ; k < items ; k++)
  426. if (fabs (float_out [k] - float_in [k]) > 1e-10)
  427. { printf ("nnLine %d: float : Incorrect sample (#%d : %f => %f).n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ;
  428. exit (1) ;
  429. break ;
  430. } ;
  431. sf_close (file) ;
  432. /*--------------------------------------------------------------------------
  433. ** Test sf_read/write_double ()
  434. */
  435. zero_count = 0 ;
  436. double_out = data_out.d ;
  437. double_in = data_in.d ;
  438. for (k = 0 ; k < items ; k++)
  439. { double_out [k] = (k * ((k % 2) ? 3 : -3)) ;
  440. zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
  441. } ;
  442. if (zero_count > items / 4)
  443. { printf ("nnLine %d: too many zeros (%d/%d).n", __LINE__, zero_count, items) ;
  444. exit (1) ;
  445. } ;
  446. sfinfo.samplerate = 44100 ;
  447. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  448. sfinfo.channels = 1 ;
  449. sfinfo.format = filetype ;
  450. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  451. sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
  452. test_write_double_or_die (file, 0, double_out, items, __LINE__) ;
  453. sf_close (file) ;
  454. memset (double_in, 0, items * sizeof (double)) ;
  455. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  456. if (sfinfo.format != filetype)
  457. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  458. exit (1) ;
  459. } ;
  460. if (sfinfo.frames != items)
  461. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  462. exit (1) ;
  463. } ;
  464. if (sfinfo.channels != 1)
  465. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  466. exit (1) ;
  467. } ;
  468. check_log_buffer_or_die (file, __LINE__) ;
  469. sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
  470. test_read_double_or_die (file, 0, double_in, items, __LINE__) ;
  471. for (k = 0 ; k < items ; k++)
  472. if (fabs (double_out [k] - double_in [k]) > 1e-10)
  473. { printf ("nnLine %d: double : Incorrect sample (#%d : %f => %f).n", __LINE__, k, double_out [k], double_in [k]) ;
  474. exit (1) ;
  475. } ;
  476. sf_close (file) ;
  477. /* Lite remove end */
  478. unlink (filename) ;
  479. puts ("ok") ;
  480. } /* pcm_test_bits_16 */
  481. static void
  482. pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash)
  483. { SNDFILE *file ;
  484. SF_INFO sfinfo ;
  485. int k, items, zero_count ;
  486. short *short_out, *short_in ;
  487. int *int_out, *int_in ;
  488. /* Lite remove start */
  489. float *float_out, *float_in ;
  490. double *double_out, *double_in ;
  491. /* Lite remove end */
  492. print_test_name ("pcm_test_bits_24", filename) ;
  493. items = 1024 ;
  494. short_out = data_out.s ;
  495. short_in = data_in.s ;
  496. zero_count = 0 ;
  497. for (k = 0 ; k < items ; k++)
  498. { short_out [k] = (k * ((k % 2) ? 3 : -3)) ;
  499. zero_count = short_out [k] ? zero_count : zero_count + 1 ;
  500. } ;
  501. if (zero_count > items / 4)
  502. { printf ("nnLine %d: too many zeros.n", __LINE__) ;
  503. exit (1) ;
  504. } ;
  505. sfinfo.samplerate = 44100 ;
  506. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  507. sfinfo.channels = 1 ;
  508. sfinfo.format = filetype ;
  509. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  510. test_write_short_or_die (file, 0, short_out, items, __LINE__) ;
  511. sf_close (file) ;
  512. memset (short_in, 0, items * sizeof (short)) ;
  513. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  514. if (sfinfo.format != filetype)
  515. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  516. exit (1) ;
  517. } ;
  518. if (sfinfo.frames != items)
  519. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  520. exit (1) ;
  521. } ;
  522. if (sfinfo.channels != 1)
  523. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  524. exit (1) ;
  525. } ;
  526. check_log_buffer_or_die (file, __LINE__) ;
  527. test_read_short_or_die (file, 0, short_in, items, __LINE__) ;
  528. for (k = 0 ; k < items ; k++)
  529. if (short_out [k] != short_in [k])
  530. { printf ("nnLine %d: Incorrect sample (#%d : 0x%x => 0x%x).n", __LINE__, k, short_out [k], short_in [k]) ;
  531. exit (1) ;
  532. } ;
  533. sf_close (file) ;
  534. /* Finally, check the file hash. */
  535. check_file_hash_or_die (filename, hash, __LINE__) ;
  536. /*--------------------------------------------------------------------------
  537. ** Test sf_read/write_int ()
  538. */
  539. zero_count = 0 ;
  540. int_out = data_out.i ;
  541. int_in = data_in.i ;
  542. for (k = 0 ; k < items ; k++)
  543. { int_out [k] = ((k * ((k % 2) ? 3333 : -3333)) << 8) ;
  544. zero_count = int_out [k] ? zero_count : zero_count + 1 ;
  545. } ;
  546. if (zero_count > items / 4)
  547. { printf ("nnLine %d: too many zeros.n", __LINE__) ;
  548. exit (1) ;
  549. } ;
  550. sfinfo.samplerate = 44100 ;
  551. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  552. sfinfo.channels = 1 ;
  553. sfinfo.format = filetype ;
  554. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  555. test_write_int_or_die (file, 0, int_out, items, __LINE__) ;
  556. sf_close (file) ;
  557. memset (int_in, 0, items * sizeof (int)) ;
  558. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  559. if (sfinfo.format != filetype)
  560. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  561. exit (1) ;
  562. } ;
  563. if (sfinfo.frames != items)
  564. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  565. exit (1) ;
  566. } ;
  567. if (sfinfo.channels != 1)
  568. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  569. exit (1) ;
  570. } ;
  571. check_log_buffer_or_die (file, __LINE__) ;
  572. test_read_int_or_die (file, 0, int_in, items, __LINE__) ;
  573. for (k = 0 ; k < items ; k++)
  574. if (int_out [k] != int_in [k])
  575. { printf ("nnLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).n", __LINE__, k, int_out [k], int_in [k]) ;
  576. exit (1) ;
  577. } ;
  578. sf_close (file) ;
  579. /* Lite remove start */
  580. /*--------------------------------------------------------------------------
  581. ** Test sf_read/write_float ()
  582. */
  583. zero_count = 0 ;
  584. float_out = data_out.f ;
  585. float_in = data_in.f ;
  586. for (k = 0 ; k < items ; k++)
  587. { float_out [k] = (k * ((k % 2) ? 3333 : -3333)) ;
  588. zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
  589. } ;
  590. if (zero_count > items / 4)
  591. { printf ("nnLine %d: too many zeros (%d/%d).n", __LINE__, zero_count, items) ;
  592. exit (1) ;
  593. } ;
  594. sfinfo.samplerate = 44100 ;
  595. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  596. sfinfo.channels = 1 ;
  597. sfinfo.format = filetype ;
  598. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  599. sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
  600. test_write_float_or_die (file, 0, float_out, items, __LINE__) ;
  601. sf_close (file) ;
  602. memset (float_in, 0, items * sizeof (float)) ;
  603. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  604. if (sfinfo.format != filetype)
  605. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  606. exit (1) ;
  607. } ;
  608. if (sfinfo.frames != items)
  609. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  610. exit (1) ;
  611. } ;
  612. if (sfinfo.channels != 1)
  613. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  614. exit (1) ;
  615. } ;
  616. check_log_buffer_or_die (file, __LINE__) ;
  617. sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
  618. test_read_float_or_die (file, 0, float_in, items, __LINE__) ;
  619. for (k = 0 ; k < items ; k++)
  620. if (fabs (float_out [k] - float_in [k]) > 1e-10)
  621. { printf ("nnLine %d: float : Incorrect sample (#%d : %f => %f).n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ;
  622. exit (1) ;
  623. break ;
  624. } ;
  625. sf_close (file) ;
  626. /*--------------------------------------------------------------------------
  627. ** Test sf_read/write_double ()
  628. */
  629. zero_count = 0 ;
  630. double_out = data_out.d ;
  631. double_in = data_in.d ;
  632. for (k = 0 ; k < items ; k++)
  633. { double_out [k] = (k * ((k % 2) ? 3333 : -3333)) ;
  634. zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
  635. } ;
  636. if (zero_count > items / 4)
  637. { printf ("nnLine %d: too many zeros (%d/%d).n", __LINE__, zero_count, items) ;
  638. exit (1) ;
  639. } ;
  640. sfinfo.samplerate = 44100 ;
  641. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  642. sfinfo.channels = 1 ;
  643. sfinfo.format = filetype ;
  644. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  645. sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
  646. test_write_double_or_die (file, 0, double_out, items, __LINE__) ;
  647. sf_close (file) ;
  648. memset (double_in, 0, items * sizeof (double)) ;
  649. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  650. if (sfinfo.format != filetype)
  651. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  652. exit (1) ;
  653. } ;
  654. if (sfinfo.frames != items)
  655. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  656. exit (1) ;
  657. } ;
  658. if (sfinfo.channels != 1)
  659. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  660. exit (1) ;
  661. } ;
  662. check_log_buffer_or_die (file, __LINE__) ;
  663. sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
  664. test_read_double_or_die (file, 0, double_in, items, __LINE__) ;
  665. for (k = 0 ; k < items ; k++)
  666. if (fabs (double_out [k] - double_in [k]) > 1e-10)
  667. { printf ("nnLine %d: double : Incorrect sample (#%d : %f => %f).n", __LINE__, k, double_out [k], double_in [k]) ;
  668. exit (1) ;
  669. } ;
  670. sf_close (file) ;
  671. /* Lite remove end */
  672. unlink (filename) ;
  673. puts ("ok") ;
  674. } /* pcm_test_bits_24 */
  675. static void
  676. pcm_test_bits_32 (const char *filename, int filetype, uint64_t hash)
  677. { SNDFILE *file ;
  678. SF_INFO sfinfo ;
  679. int k, items, zero_count ;
  680. short *short_out, *short_in ;
  681. int *int_out, *int_in ;
  682. /* Lite remove start */
  683. float *float_out, *float_in ;
  684. double *double_out, *double_in ;
  685. /* Lite remove end */
  686. print_test_name ("pcm_test_bits_32", filename) ;
  687. items = 1024 ;
  688. short_out = data_out.s ;
  689. short_in = data_in.s ;
  690. zero_count = 0 ;
  691. for (k = 0 ; k < items ; k++)
  692. { short_out [k] = (k * ((k % 2) ? 3 : -3)) ;
  693. zero_count = short_out [k] ? zero_count : zero_count + 1 ;
  694. } ;
  695. if (zero_count > items / 4)
  696. { printf ("nnLine %d: too many zeros.n", __LINE__) ;
  697. exit (1) ;
  698. } ;
  699. sfinfo.samplerate = 44100 ;
  700. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  701. sfinfo.channels = 1 ;
  702. sfinfo.format = filetype ;
  703. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  704. test_write_short_or_die (file, 0, short_out, items, __LINE__) ;
  705. sf_close (file) ;
  706. memset (short_in, 0, items * sizeof (short)) ;
  707. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  708. if (sfinfo.format != filetype)
  709. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  710. exit (1) ;
  711. } ;
  712. if (sfinfo.frames != items)
  713. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  714. exit (1) ;
  715. } ;
  716. if (sfinfo.channels != 1)
  717. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  718. exit (1) ;
  719. } ;
  720. check_log_buffer_or_die (file, __LINE__) ;
  721. test_read_short_or_die (file, 0, short_in, items, __LINE__) ;
  722. for (k = 0 ; k < items ; k++)
  723. if (short_out [k] != short_in [k])
  724. { printf ("nnLine %d: Incorrect sample (#%d : 0x%x => 0x%x).n", __LINE__, k, short_out [k], short_in [k]) ;
  725. exit (1) ;
  726. } ;
  727. sf_close (file) ;
  728. /* Finally, check the file hash. */
  729. check_file_hash_or_die (filename, hash, __LINE__) ;
  730. /*--------------------------------------------------------------------------
  731. ** Test sf_read/write_int ()
  732. */
  733. zero_count = 0 ;
  734. int_out = data_out.i ;
  735. int_in = data_in.i ;
  736. for (k = 0 ; k < items ; k++)
  737. { int_out [k] = (k * ((k % 2) ? 333333 : -333333)) ;
  738. zero_count = int_out [k] ? zero_count : zero_count + 1 ;
  739. } ;
  740. if (zero_count > items / 4)
  741. { printf ("nnLine %d: too many zeros.n", __LINE__) ;
  742. exit (1) ;
  743. } ;
  744. sfinfo.samplerate = 44100 ;
  745. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  746. sfinfo.channels = 1 ;
  747. sfinfo.format = filetype ;
  748. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  749. test_write_int_or_die (file, 0, int_out, items, __LINE__) ;
  750. sf_close (file) ;
  751. memset (int_in, 0, items * sizeof (int)) ;
  752. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  753. if (sfinfo.format != filetype)
  754. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  755. exit (1) ;
  756. } ;
  757. if (sfinfo.frames != items)
  758. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  759. exit (1) ;
  760. } ;
  761. if (sfinfo.channels != 1)
  762. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  763. exit (1) ;
  764. } ;
  765. check_log_buffer_or_die (file, __LINE__) ;
  766. test_read_int_or_die (file, 0, int_in, items, __LINE__) ;
  767. for (k = 0 ; k < items ; k++)
  768. if (int_out [k] != int_in [k])
  769. { printf ("nnLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).n", __LINE__, k, int_out [k], int_in [k]) ;
  770. exit (1) ;
  771. } ;
  772. sf_close (file) ;
  773. /* Lite remove start */
  774. /*--------------------------------------------------------------------------
  775. ** Test sf_read/write_float ()
  776. */
  777. zero_count = 0 ;
  778. float_out = data_out.f ;
  779. float_in = data_in.f ;
  780. for (k = 0 ; k < items ; k++)
  781. { float_out [k] = (k * ((k % 2) ? 333333 : -333333)) ;
  782. zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
  783. } ;
  784. if (zero_count > items / 4)
  785. { printf ("nnLine %d: too many zeros (%d/%d).n", __LINE__, zero_count, items) ;
  786. exit (1) ;
  787. } ;
  788. sfinfo.samplerate = 44100 ;
  789. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  790. sfinfo.channels = 1 ;
  791. sfinfo.format = filetype ;
  792. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  793. sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
  794. test_write_float_or_die (file, 0, float_out, items, __LINE__) ;
  795. sf_close (file) ;
  796. memset (float_in, 0, items * sizeof (float)) ;
  797. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  798. if (sfinfo.format != filetype)
  799. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  800. exit (1) ;
  801. } ;
  802. if (sfinfo.frames != items)
  803. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  804. exit (1) ;
  805. } ;
  806. if (sfinfo.channels != 1)
  807. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  808. exit (1) ;
  809. } ;
  810. check_log_buffer_or_die (file, __LINE__) ;
  811. sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;
  812. test_read_float_or_die (file, 0, float_in, items, __LINE__) ;
  813. for (k = 0 ; k < items ; k++)
  814. if (fabs (float_out [k] - float_in [k]) > 1e-10)
  815. { printf ("nnLine %d: float : Incorrect sample (#%d : %f => %f).n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ;
  816. exit (1) ;
  817. break ;
  818. } ;
  819. sf_close (file) ;
  820. /*--------------------------------------------------------------------------
  821. ** Test sf_read/write_double ()
  822. */
  823. zero_count = 0 ;
  824. double_out = data_out.d ;
  825. double_in = data_in.d ;
  826. for (k = 0 ; k < items ; k++)
  827. { double_out [k] = (k * ((k % 2) ? 333333 : -333333)) ;
  828. zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ;
  829. } ;
  830. if (zero_count > items / 4)
  831. { printf ("nnLine %d: too many zeros (%d/%d).n", __LINE__, zero_count, items) ;
  832. exit (1) ;
  833. } ;
  834. sfinfo.samplerate = 44100 ;
  835. sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */
  836. sfinfo.channels = 1 ;
  837. sfinfo.format = filetype ;
  838. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  839. sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
  840. test_write_double_or_die (file, 0, double_out, items, __LINE__) ;
  841. sf_close (file) ;
  842. memset (double_in, 0, items * sizeof (double)) ;
  843. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  844. if (sfinfo.format != filetype)
  845. { printf ("nnLine %d: Returned format incorrect (0x%08X => 0x%08X).n", __LINE__, filetype, sfinfo.format) ;
  846. exit (1) ;
  847. } ;
  848. if (sfinfo.frames != items)
  849. { printf ("nnLine %d: Incorrect number of frames in file. (%d => %ld)n", __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  850. exit (1) ;
  851. } ;
  852. if (sfinfo.channels != 1)
  853. { printf ("nnLine %d: Incorrect number of channels in file.n", __LINE__) ;
  854. exit (1) ;
  855. } ;
  856. check_log_buffer_or_die (file, __LINE__) ;
  857. sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
  858. test_read_double_or_die (file, 0, double_in, items, __LINE__) ;
  859. for (k = 0 ; k < items ; k++)
  860. if (fabs (double_out [k] - double_in [k]) > 1e-10)
  861. { printf ("nnLine %d: double : Incorrect sample (#%d : %f => %f).n", __LINE__, k, double_out [k], double_in [k]) ;
  862. exit (1) ;
  863. } ;
  864. sf_close (file) ;
  865. /* Lite remove end */
  866. unlink (filename) ;
  867. puts ("ok") ;
  868. } /* pcm_test_bits_32 */
  869. /*==============================================================================
  870. */
  871. static void
  872. pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float)
  873. { SNDFILE *file ;
  874. SF_INFO sfinfo ;
  875. int k, items, frames ;
  876. int sign ;
  877. double *data, error ;
  878. print_test_name (replace_float ?  "pcm_test_float (replace)" : "pcm_test_float", filename) ;
  879. items = BUFFER_SIZE ;
  880. data = data_out.d ;
  881. for (sign = 1, k = 0 ; k < items ; k++)
  882. { data [k] = ((double) (k * sign)) / 100.0 ;
  883. sign = (sign > 0) ? -1 : 1 ;
  884. } ;
  885. sfinfo.samplerate = 44100 ;
  886. sfinfo.frames = items ;
  887. sfinfo.channels = 1 ;
  888. sfinfo.format = filetype ;
  889. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  890. sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
  891. if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
  892. { printf ("nnLine %d : Float replacement code not working.nn", __LINE__) ;
  893. dump_log_buffer (file) ;
  894. exit (1) ;
  895. } ;
  896. test_write_double_or_die (file, 0, data, items, __LINE__) ;
  897. sf_close (file) ;
  898. check_file_hash_or_die (filename, hash, __LINE__) ;
  899. memset (data, 0, items * sizeof (double)) ;
  900. if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
  901. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  902. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  903. sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
  904. if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
  905. { printf ("nnLine %d : Float replacement code not working.nn", __LINE__) ;
  906. dump_log_buffer (file) ;
  907. exit (1) ;
  908. } ;
  909. if (sfinfo.format != filetype)
  910. { printf ("nnError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).n", __FILE__, __LINE__, filetype, sfinfo.format) ;
  911. exit (1) ;
  912. } ;
  913. if (sfinfo.frames != items)
  914. { printf ("nnError (%s:%d) Mono : Incorrect number of frames in file. (%d => %ld)n", __FILE__, __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  915. exit (1) ;
  916. } ;
  917. if (sfinfo.channels != 1)
  918. { printf ("nnError (%s:%d) Mono : Incorrect number of channels in file.n", __FILE__, __LINE__) ;
  919. exit (1) ;
  920. } ;
  921. check_log_buffer_or_die (file, __LINE__) ;
  922. test_read_double_or_die (file, 0, data, items, __LINE__) ;
  923. for (sign = -1, k = 0 ; k < items ; k++)
  924. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  925. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  926. { printf ("nnError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  927. exit (1) ;
  928. } ;
  929. } ;
  930. /* Seek to start of file. */
  931. test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
  932. test_read_double_or_die (file, 0, data, 4, __LINE__) ;
  933. for (k = 0 ; k < 4 ; k++)
  934. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  935. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  936. { printf ("nnError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  937. exit (1) ;
  938. } ;
  939. } ;
  940. /* Seek to offset from start of file. */
  941. test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
  942. test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
  943. for (k = 10 ; k < 14 ; k++)
  944. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  945. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  946. { printf ("nnError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  947. exit (1) ;
  948. } ;
  949. } ;
  950. /* Seek to offset from current position. */
  951. test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
  952. test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ;
  953. for (k = 20 ; k < 24 ; k++)
  954. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  955. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  956. { printf ("nnError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  957. exit (1) ;
  958. } ;
  959. } ;
  960. /* Seek to offset from end of file. */
  961. test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
  962. test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
  963. for (k = 10 ; k < 14 ; k++)
  964. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  965. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  966. { printf ("nnError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  967. exit (1) ;
  968. } ;
  969. } ;
  970. sf_close (file) ;
  971. /* Now test Stereo. */
  972. if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */
  973. { printf ("okn") ;
  974. return ;
  975. } ;
  976. items = BUFFER_SIZE ;
  977. data = data_out.d ;
  978. for (sign = -1, k = 0 ; k < items ; k++)
  979. data [k] = ((double) k) / 100.0 * (sign *= -1) ;
  980. sfinfo.samplerate = 44100 ;
  981. sfinfo.frames = items ;
  982. sfinfo.channels = 2 ;
  983. sfinfo.format = filetype ;
  984. frames = items / sfinfo.channels ;
  985. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  986. sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
  987. if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
  988. { printf ("nnLine %d : Float replacement code not working.nn", __LINE__) ;
  989. dump_log_buffer (file) ;
  990. exit (1) ;
  991. } ;
  992. test_writef_double_or_die (file, 0, data, frames, __LINE__) ;
  993. sf_close (file) ;
  994. check_file_hash_or_die (filename, hash, __LINE__) ;
  995. memset (data, 0, items * sizeof (double)) ;
  996. if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
  997. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  998. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  999. sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
  1000. if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
  1001. { printf ("nnLine %d : Float replacement code not working.nn", __LINE__) ;
  1002. dump_log_buffer (file) ;
  1003. exit (1) ;
  1004. } ;
  1005. if (sfinfo.format != filetype)
  1006. { printf ("nnError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).n", __FILE__, __LINE__, filetype, sfinfo.format) ;
  1007. exit (1) ;
  1008. } ;
  1009. if (sfinfo.frames != frames)
  1010. { printf ("nnError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %ld)n", __FILE__, __LINE__, frames, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  1011. exit (1) ;
  1012. } ;
  1013. if (sfinfo.channels != 2)
  1014. { printf ("nnError (%s:%d) Stereo : Incorrect number of channels in file.n", __FILE__, __LINE__) ;
  1015. exit (1) ;
  1016. } ;
  1017. check_log_buffer_or_die (file, __LINE__) ;
  1018. test_readf_double_or_die (file, 0, data, frames, __LINE__) ;
  1019. for (sign = -1, k = 0 ; k < items ; k++)
  1020. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1021. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1022. { printf ("nnError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1023. exit (1) ;
  1024. } ;
  1025. } ;
  1026. /* Seek to start of file. */
  1027. test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
  1028. test_readf_double_or_die (file, 0, data, 4, __LINE__) ;
  1029. for (k = 0 ; k < 4 ; k++)
  1030. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1031. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1032. { printf ("nnError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1033. exit (1) ;
  1034. } ;
  1035. } ;
  1036. /* Seek to offset from start of file. */
  1037. test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
  1038. test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ;
  1039. for (k = 20 ; k < 24 ; k++)
  1040. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1041. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1042. { printf ("nnError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1043. exit (1) ;
  1044. } ;
  1045. } ;
  1046. /* Seek to offset from current position. */
  1047. test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
  1048. test_readf_double_or_die (file, 0, data + 40, 2, __LINE__) ;
  1049. for (k = 40 ; k < 44 ; k++)
  1050. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1051. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1052. { printf ("nnError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1053. exit (1) ;
  1054. } ;
  1055. } ;
  1056. /* Seek to offset from end of file. */
  1057. test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
  1058. test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ;
  1059. for (k = 20 ; k < 24 ; k++)
  1060. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1061. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1062. { printf ("nnError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1063. exit (1) ;
  1064. } ;
  1065. } ;
  1066. sf_close (file) ;
  1067. printf ("okn") ;
  1068. unlink (filename) ;
  1069. } /* pcm_test_float */
  1070. static void
  1071. pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float)
  1072. { SNDFILE *file ;
  1073. SF_INFO sfinfo ;
  1074. int k, items, frames ;
  1075. int sign ;
  1076. double *data, error ;
  1077. /* This is the best test routine. Other should be brought up to this standard. */
  1078. print_test_name (replace_float ?  "pcm_test_double (replace)" : "pcm_test_double", filename) ;
  1079. items = BUFFER_SIZE ;
  1080. data = data_out.d ;
  1081. for (sign = 1, k = 0 ; k < items ; k++)
  1082. { data [k] = ((double) (k * sign)) / 100.0 ;
  1083. sign = (sign > 0) ? -1 : 1 ;
  1084. } ;
  1085. sfinfo.samplerate = 44100 ;
  1086. sfinfo.frames = items ;
  1087. sfinfo.channels = 1 ;
  1088. sfinfo.format = filetype ;
  1089. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  1090. sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
  1091. if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
  1092. { printf ("nnLine %d : Float replacement code not working.nn", __LINE__) ;
  1093. dump_log_buffer (file) ;
  1094. exit (1) ;
  1095. } ;
  1096. test_write_double_or_die (file, 0, data, items, __LINE__) ;
  1097. sf_close (file) ;
  1098. #if (defined (WIN32) || defined (_WIN32))
  1099. /* File hashing on Win32 fails due to slighty different
  1100. ** calculated values of the sin() function.
  1101. */
  1102. hash = hash ; /* Avoid compiler warning. */
  1103. #else
  1104. check_file_hash_or_die (filename, hash, __LINE__) ;
  1105. #endif
  1106. memset (data, 0, items * sizeof (double)) ;
  1107. if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
  1108. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  1109. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  1110. sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
  1111. if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
  1112. { printf ("nnLine %d : Float replacement code not working.nn", __LINE__) ;
  1113. dump_log_buffer (file) ;
  1114. exit (1) ;
  1115. } ;
  1116. if (sfinfo.format != filetype)
  1117. { printf ("nnError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).n", __FILE__, __LINE__, filetype, sfinfo.format) ;
  1118. exit (1) ;
  1119. } ;
  1120. if (sfinfo.frames != items)
  1121. { printf ("nnError (%s:%d) Mono : Incorrect number of frames in file. (%d => %ld)n", __FILE__, __LINE__, items, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  1122. exit (1) ;
  1123. } ;
  1124. if (sfinfo.channels != 1)
  1125. { printf ("nnError (%s:%d) Mono : Incorrect number of channels in file.n", __FILE__, __LINE__) ;
  1126. exit (1) ;
  1127. } ;
  1128. check_log_buffer_or_die (file, __LINE__) ;
  1129. test_read_double_or_die (file, 0, data, items, __LINE__) ;
  1130. for (sign = -1, k = 0 ; k < items ; k++)
  1131. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1132. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1133. { printf ("nnError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1134. exit (1) ;
  1135. } ;
  1136. } ;
  1137. /* Seek to start of file. */
  1138. test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
  1139. test_read_double_or_die (file, 0, data, 4, __LINE__) ;
  1140. for (k = 0 ; k < 4 ; k++)
  1141. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1142. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1143. { printf ("nnError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1144. exit (1) ;
  1145. } ;
  1146. } ;
  1147. /* Seek to offset from start of file. */
  1148. test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
  1149. test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
  1150. test_seek_or_die (file, 0, SEEK_CUR, 14, sfinfo.channels, __LINE__) ;
  1151. for (k = 10 ; k < 14 ; k++)
  1152. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1153. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1154. { printf ("nnError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1155. exit (1) ;
  1156. } ;
  1157. } ;
  1158. /* Seek to offset from current position. */
  1159. test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
  1160. test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ;
  1161. for (k = 20 ; k < 24 ; k++)
  1162. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1163. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1164. { printf ("nnError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1165. exit (1) ;
  1166. } ;
  1167. } ;
  1168. /* Seek to offset from end of file. */
  1169. test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
  1170. test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
  1171. for (k = 10 ; k < 14 ; k++)
  1172. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1173. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1174. { printf ("nnError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1175. exit (1) ;
  1176. } ;
  1177. } ;
  1178. sf_close (file) ;
  1179. /* Now test Stereo. */
  1180. if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */
  1181. { printf ("okn") ;
  1182. return ;
  1183. } ;
  1184. items = BUFFER_SIZE ;
  1185. data = data_out.d ;
  1186. for (sign = -1, k = 0 ; k < items ; k++)
  1187. data [k] = ((double) k) / 100.0 * (sign *= -1) ;
  1188. sfinfo.samplerate = 44100 ;
  1189. sfinfo.frames = items ;
  1190. sfinfo.channels = 2 ;
  1191. sfinfo.format = filetype ;
  1192. frames = items / sfinfo.channels ;
  1193. file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
  1194. sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
  1195. if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
  1196. { printf ("nnLine %d : Float replacement code not working.nn", __LINE__) ;
  1197. dump_log_buffer (file) ;
  1198. exit (1) ;
  1199. } ;
  1200. test_writef_double_or_die (file, 0, data, frames, __LINE__) ;
  1201. sf_close (file) ;
  1202. #if (defined (WIN32) || defined (_WIN32))
  1203. /* File hashing on Win32 fails due to slighty different
  1204. ** calculated values.
  1205. */
  1206. hash = hash ; /* Avoid compiler warning. */
  1207. #else
  1208. check_file_hash_or_die (filename, hash, __LINE__) ;
  1209. #endif
  1210. memset (data, 0, items * sizeof (double)) ;
  1211. if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
  1212. memset (&sfinfo, 0, sizeof (sfinfo)) ;
  1213. file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ;
  1214. sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ;
  1215. if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0)
  1216. { printf ("nnLine %d : Float replacement code not working.nn", __LINE__) ;
  1217. dump_log_buffer (file) ;
  1218. exit (1) ;
  1219. } ;
  1220. if (sfinfo.format != filetype)
  1221. { printf ("nnError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).n", __FILE__, __LINE__, filetype, sfinfo.format) ;
  1222. exit (1) ;
  1223. } ;
  1224. if (sfinfo.frames != frames)
  1225. { printf ("nnError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %ld)n", __FILE__, __LINE__, frames, SF_COUNT_TO_LONG (sfinfo.frames)) ;
  1226. exit (1) ;
  1227. } ;
  1228. if (sfinfo.channels != 2)
  1229. { printf ("nnError (%s:%d) Stereo : Incorrect number of channels in file.n", __FILE__, __LINE__) ;
  1230. exit (1) ;
  1231. } ;
  1232. check_log_buffer_or_die (file, __LINE__) ;
  1233. test_readf_double_or_die (file, 0, data, frames, __LINE__) ;
  1234. for (sign = -1, k = 0 ; k < items ; k++)
  1235. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1236. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1237. { printf ("nnError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1238. exit (1) ;
  1239. } ;
  1240. } ;
  1241. /* Seek to start of file. */
  1242. test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ;
  1243. test_read_double_or_die (file, 0, data, 4, __LINE__) ;
  1244. for (k = 0 ; k < 4 ; k++)
  1245. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1246. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1247. { printf ("nnError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1248. exit (1) ;
  1249. } ;
  1250. } ;
  1251. /* Seek to offset from start of file. */
  1252. test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ;
  1253. test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ;
  1254. for (k = 20 ; k < 24 ; k++)
  1255. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1256. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1257. { printf ("nnError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1258. exit (1) ;
  1259. } ;
  1260. } ;
  1261. /* Seek to offset from current position. */
  1262. test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ;
  1263. test_readf_double_or_die (file, 0, data + 40, 4, __LINE__) ;
  1264. for (k = 40 ; k < 44 ; k++)
  1265. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1266. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1267. { printf ("nnError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1268. exit (1) ;
  1269. } ;
  1270. } ;
  1271. /* Seek to offset from end of file. */
  1272. test_seek_or_die (file, -1 * (sfinfo.frames -10), SEEK_END, 10, sfinfo.channels, __LINE__) ;
  1273. test_readf_double_or_die (file, 0, data + 20, 4, __LINE__) ;
  1274. for (k = 20 ; k < 24 ; k++)
  1275. { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ;
  1276. if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5)
  1277. { printf ("nnError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ;
  1278. exit (1) ;
  1279. } ;
  1280. } ;
  1281. sf_close (file) ;
  1282. printf ("okn") ;
  1283. unlink (filename) ;
  1284. } /* pcm_test_double */
  1285. /*==============================================================================
  1286. */