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

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /*
  2. ** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
  3. **  
  4. ** This program is free software; you can redistribute it and/or modify
  5. ** it under the terms of the GNU 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 <stdio.h>
  19. #include <unistd.h>
  20. #include <string.h>
  21. #include <ctype.h>
  22. #include "sndfile.h"
  23. #include "config.h"
  24. #include "sfendian.h"
  25. #include "common.h"
  26. #include "pcm.h"
  27. /*------------------------------------------------------------------------------
  28.  * Macros to handle big/little endian issues.
  29.  */
  30. #if (CPU_IS_LITTLE_ENDIAN == 1)
  31. #define MAKE_MARKER(a,b,c,d) ((a)|((b)<<8)|((c)<<16)|((d)<<24))
  32. #elif (CPU_IS_BIG_ENDIAN == 1)
  33. #define MAKE_MARKER(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
  34. #else
  35. #error "Cannot determine endian-ness of processor."
  36. #endif
  37. #define FORM_MARKER (MAKE_MARKER ('F', 'O', 'R', 'M')) 
  38. #define AIFF_MARKER (MAKE_MARKER ('A', 'I', 'F', 'F')) 
  39. #define AIFC_MARKER (MAKE_MARKER ('A', 'I', 'F', 'C')) 
  40. #define COMM_MARKER (MAKE_MARKER ('C', 'O', 'M', 'M')) 
  41. #define SSND_MARKER (MAKE_MARKER ('S', 'S', 'N', 'D')) 
  42. #define MARK_MARKER (MAKE_MARKER ('M', 'A', 'R', 'K')) 
  43. #define INST_MARKER (MAKE_MARKER ('I', 'N', 'S', 'T')) 
  44. #define APPL_MARKER (MAKE_MARKER ('A', 'P', 'P', 'L')) 
  45. #define c_MARKER (MAKE_MARKER ('(', 'c', ')', ' ')) 
  46. #define NAME_MARKER (MAKE_MARKER ('N', 'A', 'M', 'E')) 
  47. #define AUTH_MARKER (MAKE_MARKER ('A', 'U', 'T', 'H')) 
  48. #define ANNO_MARKER (MAKE_MARKER ('A', 'N', 'N', 'O')) 
  49. #define FVER_MARKER (MAKE_MARKER ('F', 'V', 'E', 'R')) 
  50. #define NONE_MARKER (MAKE_MARKER ('N', 'O', 'N', 'E')) 
  51. #define REAL_COMM_SIZE (2+4+2+10)
  52. /*------------------------------------------------------------------------------
  53.  * Typedefs for file chunks.
  54.  */
  55. typedef struct
  56. { short numChannels ;
  57. unsigned int numSampleFrames ;
  58. short sampleSize ;
  59. unsigned char sampleRate [10] ;
  60. } COMM_CHUNK ; 
  61. typedef struct
  62. { unsigned int offset ;
  63. unsigned int blocksize ;
  64. } SSND_CHUNK ; 
  65. typedef struct 
  66. { short           playMode;
  67.     int         beginLoop;
  68. int         endLoop;
  69. } INST_CHUNK ;
  70. /*------------------------------------------------------------------------------
  71.  * Private static functions.
  72.  */
  73. static int aiff_close (SF_PRIVATE  *psf) ;
  74. static int     tenbytefloat2int (unsigned char *bytes) ;
  75. static void uint2tenbytefloat (unsigned int num, unsigned char *bytes) ;
  76. static 
  77. void    endswap_comm_fmt (COMM_CHUNK *comm)
  78. { comm->numChannels     = ENDSWAP_SHORT (comm->numChannels) ;
  79. comm->numSampleFrames = ENDSWAP_INT (comm->numSampleFrames) ;
  80. comm->sampleSize      = ENDSWAP_SHORT (comm->sampleSize) ;
  81. } /* endswap_comm_fmt */
  82. static 
  83. void    endswap_ssnd_fmt (SSND_CHUNK *ssnd)
  84. { ssnd->offset  = ENDSWAP_INT (ssnd->offset) ;
  85. ssnd->blocksize = ENDSWAP_INT (ssnd->blocksize) ;
  86. } /* endswap_ssnd_fmt */
  87. /*------------------------------------------------------------------------------
  88. ** Public functions.
  89. */
  90. int  aiff_open_read (SF_PRIVATE *psf)
  91. { COMM_CHUNK comm_fmt ;
  92. SSND_CHUNK ssnd_fmt ;
  93. int marker, dword ;
  94. long FORMsize, commsize, SSNDsize ;
  95. int filetype, parsestage = 0, done = 0 ;
  96. while (! done)
  97. { fread (&marker, sizeof (marker), 1, psf->file) ;
  98. switch (marker)
  99. { case FORM_MARKER :
  100. if (parsestage != 0)
  101. return SFE_AIFF_NO_FORM ;
  102. fread (&dword, sizeof (dword), 1, psf->file) ;
  103. FORMsize = BE2H_INT (dword) ;
  104. if (FORMsize != psf->filelength - 2 * sizeof (dword))
  105. { dword = psf->filelength - 2 * sizeof (dword);
  106. psf_sprintf (psf, "FORM : %d (should be %d)n", FORMsize, dword) ;
  107. FORMsize = dword ;
  108. }
  109. else
  110. psf_sprintf (psf, "FORM : %dn", FORMsize) ;
  111. parsestage = 1 ;
  112. break ;
  113. case AIFC_MARKER :
  114. case AIFF_MARKER :
  115. if (parsestage != 1)
  116. return SFE_AIFF_NO_FORM ;
  117. filetype = marker ;
  118. psf_sprintf (psf, " %Dn", marker) ;
  119. parsestage = 2 ;
  120. break ;
  121. case COMM_MARKER :
  122. if (parsestage != 2)
  123. return SFE_AIFF_NO_FORM ;
  124. fread (&dword, sizeof (dword), 1, psf->file) ;
  125. commsize = BE2H_INT (dword) ;
  126. /* The COMM chunk has an int aligned to a word boundary. Some procesors 
  127. ** are not able to deal with this (ie bus fault) so we have to take
  128. ** special care.
  129. */
  130. fread (&(comm_fmt.numChannels), sizeof (comm_fmt.numChannels), 1, psf->file) ;
  131. fread (&(comm_fmt.numSampleFrames), sizeof (comm_fmt.numSampleFrames), 1, psf->file) ;
  132. fread (&(comm_fmt.sampleSize), sizeof (comm_fmt.sampleSize), 1, psf->file) ;
  133. fread (&(comm_fmt.sampleRate), sizeof (comm_fmt.sampleRate), 1, psf->file) ;
  134. if (CPU_IS_LITTLE_ENDIAN)
  135. endswap_comm_fmt (&comm_fmt) ;
  136. psf->sf.samplerate  = tenbytefloat2int (comm_fmt.sampleRate) ;
  137. psf->sf.samples  = comm_fmt.numSampleFrames ;
  138. psf->sf.channels  = comm_fmt.numChannels ;
  139. psf->sf.pcmbitwidth  = comm_fmt.sampleSize ;
  140. psf->sf.format  = (SF_FORMAT_AIFF | SF_FORMAT_PCM);
  141. psf->sf.sections  = 1 ;
  142. psf_sprintf (psf, " COMM : %dn", commsize) ;
  143. psf_sprintf (psf, "  Sample Rate : %dn", psf->sf.samplerate) ;
  144. psf_sprintf (psf, "  Samples     : %dn", comm_fmt.numSampleFrames) ;
  145. psf_sprintf (psf, "  Channels    : %dn", comm_fmt.numChannels) ;
  146. psf_sprintf (psf, "  Sample Size : %dn", comm_fmt.sampleSize) ;
  147. if (commsize > REAL_COMM_SIZE)
  148. { fread (&dword, sizeof (dword), 1, psf->file) ;
  149. if (dword != NONE_MARKER)
  150. { psf_sprintf (psf, "AIFC : Unimplemented format : %Dn", dword) ;
  151. return SFE_UNIMPLEMENTED ;
  152. } ;
  153. fseek (psf->file, commsize - (long) (sizeof (dword) + REAL_COMM_SIZE), SEEK_CUR) ;
  154. } ;
  155. parsestage = 3 ;
  156. break ;
  157. case SSND_MARKER :
  158. if (parsestage != 3)
  159. return SFE_AIFF_NO_SSND ;
  160. fread (&dword, sizeof (dword), 1, psf->file) ;
  161. SSNDsize = BE2H_INT (dword) ;
  162. fread (&ssnd_fmt, sizeof (SSND_CHUNK), 1, psf->file) ;
  163. if (CPU_IS_LITTLE_ENDIAN)
  164. endswap_ssnd_fmt (&ssnd_fmt) ;
  165. psf->dataoffset = ftell (psf->file) ;
  166. psf->datalength = psf->filelength - psf->dataoffset ;
  167. if (SSNDsize != psf->datalength + sizeof (SSND_CHUNK))
  168. psf_sprintf (psf, " SSND : %d (should be %d)n", SSNDsize, psf->datalength + sizeof (SSND_CHUNK)) ;
  169. else
  170. psf_sprintf (psf, " SSND : %dn", SSNDsize) ;
  171. psf_sprintf (psf, "  Offset     : %dn", ssnd_fmt.offset) ;
  172. psf_sprintf (psf, "  Block Size : %dn", ssnd_fmt.blocksize) ;
  173. fseek (psf->file, psf->datalength, SEEK_CUR) ;
  174. dword = ftell (psf->file) ;
  175. if (dword != (off_t) (psf->dataoffset + psf->datalength))
  176. psf_sprintf (psf, "*** fseek past end error ***n", dword, psf->dataoffset + psf->datalength) ;
  177. parsestage = 4 ;
  178. break ;
  179. case NAME_MARKER :
  180. case AUTH_MARKER :
  181. case ANNO_MARKER :
  182. case c_MARKER :
  183. case FVER_MARKER :
  184. if (parsestage < 2)
  185. return SFE_AIFF_NO_FORM ;
  186. fread (&dword, sizeof (dword), 1, psf->file) ;
  187. dword = BE2H_INT (dword) ;
  188. psf_sprintf (psf, " %D : %dn", marker, dword) ;
  189. fseek (psf->file, dword, SEEK_CUR) ;
  190. break ;
  191. case MARK_MARKER :
  192. case INST_MARKER :
  193. case APPL_MARKER :
  194. if (parsestage < 2)
  195. return SFE_AIFF_NO_FORM ;
  196. fread (&dword, sizeof (dword), 1, psf->file) ;
  197. dword = BE2H_INT (dword) ;
  198. psf_sprintf (psf, " %D : %dn", marker, dword) ;
  199. fseek (psf->file, dword, SEEK_CUR) ;
  200. break ;
  201. default : 
  202. if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
  203. && isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
  204. { fread (&dword, sizeof (dword), 1, psf->file) ;
  205. psf_sprintf (psf, "%D : %d (unknown marker)n", marker, dword) ;
  206. fseek (psf->file, dword, SEEK_CUR) ;
  207. break ;
  208. } ;
  209. if ((dword = ftell (psf->file)) & 0x03)
  210. { psf_sprintf (psf, "  Unknown chunk marker at position %d. Resynching.n", dword - 4) ;
  211. fseek (psf->file, -3, SEEK_CUR) ;
  212. break ;
  213. } ;
  214. psf_sprintf (psf, "*** Unknown chunk marker : %X. Exiting parser.n", marker) ;
  215. done = 1 ;
  216. break ;
  217. } ; /* switch (marker) */
  218. if (ferror (psf->file))
  219. { psf_sprintf (psf, "*** Error on file handle. ***n") ;
  220. clearerr (psf->file) ;
  221. break ;
  222. } ;
  223. if (ftell (psf->file) >= (off_t) (psf->filelength - (2 * sizeof (dword))))
  224. break ;
  225. } ; /* while (1) */
  226. if (! psf->dataoffset)
  227. return SFE_AIFF_NO_DATA ;
  228. psf->current     = 0 ;
  229. psf->endian      = SF_ENDIAN_BIG ; /* All AIF* files are big endian. */
  230. psf->sf.seekable = SF_TRUE ;
  231. psf->bytewidth   = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
  232. psf->blockwidth  = psf->sf.channels * psf->bytewidth ;
  233. fseek (psf->file, psf->dataoffset, SEEK_SET) ;
  234. psf->close = (func_close) aiff_close ;
  235. switch (psf->bytewidth)
  236. { case  1 :
  237. psf->read_short  = (func_short) pcm_read_sc2s ;
  238. psf->read_int    = (func_int) pcm_read_sc2i ;
  239. psf->read_double = (func_double) pcm_read_sc2d ;
  240. break ;
  241. case  2 :
  242. psf->read_short  = (func_short) pcm_read_bes2s ;
  243. psf->read_int    = (func_int) pcm_read_bes2i ;
  244. psf->read_double = (func_double) pcm_read_bes2d ;
  245. break ;
  246. case  3 :
  247. psf->read_short  = (func_short) pcm_read_bet2s ;
  248. psf->read_int    = (func_int) pcm_read_bet2i ;
  249. psf->read_double = (func_double) pcm_read_bet2d ;
  250. break ;
  251. case  4 :
  252. psf->read_short  = (func_short) pcm_read_bei2s ;
  253. psf->read_int    = (func_int) pcm_read_bei2i ;
  254. psf->read_double = (func_double) pcm_read_bei2d ;
  255. break ;
  256. default : 
  257. /* printf ("Weird bytewidth (%d)n", psf->bytewidth) ; */
  258. return SFE_UNIMPLEMENTED ;
  259. } ;
  260. return 0 ;
  261. } /* aiff_open_read */
  262. /*------------------------------------------------------------------------------
  263.  */
  264. int  aiff_open_write (SF_PRIVATE *psf)
  265. { COMM_CHUNK comm_fmt ;
  266. SSND_CHUNK ssnd_fmt ;
  267. unsigned int dword, FORMsize ;
  268. if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_AIFF)
  269. return SFE_BAD_OPEN_FORMAT ;
  270. if ((psf->sf.format & SF_FORMAT_SUBMASK) != SF_FORMAT_PCM)
  271. return SFE_BAD_OPEN_FORMAT ;
  272. psf->endian      = SF_ENDIAN_BIG ; /* All AIF* files are big endian. */
  273. psf->sf.seekable = SF_TRUE ;
  274. psf->bytewidth   = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
  275. psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
  276. psf->dataoffset  = 5 * sizeof (dword) + REAL_COMM_SIZE + 4 * sizeof (dword) ;
  277. psf->datalength  = psf->blockwidth * psf->sf.samples ;
  278. psf->filelength  = psf->datalength + psf->dataoffset ;
  279. psf->error       = 0 ;
  280. FORMsize   = 0x7FFFFFFF ;  /* Correct this when closing file. */
  281. comm_fmt.numChannels     = psf->sf.channels ;
  282. comm_fmt.numSampleFrames = psf->sf.samples ;
  283. comm_fmt.sampleSize      = psf->sf.pcmbitwidth ;
  284. uint2tenbytefloat (psf->sf.samplerate, comm_fmt.sampleRate)  ;
  285. if (CPU_IS_LITTLE_ENDIAN)
  286. endswap_comm_fmt (&comm_fmt) ;
  287. ssnd_fmt.offset    = 0 ;
  288. ssnd_fmt.blocksize = 0 ;  /* Not normally used. */
  289. if (CPU_IS_LITTLE_ENDIAN)
  290. endswap_ssnd_fmt (&ssnd_fmt) ;
  291. dword = FORM_MARKER ;
  292. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  293.   dword = H2BE_INT (FORMsize) ;
  294.   fwrite (&dword, sizeof (dword), 1, psf->file) ;
  295. dword = AIFF_MARKER ;
  296. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  297. dword = COMM_MARKER ;
  298. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  299. dword = H2BE_INT (REAL_COMM_SIZE) ;
  300. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  301. fwrite (&(comm_fmt.numChannels), sizeof (comm_fmt.numChannels), 1, psf->file) ;
  302. fwrite (&(comm_fmt.numSampleFrames), sizeof (comm_fmt.numSampleFrames), 1, psf->file) ;
  303. fwrite (&(comm_fmt.sampleSize), sizeof (comm_fmt.sampleSize), 1, psf->file) ;
  304. fwrite (&(comm_fmt.sampleRate), sizeof (comm_fmt.sampleRate), 1, psf->file) ;
  305. dword = SSND_MARKER ;
  306. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  307. dword = H2BE_INT (psf->datalength + sizeof (SSND_CHUNK)) ;
  308. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  309. fwrite (&ssnd_fmt, sizeof (ssnd_fmt), 1, psf->file) ;
  310. psf->close = (func_close) aiff_close ;
  311. switch (psf->bytewidth)
  312. { case  1 :
  313. psf->write_short  = (func_short) pcm_write_s2sc ;
  314. psf->write_int    = (func_int) pcm_write_i2sc ;
  315. psf->write_double = (func_double) pcm_write_d2sc ;
  316. break ;
  317. case  2 :
  318. psf->write_short  = (func_short) pcm_write_s2bes ;
  319. psf->write_int    = (func_int) pcm_write_i2bes ;
  320. psf->write_double = (func_double) pcm_write_d2bes ;
  321. break ;
  322. case  3 :
  323. psf->write_short  = (func_short) pcm_write_s2bet ;
  324. psf->write_int    = (func_int) pcm_write_i2bet ;
  325. psf->write_double = (func_double) pcm_write_d2bet ;
  326. break ;
  327. case  4 :
  328. psf->write_short  = (func_short) pcm_write_s2bei ;
  329. psf->write_int    = (func_int) pcm_write_i2bei ;
  330. psf->write_double = (func_double) pcm_write_d2bei ;
  331. break ;
  332. default : return SFE_UNIMPLEMENTED ;
  333. } ;
  334. return 0 ;
  335. } /* aiff_open_write */
  336. /*------------------------------------------------------------------------------
  337.  */
  338. int aiff_close (SF_PRIVATE  *psf)
  339. { unsigned int dword ;
  340. if (psf->mode == SF_MODE_WRITE)
  341. { /*  Now we know for certain the length of the file we can re-write 
  342. ** correct values for the FORM, COMM and SSND chunks.
  343. */
  344.  
  345. fseek (psf->file, 0, SEEK_END) ;
  346. psf->filelength = ftell (psf->file) ;
  347.   dword = psf->filelength - 2 * sizeof (dword) ;
  348.   fseek (psf->file, sizeof (dword), SEEK_SET) ;
  349.   dword = H2BE_INT (dword) ;
  350.   fwrite (&dword, sizeof (dword), 1, psf->file) ; /* FORM */
  351. fseek (psf->file, psf->dataoffset - (long)((sizeof (SSND_CHUNK) + sizeof (dword))), SEEK_SET) ;
  352. psf->datalength = psf->filelength - psf->dataoffset ;
  353.   dword = H2BE_INT (psf->datalength + sizeof (SSND_CHUNK)) ;
  354.   fwrite (&dword, sizeof (dword), 1, psf->file) ; /* SSND */
  355.   fseek (psf->file, 5 * sizeof (dword) + sizeof (short), SEEK_SET) ;
  356. dword = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
  357. dword = H2BE_INT (dword) ;
  358.   fwrite (&dword, sizeof (dword), 1, psf->file) ; /* COMM.numSampleFrames */
  359. } ;
  360. if (psf->fdata)
  361. free (psf->fdata) ;
  362. psf->fdata = NULL ;
  363. return 0 ;
  364. } /* aiff_close */
  365. /*==========================================================================================
  366. ** Rough hack at converting from 80 bit IEEE float in AIFF header to an int and
  367. ** back again. It assumes that all sample rates are between 1 and 800MHz, which 
  368. ** should be OK as other sound file formats use a 32 bit integer to store sample 
  369. ** rate.
  370. ** There is another (probably better) version in the source code to the SoX but it
  371. ** has a copyright which probably prevents it from being allowable as GPL/LGPL.
  372. */
  373. static
  374. int     tenbytefloat2int (unsigned char *bytes)
  375. {       int val = 3 ;
  376. if (bytes [0] & 0x80)   /* Negative number. */
  377. return 0 ;
  378. if (bytes [0] <= 0x3F)  /* Less than 1. */
  379. return 1 ;
  380. if (bytes [0] > 0x40)   /* Way too big. */
  381. return  0x4000000 ;
  382. if (bytes [0] == 0x40 && bytes [1] > 0x1C) /* Too big. */
  383. return 800000000 ;
  384. /* Ok, can handle it. */
  385. val = (bytes [2] << 23) | (bytes [3] << 15) | (bytes [4] << 7)  | (bytes [5] >> 1) ;
  386. val >>= (29 - bytes [1]) ;
  387. return val ;
  388. } /* tenbytefloat2int */
  389. static
  390. void uint2tenbytefloat (unsigned int num, unsigned char *bytes)
  391. { int count, mask = 0x40000000 ;
  392. memset (bytes, 0, 10) ;
  393. if (num <= 1)
  394. { bytes [0] = 0x3F ;
  395. bytes [1] = 0xFF ;
  396. bytes [2] = 0x80 ;
  397. return ;
  398. } ;
  399. bytes [0] = 0x40 ;
  400. if (num >= mask)
  401. { bytes [1] = 0x1D ;
  402. return ;
  403. } ;
  404. for (count = 0 ; count <= 32 ; count ++)
  405. { if (num & mask)
  406. break ;
  407. mask >>= 1 ;
  408. } ;
  409. num <<= count + 1 ;
  410. bytes [1] = 29 - count ;
  411. bytes [2] = (num >> 24) & 0xFF ;
  412. bytes [3] = (num >> 16) & 0xFF ;
  413. bytes [4] = (num >>  8) & 0xFF ;
  414. bytes [5] = num & 0xFF ;
  415. } /* uint2tenbytefloat */