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

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 Lesser General Public License as published by
  6. ** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
  13. **
  14. ** You should have received a copy of the GNU Lesser 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 <config.h>
  19. #include <stdarg.h>
  20. #include <string.h>
  21. #include <ctype.h>
  22. #include <math.h>
  23. #include <time.h>
  24. #include <sys/time.h>
  25. #include "sndfile.h"
  26. #include "sfendian.h"
  27. #include "common.h"
  28. /*-----------------------------------------------------------------------------------------------
  29. ** psf_log_printf allows libsndfile internal functions to print to an internal logbuffer which
  30. ** can later be displayed.
  31. ** The format specifiers are as for printf but without the field width and other modifiers.
  32. ** Printing is performed to the logbuffer char array of the SF_PRIVATE struct.
  33. ** Printing is done in such a way as to guarantee that the log never overflows the end of the
  34. ** logbuffer array.
  35. */
  36. static inline void
  37. log_putchar (SF_PRIVATE *psf, char ch)
  38. { if (psf->logindex < SIGNED_SIZEOF (psf->logbuffer) - 1)
  39. { psf->logbuffer [psf->logindex++] = ch ;
  40. psf->logbuffer [psf->logindex] = 0 ;
  41. } ;
  42. return ;
  43. } /* log_putchar */
  44. void
  45. psf_log_printf (SF_PRIVATE *psf, const char *format, ...)
  46. { va_list ap ;
  47. unsigned int u ;
  48. int d, tens, shift, width, width_specifier, left_align ;
  49. char c, *strptr, istr [5], lead_char, sign_char ;
  50. va_start (ap, format) ;
  51. while ((c = *format++))
  52. { if (c != '%')
  53. { log_putchar (psf, c) ;
  54. continue ;
  55. } ;
  56. if (format [0] == '%') /* Handle %% */
  57. {  log_putchar (psf, '%') ;
  58. format ++ ;
  59. continue ;
  60. } ;
  61. sign_char = 0 ;
  62. left_align = SF_FALSE ;
  63. while (1)
  64. { switch (format [0])
  65. { case ' ' :
  66. case '+' :
  67. sign_char = format [0] ;
  68. format ++ ;
  69. continue ;
  70. case '-' :
  71. left_align = SF_TRUE ;
  72. format ++ ;
  73. continue ;
  74. default : break ;
  75. } ;
  76. break ;
  77. } ;
  78. if (format [0] == 0)
  79. break ;
  80. lead_char = ' ' ;
  81. if (format [0] == '0')
  82. lead_char = '0' ;
  83. width_specifier = 0 ;
  84. while ((c = *format++) && isdigit (c))
  85. width_specifier = width_specifier * 10 + (c - '0') ;
  86. switch (c)
  87. { case 0 : /* NULL character. */
  88. va_end (ap) ;
  89. return ;
  90. case 's': /* string */
  91. strptr = va_arg (ap, char *) ;
  92. if (strptr == NULL)
  93. break ;
  94. width_specifier -= strlen (strptr) ;
  95. if (left_align == SF_FALSE)
  96. while (width_specifier -- > 0)
  97. log_putchar (psf, ' ') ;
  98. while (*strptr)
  99. log_putchar (psf, *strptr++) ;
  100. while (width_specifier -- > 0)
  101. log_putchar (psf, ' ') ;
  102. break ;
  103. case 'd': /* int */
  104. d = va_arg (ap, int) ;
  105. if (d < 0)
  106. { d = -d ;
  107. sign_char = '-' ;
  108. if (lead_char != '0' && left_align == SF_FALSE)
  109. width_specifier -- ;
  110. } ;
  111. tens = 1 ;
  112. width = 1 ;
  113. while (d / tens >= 10)
  114. { tens *= 10 ;
  115. width ++ ;
  116. } ;
  117. width_specifier -= width ;
  118. if (sign_char == ' ')
  119. { log_putchar (psf, ' ') ;
  120. width_specifier -- ;
  121. } ;
  122. if (left_align == SF_FALSE && lead_char != '0')
  123. { if (sign_char == '+')
  124. width_specifier -- ;
  125. while (width_specifier -- > 0)
  126. log_putchar (psf, lead_char) ;
  127. } ;
  128. if (sign_char == '+' || sign_char == '-')
  129. { log_putchar (psf, sign_char) ;
  130. width_specifier -- ;
  131. } ;
  132. if (left_align == SF_FALSE)
  133. while (width_specifier -- > 0)
  134. log_putchar (psf, lead_char) ;
  135. while (tens > 0)
  136. { log_putchar (psf, '0' + d / tens) ;
  137. d %= tens ;
  138. tens /= 10 ;
  139. } ;
  140. while (width_specifier -- > 0)
  141. log_putchar (psf, lead_char) ;
  142. break ;
  143. case 'D': /* sf_count_t */
  144. { sf_count_t D, Tens ;
  145. D = va_arg (ap, sf_count_t) ;
  146. if (D == 0)
  147. { while (-- width_specifier > 0)
  148. log_putchar (psf, lead_char) ;
  149. log_putchar (psf, '0') ;
  150. break ;
  151. }
  152. if (D < 0)
  153. { log_putchar (psf, '-') ;
  154. D = -D ;
  155. } ;
  156. Tens = 1 ;
  157. width = 1 ;
  158. while (D / Tens >= 10)
  159. { Tens *= 10 ;
  160. width ++ ;
  161. } ;
  162. while (width_specifier > width)
  163. { log_putchar (psf, lead_char) ;
  164. width_specifier-- ;
  165. } ;
  166. while (Tens > 0)
  167. { log_putchar (psf, '0' + D / Tens) ;
  168. D %= Tens ;
  169. Tens /= 10 ;
  170. } ;
  171. } ;
  172. break ;
  173. case 'u': /* unsigned int */
  174. u = va_arg (ap, unsigned int) ;
  175. tens = 1 ;
  176. width = 1 ;
  177. while (u / tens >= 10)
  178. { tens *= 10 ;
  179. width ++ ;
  180. } ;
  181. width_specifier -= width ;
  182. if (sign_char == ' ')
  183. { log_putchar (psf, ' ') ;
  184. width_specifier -- ;
  185. } ;
  186. if (left_align == SF_FALSE && lead_char != '0')
  187. { if (sign_char == '+')
  188. width_specifier -- ;
  189. while (width_specifier -- > 0)
  190. log_putchar (psf, lead_char) ;
  191. } ;
  192. if (sign_char == '+' || sign_char == '-')
  193. { log_putchar (psf, sign_char) ;
  194. width_specifier -- ;
  195. } ;
  196. if (left_align == SF_FALSE)
  197. while (width_specifier -- > 0)
  198. log_putchar (psf, lead_char) ;
  199. while (tens > 0)
  200. { log_putchar (psf, '0' + u / tens) ;
  201. u %= tens ;
  202. tens /= 10 ;
  203. } ;
  204. while (width_specifier -- > 0)
  205. log_putchar (psf, lead_char) ;
  206. break ;
  207. case 'c': /* char */
  208. c = va_arg (ap, int) & 0xFF ;
  209. log_putchar (psf, c) ;
  210. break ;
  211. case 'x': /* hex */
  212. case 'X': /* hex */
  213. d = va_arg (ap, int) ;
  214. if (d == 0)
  215. { while (--width_specifier > 0)
  216. log_putchar (psf, lead_char) ;
  217. log_putchar (psf, '0') ;
  218. break ;
  219. } ;
  220. shift = 28 ;
  221. width = (width_specifier < 8) ? 8 : width_specifier ;
  222. while (! ((0xF << shift) & d))
  223. { shift -= 4 ;
  224. width -- ;
  225. } ;
  226. while (width > 0 && width_specifier > width)
  227. { log_putchar (psf, lead_char) ;
  228. width_specifier-- ;
  229. } ;
  230. while (shift >= 0)
  231. { c = (d >> shift) & 0xF ;
  232. log_putchar (psf, (c > 9) ? c + 'A' - 10 : c + '0') ;
  233. shift -= 4 ;
  234. } ;
  235. break ;
  236. case 'M': /* int2str */
  237. d = va_arg (ap, int) ;
  238. if (CPU_IS_LITTLE_ENDIAN)
  239. { istr [0] = d & 0xFF ;
  240. istr [1] = (d >> 8) & 0xFF ;
  241. istr [2] = (d >> 16) & 0xFF ;
  242. istr [3] = (d >> 24) & 0xFF ;
  243. }
  244. else
  245. { istr [3] = d & 0xFF ;
  246. istr [2] = (d >> 8) & 0xFF ;
  247. istr [1] = (d >> 16) & 0xFF ;
  248. istr [0] = (d >> 24) & 0xFF ;
  249. } ;
  250. istr [4] = 0 ;
  251. strptr = istr ;
  252. while (*strptr)
  253. { c = *strptr++ ;
  254. log_putchar (psf, c) ;
  255. } ;
  256. break ;
  257. default :
  258. log_putchar (psf, '*') ;
  259. log_putchar (psf, c) ;
  260. log_putchar (psf, '*') ;
  261. break ;
  262. } /* switch */
  263. } /* while */
  264. va_end (ap) ;
  265. return ;
  266. } /* psf_log_printf */
  267. /*-----------------------------------------------------------------------------------------------
  268. **  ASCII header printf functions.
  269. **  Some formats (ie NIST) use ascii text in their headers.
  270. **  Format specifiers are the same as the standard printf specifiers (uses vsnprintf).
  271. **  If this generates a compile error on any system, the author should be notified
  272. **  so an alternative vsnprintf can be provided.
  273. */
  274. void
  275. psf_asciiheader_printf (SF_PRIVATE *psf, const char *format, ...)
  276. { va_list argptr ;
  277. int maxlen ;
  278. char *start ;
  279. maxlen = strlen ((char*) psf->header) ;
  280. start = ((char*) psf->header) + maxlen ;
  281. maxlen = sizeof (psf->header) - maxlen ;
  282. va_start (argptr, format) ;
  283. vsnprintf (start, maxlen, format, argptr) ;
  284. va_end (argptr) ;
  285. /* Make sure the string is properly terminated. */
  286. start [maxlen - 1] = 0 ;
  287. psf->headindex = strlen ((char*) psf->header) ;
  288. return ;
  289. } /* psf_asciiheader_printf */
  290. /*-----------------------------------------------------------------------------------------------
  291. **  Binary header writing functions. Returns number of bytes written.
  292. **
  293. **  Format specifiers for psf_binheader_writef are as follows
  294. ** m - marker - four bytes - no endian manipulation
  295. **
  296. ** e   - all following numerical values will be little endian
  297. ** E   - all following numerical values will be big endian
  298. **
  299. ** t   - all following O types will be truncated to 4 bytes
  300. ** T   - switch off truncation of all following O types
  301. **
  302. ** 1 - single byte value
  303. ** 2 - two byte value
  304. ** 3 - three byte value
  305. ** 4 - four byte value
  306. ** 8 - eight byte value (sometimes written as 4 bytes)
  307. **
  308. ** s   - string preceded by a four byte length
  309. ** S   - string including null terminator
  310. ** f - floating point data
  311. ** d - double precision floating point data
  312. ** h - 16 binary bytes value
  313. **
  314. ** b - binary data (see below)
  315. ** z   - zero bytes (ses below)
  316. ** j - jump forwards or backwards
  317. **
  318. ** To write a word followed by an int (both little endian) use:
  319. ** psf_binheader_writef ("e24", wordval, longval) ;
  320. **
  321. ** To write binary data use:
  322. ** psf_binheader_writef ("b", &bindata, sizeof (bindata)) ;
  323. **
  324. ** To write N zero bytes use:
  325. ** NOTE: due to platform issues (ie x86-64) you should cast the
  326. ** argument to size_t or ensure the variable type is size_t.
  327. ** psf_binheader_writef ("z", N) ;
  328. */
  329. /* These macros may seem a bit messy but do prevent problems with processors which
  330. ** seg. fault when asked to write an int or short to a non-int/short aligned address.
  331. */
  332. static inline void
  333. header_put_byte (SF_PRIVATE *psf, char x)
  334. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 1)
  335. psf->header [psf->headindex++] = x ;
  336. } /* header_put_byte */
  337. #if (CPU_IS_BIG_ENDIAN == 1)
  338. static inline void
  339. header_put_marker (SF_PRIVATE *psf, int x)
  340. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 4)
  341. { psf->header [psf->headindex++] = (x >> 24) ;
  342. psf->header [psf->headindex++] = (x >> 16) ;
  343. psf->header [psf->headindex++] = (x >> 8) ;
  344. psf->header [psf->headindex++] = x ;
  345. } ;
  346. } /* header_put_marker */
  347. #elif (CPU_IS_LITTLE_ENDIAN == 1)
  348. static inline void
  349. header_put_marker (SF_PRIVATE *psf, int x)
  350. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 4)
  351. { psf->header [psf->headindex++] = x ;
  352. psf->header [psf->headindex++] = (x >> 8) ;
  353. psf->header [psf->headindex++] = (x >> 16) ;
  354. psf->header [psf->headindex++] = (x >> 24) ;
  355. } ;
  356. } /* header_put_marker */
  357. #else
  358. # error "Cannot determine endian-ness of processor."
  359. #endif
  360. static inline void
  361. header_put_be_short (SF_PRIVATE *psf, int x)
  362. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 2)
  363. { psf->header [psf->headindex++] = (x >> 8) ;
  364. psf->header [psf->headindex++] = x ;
  365. } ;
  366. } /* header_put_be_short */
  367. static inline void
  368. header_put_le_short (SF_PRIVATE *psf, int x)
  369. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 2)
  370. { psf->header [psf->headindex++] = x ;
  371. psf->header [psf->headindex++] = (x >> 8) ;
  372. } ;
  373. } /* header_put_le_short */
  374. static inline void
  375. header_put_be_3byte (SF_PRIVATE *psf, int x)
  376. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 3)
  377. { psf->header [psf->headindex++] = (x >> 16) ;
  378. psf->header [psf->headindex++] = (x >> 8) ;
  379. psf->header [psf->headindex++] = x ;
  380. } ;
  381. } /* header_put_be_3byte */
  382. static inline void
  383. header_put_le_3byte (SF_PRIVATE *psf, int x)
  384. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 3)
  385. { psf->header [psf->headindex++] = x ;
  386. psf->header [psf->headindex++] = (x >> 8) ;
  387. psf->header [psf->headindex++] = (x >> 16) ;
  388. } ;
  389. } /* header_put_le_3byte */
  390. static inline void
  391. header_put_be_int (SF_PRIVATE *psf, int x)
  392. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 4)
  393. { psf->header [psf->headindex++] = (x >> 24) ;
  394. psf->header [psf->headindex++] = (x >> 16) ;
  395. psf->header [psf->headindex++] = (x >> 8) ;
  396. psf->header [psf->headindex++] = x ;
  397. } ;
  398. } /* header_put_be_int */
  399. static inline void
  400. header_put_le_int (SF_PRIVATE *psf, int x)
  401. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 4)
  402. { psf->header [psf->headindex++] = x ;
  403. psf->header [psf->headindex++] = (x >> 8) ;
  404. psf->header [psf->headindex++] = (x >> 16) ;
  405. psf->header [psf->headindex++] = (x >> 24) ;
  406. } ;
  407. } /* header_put_le_int */
  408. #if (SIZEOF_SF_COUNT_T == 4)
  409. static inline void
  410. header_put_be_8byte (SF_PRIVATE *psf, sf_count_t x)
  411. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 8)
  412. { psf->header [psf->headindex++] = 0 ;
  413. psf->header [psf->headindex++] = 0 ;
  414. psf->header [psf->headindex++] = 0 ;
  415. psf->header [psf->headindex++] = 0 ;
  416. psf->header [psf->headindex++] = (x >> 24) ;
  417. psf->header [psf->headindex++] = (x >> 16) ;
  418. psf->header [psf->headindex++] = (x >> 8) ;
  419. psf->header [psf->headindex++] = x ;
  420. } ;
  421. } /* header_put_be_8byte */
  422. static inline void
  423. header_put_le_8byte (SF_PRIVATE *psf, sf_count_t x)
  424. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 8)
  425. { psf->header [psf->headindex++] = x ;
  426. psf->header [psf->headindex++] = (x >> 8) ;
  427. psf->header [psf->headindex++] = (x >> 16) ;
  428. psf->header [psf->headindex++] = (x >> 24) ;
  429. psf->header [psf->headindex++] = 0 ;
  430. psf->header [psf->headindex++] = 0 ;
  431. psf->header [psf->headindex++] = 0 ;
  432. psf->header [psf->headindex++] = 0 ;
  433. } ;
  434. } /* header_put_le_8byte */
  435. #elif (SIZEOF_SF_COUNT_T == 8)
  436. static inline void
  437. header_put_be_8byte (SF_PRIVATE *psf, sf_count_t x)
  438. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 8)
  439. { psf->header [psf->headindex++] = (x >> 56) ;
  440. psf->header [psf->headindex++] = (x >> 48) ;
  441. psf->header [psf->headindex++] = (x >> 40) ;
  442. psf->header [psf->headindex++] = (x >> 32) ;
  443. psf->header [psf->headindex++] = (x >> 24) ;
  444. psf->header [psf->headindex++] = (x >> 16) ;
  445. psf->header [psf->headindex++] = (x >> 8) ;
  446. psf->header [psf->headindex++] = x ;
  447. } ;
  448. } /* header_put_be_8byte */
  449. static inline void
  450. header_put_le_8byte (SF_PRIVATE *psf, sf_count_t x)
  451. { if (psf->headindex < SIGNED_SIZEOF (psf->header) - 8)
  452. { psf->header [psf->headindex++] = x ;
  453. psf->header [psf->headindex++] = (x >> 8) ;
  454. psf->header [psf->headindex++] = (x >> 16) ;
  455. psf->header [psf->headindex++] = (x >> 24) ;
  456. psf->header [psf->headindex++] = (x >> 32) ;
  457. psf->header [psf->headindex++] = (x >> 40) ;
  458. psf->header [psf->headindex++] = (x >> 48) ;
  459. psf->header [psf->headindex++] = (x >> 56) ;
  460. } ;
  461. } /* header_put_le_8byte */
  462. #else
  463. #error "SIZEOF_SF_COUNT_T is not defined."
  464. #endif
  465. int
  466. psf_binheader_writef (SF_PRIVATE *psf, const char *format, ...)
  467. { va_list argptr ;
  468. sf_count_t  countdata ;
  469. unsigned long  longdata ;
  470. unsigned int  data ;
  471. float floatdata ;
  472. double doubledata ;
  473. void *bindata ;
  474. size_t size ;
  475. char c, *strptr ;
  476. int count = 0, trunc_8to4 ;
  477. trunc_8to4 = SF_FALSE ;
  478. va_start (argptr, format) ;
  479. while ((c = *format++))
  480. { switch (c)
  481. { case ' ' : /* Do nothing. Just used to space out format string. */
  482. break ;
  483. case 'e' : /* All conversions are now from LE to host. */
  484. psf->rwf_endian = SF_ENDIAN_LITTLE ;
  485. break ;
  486. case 'E' : /* All conversions are now from BE to host. */
  487. psf->rwf_endian = SF_ENDIAN_BIG ;
  488. break ;
  489. case 't' : /* All 8 byte values now get written as 4 bytes. */
  490. trunc_8to4 = SF_TRUE ;
  491. break ;
  492. case 'T' : /* All 8 byte values now get written as 8 bytes. */
  493. trunc_8to4 = SF_FALSE ;
  494. break ;
  495. case 'm' :
  496. data = va_arg (argptr, unsigned int) ;
  497. header_put_marker (psf, data) ;
  498. count += 4 ;
  499. break ;
  500. case '1' :
  501. data = va_arg (argptr, unsigned int) ;
  502. header_put_byte (psf, data) ;
  503. count += 1 ;
  504. break ;
  505. case '2' :
  506. data = va_arg (argptr, unsigned int) ;
  507. if (psf->rwf_endian == SF_ENDIAN_BIG)
  508. { header_put_be_short (psf, data) ;
  509. }
  510. else
  511. { header_put_le_short (psf, data) ;
  512. } ;
  513. count += 2 ;
  514. break ;
  515. case '3' : /* tribyte */
  516. data = va_arg (argptr, unsigned int) ;
  517. if (psf->rwf_endian == SF_ENDIAN_BIG)
  518. { header_put_be_3byte (psf, data) ;
  519. }
  520. else
  521. { header_put_le_3byte (psf, data) ;
  522. } ;
  523. count += 3 ;
  524. break ;
  525. case '4' :
  526. data = va_arg (argptr, unsigned int) ;
  527. if (psf->rwf_endian == SF_ENDIAN_BIG)
  528. { header_put_be_int (psf, data) ;
  529. }
  530. else
  531. { header_put_le_int (psf, data) ;
  532. } ;
  533. count += 4 ;
  534. break ;
  535. case '8' :
  536. countdata = va_arg (argptr, sf_count_t) ;
  537. if (psf->rwf_endian == SF_ENDIAN_BIG && trunc_8to4 == SF_FALSE)
  538. { header_put_be_8byte (psf, countdata) ;
  539. count += 8 ;
  540. }
  541. else if (psf->rwf_endian == SF_ENDIAN_LITTLE && trunc_8to4 == SF_FALSE)
  542. { header_put_le_8byte (psf, countdata) ;
  543. count += 8 ;
  544. }
  545. else if (psf->rwf_endian == SF_ENDIAN_BIG && trunc_8to4 == SF_TRUE)
  546. { longdata = countdata & 0xFFFFFFFF ;
  547. header_put_be_int (psf, longdata) ;
  548. count += 4 ;
  549. }
  550. else if (psf->rwf_endian == SF_ENDIAN_LITTLE && trunc_8to4 == SF_TRUE)
  551. { longdata = countdata & 0xFFFFFFFF ;
  552. header_put_le_int (psf, longdata) ;
  553. count += 4 ;
  554. }
  555. break ;
  556. case 'f' :
  557. /* Floats are passed as doubles. Is this always true? */
  558. floatdata = (float) va_arg (argptr, double) ;
  559. if (psf->rwf_endian == SF_ENDIAN_BIG)
  560. float32_be_write (floatdata, psf->header + psf->headindex) ;
  561. else
  562. float32_le_write (floatdata, psf->header + psf->headindex) ;
  563. psf->headindex += 4 ;
  564. count += 4 ;
  565. break ;
  566. case 'd' :
  567. doubledata = va_arg (argptr, double) ;
  568. if (psf->rwf_endian == SF_ENDIAN_BIG)
  569. double64_be_write (doubledata, psf->header + psf->headindex) ;
  570. else
  571. double64_le_write (doubledata, psf->header + psf->headindex) ;
  572. psf->headindex += 8 ;
  573. count += 8 ;
  574. break ;
  575. case 's' :
  576. /* Write a C string (guaranteed to have a zero terminator). */
  577. strptr = va_arg (argptr, char *) ;
  578. size = strlen (strptr) + 1 ;
  579. size += (size & 1) ;
  580. if (psf->rwf_endian == SF_ENDIAN_BIG)
  581. header_put_be_int (psf, size) ;
  582. else
  583. header_put_le_int (psf, size) ;
  584. memcpy (&(psf->header [psf->headindex]), strptr, size) ;
  585. psf->headindex += size ;
  586. psf->header [psf->headindex - 1] = 0 ;
  587. count += 4 + size ;
  588. break ;
  589. case 'S' :
  590. /*
  591. ** Write an AIFF style string (no zero terminator but possibly
  592. ** an extra pad byte if the string length is odd).
  593. */
  594. strptr = va_arg (argptr, char *) ;
  595. size = strlen (strptr) ;
  596. if (psf->rwf_endian == SF_ENDIAN_BIG)
  597. header_put_be_int (psf, size) ;
  598. else
  599. header_put_le_int (psf, size) ;
  600. memcpy (&(psf->header [psf->headindex]), strptr, size + 1) ;
  601. size += (size & 1) ;
  602. psf->headindex += size ;
  603. psf->header [psf->headindex] = 0 ;
  604. count += 4 + size ;
  605. break ;
  606. case 'b' :
  607. bindata = va_arg (argptr, void *) ;
  608. size = va_arg (argptr, size_t) ;
  609. memcpy (&(psf->header [psf->headindex]), bindata, size) ;
  610. psf->headindex += size ;
  611. count += size ;
  612. break ;
  613. case 'z' :
  614. size = va_arg (argptr, size_t) ;
  615. count += size ;
  616. while (size)
  617. { psf->header [psf->headindex] = 0 ;
  618. psf->headindex ++ ;
  619. size -- ;
  620. } ;
  621. break ;
  622. case 'h' :
  623. bindata = va_arg (argptr, void *) ;
  624. memcpy (&(psf->header [psf->headindex]), bindata, 16) ;
  625. psf->headindex += 16 ;
  626. count += 16 ;
  627. break ;
  628. case 'j' :
  629. size = va_arg (argptr, size_t) ;
  630. psf->headindex += size ;
  631. count = size ;
  632. break ;
  633. default :
  634. psf_log_printf (psf, "*** Invalid format specifier `%c'n", c) ;
  635. psf->error = SFE_INTERNAL ;
  636. break ;
  637. } ;
  638. } ;
  639. va_end (argptr) ;
  640. return count ;
  641. } /* psf_binheader_writef */
  642. /*-----------------------------------------------------------------------------------------------
  643. **  Binary header reading functions. Returns number of bytes read.
  644. **
  645. ** Format specifiers are the same as for header write function above with the following
  646. ** additions:
  647. **
  648. ** p   - jump a given number of position from start of file.
  649. **
  650. ** If format is NULL, psf_binheader_readf returns the current offset.
  651. */
  652. #if (CPU_IS_BIG_ENDIAN == 1)
  653. #define GET_MARKER(ptr) ( ((ptr) [0] << 24) | ((ptr) [1] << 16) |
  654. ((ptr) [2] << 8) | ((ptr) [3]) )
  655. #elif (CPU_IS_LITTLE_ENDIAN == 1)
  656. #define GET_MARKER(ptr) ( ((ptr) [0]) | ((ptr) [1] << 8) |
  657. ((ptr) [2] << 16) | ((ptr) [3] << 24) )
  658. #else
  659. # error "Cannot determine endian-ness of processor."
  660. #endif
  661. #define GET_LE_SHORT(ptr) ( ((ptr) [1] << 8) | ((ptr) [0]) )
  662. #define GET_BE_SHORT(ptr) ( ((ptr) [0] << 8) | ((ptr) [1]) )
  663. #define GET_LE_3BYTE(ptr) (  ((ptr) [2] << 16) | ((ptr) [1] << 8) | ((ptr) [0]) )
  664. #define GET_BE_3BYTE(ptr) (  ((ptr) [0] << 16) | ((ptr) [1] << 8) | ((ptr) [2]) )
  665. #define GET_LE_INT(ptr) (  ((ptr) [3] << 24) | ((ptr) [2] << 16) |
  666. ((ptr) [1] << 8) | ((ptr) [0]) )
  667. #define GET_BE_INT(ptr) (  ((ptr) [0] << 24) | ((ptr) [1] << 16) |
  668.   ((ptr) [2] << 8) | ((ptr) [3]) )
  669. #define GET_LE_8BYTE(ptr) (  (((sf_count_t) (ptr) [7]) << 56) | (((sf_count_t) (ptr) [6]) << 48) |
  670.   (((sf_count_t) (ptr) [5]) << 40) | (((sf_count_t) (ptr) [4]) << 32) |
  671.   (((sf_count_t) (ptr) [3]) << 24) | (((sf_count_t) (ptr) [2]) << 16) |
  672.   (((sf_count_t) (ptr) [1]) << 8 ) | ((ptr) [0]))
  673. #define GET_BE_8BYTE(ptr) (  (((sf_count_t) (ptr) [0]) << 56) | (((sf_count_t) (ptr) [1]) << 48) |
  674.   (((sf_count_t) (ptr) [2]) << 40) | (((sf_count_t) (ptr) [3]) << 32) |
  675.   (((sf_count_t) (ptr) [4]) << 24) | (((sf_count_t) (ptr) [5]) << 16) |
  676.   (((sf_count_t) (ptr) [6]) << 8 ) | ((ptr) [7]))
  677. static int
  678. header_read (SF_PRIVATE *psf, void *ptr, int bytes)
  679. { int count = 0 ;
  680. if (psf->headindex >= SIGNED_SIZEOF (psf->header))
  681. { memset (ptr, 0, SIGNED_SIZEOF (psf->header) - psf->headindex) ;
  682. /* This is the best that we can do. */
  683. psf_fseek (psf, bytes, SEEK_CUR) ;
  684. return bytes ;
  685. } ;
  686. if (psf->headindex + bytes > SIGNED_SIZEOF (psf->header))
  687. { int most ;
  688. most = SIGNED_SIZEOF (psf->header) - psf->headindex ;
  689. psf_fread (psf->header + psf->headend, 1, most, psf) ;
  690. memset ((char *) ptr + most, 0, bytes - most) ;
  691. psf_fseek (psf, bytes - most, SEEK_CUR) ;
  692. return bytes ;
  693. } ;
  694. if (psf->headindex + bytes > psf->headend)
  695. { count = psf_fread (psf->header + psf->headend, 1, bytes - (psf->headend - psf->headindex), psf) ;
  696. if (count != bytes - (int) (psf->headend - psf->headindex))
  697. { psf_log_printf (psf, "Error : psf_fread returned short count.n") ;
  698. return 0 ;
  699. } ;
  700. psf->headend += count ;
  701. } ;
  702. memcpy (ptr, psf->header + psf->headindex, bytes) ;
  703. psf->headindex += bytes ;
  704. return bytes ;
  705. } /* header_read */
  706. static void
  707. header_seek (SF_PRIVATE *psf, sf_count_t position, int whence)
  708. {
  709. switch (whence)
  710. { case SEEK_SET :
  711. if (position > SIGNED_SIZEOF (psf->header))
  712. { /* Too much header to cache so just seek instead. */
  713. psf_fseek (psf, position, whence) ;
  714. return ;
  715. } ;
  716. if (position > psf->headend)
  717. psf->headend += psf_fread (psf->header + psf->headend, 1, position - psf->headend, psf) ;
  718. psf->headindex = position ;
  719. break ;
  720. case SEEK_CUR :
  721. if (psf->headindex + position < 0)
  722. break ;
  723. if (psf->headindex >= SIGNED_SIZEOF (psf->header))
  724. { psf_fseek (psf, position, whence) ;
  725. return ;
  726. } ;
  727. if (psf->headindex + position <= psf->headend)
  728. { psf->headindex += position ;
  729. break ;
  730. } ;
  731. if (psf->headindex + position > SIGNED_SIZEOF (psf->header))
  732. { /* Need to jump this without caching it. */
  733. psf->headindex = psf->headend ;
  734. psf_fseek (psf, position, SEEK_CUR) ;
  735. break ;
  736. } ;
  737. psf->headend += psf_fread (psf->header + psf->headend, 1, position - (psf->headend - psf->headindex), psf) ;
  738. psf->headindex = psf->headend ;
  739. break ;
  740. case SEEK_END :
  741. default :
  742. psf_log_printf (psf, "Bad whence param in header_seek().n") ;
  743. break ;
  744. } ;
  745. return ;
  746. } /* header_seek */
  747. static int
  748. header_gets (SF_PRIVATE *psf, char *ptr, int bufsize)
  749. {
  750. int k ;
  751. for (k = 0 ; k < bufsize - 1 ; k++)
  752. { if (psf->headindex < psf->headend)
  753. { ptr [k] = psf->header [psf->headindex] ;
  754. psf->headindex ++ ;
  755. }
  756. else
  757. { psf->headend += psf_fread (psf->header + psf->headend, 1, 1, psf) ;
  758. ptr [k] = psf->header [psf->headindex] ;
  759. psf->headindex = psf->headend ;
  760. } ;
  761. if (ptr [k] == 'n')
  762. break ;
  763. } ;
  764. ptr [k] = 0 ;
  765. return k ;
  766. } /* header_gets */
  767. int
  768. psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
  769. { va_list argptr ;
  770. sf_count_t *countptr, countdata ;
  771. unsigned char *ucptr, sixteen_bytes [16] ;
  772. unsigned int  *intptr, intdata ;
  773. unsigned short *shortptr ;
  774. char *charptr ;
  775. float *floatptr ;
  776. double *doubleptr ;
  777. char c ;
  778. int byte_count = 0, count ;
  779. if (! format)
  780. return psf_ftell (psf) ;
  781. va_start (argptr, format) ;
  782. while ((c = *format++))
  783. { switch (c)
  784. { case 'e' : /* All conversions are now from LE to host. */
  785. psf->rwf_endian = SF_ENDIAN_LITTLE ;
  786. break ;
  787. case 'E' : /* All conversions are now from BE to host. */
  788. psf->rwf_endian = SF_ENDIAN_BIG ;
  789. break ;
  790. case 'm' :
  791. intptr = va_arg (argptr, unsigned int*) ;
  792. ucptr = (unsigned char*) intptr ;
  793. byte_count += header_read (psf, ucptr, sizeof (int)) ;
  794. *intptr = GET_MARKER (ucptr) ;
  795. break ;
  796. case 'h' :
  797. intptr = va_arg (argptr, unsigned int*) ;
  798. ucptr = (unsigned char*) intptr ;
  799. byte_count += header_read (psf, sixteen_bytes, sizeof (sixteen_bytes)) ;
  800. { int k ;
  801. intdata = 0 ;
  802. for (k = 0 ; k < 16 ; k++)
  803. intdata ^= sixteen_bytes [k] << k ;
  804. }
  805. *intptr = intdata ;
  806. break ;
  807. case '1' :
  808. charptr = va_arg (argptr, char*) ;
  809. *charptr = 0 ;
  810. byte_count += header_read (psf, charptr, sizeof (char)) ;
  811. break ;
  812. case '2' :
  813. shortptr = va_arg (argptr, unsigned short*) ;
  814. *shortptr = 0 ;
  815. ucptr = (unsigned char*) shortptr ;
  816. byte_count += header_read (psf, ucptr, sizeof (short)) ;
  817. if (psf->rwf_endian == SF_ENDIAN_BIG)
  818. *shortptr = GET_BE_SHORT (ucptr) ;
  819. else
  820. *shortptr = GET_LE_SHORT (ucptr) ;
  821. break ;
  822. case '3' :
  823. intptr = va_arg (argptr, unsigned int*) ;
  824. *intptr = 0 ;
  825. byte_count += header_read (psf, sixteen_bytes, 3) ;
  826. if (psf->rwf_endian == SF_ENDIAN_BIG)
  827. *intptr = GET_BE_3BYTE (sixteen_bytes) ;
  828. else
  829. *intptr = GET_LE_3BYTE (sixteen_bytes) ;
  830. break ;
  831. case '4' :
  832. intptr = va_arg (argptr, unsigned int*) ;
  833. *intptr = 0 ;
  834. ucptr = (unsigned char*) intptr ;
  835. byte_count += header_read (psf, ucptr, sizeof (int)) ;
  836. if (psf->rwf_endian == SF_ENDIAN_BIG)
  837. *intptr = GET_BE_INT (ucptr) ;
  838. else
  839. *intptr = GET_LE_INT (ucptr) ;
  840. break ;
  841. case '8' :
  842. countptr = va_arg (argptr, sf_count_t *) ;
  843. *countptr = 0 ;
  844. byte_count += header_read (psf, sixteen_bytes, 8) ;
  845. if (psf->rwf_endian == SF_ENDIAN_BIG)
  846. countdata = GET_BE_8BYTE (sixteen_bytes) ;
  847. else
  848. countdata = GET_LE_8BYTE (sixteen_bytes) ;
  849. *countptr = countdata ;
  850. break ;
  851. case 'f' : /* Float conversion */
  852. floatptr = va_arg (argptr, float *) ;
  853. *floatptr = 0.0 ;
  854. byte_count += header_read (psf, floatptr, sizeof (float)) ;
  855. if (psf->rwf_endian == SF_ENDIAN_BIG)
  856. *floatptr = float32_be_read ((unsigned char*) floatptr) ;
  857. else
  858. *floatptr = float32_le_read ((unsigned char*) floatptr) ;
  859. break ;
  860. case 'd' : /* double conversion */
  861. doubleptr = va_arg (argptr, double *) ;
  862. *doubleptr = 0.0 ;
  863. byte_count += header_read (psf, doubleptr, sizeof (double)) ;
  864. if (psf->rwf_endian == SF_ENDIAN_BIG)
  865. *doubleptr = double64_be_read ((unsigned char*) doubleptr) ;
  866. else
  867. *doubleptr = double64_le_read ((unsigned char*) doubleptr) ;
  868. break ;
  869. case 's' :
  870. psf_log_printf (psf, "Format conversion 's' not implemented yet.n") ;
  871. /*
  872. strptr = va_arg (argptr, char *) ;
  873. size   = strlen (strptr) + 1 ;
  874. size  += (size & 1) ;
  875. longdata = H2LE_INT (size) ;
  876. get_int (psf, longdata) ;
  877. memcpy (&(psf->header [psf->headindex]), strptr, size) ;
  878. psf->headindex += size ;
  879. */
  880. break ;
  881. case 'b' :
  882. charptr = va_arg (argptr, char*) ;
  883. count = va_arg (argptr, int) ;
  884. if (count > 0)
  885. byte_count += header_read (psf, charptr, count) ;
  886. break ;
  887. case 'G' :
  888. charptr = va_arg (argptr, char*) ;
  889. count = va_arg (argptr, int) ;
  890. if (count > 0)
  891. byte_count += header_gets (psf, charptr, count) ;
  892. break ;
  893. case 'z' :
  894. psf_log_printf (psf, "Format conversion 'z' not implemented yet.n") ;
  895. /*
  896. size    = va_arg (argptr, size_t) ;
  897. while (size)
  898. { psf->header [psf->headindex] = 0 ;
  899. psf->headindex ++ ;
  900. size -- ;
  901. } ;
  902. */
  903. break ;
  904. case 'p' :
  905. /* Get the seek position first. */
  906. count = va_arg (argptr, int) ;
  907. header_seek (psf, count, SEEK_SET) ;
  908. byte_count = count ;
  909. break ;
  910. case 'j' :
  911. /* Get the seek position first. */
  912. count = va_arg (argptr, int) ;
  913. header_seek (psf, count, SEEK_CUR) ;
  914. byte_count += count ;
  915. break ;
  916. default :
  917. psf_log_printf (psf, "*** Invalid format specifier `%c'n", c) ;
  918. psf->error = SFE_INTERNAL ;
  919. break ;
  920. } ;
  921. } ;
  922. va_end (argptr) ;
  923. return byte_count ;
  924. } /* psf_binheader_readf */
  925. /*-----------------------------------------------------------------------------------------------
  926. */
  927. sf_count_t
  928. psf_default_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t samples_from_start)
  929. { sf_count_t position, retval ;
  930. if (! (psf->blockwidth && psf->dataoffset >= 0))
  931. { psf->error = SFE_BAD_SEEK ;
  932. return PSF_SEEK_ERROR ;
  933. } ;
  934. if (! psf->sf.seekable)
  935. { psf->error = SFE_NOT_SEEKABLE ;
  936. return PSF_SEEK_ERROR ;
  937. } ;
  938. position = psf->dataoffset + psf->blockwidth * samples_from_start ;
  939. if ((retval = psf_fseek (psf, position, SEEK_SET)) != position)
  940. { psf->error = SFE_SEEK_FAILED ;
  941. return PSF_SEEK_ERROR ;
  942. } ;
  943. return samples_from_start ;
  944. } /* psf_default_seek */
  945. /*-----------------------------------------------------------------------------------------------
  946. */
  947. void
  948. psf_hexdump (const void *ptr, int len)
  949. { const char *data ;
  950. char ascii [17] ;
  951. int k, m ;
  952. if ((data = ptr) == NULL)
  953. return ;
  954. if (len <= 0)
  955. return ;
  956. puts ("") ;
  957. for (k = 0 ; k < len ; k += 16)
  958. { memset (ascii, ' ', sizeof (ascii)) ;
  959. printf ("%08X: ", k) ;
  960. for (m = 0 ; m < 16 && k + m < len ; m++)
  961. { printf (m == 8 ? " %02X " : "%02X ", data [k + m] & 0xFF) ;
  962. ascii [m] = psf_isprint (data [k + m]) ? data [k + m] : '.' ;
  963. } ;
  964. if (m <= 8) printf (" ") ;
  965. for ( ; m < 16 ; m++) printf ("   ") ;
  966. ascii [16] = 0 ;
  967. printf (" %sn", ascii) ;
  968. } ;
  969. puts ("") ;
  970. } /* psf_hexdump */
  971. void
  972. psf_log_SF_INFO (SF_PRIVATE *psf)
  973. { psf_log_printf (psf, "---------------------------------n") ;
  974. psf_log_printf (psf, " Sample rate :   %dn", psf->sf.samplerate) ;
  975. psf_log_printf (psf, " Frames      :   %Dn", psf->sf.frames) ;
  976. psf_log_printf (psf, " Channels    :   %dn", psf->sf.channels) ;
  977. psf_log_printf (psf, " Format      :   0x%Xn", psf->sf.format) ;
  978. psf_log_printf (psf, " Sections    :   %dn", psf->sf.sections) ;
  979. psf_log_printf (psf, " Seekable    :   %sn", psf->sf.seekable ? "TRUE" : "FALSE") ;
  980. psf_log_printf (psf, "---------------------------------n") ;
  981. } /* psf_dump_SFINFO */
  982. /*========================================================================================
  983. */
  984. void*
  985. psf_memset (void *s, int c, sf_count_t len)
  986. { char *ptr ;
  987. int  setcount ;
  988. ptr = (char *) s ;
  989. while (len > 0)
  990. { setcount = (len > 0x10000000) ? 0x10000000 : (int) len ;
  991. memset (ptr, c, setcount) ;
  992. ptr += setcount ;
  993. len -= setcount ;
  994. } ;
  995. return s ;
  996. } /* psf_memset */
  997. SF_INSTRUMENT *
  998. psf_instrument_alloc (void)
  999. { SF_INSTRUMENT *instr ;
  1000. instr = calloc (1, sizeof (SF_INSTRUMENT)) ;
  1001. if (instr == NULL)
  1002. return NULL ;
  1003. /* Set non-zero default values. */
  1004. instr->basenote = -1 ;
  1005. instr->velocity_lo = -1 ;
  1006. instr->velocity_hi = -1 ;
  1007. instr->key_lo = -1 ;
  1008. instr->key_hi = -1 ;
  1009. return instr ;
  1010. } /* psf_instrument_alloc */
  1011. void
  1012. psf_sanitize_string (char * cptr, int len)
  1013. {
  1014. do
  1015. {
  1016. len -- ;
  1017. cptr [len] = psf_isprint (cptr [len]) ? cptr [len] : '.' ;
  1018. }
  1019. while (len > 0) ;
  1020. } /* psf_sanitize_string */
  1021. void
  1022. psf_get_date_str (char *str, int maxlen)
  1023. { time_t current ;
  1024. struct tm timedata, *tmptr ;
  1025. time (&current) ;
  1026. #if defined (HAVE_GMTIME_R)
  1027. /* If the re-entrant version is available, use it. */
  1028. tmptr = gmtime_r (&current, &timedata) ;
  1029. #elif defined (HAVE_GMTIME)
  1030. /* Otherwise use the standard one and copy the data to local storage. */
  1031. tmptr = gmtime (&current) ;
  1032. memcpy (&timedata, tmptr, sizeof (timedata)) ;
  1033. #else
  1034. tmptr = NULL ;
  1035. #endif
  1036. if (tmptr)
  1037. snprintf (str, maxlen, "%4d-%02d-%02d %02d:%02d:%02d UTC",
  1038. 1900 + timedata.tm_year, timedata.tm_mon, timedata.tm_mday,
  1039. timedata.tm_hour, timedata.tm_min, timedata.tm_sec) ;
  1040. else
  1041. snprintf (str, maxlen, "Unknown date") ;
  1042. return ;
  1043. } /* psf_get_date_str */
  1044. int
  1045. subformat_to_bytewidth (int format)
  1046. {
  1047. switch (format)
  1048. { case SF_FORMAT_PCM_U8 :
  1049. case SF_FORMAT_PCM_S8 :
  1050. return 1 ;
  1051. case SF_FORMAT_PCM_16 :
  1052. return 2 ;
  1053. case SF_FORMAT_PCM_24 :
  1054. return 3 ;
  1055. case SF_FORMAT_PCM_32 :
  1056. case SF_FORMAT_FLOAT :
  1057. return 4 ;
  1058. case SF_FORMAT_DOUBLE :
  1059. return 8 ;
  1060. } ;
  1061. return 0 ;
  1062. } /* subformat_to_bytewidth */
  1063. int
  1064. s_bitwidth_to_subformat (int bits)
  1065. { static int array [] =
  1066. { SF_FORMAT_PCM_S8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32
  1067. } ;
  1068. if (bits < 8 || bits > 32)
  1069. return 0 ;
  1070. return array [((bits + 7) / 8) - 1] ;
  1071. } /* bitwidth_to_subformat */
  1072. int
  1073. u_bitwidth_to_subformat (int bits)
  1074. { static int array [] =
  1075. { SF_FORMAT_PCM_U8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32
  1076. } ;
  1077. if (bits < 8 || bits > 32)
  1078. return 0 ;
  1079. return array [((bits + 7) / 8) - 1] ;
  1080. } /* bitwidth_to_subformat */
  1081. /*
  1082. ** psf_rand_int32 : Not crypto quality, but more than adequate for things
  1083. ** like stream serial numbers in Ogg files or the unique_id field of the
  1084. ** SF_PRIVATE struct.
  1085. */
  1086. int32_t
  1087. psf_rand_int32 (void)
  1088. { static int32_t value = -1 ;
  1089. int k, count ;
  1090. if (value == -1)
  1091. {
  1092. #if HAVE_GETTIMEOFDAY
  1093. struct timeval tv ;
  1094. gettimeofday (&tv, NULL) ;
  1095. value = tv.tv_sec + tv.tv_usec ;
  1096. #else
  1097. value = time (NULL) ;
  1098. #endif
  1099. } ;
  1100. count = 4 + (value & 7) ;
  1101. for (k = 0 ; k < count ; k++)
  1102. value = 11117 * value + 211231 ;
  1103. return value ;
  1104. } /* psf_rand_int32 */
  1105. void
  1106. append_snprintf (char * dest, size_t maxlen, const char * fmt, ...)
  1107. { size_t len = strlen (dest) ;
  1108. if (len < maxlen)
  1109. { va_list ap ;
  1110. va_start (ap, fmt) ;
  1111. vsnprintf (dest + len, maxlen - len, fmt, ap) ;
  1112. va_end (ap) ;
  1113. } ;
  1114. return ;
  1115. } /* append_snprintf */
  1116. /*==============================================================================
  1117. */
  1118. #define CASE_NAME(x) case x : return #x ; break ;
  1119. const char *
  1120. str_of_major_format (int format)
  1121. { switch (SF_CONTAINER (format))
  1122. { CASE_NAME (SF_FORMAT_WAV) ;
  1123. CASE_NAME (SF_FORMAT_AIFF) ;
  1124. CASE_NAME (SF_FORMAT_AU) ;
  1125. CASE_NAME (SF_FORMAT_RAW) ;
  1126. CASE_NAME (SF_FORMAT_PAF) ;
  1127. CASE_NAME (SF_FORMAT_SVX) ;
  1128. CASE_NAME (SF_FORMAT_NIST) ;
  1129. CASE_NAME (SF_FORMAT_VOC) ;
  1130. CASE_NAME (SF_FORMAT_IRCAM) ;
  1131. CASE_NAME (SF_FORMAT_W64) ;
  1132. CASE_NAME (SF_FORMAT_MAT4) ;
  1133. CASE_NAME (SF_FORMAT_MAT5) ;
  1134. CASE_NAME (SF_FORMAT_PVF) ;
  1135. CASE_NAME (SF_FORMAT_XI) ;
  1136. CASE_NAME (SF_FORMAT_HTK) ;
  1137. CASE_NAME (SF_FORMAT_SDS) ;
  1138. CASE_NAME (SF_FORMAT_AVR) ;
  1139. CASE_NAME (SF_FORMAT_WAVEX) ;
  1140. CASE_NAME (SF_FORMAT_SD2) ;
  1141. CASE_NAME (SF_FORMAT_FLAC) ;
  1142. CASE_NAME (SF_FORMAT_CAF) ;
  1143. CASE_NAME (SF_FORMAT_WVE) ;
  1144. CASE_NAME (SF_FORMAT_OGG) ;
  1145. default :
  1146. break ;
  1147. } ;
  1148. return "BAD_MAJOR_FORMAT" ;
  1149. } /* str_of_major_format */
  1150. const char *
  1151. str_of_minor_format (int format)
  1152. { switch (SF_CODEC (format))
  1153. { CASE_NAME (SF_FORMAT_PCM_S8) ;
  1154. CASE_NAME (SF_FORMAT_PCM_16) ;
  1155. CASE_NAME (SF_FORMAT_PCM_24) ;
  1156. CASE_NAME (SF_FORMAT_PCM_32) ;
  1157. CASE_NAME (SF_FORMAT_PCM_U8) ;
  1158. CASE_NAME (SF_FORMAT_FLOAT) ;
  1159. CASE_NAME (SF_FORMAT_DOUBLE) ;
  1160. CASE_NAME (SF_FORMAT_ULAW) ;
  1161. CASE_NAME (SF_FORMAT_ALAW) ;
  1162. CASE_NAME (SF_FORMAT_IMA_ADPCM) ;
  1163. CASE_NAME (SF_FORMAT_MS_ADPCM) ;
  1164. CASE_NAME (SF_FORMAT_GSM610) ;
  1165. CASE_NAME (SF_FORMAT_VOX_ADPCM) ;
  1166. CASE_NAME (SF_FORMAT_G721_32) ;
  1167. CASE_NAME (SF_FORMAT_G723_24) ;
  1168. CASE_NAME (SF_FORMAT_G723_40) ;
  1169. CASE_NAME (SF_FORMAT_DWVW_12) ;
  1170. CASE_NAME (SF_FORMAT_DWVW_16) ;
  1171. CASE_NAME (SF_FORMAT_DWVW_24) ;
  1172. CASE_NAME (SF_FORMAT_DWVW_N) ;
  1173. CASE_NAME (SF_FORMAT_DPCM_8) ;
  1174. CASE_NAME (SF_FORMAT_DPCM_16) ;
  1175. CASE_NAME (SF_FORMAT_VORBIS) ;
  1176. default :
  1177. break ;
  1178. } ;
  1179. return "BAD_MINOR_FORMAT" ;
  1180. } /* str_of_minor_format */
  1181. const char *
  1182. str_of_open_mode (int mode)
  1183. { switch (mode)
  1184. { CASE_NAME (SFM_READ) ;
  1185. CASE_NAME (SFM_WRITE) ;
  1186. CASE_NAME (SFM_RDWR) ;
  1187. default :
  1188. break ;
  1189. } ;
  1190. return "BAD_MODE" ;
  1191. } /* str_of_open_mode */
  1192. const char *
  1193. str_of_endianness (int end)
  1194. { switch (end)
  1195. { CASE_NAME (SF_ENDIAN_BIG) ;
  1196. CASE_NAME (SF_ENDIAN_LITTLE) ;
  1197. CASE_NAME (SF_ENDIAN_CPU) ;
  1198. default :
  1199. break ;
  1200. } ;
  1201. /* Zero length string for SF_ENDIAN_FILE. */
  1202. return "" ;
  1203. } /* str_of_endianness */