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

流媒体/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 "ulaw.h"
  29. #include "alaw.h"
  30. /*------------------------------------------------------------------------------
  31. ** Private static functions.
  32. */
  33. /*------------------------------------------------------------------------------
  34. ** Public functions.
  35. */
  36. int  raw_open_read (SF_PRIVATE *psf)
  37. { unsigned int subformat ;
  38. //if(! psf->sf.channels || ! psf->sf.pcmbitwidth)
  39. // return SFE_RAW_READ_BAD_SPEC ;
  40. subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
  41. //or
  42. if(! psf->sf.channels || 
  43.    ( (subformat != SF_FORMAT_ULAW && subformat != SF_FORMAT_ALAW) && ! psf->sf.pcmbitwidth ) )
  44.     return SFE_RAW_READ_BAD_SPEC ;
  45. if (subformat == SF_FORMAT_PCM_BE)
  46. psf->endian = SF_ENDIAN_BIG ;
  47. else if (subformat == SF_FORMAT_PCM_LE)
  48. psf->endian = SF_ENDIAN_LITTLE ;
  49. else if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_U8)
  50. psf->endian = 0 ;
  51. else if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW ) //or
  52. psf->endian = 0 ;                                             //or
  53. else
  54. return SFE_RAW_READ_BAD_SPEC ;
  55. psf->sf.seekable = SF_TRUE ;
  56.  
  57. psf->sf.sections = 1 ;
  58. //or
  59. if(subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW )
  60. {
  61. if(subformat == SF_FORMAT_ULAW)
  62. {
  63. psf->read_short  = (func_short)  ulaw_read_ulaw2s ;
  64. psf->read_int    = (func_int)    ulaw_read_ulaw2i ;
  65. psf->read_double = (func_double) ulaw_read_ulaw2d ;
  66. }
  67. else if(subformat == SF_FORMAT_ALAW)
  68. {
  69. psf->read_short  = (func_short)  alaw_read_alaw2s ;
  70. psf->read_int    = (func_int)    alaw_read_alaw2i ;
  71. psf->read_double = (func_double) alaw_read_alaw2d ;
  72. }
  73. psf->sf.pcmbitwidth = 16 ; /* After decoding */
  74. psf->bytewidth      = 1 ; /* Before decoding */
  75. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  76. psf->dataoffset = 0 ;
  77. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  78. if (psf->blockwidth)
  79. psf->sf.samples = psf->filelength / psf->blockwidth ;
  80.   psf->datalength = psf->filelength - psf->dataoffset ;
  81.   psf->current  = 0 ;
  82.     return 0 ;
  83. }
  84. switch (psf->sf.pcmbitwidth)
  85. { case   8 : if (subformat == SF_FORMAT_PCM_S8)
  86. { psf->read_short  = (func_short)  pcm_read_sc2s ;
  87. psf->read_int    = (func_int)    pcm_read_sc2i ;
  88. psf->read_double = (func_double) pcm_read_sc2d ;
  89.    }
  90. else if (subformat == SF_FORMAT_PCM_U8)
  91. { psf->read_short  = (func_short)  pcm_read_uc2s ;
  92. psf->read_int    = (func_int)    pcm_read_uc2i ;
  93. psf->read_double = (func_double) pcm_read_uc2d ;
  94.    }
  95. break ;
  96. case  16 : if (subformat == SF_FORMAT_PCM_BE)
  97. { psf->read_short  = (func_short)  pcm_read_bes2s ;
  98. psf->read_int    = (func_int)    pcm_read_bes2i ;
  99. psf->read_double = (func_double) pcm_read_bes2d ;
  100. }
  101. else
  102. { psf->read_short  = (func_short)  pcm_read_les2s ;
  103. psf->read_int    = (func_int)    pcm_read_les2i ;
  104. psf->read_double = (func_double) pcm_read_les2d ;
  105. } ;
  106. break ;
  107. case  24 : if (subformat == SF_FORMAT_PCM_BE)
  108. { psf->read_short  = (func_short)  pcm_read_bet2s ;
  109. psf->read_int    = (func_int)    pcm_read_bet2i ;
  110. psf->read_double = (func_double) pcm_read_bet2d ;
  111. }
  112. else
  113. { psf->read_short  = (func_short)  pcm_read_let2s ;
  114. psf->read_int    = (func_int)    pcm_read_let2i ;
  115. psf->read_double = (func_double) pcm_read_let2d ;
  116. } ;
  117. break ;
  118. case  32 : if (subformat == SF_FORMAT_PCM_BE)
  119. { psf->read_short  = (func_short)  pcm_read_bei2s ;
  120. psf->read_int    = (func_int)    pcm_read_bei2i ;
  121. psf->read_double = (func_double) pcm_read_bei2d ;
  122. }
  123. else
  124. { psf->read_short  = (func_short)  pcm_read_lei2s ;
  125. psf->read_int    = (func_int)    pcm_read_lei2i ;
  126. psf->read_double = (func_double) pcm_read_lei2d ;
  127. } ;
  128. break ;
  129. default :   return SFE_RAW_BAD_BITWIDTH ;
  130. break ;
  131. } ;
  132. psf->dataoffset = 0 ;
  133. psf->bytewidth  = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
  134. psf->blockwidth = psf->sf.channels * psf->bytewidth ;
  135. if (psf->blockwidth)
  136. psf->sf.samples = psf->filelength / psf->blockwidth ;
  137.   psf->datalength = psf->filelength - psf->dataoffset ;
  138.   psf->current  = 0 ;
  139. return 0 ;
  140. } /* raw_open_read */
  141. /*------------------------------------------------------------------------------
  142. */
  143. int  raw_open_write (SF_PRIVATE *psf)
  144. { unsigned int subformat, big_endian_file ;
  145. subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
  146. if (subformat == SF_FORMAT_PCM_BE)
  147. big_endian_file = 1 ;
  148. else if (subformat == SF_FORMAT_PCM_LE)
  149. big_endian_file = 0 ;
  150. else if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_U8)
  151. big_endian_file = 0 ;
  152. else if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW ) //or
  153. big_endian_file = 0 ;                                         //or
  154. else
  155. return SFE_BAD_OPEN_FORMAT ;
  156. if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW ) //or
  157. {
  158.     psf->sf.pcmbitwidth = 16 ; /* After decoding */
  159.     psf->bytewidth      = 1 ; /* Before decoding */
  160. }
  161. else
  162.     psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
  163. psf->endian      = big_endian_file ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
  164. psf->sf.seekable = SF_TRUE ;
  165. psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
  166.   psf->dataoffset  = 0 ;
  167. psf->datalength  = psf->blockwidth * psf->sf.samples ;
  168. psf->filelength  = psf->datalength ;
  169. psf->error       = 0 ;
  170. //or
  171. if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW ) //or
  172. {
  173. if(subformat == SF_FORMAT_ULAW)
  174. {
  175. psf->write_short  = (func_short)  ulaw_write_s2ulaw ;
  176. psf->write_int    = (func_int)    ulaw_write_i2ulaw ;
  177. psf->write_double = (func_double) ulaw_write_d2ulaw ;
  178. }
  179. else if(subformat == SF_FORMAT_ALAW)
  180. {
  181. psf->write_short  = (func_short)  alaw_write_s2alaw ;
  182. psf->write_int    = (func_int)    alaw_write_i2alaw ;
  183. psf->write_double = (func_double) alaw_write_d2alaw ;
  184. }
  185.     return 0 ;
  186. }
  187. switch (psf->sf.pcmbitwidth)
  188. { case   8 : if (subformat == SF_FORMAT_PCM_S8)
  189. { psf->write_short  = (func_short)  pcm_write_s2sc ;
  190. psf->write_int    = (func_int)    pcm_write_i2sc ;
  191. psf->write_double = (func_double) pcm_write_d2sc ;
  192.    }
  193. else if (subformat == SF_FORMAT_PCM_U8)
  194. { psf->write_short  = (func_short)  pcm_write_s2uc ;
  195. psf->write_int    = (func_int)    pcm_write_i2uc ;
  196. psf->write_double = (func_double) pcm_write_d2uc ;
  197.    }
  198. break ;
  199. case  16 : if (big_endian_file)
  200. { psf->write_short  = (func_short)  pcm_write_s2bes ;
  201. psf->write_int    = (func_int)    pcm_write_i2bes ;
  202. psf->write_double = (func_double) pcm_write_d2bes ;
  203. }
  204. else
  205. { psf->write_short  = (func_short)  pcm_write_s2les ;
  206. psf->write_int    = (func_int)    pcm_write_i2les ;
  207. psf->write_double = (func_double) pcm_write_d2les ;
  208. } ;
  209. break ;
  210. case  24 : if (big_endian_file)
  211. { psf->write_short  = (func_short)  pcm_write_s2bet ;
  212. psf->write_int    = (func_int)    pcm_write_i2bet ;
  213. psf->write_double = (func_double) pcm_write_d2bet ;
  214. }
  215. else
  216. { psf->write_short  = (func_short)  pcm_write_s2let ;
  217. psf->write_int    = (func_int)    pcm_write_i2let ;
  218. psf->write_double = (func_double) pcm_write_d2let ;
  219. } ;
  220. break ;
  221. case  32 : if (big_endian_file)
  222. { psf->write_short  = (func_short)  pcm_write_s2bei ;
  223. psf->write_int    = (func_int)    pcm_write_i2bei ;
  224. psf->write_double = (func_double) pcm_write_d2bei ;
  225. }
  226. else
  227. { psf->write_short  = (func_short)  pcm_write_s2lei ;
  228. psf->write_int    = (func_int)    pcm_write_i2lei ;
  229. psf->write_double = (func_double) pcm_write_d2lei ;
  230. } ;
  231. break ;
  232. default :   return SFE_BAD_OPEN_FORMAT ;
  233. } ;
  234. return 0 ;
  235. } /* raw_open_write */
  236. /*------------------------------------------------------------------------------
  237. */
  238. /*==============================================================================
  239. */