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

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. #ifndef SNDFILE_COMMON_H
  19. #define SNDFILE_COMMON_H
  20. #include "sfconfig.h"
  21. #include <stdlib.h>
  22. #if HAVE_STDINT_H
  23. #include <stdint.h>
  24. #elif HAVE_INTTYPES_H
  25. #include <inttypes.h>
  26. #endif
  27. #ifndef SNDFILE_H
  28. #include "sndfile.h"
  29. #endif
  30. #ifdef __cplusplus
  31. #error "This code is not designed to be compiled with a C++ compiler."
  32. #endif
  33. #if (SIZEOF_LONG == 8)
  34. # define SF_PLATFORM_S64(x) x##l
  35. #elif (SIZEOF_LONG_LONG == 8)
  36. # define SF_PLATFORM_S64(x) x##ll
  37. #elif COMPILER_IS_GCC
  38. # define SF_PLATFORM_S64(x) x##ll
  39. #elif OS_IS_WIN32
  40. # define SF_PLATFORM_S64(x) x##I64
  41. #else
  42. # error "Don't know how to define a 64 bit integer constant."
  43. #endif
  44. /*
  45. ** Inspiration : http://sourcefrog.net/weblog/software/languages/C/unused.html
  46. */
  47. #ifdef UNUSED
  48. #elif defined (__GNUC__)
  49. # define UNUSED(x) UNUSED_ ## x __attribute__ ((unused))
  50. #elif defined (__LCLINT__)
  51. # define UNUSED(x) /*@unused@*/ x
  52. #else
  53. # define UNUSED(x) x
  54. #endif
  55. #ifdef __GNUC__
  56. # define WARN_UNUSED __attribute__ ((warn_unused_result))
  57. #else
  58. # define WARN_UNUSED
  59. #endif
  60. #define SF_BUFFER_LEN (8192*2)
  61. #define SF_FILENAME_LEN (512)
  62. #define SF_SYSERR_LEN (256)
  63. #define SF_MAX_STRINGS (32)
  64. #define SF_STR_BUFFER_LEN (8192)
  65. #define SF_HEADER_LEN (4100 + SF_STR_BUFFER_LEN)
  66. #define PSF_SEEK_ERROR ((sf_count_t) -1)
  67. #define BITWIDTH2BYTES(x) (((x) + 7) / 8)
  68. /* For some reason sizeof returns an unsigned  value which causes
  69. ** a warning when that value is added or subtracted from a signed
  70. ** value. Use SIGNED_SIZEOF instead.
  71. */
  72. #define SIGNED_SIZEOF(x) ((int) sizeof (x))
  73. #define ARRAY_LEN(x) ((int) (sizeof (x) / sizeof ((x) [0])))
  74. #if (COMPILER_IS_GCC == 1)
  75. #define SF_MAX(x,y) ({ 
  76. typeof (x) sf_max_x1 = (x) ; 
  77. typeof (y) sf_max_y1 = (y) ; 
  78. (void) (&sf_max_x1 == &sf_max_y1) ; 
  79. sf_max_x1 > sf_max_y1 ? sf_max_x1 : sf_max_y1 ; })
  80. #define SF_MIN(x,y) ({ 
  81. typeof (x) sf_min_x2 = (x) ; 
  82. typeof (y) sf_min_y2 = (y) ; 
  83. (void) (&sf_min_x2 == &sf_min_y2) ; 
  84. sf_min_x2 < sf_min_y2 ? sf_min_x2 : sf_min_y2 ; })
  85. #else
  86. #define SF_MAX(a,b) ((a) > (b) ? (a) : (b))
  87. #define SF_MIN(a,b) ((a) < (b) ? (a) : (b))
  88. #endif
  89. #define SF_MAX_CHANNELS 256
  90. /*
  91. * Macros for spliting the format file of SF_INFI into contrainer type,
  92. ** codec type and endian-ness.
  93. */
  94. #define SF_CONTAINER(x) ((x) & SF_FORMAT_TYPEMASK)
  95. #define SF_CODEC(x) ((x) & SF_FORMAT_SUBMASK)
  96. #define SF_ENDIAN(x) ((x) & SF_FORMAT_ENDMASK)
  97. enum
  98. { /* PEAK chunk location. */
  99. SF_PEAK_START = 42,
  100. SF_PEAK_END = 43,
  101. /* PEAK chunk location. */
  102. SF_SCALE_MAX = 52,
  103. SF_SCALE_MIN = 53,
  104. /* str_flags values. */
  105. SF_STR_ALLOW_START = 0x0100,
  106. SF_STR_ALLOW_END = 0x0200,
  107. /* Location of strings. */
  108. SF_STR_LOCATE_START = 0x0400,
  109. SF_STR_LOCATE_END = 0x0800,
  110. SFD_TYPEMASK = 0x0FFFFFFF
  111. } ;
  112. #define SFM_MASK  (SFM_READ | SFM_WRITE | SFM_RDWR)
  113. #define SFM_UNMASK  (~SFM_MASK)
  114. /*---------------------------------------------------------------------------------------
  115. ** Formats that may be supported at some time in the future.
  116. ** When support is finalised, these values move to src/sndfile.h.
  117. */
  118. enum
  119. { /* Work in progress. */
  120. /* Formats supported read only. */
  121. SF_FORMAT_TXW = 0x4030000, /* Yamaha TX16 sampler file */
  122. SF_FORMAT_DWD = 0x4040000, /* DiamondWare Digirized */
  123. /* Following are detected but not supported. */
  124. SF_FORMAT_REX = 0x40A0000, /* Propellorheads Rex/Rcy */
  125. SF_FORMAT_REX2 = 0x40D0000, /* Propellorheads Rex2 */
  126. SF_FORMAT_KRZ = 0x40E0000, /* Kurzweil sampler file */
  127. SF_FORMAT_WMA = 0x4100000, /* Windows Media Audio. */
  128. SF_FORMAT_SHN = 0x4110000, /* Shorten. */
  129. /* Unsupported encodings. */
  130. SF_FORMAT_SVX_FIB = 0x1020,  /* SVX Fibonacci Delta encoding. */
  131. SF_FORMAT_SVX_EXP = 0x1021,  /* SVX Exponential Delta encoding. */
  132. SF_FORMAT_PCM_N = 0x1030
  133. } ;
  134. /*---------------------------------------------------------------------------------------
  135. ** PEAK_CHUNK - This chunk type is common to both AIFF and WAVE files although their
  136. ** endian encodings are different.
  137. */
  138. typedef struct
  139. { double value ; /* signed value of peak */
  140. sf_count_t position ; /* the sample frame for the peak */
  141. } PEAK_POS ;
  142. typedef struct
  143. { /* libsndfile internal : write a PEAK chunk at the start or end of the file? */
  144. int peak_loc ;
  145. /* WAV/AIFF */
  146. unsigned int version ; /* version of the PEAK chunk */
  147. unsigned int timestamp ; /* secs since 1/1/1970  */
  148. /* CAF */
  149. unsigned int edit_number ;
  150. #if HAVE_FLEXIBLE_ARRAY
  151. /* the per channel peak info */
  152. PEAK_POS peaks [] ;
  153. #else
  154. /*
  155. ** This is not ISO compliant C. It works on some compilers which
  156. ** don't support the ISO standard flexible struct array which is
  157. ** used above. If your compiler doesn't like this I suggest you find
  158. ** youself a 1999 ISO C standards compilant compiler. GCC-3.X is
  159. ** highly recommended.
  160. */
  161. PEAK_POS peaks [0] ;
  162. #endif
  163. } PEAK_INFO ;
  164. static inline PEAK_INFO *
  165. peak_info_calloc (int channels)
  166. { return calloc (1, sizeof (PEAK_INFO) + channels * sizeof (PEAK_POS)) ;
  167. } /* peak_info_calloc */
  168. typedef struct
  169. { int type ;
  170. int flags ;
  171. char  *str ;
  172. } STR_DATA ;
  173. static inline size_t
  174. make_size_t (int x)
  175. { return (size_t) x ;
  176. } /* size_t_of_int */
  177. /*
  178. ** This version of isprint specifically ignores any locale info. Its used for
  179. ** determining which characters can be printed in things like hexdumps.
  180. */
  181. static inline int
  182. psf_isprint (int ch)
  183. { return (ch >= ' ' && ch <= '~') ;
  184. } /* psf_isprint */
  185. /*=======================================================================================
  186. ** SF_PRIVATE stuct - a pointer to this struct is passed back to the caller of the
  187. ** sf_open_XXXX functions. The caller however has no knowledge of the struct's
  188. ** contents.
  189. */
  190. typedef struct
  191. { int size ;
  192. SF_BROADCAST_INFO binfo ;
  193. } PSF_BROADCAST_VAR ;
  194. #if SIZEOF_WCHAR_T == 2
  195. typedef wchar_t sfwchar_t ;
  196. #else
  197. typedef int16_t sfwchar_t ;
  198. #endif
  199. typedef struct
  200. {
  201. union
  202. { char c [SF_FILENAME_LEN] ;
  203. sfwchar_t wc [SF_FILENAME_LEN] ;
  204. } path ;
  205. union
  206. { char c [SF_FILENAME_LEN] ;
  207. sfwchar_t wc [SF_FILENAME_LEN] ;
  208. } dir ;
  209. union
  210. { char c [SF_FILENAME_LEN / 4] ;
  211. sfwchar_t wc [SF_FILENAME_LEN / 4] ;
  212. } name ;
  213. #if USE_WINDOWS_API
  214. /*
  215. ** These fields can only be used in src/file_io.c.
  216. ** They are basically the same as a windows file HANDLE.
  217. */
  218. void  *handle, *hsaved ;
  219. int use_wchar ;
  220. #else
  221. /* These fields can only be used in src/file_io.c. */
  222. int  filedes, savedes ;
  223. #endif
  224. int do_not_close_descriptor ;
  225. int mode ; /* Open mode : SFM_READ, SFM_WRITE or SFM_RDWR. */
  226. } PSF_FILE ;
  227. typedef struct sf_private_tag
  228. {
  229. /* Canary in a coal mine. */
  230. union
  231. { /* Place a double here to encourage double alignment. */
  232. double d [2] ;
  233. char c [16] ;
  234. } canary ;
  235. /* Force the compiler to double align the start of buffer. */
  236. union
  237. { double dbuf [SF_BUFFER_LEN / sizeof (double)] ;
  238. #if (defined (SIZEOF_INT64_T) && (SIZEOF_INT64_T == 8))
  239. int64_t lbuf [SF_BUFFER_LEN / sizeof (int64_t)] ;
  240. #else
  241. long lbuf [SF_BUFFER_LEN / sizeof (double)] ;
  242. #endif
  243. float fbuf [SF_BUFFER_LEN / sizeof (float)] ;
  244. int ibuf [SF_BUFFER_LEN / sizeof (int)] ;
  245. short sbuf [SF_BUFFER_LEN / sizeof (short)] ;
  246. char cbuf [SF_BUFFER_LEN / sizeof (char)] ;
  247. signed char scbuf [SF_BUFFER_LEN / sizeof (signed char)] ;
  248. unsigned char ucbuf [SF_BUFFER_LEN / sizeof (signed char)] ;
  249. } u ;
  250. PSF_FILE file, rsrc ;
  251. char syserr [SF_SYSERR_LEN] ;
  252. /* logbuffer and logindex should only be changed within the logging functions
  253. ** of common.c
  254. */
  255. char logbuffer [SF_BUFFER_LEN] ;
  256. unsigned char header [SF_HEADER_LEN] ; /* Must be unsigned */
  257. int rwf_endian ; /* Header endian-ness flag. */
  258. /* Storage and housekeeping data for adding/reading strings from
  259. ** sound files.
  260. */
  261. STR_DATA strings [SF_MAX_STRINGS] ;
  262. char str_storage [SF_STR_BUFFER_LEN] ;
  263. char *str_end ;
  264. int str_flags ;
  265. /* Guard value. If this changes the buffers above have overflowed. */
  266. int Magick ;
  267. unsigned unique_id ;
  268. /* Index variables for maintaining logbuffer and header above. */
  269. int logindex ;
  270. int headindex, headend ;
  271. int has_text ;
  272. int error ;
  273. int endian ; /* File endianness : SF_ENDIAN_LITTLE or SF_ENDIAN_BIG. */
  274. int data_endswap ; /* Need to endswap data? */
  275. /*
  276. ** Maximum float value for calculating the multiplier for
  277. ** float/double to short/int conversions.
  278. */
  279. int float_int_mult ;
  280. float float_max ;
  281. int scale_int_float ;
  282. /* Vairables for handling pipes. */
  283. int is_pipe ; /* True if file is a pipe. */
  284. sf_count_t pipeoffset ; /* Number of bytes read from a pipe. */
  285. /* True if clipping must be performed on float->int conversions. */
  286. int add_clipping ;
  287. SF_INFO sf ;
  288. int have_written ; /* Has a single write been done to the file? */
  289. PEAK_INFO *peak_info ;
  290. /* Loop Info */
  291. SF_LOOP_INFO *loop_info ;
  292. SF_INSTRUMENT *instrument ;
  293. /* Broadcast (EBU) Info */
  294. PSF_BROADCAST_VAR *broadcast_var ;
  295. /* Channel map data (if present) : an array of ints. */
  296. int *channel_map ;
  297. sf_count_t filelength ; /* Overall length of (embedded) file. */
  298. sf_count_t fileoffset ; /* Offset in number of bytes from beginning of file. */
  299. sf_count_t rsrclength ; /* Length of the resource fork (if it exists). */
  300. sf_count_t dataoffset ; /* Offset in number of bytes from beginning of file. */
  301. sf_count_t datalength ; /* Length in bytes of the audio data. */
  302. sf_count_t dataend ; /* Offset to file tailer. */
  303. int blockwidth ; /* Size in bytes of one set of interleaved samples. */
  304. int bytewidth ; /* Size in bytes of one sample (one channel). */
  305. void *dither ;
  306. void *interleave ;
  307. int last_op ; /* Last operation; either SFM_READ or SFM_WRITE */
  308. sf_count_t read_current ;
  309. sf_count_t write_current ;
  310. void *container_data ; /* This is a pointer to dynamically allocated file
  311. ** container format specific data.
  312. */
  313. void *codec_data ; /* This is a pointer to dynamically allocated file
  314. ** codec format specific data.
  315. */
  316. SF_DITHER_INFO write_dither ;
  317. SF_DITHER_INFO read_dither ;
  318. int norm_double ;
  319. int norm_float ;
  320. int auto_header ;
  321. int ieee_replace ;
  322. /* A set of file specific function pointers */
  323. sf_count_t (*read_short) (struct sf_private_tag*, short *ptr, sf_count_t len) ;
  324. sf_count_t (*read_int) (struct sf_private_tag*, int *ptr, sf_count_t len) ;
  325. sf_count_t (*read_float) (struct sf_private_tag*, float *ptr, sf_count_t len) ;
  326. sf_count_t (*read_double) (struct sf_private_tag*, double *ptr, sf_count_t len) ;
  327. sf_count_t (*write_short) (struct sf_private_tag*, const short *ptr, sf_count_t len) ;
  328. sf_count_t (*write_int) (struct sf_private_tag*, const int *ptr, sf_count_t len) ;
  329. sf_count_t (*write_float) (struct sf_private_tag*, const float *ptr, sf_count_t len) ;
  330. sf_count_t (*write_double) (struct sf_private_tag*, const double *ptr, sf_count_t len) ;
  331. sf_count_t (*seek)  (struct sf_private_tag*, int mode, sf_count_t samples_from_start) ;
  332. int (*write_header) (struct sf_private_tag*, int calc_length) ;
  333. int (*command) (struct sf_private_tag*, int command, void *data, int datasize) ;
  334. /*
  335. ** Separate close functions for the codec and the container.
  336. ** The codec close function is always called first.
  337. */
  338. int (*codec_close) (struct sf_private_tag*) ;
  339. int (*container_close) (struct sf_private_tag*) ;
  340. char *format_desc ;
  341. /* Virtual I/O functions. */
  342. int virtual_io ;
  343. SF_VIRTUAL_IO vio ;
  344. void *vio_user_data ;
  345. } SF_PRIVATE ;
  346. enum
  347. { SFE_NO_ERROR = SF_ERR_NO_ERROR,
  348. SFE_BAD_OPEN_FORMAT = SF_ERR_UNRECOGNISED_FORMAT,
  349. SFE_SYSTEM = SF_ERR_SYSTEM,
  350. SFE_MALFORMED_FILE = SF_ERR_MALFORMED_FILE,
  351. SFE_UNSUPPORTED_ENCODING = SF_ERR_UNSUPPORTED_ENCODING,
  352. SFE_ZERO_MAJOR_FORMAT,
  353. SFE_ZERO_MINOR_FORMAT,
  354. SFE_BAD_FILE,
  355. SFE_BAD_FILE_READ,
  356. SFE_OPEN_FAILED,
  357. SFE_BAD_SNDFILE_PTR,
  358. SFE_BAD_SF_INFO_PTR,
  359. SFE_BAD_SF_INCOMPLETE,
  360. SFE_BAD_FILE_PTR,
  361. SFE_BAD_INT_PTR,
  362. SFE_BAD_STAT_SIZE,
  363. SFE_MALLOC_FAILED,
  364. SFE_UNIMPLEMENTED,
  365. SFE_BAD_READ_ALIGN,
  366. SFE_BAD_WRITE_ALIGN,
  367. SFE_UNKNOWN_FORMAT,
  368. SFE_NOT_READMODE,
  369. SFE_NOT_WRITEMODE,
  370. SFE_BAD_MODE_RW,
  371. SFE_BAD_SF_INFO,
  372. SFE_BAD_OFFSET,
  373. SFE_NO_EMBED_SUPPORT,
  374. SFE_NO_EMBEDDED_RDWR,
  375. SFE_NO_PIPE_WRITE,
  376. SFE_INTERNAL,
  377. SFE_BAD_COMMAND_PARAM,
  378. SFE_BAD_ENDIAN,
  379. SFE_CHANNEL_COUNT_ZERO,
  380. SFE_CHANNEL_COUNT,
  381. SFE_BAD_VIRTUAL_IO,
  382. SFE_INTERLEAVE_MODE,
  383. SFE_INTERLEAVE_SEEK,
  384. SFE_INTERLEAVE_READ,
  385. SFE_BAD_SEEK,
  386. SFE_NOT_SEEKABLE,
  387. SFE_AMBIGUOUS_SEEK,
  388. SFE_WRONG_SEEK,
  389. SFE_SEEK_FAILED,
  390. SFE_BAD_OPEN_MODE,
  391. SFE_OPEN_PIPE_RDWR,
  392. SFE_RDWR_POSITION,
  393. SFE_RDWR_BAD_HEADER,
  394. SFE_CMD_HAS_DATA,
  395. SFE_BAD_BROADCAST_INFO_SIZE,
  396. SFE_STR_NO_SUPPORT,
  397. SFE_STR_NOT_WRITE,
  398. SFE_STR_MAX_DATA,
  399. SFE_STR_MAX_COUNT,
  400. SFE_STR_BAD_TYPE,
  401. SFE_STR_NO_ADD_END,
  402. SFE_STR_BAD_STRING,
  403. SFE_STR_WEIRD,
  404. SFE_WAV_NO_RIFF,
  405. SFE_WAV_NO_WAVE,
  406. SFE_WAV_NO_FMT,
  407. SFE_WAV_BAD_FMT,
  408. SFE_WAV_FMT_SHORT,
  409. SFE_WAV_BAD_FACT,
  410. SFE_WAV_BAD_PEAK,
  411. SFE_WAV_PEAK_B4_FMT,
  412. SFE_WAV_BAD_FORMAT,
  413. SFE_WAV_BAD_BLOCKALIGN,
  414. SFE_WAV_NO_DATA,
  415. SFE_WAV_BAD_LIST,
  416. SFE_WAV_ADPCM_NOT4BIT,
  417. SFE_WAV_ADPCM_CHANNELS,
  418. SFE_WAV_GSM610_FORMAT,
  419. SFE_WAV_UNKNOWN_CHUNK,
  420. SFE_WAV_WVPK_DATA,
  421. SFE_AIFF_NO_FORM,
  422. SFE_AIFF_AIFF_NO_FORM,
  423. SFE_AIFF_COMM_NO_FORM,
  424. SFE_AIFF_SSND_NO_COMM,
  425. SFE_AIFF_UNKNOWN_CHUNK,
  426. SFE_AIFF_COMM_CHUNK_SIZE,
  427. SFE_AIFF_BAD_COMM_CHUNK,
  428. SFE_AIFF_PEAK_B4_COMM,
  429. SFE_AIFF_BAD_PEAK,
  430. SFE_AIFF_NO_SSND,
  431. SFE_AIFF_NO_DATA,
  432. SFE_AIFF_RW_SSND_NOT_LAST,
  433. SFE_AU_UNKNOWN_FORMAT,
  434. SFE_AU_NO_DOTSND,
  435. SFE_AU_EMBED_BAD_LEN,
  436. SFE_RAW_READ_BAD_SPEC,
  437. SFE_RAW_BAD_BITWIDTH,
  438. SFE_RAW_BAD_FORMAT,
  439. SFE_PAF_NO_MARKER,
  440. SFE_PAF_VERSION,
  441. SFE_PAF_UNKNOWN_FORMAT,
  442. SFE_PAF_SHORT_HEADER,
  443. SFE_SVX_NO_FORM,
  444. SFE_SVX_NO_BODY,
  445. SFE_SVX_NO_DATA,
  446. SFE_SVX_BAD_COMP,
  447. SFE_SVX_BAD_NAME_LENGTH,
  448. SFE_NIST_BAD_HEADER,
  449. SFE_NIST_CRLF_CONVERISON,
  450. SFE_NIST_BAD_ENCODING,
  451. SFE_VOC_NO_CREATIVE,
  452. SFE_VOC_BAD_FORMAT,
  453. SFE_VOC_BAD_VERSION,
  454. SFE_VOC_BAD_MARKER,
  455. SFE_VOC_BAD_SECTIONS,
  456. SFE_VOC_MULTI_SAMPLERATE,
  457. SFE_VOC_MULTI_SECTION,
  458. SFE_VOC_MULTI_PARAM,
  459. SFE_VOC_SECTION_COUNT,
  460. SFE_VOC_NO_PIPE,
  461. SFE_IRCAM_NO_MARKER,
  462. SFE_IRCAM_BAD_CHANNELS,
  463. SFE_IRCAM_UNKNOWN_FORMAT,
  464. SFE_W64_64_BIT,
  465. SFE_W64_NO_RIFF,
  466. SFE_W64_NO_WAVE,
  467. SFE_W64_NO_DATA,
  468. SFE_W64_ADPCM_NOT4BIT,
  469. SFE_W64_ADPCM_CHANNELS,
  470. SFE_W64_GSM610_FORMAT,
  471. SFE_MAT4_BAD_NAME,
  472. SFE_MAT4_NO_SAMPLERATE,
  473. SFE_MAT5_BAD_ENDIAN,
  474. SFE_MAT5_NO_BLOCK,
  475. SFE_MAT5_SAMPLE_RATE,
  476. SFE_PVF_NO_PVF1,
  477. SFE_PVF_BAD_HEADER,
  478. SFE_PVF_BAD_BITWIDTH,
  479. SFE_DWVW_BAD_BITWIDTH,
  480. SFE_G72X_NOT_MONO,
  481. SFE_XI_BAD_HEADER,
  482. SFE_XI_EXCESS_SAMPLES,
  483. SFE_XI_NO_PIPE,
  484. SFE_HTK_NO_PIPE,
  485. SFE_SDS_NOT_SDS,
  486. SFE_SDS_BAD_BIT_WIDTH,
  487. SFE_SD2_FD_DISALLOWED,
  488. SFE_SD2_BAD_DATA_OFFSET,
  489. SFE_SD2_BAD_MAP_OFFSET,
  490. SFE_SD2_BAD_DATA_LENGTH,
  491. SFE_SD2_BAD_MAP_LENGTH,
  492. SFE_SD2_BAD_RSRC,
  493. SFE_SD2_BAD_SAMPLE_SIZE,
  494. SFE_FLAC_BAD_HEADER,
  495. SFE_FLAC_NEW_DECODER,
  496. SFE_FLAC_INIT_DECODER,
  497. SFE_FLAC_LOST_SYNC,
  498. SFE_FLAC_BAD_SAMPLE_RATE,
  499. SFE_FLAC_UNKOWN_ERROR,
  500. SFE_WVE_NOT_WVE,
  501. SFE_WVE_NO_PIPE,
  502. SFE_VORBIS_ENCODER_BUG,
  503. SFE_RF64_NOT_RF64,
  504. SFE_MAX_ERROR /* This must be last in list. */
  505. } ;
  506. int subformat_to_bytewidth (int format) ;
  507. int s_bitwidth_to_subformat (int bits) ;
  508. int u_bitwidth_to_subformat (int bits) ;
  509. /*  Functions for reading and writing floats and doubles on processors
  510. ** with non-IEEE floats/doubles.
  511. */
  512. float float32_be_read (unsigned char *cptr) ;
  513. float float32_le_read (unsigned char *cptr) ;
  514. void float32_be_write (float in, unsigned char *out) ;
  515. void float32_le_write (float in, unsigned char *out) ;
  516. double double64_be_read (unsigned char *cptr) ;
  517. double double64_le_read (unsigned char *cptr) ;
  518. void double64_be_write (double in, unsigned char *out) ;
  519. void double64_le_write (double in, unsigned char *out) ;
  520. /* Functions for writing to the internal logging buffer. */
  521. void psf_log_printf (SF_PRIVATE *psf, const char *format, ...) ;
  522. void psf_log_SF_INFO  (SF_PRIVATE *psf) ;
  523. int32_t psf_rand_int32 (void) ;
  524. void append_snprintf (char * dest, size_t maxlen, const char * fmt, ...) ;
  525. /* Functions used when writing file headers. */
  526. int psf_binheader_writef (SF_PRIVATE *psf, const char *format, ...) ;
  527. void psf_asciiheader_printf (SF_PRIVATE *psf, const char *format, ...) ;
  528. /* Functions used when reading file headers. */
  529. int psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...) ;
  530. /* Functions used in the write function for updating the peak chunk. */
  531. void peak_update_short (SF_PRIVATE *psf, short *ptr, size_t items) ;
  532. void peak_update_int (SF_PRIVATE *psf, int *ptr, size_t items) ;
  533. void peak_update_double (SF_PRIVATE *psf, double *ptr, size_t items) ;
  534. /* Functions defined in command.c. */
  535. int psf_get_format_simple_count (void) ;
  536. int psf_get_format_simple (SF_FORMAT_INFO *data) ;
  537. int psf_get_format_info (SF_FORMAT_INFO *data) ;
  538. int psf_get_format_major_count (void) ;
  539. int psf_get_format_major (SF_FORMAT_INFO *data) ;
  540. int psf_get_format_subtype_count (void) ;
  541. int psf_get_format_subtype (SF_FORMAT_INFO *data) ;
  542. void psf_generate_format_desc (SF_PRIVATE *psf) ;
  543. double psf_calc_signal_max (SF_PRIVATE *psf, int normalize) ;
  544. int psf_calc_max_all_channels (SF_PRIVATE *psf, double *peaks, int normalize) ;
  545. int psf_get_signal_max (SF_PRIVATE *psf, double *peak) ;
  546. int psf_get_max_all_channels (SF_PRIVATE *psf, double *peaks) ;
  547. /* Functions in strings.c. */
  548. const char* psf_get_string (SF_PRIVATE *psf, int str_type) ;
  549. int psf_set_string (SF_PRIVATE *psf, int str_type, const char *str) ;
  550. int psf_store_string (SF_PRIVATE *psf, int str_type, const char *str) ;
  551. int psf_location_string_count (const SF_PRIVATE * psf, int location) ;
  552. /* Default seek function. Use for PCM and float encoded data. */
  553. sf_count_t psf_default_seek (SF_PRIVATE *psf, int mode, sf_count_t samples_from_start) ;
  554. int macos_guess_file_type (SF_PRIVATE *psf, const char *filename) ;
  555. /*------------------------------------------------------------------------------------
  556. ** File I/O functions which will allow access to large files (> 2 Gig) on
  557. ** some 32 bit OSes. Implementation in file_io.c.
  558. */
  559. int psf_fopen (SF_PRIVATE *psf) ;
  560. int psf_set_stdio (SF_PRIVATE *psf) ;
  561. int psf_file_valid (SF_PRIVATE *psf) ;
  562. void psf_set_file (SF_PRIVATE *psf, int fd) ;
  563. void psf_init_files (SF_PRIVATE *psf) ;
  564. void psf_use_rsrc (SF_PRIVATE *psf, int on_off) ;
  565. SNDFILE * psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo) ;
  566. sf_count_t psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence) ;
  567. sf_count_t psf_fread (void *ptr, sf_count_t bytes, sf_count_t count, SF_PRIVATE *psf) ;
  568. sf_count_t psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t count, SF_PRIVATE *psf) ;
  569. sf_count_t psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf) ;
  570. sf_count_t psf_ftell (SF_PRIVATE *psf) ;
  571. sf_count_t psf_get_filelen (SF_PRIVATE *psf) ;
  572. void psf_fsync (SF_PRIVATE *psf) ;
  573. int psf_is_pipe (SF_PRIVATE *psf) ;
  574. int psf_ftruncate (SF_PRIVATE *psf, sf_count_t len) ;
  575. int psf_fclose (SF_PRIVATE *psf) ;
  576. /* Open and close the resource fork of a file. */
  577. int psf_open_rsrc (SF_PRIVATE *psf) ;
  578. int psf_close_rsrc (SF_PRIVATE *psf) ;
  579. /*
  580. void psf_fclearerr (SF_PRIVATE *psf) ;
  581. int psf_ferror (SF_PRIVATE *psf) ;
  582. */
  583. /*------------------------------------------------------------------------------------
  584. ** Functions for reading and writing different file formats.
  585. */
  586. int aiff_open (SF_PRIVATE *psf) ;
  587. int au_open (SF_PRIVATE *psf) ;
  588. int avr_open (SF_PRIVATE *psf) ;
  589. int htk_open (SF_PRIVATE *psf) ;
  590. int ircam_open (SF_PRIVATE *psf) ;
  591. int mat4_open (SF_PRIVATE *psf) ;
  592. int mat5_open (SF_PRIVATE *psf) ;
  593. int nist_open (SF_PRIVATE *psf) ;
  594. int paf_open (SF_PRIVATE *psf) ;
  595. int pvf_open (SF_PRIVATE *psf) ;
  596. int raw_open (SF_PRIVATE *psf) ;
  597. int sd2_open (SF_PRIVATE *psf) ;
  598. int sds_open (SF_PRIVATE *psf) ;
  599. int svx_open (SF_PRIVATE *psf) ;
  600. int voc_open (SF_PRIVATE *psf) ;
  601. int w64_open (SF_PRIVATE *psf) ;
  602. int wav_open (SF_PRIVATE *psf) ;
  603. int xi_open (SF_PRIVATE *psf) ;
  604. int flac_open (SF_PRIVATE *psf) ;
  605. int caf_open (SF_PRIVATE *psf) ;
  606. int mpc2k_open (SF_PRIVATE *psf) ;
  607. int rf64_open (SF_PRIVATE *psf) ;
  608. /* In progress. Do not currently work. */
  609. int mpeg_open (SF_PRIVATE *psf) ;
  610. int ogg_open (SF_PRIVATE *psf) ;
  611. int rx2_open (SF_PRIVATE *psf) ;
  612. int txw_open (SF_PRIVATE *psf) ;
  613. int wve_open (SF_PRIVATE *psf) ;
  614. int dwd_open (SF_PRIVATE *psf) ;
  615. int macbinary3_open (SF_PRIVATE *psf) ;
  616. /*------------------------------------------------------------------------------------
  617. ** Init functions for a number of common data encodings.
  618. */
  619. int pcm_init (SF_PRIVATE *psf) ;
  620. int ulaw_init (SF_PRIVATE *psf) ;
  621. int alaw_init (SF_PRIVATE *psf) ;
  622. int float32_init (SF_PRIVATE *psf) ;
  623. int double64_init (SF_PRIVATE *psf) ;
  624. int dwvw_init (SF_PRIVATE *psf, int bitwidth) ;
  625. int gsm610_init (SF_PRIVATE *psf) ;
  626. int vox_adpcm_init (SF_PRIVATE *psf) ;
  627. int flac_init (SF_PRIVATE *psf) ;
  628. int g72x_init  (SF_PRIVATE * psf) ;
  629. int  dither_init (SF_PRIVATE *psf, int mode) ;
  630. int wav_w64_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;
  631. int wav_w64_msadpcm_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;
  632. int aiff_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;
  633. int interleave_init (SF_PRIVATE *psf) ;
  634. /*------------------------------------------------------------------------------------
  635. ** Chunk logging functions.
  636. */
  637. typedef struct
  638. { struct
  639. { int chunk ;
  640. sf_count_t offset ;
  641. sf_count_t len ;
  642. } l [100] ;
  643. int count ;
  644. } PRIV_CHUNK4 ;
  645. void pchk4_store (PRIV_CHUNK4 * pchk, int marker, sf_count_t offset, sf_count_t len) ;
  646. int pchk4_find (PRIV_CHUNK4 * pchk, int marker) ;
  647. /*------------------------------------------------------------------------------------
  648. ** Other helper functions.
  649. */
  650. void *psf_memset (void *s, int c, sf_count_t n) ;
  651. SF_INSTRUMENT * psf_instrument_alloc (void) ;
  652. void psf_sanitize_string (char * cptr, int len) ;
  653. /* Generate the current date as a string. */
  654. void psf_get_date_str (char *str, int maxlen) ;
  655. PSF_BROADCAST_VAR* broadcast_var_alloc (size_t datasize) ;
  656. int broadcast_var_set (SF_PRIVATE *psf, const SF_BROADCAST_INFO * data, size_t datasize) ;
  657. int broadcast_var_get (SF_PRIVATE *psf, SF_BROADCAST_INFO * data, size_t datasize) ;
  658. typedef struct
  659. { int channels ;
  660. int endianness ;
  661. } AUDIO_DETECT ;
  662. int audio_detect (SF_PRIVATE * psf, AUDIO_DETECT *ad, const unsigned char * data, int datalen) ;
  663. /*------------------------------------------------------------------------------------
  664. ** Helper/debug functions.
  665. */
  666. void psf_hexdump (const void *ptr, int len) ;
  667. const char * str_of_major_format (int format) ;
  668. const char * str_of_minor_format (int format) ;
  669. const char * str_of_open_mode (int mode) ;
  670. const char * str_of_endianness (int end) ;
  671. /*------------------------------------------------------------------------------------
  672. ** Extra commands for sf_command(). Not for public use yet.
  673. */
  674. enum
  675. { SFC_TEST_AIFF_ADD_INST_CHUNK = 0x2000,
  676. SFC_TEST_WAV_ADD_INFO_CHUNK = 0x2010
  677. } ;
  678. /*
  679. ** Maybe, one day, make these functions or something like them, public.
  680. **
  681. ** Buffer to buffer dithering. Pointer in and out are allowed to point
  682. ** to the same buffer for in-place dithering.
  683. */
  684. #if 0
  685. int sf_dither_short (const SF_DITHER_INFO *dither, const short *in, short *out, int count) ;
  686. int sf_dither_int (const SF_DITHER_INFO *dither, const int *in, int *out, int count) ;
  687. int sf_dither_float (const SF_DITHER_INFO *dither, const float *in, float *out, int count) ;
  688. int sf_dither_double (const SF_DITHER_INFO *dither, const double *in, double *out, int count) ;
  689. #endif
  690. #endif /* SNDFILE_COMMON_H */