interface.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:4k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include "mpg123.h"
  5. #include "mpglib.h"
  6. struct mpstr *gmp;
  7. extern int head_check(unsigned long head);
  8. /**
  9.  *
  10.  **/
  11. BOOL InitMP3 (struct mpstr *mp) 
  12. {
  13. static int init = 0;
  14. memset (mp, 0, sizeof (struct mpstr));
  15. mp->framesize = 0;
  16. mp->fsizeold = -1;
  17. mp->bsize = 0;
  18. mp->head = mp->tail = NULL;
  19. mp->fr.single = -1;
  20. mp->bsnum = 0;
  21. mp->synth_bo = 1;
  22. mp->tail = NULL;
  23. if (!init) {
  24. init = 1;
  25. make_decode_tables (32767);
  26. init_layer2 ();
  27. init_layer3 (SBLIMIT);
  28. }
  29. return 0;
  30. }
  31. /**
  32.  *
  33.  **/
  34. void ExitMP3 (struct mpstr *mp)
  35. {
  36. struct buf *b,*bn;
  37. b = mp->tail;
  38. while(b != NULL) {
  39. if(b->pnt != NULL) {
  40. free(b->pnt);
  41. }
  42. bn = b->next;
  43. free(b);
  44. b = bn;
  45. }
  46. mp->tail = NULL;
  47. }
  48. /**
  49.  *
  50.  **/
  51. static struct buf *addbuf (struct mpstr *mp,char *buf,int size)
  52. {
  53. struct buf *nbuf;
  54. if (!(nbuf = (struct buf *) new char[sizeof(struct buf)])) {
  55.   return NULL;
  56. }
  57. if (!(nbuf->pnt = (unsigned char *) new char[size])) {
  58. free (nbuf);
  59. return NULL;
  60. }
  61. nbuf->size = size;
  62. memcpy (nbuf->pnt,buf,size);
  63. nbuf->next = NULL;
  64. nbuf->prev = mp->head;
  65. nbuf->pos = 0;
  66. if(!mp->tail)
  67. mp->tail = nbuf;
  68. else
  69. mp->head->next = nbuf;
  70. mp->head = nbuf;
  71. mp->bsize += size;
  72. return nbuf;
  73. }
  74. /**
  75.  *
  76.  **/
  77. static void remove_buf(struct mpstr *mp)
  78. {
  79. struct buf *buf = mp->tail;
  80.   
  81. if ((mp->tail = buf->next))
  82. mp->tail->prev = NULL;
  83. else 
  84. mp->tail = mp->head = NULL;
  85.   
  86. free (buf->pnt);
  87. free (buf);
  88. }
  89. /**
  90.  *
  91.  **/
  92. static int _read_buf_byte (struct mpstr *mp)
  93. {
  94. unsigned int b;
  95. int pos;
  96. if(mp == NULL || mp->tail == NULL) {
  97.   return -1;
  98. }
  99. pos = mp->tail->pos;
  100. while (pos >= mp->tail->size) {
  101. remove_buf (mp);
  102. if(mp == NULL || mp->tail == NULL) {
  103.   return -1;
  104. }
  105. pos = mp->tail->pos;
  106. if (!mp->tail) {
  107.   return -1;
  108. }
  109. }
  110. b = mp->tail->pnt[pos];
  111. mp->bsize--;
  112. mp->tail->pos++;
  113. return b;
  114. }
  115. /**
  116.  *
  117.  **/
  118. static void read_head (struct mpstr *mp)
  119. {
  120.   uint32_t head;
  121.   head = _read_buf_byte (mp) & 0xFF;
  122.   mp->header <<= 8;
  123.   mp->header |= head;
  124. }
  125. /**
  126.  *
  127.  **/
  128. int decodeMP3(struct mpstr *mp,char *in,int isize,char *out,
  129. int osize,int *done)
  130. {
  131. int len;
  132. gmp = mp;
  133. if(osize < 4608) {
  134.   return MP3_ERR;
  135. }
  136. if(in  && !addbuf(mp, in, isize)) {
  137.   return MP3_ERR;
  138. }
  139. if (!mp->framesize) {
  140.   
  141.   if(mp->bsize < 4)
  142.     return MP3_NEED_MORE;
  143.   
  144.   read_head(mp);
  145.   
  146.   while(!head_check(mp->header)) {
  147.     read_head(mp);
  148.   }
  149.   if(decode_header(&mp->fr,mp->header) == -1) {
  150.     return MP3_ERR;
  151.   }
  152.   
  153.   mp->framesize = mp->fr.framesize;
  154. }
  155. if(mp->fr.framesize > mp->bsize)
  156. return MP3_NEED_MORE;
  157. wordpointer = mp->bsspace[mp->bsnum] + 512;
  158. mp->bsnum = (mp->bsnum + 1) & 0x1;
  159. bitindex = 0;
  160. len = 0;
  161. while (len < mp->framesize) {
  162. int nlen;
  163. int blen = mp->tail->size - mp->tail->pos;
  164. if ((mp->framesize - len) <= blen) {
  165. nlen = mp->framesize-len;
  166. } else {
  167. nlen = blen;
  168.                 }
  169. memcpy (wordpointer+len,mp->tail->pnt+mp->tail->pos,nlen);
  170.                 len += nlen;
  171.                 mp->tail->pos += nlen;
  172. mp->bsize -= nlen;
  173.                 if(mp->tail->pos == mp->tail->size)
  174.                    remove_buf(mp);
  175. }
  176. *done = 0;
  177. if(mp->fr.error_protection)
  178. getbits(16);
  179.         switch(mp->fr.lay) {
  180. case 1:
  181. do_layer1 (&mp->fr, (uint8_t *) out, done);
  182. break;
  183. case 2:
  184. do_layer2 (&mp->fr, (uint8_t *) out, done);
  185. break;
  186. case 3:
  187. do_layer3 (&mp->fr, (uint8_t *) out, done);
  188. break;
  189. }
  190. mp->fsizeold = mp->framesize;
  191. mp->framesize = 0;
  192. return MP3_OK;
  193. }
  194. /**
  195.  *
  196.  **/
  197. int set_pointer(long backstep)
  198. {
  199. uint8_t *bsbufold;
  200. if(gmp->fsizeold < 0 && backstep > 0) {
  201.   return MP3_ERR;
  202. }
  203. bsbufold = gmp->bsspace[gmp->bsnum] + 512;
  204. wordpointer -= backstep;
  205. if (backstep)
  206. memcpy(wordpointer,bsbufold+gmp->fsizeold-backstep,backstep);
  207. bitindex = 0;
  208. return MP3_OK;
  209. }