/project/jni/sndfile/src/caf.c

https://github.com/aichunyu/FFPlayer · C · 620 lines · 448 code · 126 blank · 46 comment · 139 complexity · f556f79d371147532161030d3f323f9d MD5 · raw file

  1. /*
  2. ** Copyright (C) 2005-2011 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 "sfconfig.h"
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #include <math.h>
  24. #include <inttypes.h>
  25. #include "sndfile.h"
  26. #include "sfendian.h"
  27. #include "common.h"
  28. #include "chanmap.h"
  29. /*------------------------------------------------------------------------------
  30. ** Macros to handle big/little endian issues.
  31. */
  32. #define aac_MARKER MAKE_MARKER ('a', 'a', 'c', ' ')
  33. #define alac_MARKER MAKE_MARKER ('a', 'l', 'a', 'c')
  34. #define alaw_MARKER MAKE_MARKER ('a', 'l', 'a', 'w')
  35. #define caff_MARKER MAKE_MARKER ('c', 'a', 'f', 'f')
  36. #define chan_MARKER MAKE_MARKER ('c', 'h', 'a', 'n')
  37. #define data_MARKER MAKE_MARKER ('d', 'a', 't', 'a')
  38. #define desc_MARKER MAKE_MARKER ('d', 'e', 's', 'c')
  39. #define edct_MARKER MAKE_MARKER ('e', 'd', 'c', 't')
  40. #define free_MARKER MAKE_MARKER ('f', 'r', 'e', 'e')
  41. #define ima4_MARKER MAKE_MARKER ('i', 'm', 'a', '4')
  42. #define info_MARKER MAKE_MARKER ('i', 'n', 'f', 'o')
  43. #define inst_MARKER MAKE_MARKER ('i', 'n', 's', 't')
  44. #define kuki_MARKER MAKE_MARKER ('k', 'u', 'k', 'i')
  45. #define lpcm_MARKER MAKE_MARKER ('l', 'p', 'c', 'm')
  46. #define mark_MARKER MAKE_MARKER ('m', 'a', 'r', 'k')
  47. #define midi_MARKER MAKE_MARKER ('m', 'i', 'd', 'i')
  48. #define mp1_MARKER MAKE_MARKER ('.', 'm', 'p', '1')
  49. #define mp2_MARKER MAKE_MARKER ('.', 'm', 'p', '2')
  50. #define mp3_MARKER MAKE_MARKER ('.', 'm', 'p', '3')
  51. #define ovvw_MARKER MAKE_MARKER ('o', 'v', 'v', 'w')
  52. #define pakt_MARKER MAKE_MARKER ('p', 'a', 'k', 't')
  53. #define peak_MARKER MAKE_MARKER ('p', 'e', 'a', 'k')
  54. #define regn_MARKER MAKE_MARKER ('r', 'e', 'g', 'n')
  55. #define strg_MARKER MAKE_MARKER ('s', 't', 'r', 'g')
  56. #define umid_MARKER MAKE_MARKER ('u', 'm', 'i', 'd')
  57. #define uuid_MARKER MAKE_MARKER ('u', 'u', 'i', 'd')
  58. #define ulaw_MARKER MAKE_MARKER ('u', 'l', 'a', 'w')
  59. #define MAC3_MARKER MAKE_MARKER ('M', 'A', 'C', '3')
  60. #define MAC6_MARKER MAKE_MARKER ('M', 'A', 'C', '6')
  61. #define CAF_PEAK_CHUNK_SIZE(ch) ((int) (sizeof (int) + ch * (sizeof (float) + 8)))
  62. #define SFE_CAF_NOT_CAF 666
  63. #define SFE_CAF_NO_DESC 667
  64. #define SFE_CAF_BAD_PEAK 668
  65. /*------------------------------------------------------------------------------
  66. ** Typedefs.
  67. */
  68. typedef struct
  69. { unsigned char srate [8] ;
  70. unsigned int fmt_id ;
  71. unsigned int fmt_flags ;
  72. unsigned int pkt_bytes ;
  73. unsigned int pkt_frames ;
  74. unsigned int channels_per_frame ;
  75. unsigned int bits_per_chan ;
  76. } DESC_CHUNK ;
  77. typedef struct
  78. { int chanmap_tag ;
  79. } CAF_PRIVATE ;
  80. /*------------------------------------------------------------------------------
  81. ** Private static functions.
  82. */
  83. static int caf_close (SF_PRIVATE *psf) ;
  84. static int caf_read_header (SF_PRIVATE *psf) ;
  85. static int caf_write_header (SF_PRIVATE *psf, int calc_length) ;
  86. static int caf_command (SF_PRIVATE *psf, int command, void *data, int datasize) ;
  87. static int caf_read_chanmap (SF_PRIVATE * psf, sf_count_t chunk_size) ;
  88. /*------------------------------------------------------------------------------
  89. ** Public function.
  90. */
  91. int
  92. caf_open (SF_PRIVATE *psf)
  93. { int subformat, format, error = 0 ;
  94. if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0))
  95. { if ((error = caf_read_header (psf)))
  96. return error ;
  97. } ;
  98. subformat = SF_CODEC (psf->sf.format) ;
  99. if ((psf->container_data = calloc (1, sizeof (CAF_PRIVATE))) == NULL)
  100. return SFE_MALLOC_FAILED ;
  101. if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
  102. { if (psf->is_pipe)
  103. return SFE_NO_PIPE_WRITE ;
  104. format = SF_CONTAINER (psf->sf.format) ;
  105. if (format != SF_FORMAT_CAF)
  106. return SFE_BAD_OPEN_FORMAT ;
  107. psf->blockwidth = psf->bytewidth * psf->sf.channels ;
  108. if (psf->file.mode != SFM_RDWR || psf->filelength < 44)
  109. { psf->filelength = 0 ;
  110. psf->datalength = 0 ;
  111. psf->dataoffset = 0 ;
  112. psf->sf.frames = 0 ;
  113. } ;
  114. psf->str_flags = SF_STR_ALLOW_START ;
  115. /*
  116. ** By default, add the peak chunk to floating point files. Default behaviour
  117. ** can be switched off using sf_command (SFC_SET_PEAK_CHUNK, SF_FALSE).
  118. */
  119. if (psf->file.mode == SFM_WRITE && (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE))
  120. { if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL)
  121. return SFE_MALLOC_FAILED ;
  122. psf->peak_info->peak_loc = SF_PEAK_START ;
  123. } ;
  124. if ((error = caf_write_header (psf, SF_FALSE)) != 0)
  125. return error ;
  126. psf->write_header = caf_write_header ;
  127. } ;
  128. psf->container_close = caf_close ;
  129. psf->command = caf_command ;
  130. switch (subformat)
  131. { case SF_FORMAT_PCM_S8 :
  132. case SF_FORMAT_PCM_16 :
  133. case SF_FORMAT_PCM_24 :
  134. case SF_FORMAT_PCM_32 :
  135. error = pcm_init (psf) ;
  136. break ;
  137. case SF_FORMAT_ULAW :
  138. error = ulaw_init (psf) ;
  139. break ;
  140. case SF_FORMAT_ALAW :
  141. error = alaw_init (psf) ;
  142. break ;
  143. /* Lite remove start */
  144. case SF_FORMAT_FLOAT :
  145. error = float32_init (psf) ;
  146. break ;
  147. case SF_FORMAT_DOUBLE :
  148. error = double64_init (psf) ;
  149. break ;
  150. /* Lite remove end */
  151. default :
  152. return SFE_UNSUPPORTED_ENCODING ;
  153. } ;
  154. return error ;
  155. } /* caf_open */
  156. static int
  157. caf_close (SF_PRIVATE *psf)
  158. {
  159. if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR)
  160. caf_write_header (psf, SF_TRUE) ;
  161. return 0 ;
  162. } /* caf_close */
  163. static int
  164. caf_command (SF_PRIVATE * psf, int command, void * UNUSED (data), int UNUSED (datasize))
  165. { CAF_PRIVATE *pcaf ;
  166. if ((pcaf = psf->container_data) == NULL)
  167. return SFE_INTERNAL ;
  168. switch (command)
  169. { case SFC_SET_CHANNEL_MAP_INFO :
  170. pcaf->chanmap_tag = aiff_caf_find_channel_layout_tag (psf->channel_map, psf->sf.channels) ;
  171. return (pcaf->chanmap_tag != 0) ;
  172. default :
  173. break ;
  174. } ;
  175. return 0 ;
  176. } /* caf_command */
  177. /*------------------------------------------------------------------------------
  178. */
  179. static int
  180. decode_desc_chunk (SF_PRIVATE *psf, const DESC_CHUNK *desc)
  181. { int format ;
  182. psf->sf.channels = desc->channels_per_frame ;
  183. format = SF_FORMAT_CAF | (psf->endian == SF_ENDIAN_LITTLE ? SF_ENDIAN_LITTLE : 0) ;
  184. if (desc->fmt_id == lpcm_MARKER && desc->fmt_flags & 1)
  185. { /* Floating point data. */
  186. if (desc->bits_per_chan == 32 && desc->pkt_bytes == 4 * desc->channels_per_frame)
  187. { psf->bytewidth = 4 ;
  188. return format | SF_FORMAT_FLOAT ;
  189. } ;
  190. if (desc->bits_per_chan == 64 && desc->pkt_bytes == 8 * desc->channels_per_frame)
  191. { psf->bytewidth = 8 ;
  192. return format | SF_FORMAT_DOUBLE ;
  193. } ;
  194. } ;
  195. if ((desc->fmt_flags & 1) != 0)
  196. { psf_log_printf (psf, "**** Ooops, 'desc' chunk suggests float data, but other info invalid.\n") ;
  197. return 0 ;
  198. } ;
  199. if (desc->fmt_id == lpcm_MARKER)
  200. { /* Integer data. */
  201. if (desc->bits_per_chan == 32 && desc->pkt_bytes == 4 * desc->channels_per_frame)
  202. { psf->bytewidth = 4 ;
  203. return format | SF_FORMAT_PCM_32 ;
  204. } ;
  205. if (desc->bits_per_chan == 24 && desc->pkt_bytes == 3 * desc->channels_per_frame)
  206. { psf->bytewidth = 3 ;
  207. return format | SF_FORMAT_PCM_24 ;
  208. } ;
  209. if (desc->bits_per_chan == 16 && desc->pkt_bytes == 2 * desc->channels_per_frame)
  210. { psf->bytewidth = 2 ;
  211. return format | SF_FORMAT_PCM_16 ;
  212. } ;
  213. if (desc->bits_per_chan == 8 && desc->pkt_bytes == 1 * desc->channels_per_frame)
  214. { psf->bytewidth = 1 ;
  215. return format | SF_FORMAT_PCM_S8 ;
  216. } ;
  217. } ;
  218. if (desc->fmt_id == alaw_MARKER && desc->bits_per_chan == 8)
  219. { psf->bytewidth = 1 ;
  220. return format | SF_FORMAT_ALAW ;
  221. } ;
  222. if (desc->fmt_id == ulaw_MARKER && desc->bits_per_chan == 8)
  223. { psf->bytewidth = 1 ;
  224. return format | SF_FORMAT_ULAW ;
  225. } ;
  226. return 0 ;
  227. } /* decode_desc_chunk */
  228. static int
  229. caf_read_header (SF_PRIVATE *psf)
  230. { DESC_CHUNK desc ;
  231. sf_count_t chunk_size ;
  232. double srate ;
  233. short version, flags ;
  234. int marker, k, have_data = 0, error ;
  235. memset (&desc, 0, sizeof (desc)) ;
  236. /* Set position to start of file to begin reading header. */
  237. psf_binheader_readf (psf, "pmE2E2", 0, &marker, &version, &flags) ;
  238. psf_log_printf (psf, "%M\n Version : %d\n Flags : %x\n", marker, version, flags) ;
  239. if (marker != caff_MARKER)
  240. return SFE_CAF_NOT_CAF ;
  241. psf_binheader_readf (psf, "mE8b", &marker, &chunk_size, psf->u.ucbuf, 8) ;
  242. srate = double64_be_read (psf->u.ucbuf) ;
  243. snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), "%5.3f", srate) ;
  244. psf_log_printf (psf, "%M : %D\n Sample rate : %s\n", marker, chunk_size, psf->u.cbuf) ;
  245. if (marker != desc_MARKER)
  246. return SFE_CAF_NO_DESC ;
  247. if (chunk_size < SIGNED_SIZEOF (DESC_CHUNK))
  248. { psf_log_printf (psf, "**** Chunk size too small. Should be > 32 bytes.\n") ;
  249. return SFE_MALFORMED_FILE ;
  250. } ;
  251. psf->sf.samplerate = lrint (srate) ;
  252. psf_binheader_readf (psf, "mE44444", &desc.fmt_id, &desc.fmt_flags, &desc.pkt_bytes, &desc.pkt_frames,
  253. &desc.channels_per_frame, &desc.bits_per_chan) ;
  254. psf_log_printf (psf, " Format id : %M\n Format flags : %x\n Bytes / packet : %u\n"
  255. " Frames / packet : %u\n Channels / frame : %u\n Bits / channel : %u\n",
  256. desc.fmt_id, desc.fmt_flags, desc.pkt_bytes, desc.pkt_frames, desc.channels_per_frame, desc.bits_per_chan) ;
  257. if (desc.channels_per_frame > SF_MAX_CHANNELS)
  258. { psf_log_printf (psf, "**** Bad channels per frame value %u.\n", desc.channels_per_frame) ;
  259. return SFE_MALFORMED_FILE ;
  260. } ;
  261. if (chunk_size > SIGNED_SIZEOF (DESC_CHUNK))
  262. psf_binheader_readf (psf, "j", (int) (chunk_size - sizeof (DESC_CHUNK))) ;
  263. psf->sf.channels = desc.channels_per_frame ;
  264. while (have_data == 0 && psf_ftell (psf) < psf->filelength - SIGNED_SIZEOF (marker))
  265. { psf_binheader_readf (psf, "mE8", &marker, &chunk_size) ;
  266. switch (marker)
  267. { case peak_MARKER :
  268. psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
  269. if (chunk_size != CAF_PEAK_CHUNK_SIZE (psf->sf.channels))
  270. { psf_binheader_readf (psf, "j", (int) chunk_size) ;
  271. psf_log_printf (psf, "*** File PEAK chunk %D should be %d.\n", chunk_size, CAF_PEAK_CHUNK_SIZE (psf->sf.channels)) ;
  272. return SFE_CAF_BAD_PEAK ;
  273. } ;
  274. if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL)
  275. return SFE_MALLOC_FAILED ;
  276. /* read in rest of PEAK chunk. */
  277. psf_binheader_readf (psf, "E4", & (psf->peak_info->edit_number)) ;
  278. psf_log_printf (psf, " edit count : %d\n", psf->peak_info->edit_number) ;
  279. psf_log_printf (psf, " Ch Position Value\n") ;
  280. for (k = 0 ; k < psf->sf.channels ; k++)
  281. { sf_count_t position ;
  282. float value ;
  283. psf_binheader_readf (psf, "Ef8", &value, &position) ;
  284. psf->peak_info->peaks [k].value = value ;
  285. psf->peak_info->peaks [k].position = position ;
  286. snprintf (psf->u.cbuf, sizeof (psf->u.cbuf), " %2d %-12" PRId64 " %g\n", k, position, value) ;
  287. psf_log_printf (psf, psf->u.cbuf) ;
  288. } ;
  289. psf->peak_info->peak_loc = SF_PEAK_START ;
  290. break ;
  291. case chan_MARKER :
  292. if (chunk_size < 12)
  293. { psf_log_printf (psf, "%M : %D (should be >= 12)\n", marker, chunk_size) ;
  294. psf_binheader_readf (psf, "j", (int) chunk_size) ;
  295. break ;
  296. }
  297. psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
  298. if ((error = caf_read_chanmap (psf, chunk_size)))
  299. return error ;
  300. break ;
  301. case free_MARKER :
  302. psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
  303. psf_binheader_readf (psf, "j", (int) chunk_size) ;
  304. break ;
  305. case data_MARKER :
  306. if (psf->filelength > 0 && chunk_size + psf->headindex != psf->filelength)
  307. psf_log_printf (psf, "%M : %D (should be %D)\n", marker, chunk_size, chunk_size + 4) ;
  308. else
  309. psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ;
  310. psf_binheader_readf (psf, "E4", &k) ;
  311. psf_log_printf (psf, " edit : %u\n", k) ;
  312. have_data = 1 ;
  313. break ;
  314. default :
  315. psf_log_printf (psf, " %M : %D (skipped)\n", marker, chunk_size) ;
  316. psf_binheader_readf (psf, "j", (int) chunk_size) ;
  317. break ;
  318. } ;
  319. } ;
  320. if (have_data == 0)
  321. { psf_log_printf (psf, "**** Error, could not find 'data' chunk.\n") ;
  322. return SFE_MALFORMED_FILE ;
  323. } ;
  324. psf_log_printf (psf, "End\n") ;
  325. psf->dataoffset = psf_ftell (psf) ;
  326. psf->datalength = psf->filelength - psf->dataoffset ;
  327. psf->endian = (desc.fmt_flags & 2) ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ;
  328. if ((psf->sf.format = decode_desc_chunk (psf, &desc)) == 0)
  329. return SFE_UNSUPPORTED_ENCODING ;
  330. if (psf->bytewidth > 0)
  331. psf->sf.frames = psf->datalength / psf->bytewidth ;
  332. return 0 ;
  333. } /* caf_read_header */
  334. /*------------------------------------------------------------------------------
  335. */
  336. static int
  337. caf_write_header (SF_PRIVATE *psf, int calc_length)
  338. { CAF_PRIVATE *pcaf ;
  339. DESC_CHUNK desc ;
  340. sf_count_t current, free_len ;
  341. int subformat ;
  342. if ((pcaf = psf->container_data) == NULL)
  343. return SFE_INTERNAL ;
  344. memset (&desc, 0, sizeof (desc)) ;
  345. current = psf_ftell (psf) ;
  346. if (calc_length)
  347. { psf->filelength = psf_get_filelen (psf) ;
  348. psf->datalength = psf->filelength - psf->dataoffset ;
  349. if (psf->dataend)
  350. psf->datalength -= psf->filelength - psf->dataend ;
  351. if (psf->bytewidth > 0)
  352. psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
  353. } ;
  354. /* Reset the current header length to zero. */
  355. psf->header [0] = 0 ;
  356. psf->headindex = 0 ;
  357. psf_fseek (psf, 0, SEEK_SET) ;
  358. /* 'caff' marker, version and flags. */
  359. psf_binheader_writef (psf, "Em22", caff_MARKER, 1, 0) ;
  360. /* 'desc' marker and chunk size. */
  361. psf_binheader_writef (psf, "Em8", desc_MARKER, (sf_count_t) (sizeof (DESC_CHUNK))) ;
  362. double64_be_write (1.0 * psf->sf.samplerate, psf->u.ucbuf) ;
  363. psf_binheader_writef (psf, "b", psf->u.ucbuf, make_size_t (8)) ;
  364. subformat = SF_CODEC (psf->sf.format) ;
  365. psf->endian = SF_ENDIAN (psf->sf.format) ;
  366. if (CPU_IS_BIG_ENDIAN && (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU))
  367. psf->endian = SF_ENDIAN_BIG ;
  368. else if (CPU_IS_LITTLE_ENDIAN && (psf->endian == SF_ENDIAN_LITTLE || psf->endian == SF_ENDIAN_CPU))
  369. psf->endian = SF_ENDIAN_LITTLE ;
  370. if (psf->endian == SF_ENDIAN_LITTLE)
  371. desc.fmt_flags = 2 ;
  372. else
  373. psf->endian = SF_ENDIAN_BIG ;
  374. /* initial section (same for all, it appears) */
  375. switch (subformat)
  376. { case SF_FORMAT_PCM_S8 :
  377. desc.fmt_id = lpcm_MARKER ;
  378. psf->bytewidth = 1 ;
  379. desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
  380. desc.pkt_frames = 1 ;
  381. desc.channels_per_frame = psf->sf.channels ;
  382. desc.bits_per_chan = 8 ;
  383. break ;
  384. case SF_FORMAT_PCM_16 :
  385. desc.fmt_id = lpcm_MARKER ;
  386. psf->bytewidth = 2 ;
  387. desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
  388. desc.pkt_frames = 1 ;
  389. desc.channels_per_frame = psf->sf.channels ;
  390. desc.bits_per_chan = 16 ;
  391. break ;
  392. case SF_FORMAT_PCM_24 :
  393. psf->bytewidth = 3 ;
  394. desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
  395. desc.pkt_frames = 1 ;
  396. desc.channels_per_frame = psf->sf.channels ;
  397. desc.bits_per_chan = 24 ;
  398. desc.fmt_id = lpcm_MARKER ;
  399. break ;
  400. case SF_FORMAT_PCM_32 :
  401. desc.fmt_id = lpcm_MARKER ;
  402. psf->bytewidth = 4 ;
  403. desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
  404. desc.pkt_frames = 1 ;
  405. desc.channels_per_frame = psf->sf.channels ;
  406. desc.bits_per_chan = 32 ;
  407. break ;
  408. case SF_FORMAT_FLOAT :
  409. desc.fmt_id = lpcm_MARKER ;
  410. desc.fmt_flags |= 1 ;
  411. psf->bytewidth = 4 ;
  412. desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
  413. desc.pkt_frames = 1 ;
  414. desc.channels_per_frame = psf->sf.channels ;
  415. desc.bits_per_chan = 32 ;
  416. break ;
  417. case SF_FORMAT_DOUBLE :
  418. desc.fmt_id = lpcm_MARKER ;
  419. desc.fmt_flags |= 1 ;
  420. psf->bytewidth = 8 ;
  421. desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
  422. desc.pkt_frames = 1 ;
  423. desc.channels_per_frame = psf->sf.channels ;
  424. desc.bits_per_chan = 64 ;
  425. break ;
  426. case SF_FORMAT_ALAW :
  427. desc.fmt_id = alaw_MARKER ;
  428. psf->bytewidth = 1 ;
  429. desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
  430. desc.pkt_frames = 1 ;
  431. desc.channels_per_frame = psf->sf.channels ;
  432. desc.bits_per_chan = 8 ;
  433. break ;
  434. case SF_FORMAT_ULAW :
  435. desc.fmt_id = ulaw_MARKER ;
  436. psf->bytewidth = 1 ;
  437. desc.pkt_bytes = psf->bytewidth * psf->sf.channels ;
  438. desc.pkt_frames = 1 ;
  439. desc.channels_per_frame = psf->sf.channels ;
  440. desc.bits_per_chan = 8 ;
  441. break ;
  442. default :
  443. return SFE_UNIMPLEMENTED ;
  444. } ;
  445. psf_binheader_writef (psf, "mE44444", desc.fmt_id, desc.fmt_flags, desc.pkt_bytes, desc.pkt_frames, desc.channels_per_frame, desc.bits_per_chan) ;
  446. #if 0
  447. if (psf->str_flags & SF_STR_LOCATE_START)
  448. caf_write_strings (psf, SF_STR_LOCATE_START) ;
  449. #endif
  450. if (psf->peak_info != NULL)
  451. { int k ;
  452. psf_binheader_writef (psf, "Em84", peak_MARKER, (sf_count_t) CAF_PEAK_CHUNK_SIZE (psf->sf.channels), psf->peak_info->edit_number) ;
  453. for (k = 0 ; k < psf->sf.channels ; k++)
  454. psf_binheader_writef (psf, "Ef8", (float) psf->peak_info->peaks [k].value, psf->peak_info->peaks [k].position) ;
  455. } ;
  456. if (psf->channel_map && pcaf->chanmap_tag)
  457. psf_binheader_writef (psf, "Em8444", chan_MARKER, (sf_count_t) 12, pcaf->chanmap_tag, 0, 0) ;
  458. /* Add free chunk so that the actual audio data starts at a multiple 0x1000. */
  459. free_len = 0x1000 - psf->headindex - 16 - 12 ;
  460. while (free_len < 0)
  461. free_len += 0x1000 ;
  462. psf_binheader_writef (psf, "Em8z", free_MARKER, free_len, (int) free_len) ;
  463. psf_binheader_writef (psf, "Em84", data_MARKER, psf->datalength + 4, 0) ;
  464. psf_fwrite (psf->header, psf->headindex, 1, psf) ;
  465. if (psf->error)
  466. return psf->error ;
  467. psf->dataoffset = psf->headindex ;
  468. if (current < psf->dataoffset)
  469. psf_fseek (psf, psf->dataoffset, SEEK_SET) ;
  470. else if (current > 0)
  471. psf_fseek (psf, current, SEEK_SET) ;
  472. return psf->error ;
  473. } /* caf_write_header */
  474. static int
  475. caf_read_chanmap (SF_PRIVATE * psf, sf_count_t chunk_size)
  476. { const AIFF_CAF_CHANNEL_MAP * map_info ;
  477. unsigned channel_bitmap, channel_decriptions, bytesread ;
  478. int layout_tag ;
  479. bytesread = psf_binheader_readf (psf, "E444", &layout_tag, &channel_bitmap, &channel_decriptions) ;
  480. map_info = aiff_caf_of_channel_layout_tag (layout_tag) ;
  481. psf_log_printf (psf, " Tag : %x\n", layout_tag) ;
  482. if (map_info)
  483. psf_log_printf (psf, " Layout : %s\n", map_info->name) ;
  484. if (bytesread < chunk_size)
  485. psf_binheader_readf (psf, "j", chunk_size - bytesread) ;
  486. if (map_info->channel_map != NULL)
  487. { size_t chanmap_size = psf->sf.channels * sizeof (psf->channel_map [0]) ;
  488. free (psf->channel_map) ;
  489. if ((psf->channel_map = malloc (chanmap_size)) == NULL)
  490. return SFE_MALLOC_FAILED ;
  491. memcpy (psf->channel_map, map_info->channel_map, chanmap_size) ;
  492. } ;
  493. return 0 ;
  494. } /* caf_read_chanmap */