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

流媒体/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 <unistd.h>
  20. #include <sys/stat.h>
  21. #include <fcntl.h>
  22. #include <sndfile.h>
  23. static unsigned char  wav_ieee [] =
  24. { 0x52, 0x49, 0x46, 0x46, 0x64, 0x00, 0x00, 0x00, 
  25. 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20,
  26. 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 
  27. 0x34, 0x12, 0x00, 0x00, 0xD0, 0x48, 0x00, 0x00,
  28. 0x04, 0x00, 0x20, 0x00, 0x64, 0x61, 0x74, 0x61, 
  29. 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  30. 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x40, 
  31. 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x40,
  32. 0x00, 0x00, 0xA0, 0x40, 0x00, 0x00, 0xC0, 0x40, 
  33. 0x00, 0x00, 0xE0, 0x40, 0x00, 0x00, 0x00, 0x41,
  34. 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x20, 0x41, 
  35. 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0x40, 0x41,
  36. 0x00, 0x00, 0x50, 0x41, 0x00, 0x00, 0x60, 0x41, 
  37. 0x00, 0x00, 0x70, 0x41, 0x49, 0x4E, 0x46, 0x4F,
  38. 0x04, 0x00, 0x00, 0x00, 0xFE, 0xED, 0xC0, 0xDE
  39. } ; /* wav_ieee */
  40. static unsigned char  wav_pcm32 [] =
  41. { 0x52, 0x49, 0x46, 0x46, 0x64, 0x00, 0x00, 0x00, 
  42. 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20,
  43. 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 
  44. 0x34, 0x12, 0x00, 0x00, 0xD0, 0x48, 0x00, 0x00,
  45. 0x04, 0x00, 0x20, 0x00, 0x64, 0x61, 0x74, 0x61, 
  46. 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  47. 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 
  48. 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
  49. 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
  50. 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
  51. 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 
  52. 0x0B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
  53. 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 
  54. 0x0F, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x46, 0x4F,
  55. 0x04, 0x00, 0x00, 0x00, 0xFE, 0xED, 0xC0, 0xDE
  56. } ; /* wav_pcm32 */
  57. static unsigned char  wav_pcm24 [] =
  58. { 0x52, 0x49, 0x46, 0x46, 0x54, 0x00, 0x00, 0x00, 
  59. 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20,
  60. 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 
  61. 0x34, 0x12, 0x00, 0x00, 0x9C, 0x36, 0x00, 0x00, 
  62. 0x03, 0x00, 0x18, 0x00, 0x64, 0x61, 0x74, 0x61, 
  63. 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
  64. 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 
  65. 0x04, 0x00, 0x00, 0x05, 0x00, 0x00, 0x06, 0x00, 
  66. 0x00, 0x07, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 
  67. 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0B, 0x00, 0x00, 
  68. 0x0C, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0E, 0x00, 
  69. 0x00, 0x0F, 0x00, 0x00, 0x49, 0x4E, 0x46, 0x4F,
  70. 0x04, 0x00, 0x00, 0x00, 0xFE, 0xED, 0xC0, 0xDE
  71. } ; /* wav_pcm24 */
  72. static unsigned char  wav_pcm16 [] =
  73. { 0x52, 0x49, 0x46, 0x46, 0x44, 0x00, 0x00, 0x00, 
  74. 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20, 
  75. 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 
  76. 0x34, 0x12, 0x00, 0x00, 0x24, 0x68, 0x00, 0x00, 
  77. 0x02, 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61, 
  78. 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 
  79. 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 
  80. 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 
  81. 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x00, 0x0D, 0x00, 
  82. 0x0E, 0x00, 0x0F, 0x00, 0x49, 0x4E, 0x46, 0x4F,
  83. 0x04, 0x00, 0x00, 0x00, 0xFE, 0xED, 0xC0, 0xDE
  84. } ; /* wav_pcm16 */
  85. static unsigned char  wav_pcm8 [] =
  86. { 0x52, 0x49, 0x46, 0x46, 0x34, 0x00, 0x00, 0x00, 
  87. 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20, 
  88. 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 
  89. 0x34, 0x12, 0x00, 0x00, 0x34, 0x12, 0x00, 0x00, 
  90. 0x01, 0x00, 0x08, 0x00, 0x64, 0x61, 0x74, 0x61, 
  91. 0x10, 0x00, 0x00, 0x00, 0x80, 0x81, 0x82, 0x83, 
  92. 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 
  93. 0x8C, 0x8D, 0x8E, 0x8F, 0x49, 0x4E, 0x46, 0x4F,
  94. 0x04, 0x00, 0x00, 0x00, 0xFE, 0xED, 0xC0, 0xDE
  95. } ; /* wav_pcm8 */
  96. static unsigned char  aiff_pcm32 [] =
  97. { 0x46, 0x4F, 0x52, 0x4D, 0x00, 0x00, 0x00, 0x6E, 
  98. 0x41, 0x49, 0x46, 0x46, 0x43, 0x4F, 0x4D, 0x4D,
  99. 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x00, 
  100. 0x00, 0x10, 0x00, 0x20, 0x40, 0x0B, 0x91, 0xA0,
  101. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 
  102. 0x4E, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
  103. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  104. 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  105. 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
  106. 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
  107. 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
  108. 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
  109. 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 
  110. 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00,
  111. 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F
  112. } ; /* aiff_pcm32 */
  113. static unsigned char  aiff_pcm24 [] =
  114. { 0x46, 0x4F, 0x52, 0x4D, 0x00, 0x00, 0x00, 0x5E, 
  115. 0x41, 0x49, 0x46, 0x46, 0x43, 0x4F, 0x4D, 0x4D, 
  116. 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x00, 
  117. 0x00, 0x10, 0x00, 0x18, 0x40, 0x0B, 0x91, 0xA0, 
  118. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 
  119. 0x4E, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 
  120. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  121. 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 
  122. 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 
  123. 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0x00, 0x00, 
  124. 0x08, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x00, 
  125. 0x00, 0x0B, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0D, 
  126. 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0F
  127. } ; /* aiff_pcm24 */
  128. static unsigned char  aiff_pcm16 [] =
  129. { 0x46, 0x4F, 0x52, 0x4D, 0x00, 0x00, 0x00, 0x4E, 
  130. 0x41, 0x49, 0x46, 0x46, 0x43, 0x4F, 0x4D, 0x4D, 
  131. 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x00, 
  132. 0x00, 0x10, 0x00, 0x10, 0x40, 0x0B, 0x91, 0xA0, 
  133. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 
  134. 0x4E, 0x44, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 
  135. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  136. 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 
  137. 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 
  138. 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x0C, 
  139. 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F
  140. } ; /* aiff_pcm16 */
  141. static unsigned char  aiff_pcm8 [] =
  142. { 0x46, 0x4F, 0x52, 0x4D, 0x00, 0x00, 0x00, 0x3E, 
  143. 0x41, 0x49, 0x46, 0x46, 0x43, 0x4F, 0x4D, 0x4D, 
  144. 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x00, 
  145. 0x00, 0x10, 0x00, 0x08, 0x40, 0x0B, 0x91, 0xA0, 
  146. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 
  147. 0x4E, 0x44, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 
  148. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
  149. 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 
  150. 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
  151. } ; /* aiff_pcm8 */
  152. static unsigned char  au_pcm32 [] =
  153. { 0x2E, 0x73, 0x6E, 0x64, 0x00, 0x00, 0x00, 0x18, 
  154. 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x05,
  155. 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x01, 
  156. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  157. 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03,
  158. 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05,
  159. 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07,
  160. 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09,
  161. 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B,
  162. 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0D,
  163. 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F
  164. } ; /* au_pcm32 */
  165. static unsigned char  au_pcm24 [] =
  166. { 0x2E, 0x73, 0x6E, 0x64, 0x00, 0x00, 0x00, 0x18, 
  167. 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x04,
  168. 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x01,
  169. 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  170. 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x00,
  171. 0x00, 0x05, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07,
  172. 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x00, 0x00,
  173. 0x0A, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x0C, 0x00,
  174. 0x00, 0x0D, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0F
  175. } ; /* au_pcm24 */
  176. static unsigned char  au_pcm16 [] =
  177. { 0x2E, 0x73, 0x6E, 0x64, 0x00, 0x00, 0x00, 0x18, 
  178. 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03,
  179. 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x01, 
  180. 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03,
  181. 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 
  182. 0x00, 0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0B,
  183. 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F
  184. } ; /* au_pcm16 */
  185. static unsigned char  au_pcm8 [] =
  186. { 0x2E, 0x73, 0x6E, 0x64, 0x00, 0x00, 0x00, 0x18, 
  187. 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02,
  188. 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x00, 0x01, 
  189. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  190. 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
  191. } ; /* au_pcm8 */
  192. static
  193. void write_file (char *filename, unsigned char *data, size_t len)
  194. { FILE* fp = NULL ;
  195. fp = fopen (filename,"wb") ;
  196. if (fp == NULL)
  197. { printf ("Could not open file '%s' for writing.n", filename) ;
  198. sf_perror (NULL) ;
  199. exit (1) ;
  200. } ;
  201. if (fwrite (data, 1, len, fp) != len)
  202. { printf ("Write to file '%s' failed.n", filename) ;
  203. sf_perror (NULL) ;
  204. exit (1) ;
  205. } ;
  206. fclose (fp) ;
  207. } /* write_file */
  208. static
  209. void double_test (char *filename, int length)
  210. { int k, count ;
  211. SNDFILE *file ;
  212. SF_INFO sfinfo ;
  213. double *readdata ;
  214. printf ("    double_test (%s) ... ", filename) ;
  215. if (! (file = sf_open_read (filename, &sfinfo)))
  216. { printf ("Could not open file '%s' for read.n", filename) ;
  217. sf_perror (NULL) ;
  218. exit (1) ;
  219. } ;
  220. if (sfinfo.samples != length)
  221. { printf ("Expecting %d samples in file, found %d.n", length, sfinfo.samples) ;
  222. exit (1) ;
  223. } ;
  224. readdata = (double*) malloc (sfinfo.samples * sizeof (double)) ;
  225. if ((count = sf_read_double (file, readdata, sfinfo.samples, 0)) != sfinfo.samples)
  226. { printf ("sf_read_double failed (%d items read).n", count) ;
  227. exit (1) ;
  228. } ;
  229. for (k = 0 ; k < sfinfo.samples ; k++)
  230. if (readdata [k] != (double) (k))
  231. { printf ("Incorrect sample (#%d => %g).n", k, readdata [k]) ;
  232. exit (1) ;
  233. } ;
  234. /* Check seek from start of file. */
  235. k = sf_seek (file, 1, SEEK_SET) ;
  236. sf_read_double (file, readdata, 1, 0) ;
  237. if (readdata [0] != 1 || k != 1)
  238. { printf ("sf_seek (SEEK_SET) followed by sf_read_XXXX failed (%d, %d).n", ((int) readdata [0]), k) ;
  239. exit (1) ;
  240. } ;
  241. /* Check seek forward from current position. */
  242. k = sf_seek (file, 2, SEEK_CUR) ;
  243. sf_read_double (file, readdata, 1, 0) ;
  244. if (readdata [0] != 4 || k != 4)
  245. { printf ("sf_seek (SEEK_CUR) followed by sf_read_XXXX failed (%d, %d).n", ((int) readdata [0]), k) ;
  246. exit (1) ;
  247. } ;
  248. /* Check seek backward from current position. */
  249. k = sf_seek (file, -2, SEEK_CUR) ;
  250. sf_read_double (file, readdata, 1, 0) ;
  251. if (readdata [0] != 3 || k != 3)
  252. { printf ("sf_seek (SEEK_CUR) followed by sf_read_XXXX failed (%d, %d).n", ((int) readdata [0]), k) ;
  253. exit (1) ;
  254. } ;
  255. /* Check that read past end of file returns number of items. */
  256. if ((k = sf_read_double (file, readdata, sfinfo.samples, 0)) != 12)
  257. { printf ("Return value from short sf_read_XXXX incorrect (%d).n", k) ;
  258. exit (1) ;
  259. } ;
  260. /* Check seek backward from end. */
  261. k = sf_seek (file, -14, SEEK_END) ;
  262. sf_read_double (file, readdata, 1, 0) ;
  263. if (readdata [0] != 2 || k != 2)
  264. { printf ("sf_seek (SEEK_END) followed by sf_read_XXXX failed (%d, %d).n", ((int) readdata [0]), k) ;
  265. exit (1) ;
  266. } ;
  267. /* Check multiple reads. */
  268. k = sf_seek (file, 0, SEEK_SET) ;
  269. count = 0 ;
  270. while ((k = sf_read_double (file, readdata, 3, 0)))
  271. count += k ;
  272. if (count != sfinfo.samples)
  273. { printf ("failed multiple read test (%d, %d).n", count, sfinfo.samples) ;
  274. exit (1) ;
  275. } ;
  276. free (readdata) ;
  277. sf_close (file) ;
  278. printf ("okn") ;
  279. } /* double_test */
  280. static
  281. void int_test (char *filename, int length)
  282. { int count, k ;
  283. SNDFILE *file ;
  284. SF_INFO sfinfo ;
  285. int *readdata ;
  286. printf ("    int_test    (%s) ... ", filename) ;
  287. if (! (file = sf_open_read (filename, &sfinfo)))
  288. { printf ("Could not open file '%s' for read.n", filename) ;
  289. sf_perror (NULL) ;
  290. exit (1) ;
  291. } ;
  292. if (sfinfo.samples != length)
  293. { printf ("Expecting %d samples in file, found %d.n", length, sfinfo.samples) ;
  294. exit (1) ;
  295. } ;
  296. readdata = (int*) malloc (sfinfo.samples * sizeof (int)) ;
  297. if ((count = sf_read_int (file, readdata, sfinfo.samples)) != sfinfo.samples)
  298. { printf ("sf_read_int failed (%d items read).n", count) ;
  299. exit (1) ;
  300. } ;
  301. for (k = 0 ; k < sfinfo.samples ; k++)
  302. if (readdata [k] != (int) (k))
  303. { printf ("Incorrect sample (#%d => %d).n", k, readdata [k]) ;
  304. exit (1) ;
  305. } ;
  306. /* Check seek from start of file. */
  307. k = sf_seek (file, 1, SEEK_SET) ;
  308. sf_read_int (file, readdata, 1) ;
  309. if (readdata [0] != 1 || k != 1)
  310. { printf ("sf_seek (SEEK_SET) followed by sf_read_XXXX failed (%d, %d).n", readdata [0], k) ;
  311. exit (1) ;
  312. } ;
  313. /* Check seek forward from current position. */
  314. k = sf_seek (file, 2, SEEK_CUR) ;
  315. sf_read_int (file, readdata, 1) ;
  316. if (readdata [0] != 4 || k != 4)
  317. { printf ("sf_seek (SEEK_CUR) followed by sf_read_XXXX failed (%d, %d).n", readdata [0], k) ;
  318. exit (1) ;
  319. } ;
  320. /* Check seek backward from current position. */
  321. k = sf_seek (file, -2, SEEK_CUR) ;
  322. sf_read_int (file, readdata, 1) ;
  323. if (readdata [0] != 3 || k != 3)
  324. { printf ("sf_seek (SEEK_CUR) followed by sf_read_XXXX failed (%d, %d).n", readdata [0], k) ;
  325. exit (1) ;
  326. } ;
  327. /* Check that read past end of file returns number of items. */
  328. if ((k = sf_read_int (file, readdata, sfinfo.samples)) != 12)
  329. { printf ("Return value from short sf_read_XXXX incorrect (%d).n", k) ;
  330. exit (1) ;
  331. } ;
  332. /* Check seek backward from end. */
  333. k = sf_seek (file, -14, SEEK_END) ;
  334. sf_read_int (file, readdata, 1) ;
  335. if (readdata [0] != 2 || k != 2)
  336. { printf ("sf_seek (SEEK_END) followed by sf_read_XXXX failed (%d, %d).n", readdata [0], k) ;
  337. exit (1) ;
  338. } ;
  339. /* Check multiple reads. */
  340. k = sf_seek (file, 0, SEEK_SET) ;
  341. count = 0 ;
  342. while ((k = sf_read_int (file, readdata, 3)))
  343. count += k ;
  344. if (count != sfinfo.samples)
  345. { printf ("failed multiple read test (%d, %d).n", count, sfinfo.samples) ;
  346. exit (1) ;
  347. } ;
  348. free (readdata) ;
  349. sf_close (file) ;
  350. printf ("okn") ;
  351. } /* int_test */
  352. static
  353. void short_test (char *filename, int length)
  354. { int count, k ;
  355. SNDFILE *file ;
  356. SF_INFO sfinfo ;
  357. short *readdata ;
  358. printf ("    short_test  (%s) ... ", filename) ;
  359. if (! (file = sf_open_read (filename, &sfinfo)))
  360. { printf ("Could not open file '%s' for read.n", filename) ;
  361. sf_perror (NULL) ;
  362. exit (1) ;
  363. } ;
  364. if (sfinfo.samples != length)
  365. { printf ("Expecting %d samples in file, found %d.n", length, sfinfo.samples) ;
  366. exit (1) ;
  367. } ;
  368. readdata = (short*) malloc (sfinfo.samples * sizeof (short)) ;
  369. if ((count = sf_read_short (file, readdata, sfinfo.samples)) != sfinfo.samples)
  370. { printf ("sf_read_short failed (%d items read).n", count) ;
  371. exit (1) ;
  372. } ;
  373. for (k = 0 ; k < sfinfo.samples ; k++)
  374. if (readdata [k] != (short) (k))
  375. { printf ("Incorrect sample (#%d => %d).n", k, readdata [k]) ;
  376. exit (1) ;
  377. } ;
  378. /* Check seek from start of file. */
  379. k = sf_seek (file, 1, SEEK_SET) ;
  380. sf_read_short (file, readdata, 1) ;
  381. if (readdata [0] != 1 || k != 1)
  382. { printf ("sf_seek (SEEK_SET) followed by sf_read_XXXX failed (%d, %d).n", readdata [0], k) ;
  383. exit (1) ;
  384. } ;
  385. /* Check seek forward from current position. */
  386. k = sf_seek (file, 2, SEEK_CUR) ;
  387. sf_read_short (file, readdata, 1) ;
  388. if (readdata [0] != 4 || k != 4)
  389. { printf ("sf_seek (SEEK_CUR) followed by sf_read_XXXX failed (%d, %d).n", readdata [0], k) ;
  390. exit (1) ;
  391. } ;
  392. /* Check seek backward from current position. */
  393. k = sf_seek (file, -2, SEEK_CUR) ;
  394. sf_read_short (file, readdata, 1) ;
  395. if (readdata [0] != 3 || k != 3)
  396. { printf ("sf_seek (SEEK_CUR) followed by sf_read_XXXX failed (%d, %d).n", readdata [0], k) ;
  397. exit (1) ;
  398. } ;
  399. /* Check that read past end of file returns number of items. */
  400. if ((k = sf_read_short (file, readdata, sfinfo.samples)) != 12)
  401. { printf ("Return value from short sf_read_XXXX incorrect (%d).n", k) ;
  402. exit (1) ;
  403. } ;
  404. /* Check seek backward from end. */
  405. k = sf_seek (file, -14, SEEK_END) ;
  406. sf_read_short (file, readdata, 1) ;
  407. if (readdata [0] != 2 || k != 2)
  408. { printf ("sf_seek (SEEK_END) followed by sf_read_XXXX failed (%d, %d).n", readdata [0], k) ;
  409. exit (1) ;
  410. } ;
  411. /* Check multiple reads. */
  412. k = sf_seek (file, 0, SEEK_SET) ;
  413. count = 0 ;
  414. while ((k = sf_read_short (file, readdata, 3)))
  415. count += k ;
  416. if (count != sfinfo.samples)
  417. { printf ("failed multiple read test (%d, %d).n", count, sfinfo.samples) ;
  418. exit (1) ;
  419. } ;
  420. free (readdata) ;
  421. sf_close (file) ;
  422. printf ("okn") ;
  423. } /* short_test */
  424. int main (int argc, char *argv [])
  425. { char *filename ;
  426. int bDoAll = 0 ;
  427. int nTests = 0 ;
  428. if (argc != 2)
  429. { printf ("Usage : %s <test>n", argv [0]) ;
  430. printf ("    Where <test> is one of the following:n") ;
  431. printf ("           wav      - test WAV file functions (little endian)n") ;
  432. printf ("           aiff     - test AIFF file functions (big endian)n") ;
  433. printf ("           au       - test AU file functions (big endian)n") ;
  434. /*
  435. ** printf ("           paf      - test PAF file functions (little endian)n") ;
  436. ** printf ("           svx      - test SVX file functions (big endian)n") ;
  437. ** printf ("           nist     - test NIST file functions (little endian)n") ;
  438. */
  439. printf ("           all      - perform all testsn") ;
  440. exit (1) ;
  441. } ;
  442. bDoAll = !strcmp (argv [1], "all") ;
  443. if (bDoAll || ! strcmp (argv [1], "wav"))
  444. { filename = "wav_pcm8.wav" ;
  445. write_file (filename, wav_pcm8, sizeof (wav_pcm8)) ;
  446.   short_test (filename, 16) ;
  447.   int_test (filename, 16) ;
  448.   double_test (filename, 16) ;
  449.   unlink (filename) ;
  450. filename = "wav_pcm16.wav" ;
  451. write_file (filename, wav_pcm16, sizeof (wav_pcm16)) ;
  452. short_test (filename, 16) ;
  453. int_test (filename, 16) ;
  454. double_test (filename, 16) ;
  455. unlink (filename) ;
  456. filename = "wav_pcm24.wav" ;
  457. write_file (filename, wav_pcm24, sizeof (wav_pcm24)) ;
  458. int_test (filename, 16) ;
  459. double_test (filename, 16) ;
  460. unlink (filename) ;
  461. filename = "wav_pcm32.wav" ;
  462. write_file (filename, wav_pcm32, sizeof (wav_pcm32)) ;
  463. int_test (filename, 16) ;
  464. double_test (filename, 16) ;
  465. unlink (filename) ;
  466. filename = "wav_ieee.wav" ;
  467. write_file (filename, wav_ieee, sizeof (wav_ieee)) ;
  468. short_test (filename, 16) ;
  469. int_test (filename, 16) ;
  470. double_test (filename, 16) ;
  471. unlink (filename) ;
  472. nTests++ ;
  473. } ;
  474. if (bDoAll || ! strcmp (argv [1], "aiff"))
  475. { filename = "aiff_pcm8.aiff" ;
  476.   write_file (filename, aiff_pcm8, sizeof (aiff_pcm8)) ;
  477.   short_test (filename, 16) ;
  478.   int_test (filename, 16) ;
  479.   double_test (filename, 16) ;
  480.   unlink (filename) ;
  481. filename = "aiff_pcm16.aiff" ;
  482. write_file (filename, aiff_pcm16, sizeof (aiff_pcm16)) ;
  483. short_test (filename, 16) ;
  484. int_test (filename, 16) ;
  485. double_test (filename, 16) ;
  486. unlink (filename) ;
  487. filename = "aiff_pcm24.aiff" ;
  488. write_file (filename, aiff_pcm24, sizeof (aiff_pcm24)) ;
  489. int_test (filename, 16) ;
  490. double_test (filename, 16) ;
  491. unlink (filename) ;
  492. filename = "aiff_pcm32.aiff" ;
  493. write_file (filename, aiff_pcm32, sizeof (aiff_pcm32)) ;
  494. int_test (filename, 16) ;
  495. double_test (filename, 16) ;
  496. unlink (filename) ;
  497. nTests++ ;
  498. } ;
  499. if (bDoAll || ! strcmp (argv [1], "au"))
  500. { filename = "au_pcm8.au" ;
  501.   write_file (filename, au_pcm8, sizeof (au_pcm8)) ;
  502.   short_test (filename, 16) ;
  503.   int_test (filename, 16) ;
  504.   double_test (filename, 16) ;
  505.   unlink (filename) ;
  506. filename = "au_pcm16.au" ;
  507. write_file (filename, au_pcm16, sizeof (au_pcm16)) ;
  508. short_test (filename, 16) ;
  509. int_test (filename, 16) ;
  510. double_test (filename, 16) ;
  511. unlink (filename) ;
  512. filename = "au_pcm24.au" ;
  513. write_file (filename, au_pcm24, sizeof (au_pcm24)) ;
  514. int_test (filename, 16) ;
  515. double_test (filename, 16) ;
  516. unlink (filename) ;
  517. filename = "au_pcm32.au" ;
  518. write_file (filename, au_pcm32, sizeof (au_pcm32)) ;
  519. int_test (filename, 16) ;
  520. double_test (filename, 16) ;
  521. unlink (filename) ;
  522. nTests++ ;
  523. } ;
  524. if (nTests == 0)
  525. { printf ("************************************n") ;
  526. printf ("*  No '%s' test defined.n", argv [1]) ;
  527. printf ("************************************n") ;
  528. return 1 ;
  529. }
  530. return 0;
  531. } /* main */
  532. /*============================================================================================
  533.  * Here are the test functions.
  534.  */