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

流媒体/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 <fcntl.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #include "sndfile.h"
  24. #include "config.h"
  25. #include "sfendian.h"
  26. #include "common.h"
  27. #include "pcm.h"
  28. #include "au.h"
  29. #include "ulaw.h"
  30. #include "alaw.h"
  31. /*------------------------------------------------------------------------------
  32. ** Macros to handle big/little endian issues.
  33. */
  34. #if (CPU_IS_LITTLE_ENDIAN == 1)
  35. #define MAKE_MARKER(a,b,c,d) ((a)|((b)<<8)|((c)<<16)|((d)<<24))
  36. #elif (CPU_IS_BIG_ENDIAN == 1)
  37. #define MAKE_MARKER(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
  38. #else
  39. #error "Cannot determine endian-ness of processor."
  40. #endif
  41. #define DOTSND_MARKER (MAKE_MARKER ('.', 's', 'n', 'd')) 
  42. #define DNSDOT_MARKER (MAKE_MARKER ('d', 'n', 's', '.')) 
  43. /*------------------------------------------------------------------------------
  44. ** Known AU file encoding types.
  45. */
  46. enum
  47. { AU_ENCODING_ULAW_8 = 1, /* 8-bit u-law samples */
  48. AU_ENCODING_PCM_8 = 2, /* 8-bit linear samples */
  49. AU_ENCODING_PCM_16 = 3, /* 16-bit linear samples */
  50. AU_ENCODING_PCM_24 = 4, /* 24-bit linear samples */
  51. AU_ENCODING_PCM_32 = 5, /* 32-bit linear samples */
  52. AU_ENCODING_FLOAT = 6, /* floating-point samples */
  53. AU_ENCODING_DOUBLE = 7, /* double-precision float samples */
  54. AU_ENCODING_INDIRECT = 8, /* fragmented sampled data */
  55. AU_ENCODING_NESTED = 9, /* ? */
  56. AU_ENCODING_DSP_CORE = 10, /* DSP program */
  57. AU_ENCODING_DSP_DATA_8 = 11, /* 8-bit fixed-point samples */
  58. AU_ENCODING_DSP_DATA_16 = 12, /* 16-bit fixed-point samples */
  59. AU_ENCODING_DSP_DATA_24 = 13, /* 24-bit fixed-point samples */
  60. AU_ENCODING_DSP_DATA_32 = 14, /* 32-bit fixed-point samples */
  61. AU_ENCODING_DISPLAY = 16, /* non-audio display data */
  62. AU_ENCODING_MULAW_SQUELCH = 17, /* ? */
  63. AU_ENCODING_EMPHASIZED = 18, /* 16-bit linear with emphasis */
  64. AU_ENCODING_NEXT = 19, /* 16-bit linear with compression (NEXT) */
  65. AU_ENCODING_COMPRESSED_EMPHASIZED = 20, /* A combination of the two above */
  66. AU_ENCODING_DSP_COMMANDS = 21, /* Music Kit DSP commands */
  67. AU_ENCODING_DSP_COMMANDS_SAMPLES = 22, /* ? */
  68. AU_ENCODING_ADPCM_G721_32 = 23, /* G721 32 kbs ADPCM - 4 bits per sample. */
  69. AU_ENCODING_ADPCM_G722 = 24,
  70. AU_ENCODING_ADPCM_G723_24 = 25, /* G723 24 kbs ADPCM - 3 bits per sample. */
  71. AU_ENCODING_ADPCM_G723_5 = 26,
  72. AU_ENCODING_ALAW_8 = 27
  73. } ;
  74. /*------------------------------------------------------------------------------
  75. ** Typedefs.
  76. */
  77.  
  78. typedef struct
  79. { int dataoffset ;
  80. int datasize ;
  81. int encoding ;
  82.     int samplerate ;
  83.     int channels ;
  84. } AU_FMT ;
  85. /*------------------------------------------------------------------------------
  86. ** Private static functions.
  87. */
  88. static int au_close (SF_PRIVATE *psf) ;
  89. static int  get_encoding (unsigned int format, unsigned int bitwidth) ;
  90. static char*  get_encoding_str(int format) ;
  91. static void endswap_au_fmt (AU_FMT *pau_fmt) ;
  92. /*------------------------------------------------------------------------------
  93. ** Public functions.
  94. */
  95. int  au_open_read (SF_PRIVATE *psf)
  96. { AU_FMT au_fmt ;
  97. unsigned int marker, dword ;
  98. int big_endian_file, error = SFE_NO_ERROR ;
  99. /*or*/
  100. int force_open; 
  101. force_open = ((psf->sf.format & SF_FORMAT_SUBMASK) == SF_FORCE_OPEN)?1:0;
  102. /*end or*/
  103. fread (&marker, sizeof (marker), 1, psf->file) ;
  104. if (marker == DOTSND_MARKER)
  105. big_endian_file = 1 ;
  106. else if (marker == DNSDOT_MARKER)
  107. big_endian_file = 0 ;
  108. else
  109. return SFE_AU_NO_DOTSND ;
  110. psf_sprintf (psf, "%Dn", marker) ;
  111. fread (&au_fmt, sizeof (AU_FMT), 1, psf->file) ;
  112. if (CPU_IS_LITTLE_ENDIAN && big_endian_file)
  113. endswap_au_fmt (&au_fmt) ;
  114. else if (CPU_IS_BIG_ENDIAN && ! big_endian_file)
  115. endswap_au_fmt (&au_fmt) ;
  116. psf_sprintf (psf, "  Data Offset : %dn", au_fmt.dataoffset) ;
  117. if (au_fmt.dataoffset + au_fmt.datasize != psf->filelength)
  118. { dword = psf->filelength - au_fmt.dataoffset ;
  119. psf_sprintf (psf, "  Data Size   : %d (should be %d)n", au_fmt.datasize, dword) ;
  120. au_fmt.datasize = dword ;
  121. }
  122. else
  123. psf_sprintf (psf, "  Data Size   : %dn", au_fmt.datasize) ;
  124.   psf->dataoffset = au_fmt.dataoffset ;
  125. psf->datalength = psf->filelength - psf->dataoffset ;
  126.   psf->current  = 0 ;
  127. psf->endian   = big_endian_file ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
  128. psf->sf.seekable = SF_TRUE ;
  129.  
  130.   if (fseek (psf->file, psf->dataoffset, SEEK_SET))
  131. return SFE_BAD_SEEK ;
  132. psf->close = (func_close) au_close ;
  133. psf->sf.samplerate = au_fmt.samplerate ;
  134. psf->sf.channels  = au_fmt.channels ;
  135. /* Only fill in type major. */
  136. psf->sf.format = big_endian_file ? SF_FORMAT_AU : SF_FORMAT_AULE ;
  137. psf->sf.sections  = 1 ;
  138. psf_sprintf (psf, "  Encoding    : %d => %sn", au_fmt.encoding, get_encoding_str (au_fmt.encoding)) ;
  139. psf_sprintf (psf, "  Sample Rate : %dn", au_fmt.samplerate) ;
  140. psf_sprintf (psf, "  Channels    : %dn", au_fmt.channels) ;
  141. /*or*/
  142. if(force_open)
  143.     psf->sf.format_tag = au_fmt.encoding;
  144. /*end or*/
  145. switch (au_fmt.encoding)
  146. { case  AU_ENCODING_ULAW_8 :
  147. psf->sf.pcmbitwidth = 16 ; /* After decoding */
  148. psf->bytewidth    = 1 ; /* Before decoding */
  149. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  150. psf->sf.format |= SF_FORMAT_ULAW ;
  151. psf->read_short  = (func_short)  ulaw_read_ulaw2s ;
  152. psf->read_int    = (func_int)    ulaw_read_ulaw2i ;
  153. psf->read_double = (func_double) ulaw_read_ulaw2d ;
  154. break ;
  155. case  AU_ENCODING_PCM_8 :
  156. psf->sf.pcmbitwidth = 8 ;
  157. psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
  158. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  159. psf->sf.format |= SF_FORMAT_PCM ;
  160. psf->read_short  = (func_short)  pcm_read_sc2s ;
  161. psf->read_int    = (func_int)    pcm_read_sc2i ;
  162. psf->read_double = (func_double) pcm_read_sc2d ;
  163. break ;
  164. case  AU_ENCODING_PCM_16 :
  165. psf->sf.pcmbitwidth = 16 ;
  166. psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
  167. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  168. psf->sf.format |= SF_FORMAT_PCM ;
  169. if (big_endian_file)
  170. { psf->read_short  = (func_short)  pcm_read_bes2s ;
  171. psf->read_int    = (func_int)    pcm_read_bes2i ;
  172. psf->read_double = (func_double) pcm_read_bes2d ;
  173. }
  174. else
  175. { psf->read_short  = (func_short)  pcm_read_les2s ;
  176. psf->read_int    = (func_int)    pcm_read_les2i ;
  177. psf->read_double = (func_double) pcm_read_les2d ;
  178. } ;
  179. break ;
  180. case  AU_ENCODING_PCM_24 :
  181. psf->sf.pcmbitwidth = 24 ;
  182. psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
  183. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  184. psf->sf.format |= SF_FORMAT_PCM ;
  185. if (big_endian_file)
  186. { psf->read_short  = (func_short)  pcm_read_bet2s ;
  187. psf->read_int    = (func_int)    pcm_read_bet2i ;
  188. psf->read_double = (func_double) pcm_read_bet2d ;
  189. }
  190. else
  191. { psf->read_short  = (func_short)  pcm_read_let2s ;
  192. psf->read_int    = (func_int)    pcm_read_let2i ;
  193. psf->read_double = (func_double) pcm_read_let2d ;
  194. } ;
  195. break ;
  196. case  AU_ENCODING_PCM_32 :
  197. psf->sf.pcmbitwidth = 32 ;
  198. psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
  199. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  200. psf->sf.format |= SF_FORMAT_PCM ;
  201. if (big_endian_file)
  202. { psf->read_short  = (func_short)  pcm_read_bei2s ;
  203. psf->read_int    = (func_int)    pcm_read_bei2i ;
  204. psf->read_double = (func_double) pcm_read_bei2d ;
  205. }
  206. else
  207. { psf->read_short  = (func_short)  pcm_read_lei2s ;
  208. psf->read_int    = (func_int)    pcm_read_lei2i ;
  209. psf->read_double = (func_double) pcm_read_lei2d ;
  210. } ;
  211. break ;
  212. case  AU_ENCODING_ALAW_8 :
  213. psf->sf.pcmbitwidth = 16 ; /* After decoding */
  214. psf->bytewidth    = 1 ; /* Before decoding */
  215. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  216. psf->sf.format |= SF_FORMAT_ALAW ;
  217. psf->read_short  = (func_short)  alaw_read_alaw2s ;
  218. psf->read_int    = (func_int)    alaw_read_alaw2i ;
  219. psf->read_double = (func_double) alaw_read_alaw2d ;
  220. break ;
  221. case  AU_ENCODING_ADPCM_G721_32 :  /* G721 32kbs ADPCM */
  222. if (psf->sf.channels != 1)
  223. { psf_sprintf (psf, "Channels != 1n") ;
  224. break ;
  225. } ;
  226. psf->sf.pcmbitwidth = 16 ; /* After decoding */
  227. psf->sf.format |= SF_FORMAT_G721_32 ;
  228. error = au_g72x_reader_init (psf, AU_H_G721_32) ;
  229. psf->sf.seekable = SF_FALSE ;
  230. break ;
  231. case  AU_ENCODING_ADPCM_G723_24 :  /* G723 24kbs ADPCM */
  232. if (psf->sf.channels != 1)
  233. { psf_sprintf (psf, "Channels != 1n") ;
  234. break ;
  235. } ;
  236. psf->sf.pcmbitwidth = 16 ; /* After decoding */
  237. psf->sf.format |= SF_FORMAT_G723_24 ;
  238. error = au_g72x_reader_init (psf, AU_H_G723_24) ;
  239. psf->sf.seekable = SF_FALSE ;
  240. break ;
  241. case  AU_ENCODING_NEXT :
  242. error = SFE_AU_UNKNOWN_FORMAT ;
  243. break ;
  244. default : 
  245. error = SFE_AU_UNKNOWN_FORMAT ;
  246. break ;
  247. } ;
  248. if (error)
  249. {
  250.     //or
  251.     if(force_open)
  252.     {
  253. error=SFE_NO_ERROR;
  254. psf->sf.format |= SF_FORCE_OPEN ;
  255.     
  256.     }
  257.     else
  258.     //end or
  259. return error ;
  260. }
  261. if (! psf->sf.samples && psf->blockwidth)
  262. psf->sf.samples = au_fmt.datasize / psf->blockwidth ;
  263. return 0 ;
  264. } /* au_open_read */
  265. /*------------------------------------------------------------------------------
  266. */
  267. int  au_nh_open_read (SF_PRIVATE *psf)
  268. { if (fseek (psf->file, psf->dataoffset, SEEK_SET))
  269. return SFE_BAD_SEEK ;
  270. psf_sprintf (psf, "Setting up for 8kHz, mono, u-law.n") ;
  271. psf->sf.format = SF_FORMAT_AU | SF_FORMAT_ULAW ;
  272.   psf->dataoffset = 0 ;
  273.   psf->current  = 0 ;
  274. psf->endian   = 0 ;  /* Irrelevant but it must be something. */
  275. psf->sf.seekable = SF_TRUE ;
  276. psf->sf.samplerate = 8000 ;
  277. psf->sf.channels  = 1 ;
  278. psf->sf.sections  = 1 ;
  279. psf->sf.pcmbitwidth = 16 ; /* After decoding */
  280. psf->bytewidth    = 1 ; /* Before decoding */
  281. psf->read_short  = (func_short)  ulaw_read_ulaw2s ;
  282. psf->read_int    = (func_int)    ulaw_read_ulaw2i ;
  283. psf->read_double = (func_double) ulaw_read_ulaw2d ;
  284. psf->close       = (func_close)  au_close ;
  285. psf->blockwidth = 1 ;
  286. psf->sf.samples = psf->filelength ;
  287. psf->datalength = psf->filelength ;
  288. return 0 ;
  289. } /* au_open_read */
  290. /*------------------------------------------------------------------------------
  291. */
  292. int  au_open_write (SF_PRIVATE *psf)
  293. { AU_FMT au_fmt ;
  294. unsigned int dword, encoding, format, subformat, big_endian_file ;
  295. int error = 0 ;
  296. format = psf->sf.format & SF_FORMAT_TYPEMASK ;
  297. subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
  298. if (format == SF_FORMAT_AU)
  299. big_endian_file = 1 ;
  300. else if (format == SF_FORMAT_AULE)
  301. big_endian_file = 0 ;
  302. else
  303. return SFE_BAD_OPEN_FORMAT ;
  304. if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW || 
  305. subformat == SF_FORMAT_G721_32 || subformat == SF_FORMAT_G723_24)
  306. psf->bytewidth = 1 ;
  307. else
  308. //or
  309.     if(subformat == SF_FORCE_OPEN)
  310. psf->bytewidth = psf->sf.bytewidth;
  311.     else
  312. //end or    
  313. psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
  314. psf->endian      = big_endian_file ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
  315. psf->sf.seekable = SF_TRUE ;
  316. psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
  317.   psf->dataoffset  = 6 * sizeof (dword) ;
  318. psf->datalength  = psf->blockwidth * psf->sf.samples ;
  319. psf->filelength  = psf->datalength + psf->dataoffset ;
  320. psf->error       = 0 ;
  321. //or
  322. if(subformat == SF_FORCE_OPEN)
  323.     encoding=psf->sf.format_tag;
  324. else
  325. //end or
  326.     encoding = get_encoding (subformat, psf->bytewidth * 8) ;
  327.     
  328. if (! encoding)
  329. return SFE_BAD_OPEN_FORMAT ;
  330. au_fmt.dataoffset = 24 ;
  331. au_fmt.datasize   = psf->datalength ;
  332. au_fmt.encoding   = encoding ;
  333. au_fmt.samplerate = psf->sf.samplerate ;
  334. au_fmt.channels   = psf->sf.channels ;
  335. if (CPU_IS_LITTLE_ENDIAN && big_endian_file)
  336. endswap_au_fmt (&au_fmt) ;
  337. else if (CPU_IS_BIG_ENDIAN && ! big_endian_file)
  338. endswap_au_fmt (&au_fmt) ;
  339. dword = big_endian_file ? DOTSND_MARKER : DNSDOT_MARKER ; /* Marker */
  340. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  341. fwrite (&au_fmt, sizeof (AU_FMT), 1, psf->file) ;
  342. psf->close = (func_close) au_close ;
  343. switch (encoding)
  344. { case  AU_ENCODING_ULAW_8 : /* 8-bit Ulaw encoding. */
  345. psf->write_short  = (func_short)  ulaw_write_s2ulaw ;
  346. psf->write_int    = (func_int)    ulaw_write_i2ulaw ;
  347. psf->write_double = (func_double) ulaw_write_d2ulaw ;
  348. break ;
  349. case  AU_ENCODING_PCM_8 : /* 8-bit linear PCM. */
  350. psf->write_short  = (func_short)  pcm_write_s2sc ;
  351. psf->write_int    = (func_int)    pcm_write_i2sc ;
  352. psf->write_double = (func_double) pcm_write_d2sc ;
  353. break ;
  354. case  AU_ENCODING_PCM_16 : /* 16-bit linear PCM. */
  355. if (big_endian_file)
  356. { psf->write_short  = (func_short)  pcm_write_s2bes ;
  357. psf->write_int    = (func_int)    pcm_write_i2bes ;
  358. psf->write_double = (func_double) pcm_write_d2bes ;
  359. }
  360. else
  361. { psf->write_short  = (func_short)  pcm_write_s2les ;
  362. psf->write_int    = (func_int)    pcm_write_i2les ;
  363. psf->write_double = (func_double) pcm_write_d2les ;
  364. } ;
  365. break ;
  366. case  AU_ENCODING_PCM_24 : /* 24-bit linear PCM */
  367. if (big_endian_file)
  368. { psf->write_short  = (func_short)  pcm_write_s2bet ;
  369. psf->write_int    = (func_int)    pcm_write_i2bet ;
  370. psf->write_double = (func_double) pcm_write_d2bet ;
  371. }
  372. else
  373. { psf->write_short  = (func_short)  pcm_write_s2let ;
  374. psf->write_int    = (func_int)    pcm_write_i2let ;
  375. psf->write_double = (func_double) pcm_write_d2let ;
  376. } ;
  377. break ;
  378. case  AU_ENCODING_PCM_32 : /* 32-bit linear PCM. */
  379. if (big_endian_file)
  380. { psf->write_short  = (func_short)  pcm_write_s2bei ;
  381. psf->write_int    = (func_int)    pcm_write_i2bei ;
  382. psf->write_double = (func_double) pcm_write_d2bei ;
  383. }
  384. else
  385. { psf->write_short  = (func_short)  pcm_write_s2lei ;
  386. psf->write_int    = (func_int)    pcm_write_i2lei ;
  387. psf->write_double = (func_double) pcm_write_d2lei ;
  388. } ;
  389. break ;
  390. case  AU_ENCODING_ALAW_8 : /* 8-bit Alaw encoding. */
  391. psf->write_short  = (func_short)  alaw_write_s2alaw ;
  392. psf->write_int    = (func_int)    alaw_write_i2alaw ;
  393. psf->write_double = (func_double) alaw_write_d2alaw ;
  394. break ;
  395. case  AU_ENCODING_ADPCM_G721_32 :  
  396. if (psf->sf.channels != 1)
  397. { psf_sprintf (psf, "Channels != 1n") ;
  398. break ;
  399. } ;
  400. psf->sf.pcmbitwidth = 16 ; /* After decoding */
  401. psf->bytewidth    = 0 ;
  402. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  403. psf->sf.format |= SF_FORMAT_G721_32 ;
  404. error = au_g72x_writer_init (psf, AU_H_G721_32) ;
  405. break ;
  406. case  AU_ENCODING_ADPCM_G723_24 :  
  407. if (psf->sf.channels != 1)
  408. { psf_sprintf (psf, "Channels != 1n") ;
  409. break ;
  410. } ;
  411. psf->sf.pcmbitwidth = 16 ; /* After decoding */
  412. psf->bytewidth    = 0 ;
  413. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  414. psf->sf.format |= SF_FORMAT_G721_32 ;
  415. error = au_g72x_writer_init (psf, AU_H_G723_24) ;
  416. break ;
  417. default :   break ;
  418. } ;
  419. return error ;
  420. } /* au_open_write */
  421. /*------------------------------------------------------------------------------
  422. */
  423. int au_close (SF_PRIVATE  *psf)
  424. { unsigned int dword ;
  425. if (psf->mode == SF_MODE_WRITE)
  426. { /*  Now we know for certain the length of the file we can
  427.  *  re-write correct values for the datasize header element.
  428.  */
  429. fseek (psf->file, 0, SEEK_END) ;
  430. psf->filelength = ftell (psf->file) ;
  431. psf->datalength = psf->filelength - psf->dataoffset ;
  432. fseek (psf->file, 2 * sizeof (dword), SEEK_SET) ;
  433. if (psf->endian == SF_ENDIAN_BIG)
  434. dword = H2BE_INT (psf->datalength) ;
  435. else if (psf->endian == SF_ENDIAN_LITTLE)
  436. dword = H2LE_INT (psf->datalength) ;
  437. else
  438. dword = 0xFFFFFFFF ;
  439. fwrite (&dword, sizeof (dword), 1, psf->file) ;
  440. } ;
  441. if (psf->fdata)
  442. free (psf->fdata) ;
  443. psf->fdata = NULL ;
  444. return 0 ;
  445. } /* au_close */
  446. static
  447. int get_encoding (unsigned int format, unsigned int bitwidth)
  448. { if (format == SF_FORMAT_ULAW)
  449. return AU_ENCODING_ULAW_8 ;
  450. if (format == SF_FORMAT_ALAW)
  451. return AU_ENCODING_ALAW_8 ;
  452. if (format == SF_FORMAT_G721_32)
  453. return AU_ENCODING_ADPCM_G721_32 ;
  454. if (format == SF_FORMAT_G723_24)
  455. return AU_ENCODING_ADPCM_G723_24 ;
  456. if (format != SF_FORMAT_PCM)
  457. return 0 ;
  458. /* For PCM encoding, the header encoding field depends on the bitwidth. */
  459. switch (bitwidth)
  460. { case 8  : return AU_ENCODING_PCM_8 ;
  461. case 16 : return AU_ENCODING_PCM_16 ;
  462. case 24 : return AU_ENCODING_PCM_24 ;
  463. case 32 : return AU_ENCODING_PCM_32 ;
  464. default : break ;
  465. } ;
  466. return 0 ;
  467. } /* get encoding */
  468. static
  469. void endswap_au_fmt (AU_FMT *pau_fmt)
  470. { pau_fmt->dataoffset = ENDSWAP_INT (pau_fmt->dataoffset) ;
  471. pau_fmt->datasize   = ENDSWAP_INT (pau_fmt->datasize) ;
  472. pau_fmt->encoding   = ENDSWAP_INT (pau_fmt->encoding) ;
  473.     pau_fmt->samplerate = ENDSWAP_INT (pau_fmt->samplerate) ;
  474.     pau_fmt->channels   = ENDSWAP_INT (pau_fmt->channels) ;
  475. } /* endswap_au_fmt */
  476. static
  477. char* get_encoding_str (int format)
  478. { switch (format)
  479. { case  AU_ENCODING_ULAW_8 :
  480. return "8-bit ISDN u-law" ;
  481. case  AU_ENCODING_PCM_8 :
  482. return "8-bit linear PCM" ;
  483. case  AU_ENCODING_PCM_16 :
  484. return "16-bit linear PCM" ;
  485. case  AU_ENCODING_PCM_24 :
  486. return "24-bit linear PCM" ;
  487. case  AU_ENCODING_PCM_32 :
  488. return "32-bit linear PCM" ;
  489. case  AU_ENCODING_ALAW_8 :
  490. return "8-bit ISDN A-law" ;
  491. case  AU_ENCODING_ADPCM_G721_32 :  
  492. return "G721 32kbs ADPCM" ;
  493. case  AU_ENCODING_ADPCM_G723_24 :  
  494. return "G723 24kbs ADPCM" ;
  495. case  AU_ENCODING_NEXT :
  496. return "Weird NeXT encoding format (unsupported)" ;
  497. } ;
  498. return "Unknown!!" ;
  499. } /* get_encoding_str */