www.pudn.com > MyPlayerbylqh.rar > interface.cpp
#include#include #include #include "mpg123.h" #include "mpglib.h" struct mpstr *gmp; extern int head_check(unsigned long head); /** * **/ BOOL InitMP3 (struct mpstr *mp) { static int init = 0; memset (mp, 0, sizeof (struct mpstr)); mp->framesize = 0; mp->fsizeold = -1; mp->bsize = 0; mp->head = mp->tail = NULL; mp->fr.single = -1; mp->bsnum = 0; mp->synth_bo = 1; mp->tail = NULL; if (!init) { init = 1; make_decode_tables (32767); init_layer2 (); init_layer3 (SBLIMIT); } return 0; } /** * **/ void ExitMP3 (struct mpstr *mp) { struct buf *b,*bn; b = mp->tail; while(b != NULL) { if(b->pnt != NULL) { free(b->pnt); } bn = b->next; free(b); b = bn; } mp->tail = NULL; } /** * **/ static struct buf *addbuf (struct mpstr *mp,char *buf,int size) { struct buf *nbuf; if (!(nbuf = (struct buf *) new char[sizeof(struct buf)])) { return NULL; } if (!(nbuf->pnt = (unsigned char *) new char[size])) { free (nbuf); return NULL; } nbuf->size = size; memcpy (nbuf->pnt,buf,size); nbuf->next = NULL; nbuf->prev = mp->head; nbuf->pos = 0; if(!mp->tail) mp->tail = nbuf; else mp->head->next = nbuf; mp->head = nbuf; mp->bsize += size; return nbuf; } /** * **/ static void remove_buf(struct mpstr *mp) { struct buf *buf = mp->tail; if ((mp->tail = buf->next)) mp->tail->prev = NULL; else mp->tail = mp->head = NULL; free (buf->pnt); free (buf); } /** * **/ static int _read_buf_byte (struct mpstr *mp) { unsigned int b; int pos; if(mp == NULL || mp->tail == NULL) { return -1; } pos = mp->tail->pos; while (pos >= mp->tail->size) { remove_buf (mp); if(mp == NULL || mp->tail == NULL) { return -1; } pos = mp->tail->pos; if (!mp->tail) { return -1; } } b = mp->tail->pnt[pos]; mp->bsize--; mp->tail->pos++; return b; } /** * **/ static void read_head (struct mpstr *mp) { uint32_t head; head = _read_buf_byte (mp) & 0xFF; mp->header <<= 8; mp->header |= head; } /** * **/ int decodeMP3(struct mpstr *mp,char *in,int isize,char *out, int osize,int *done) { int len; gmp = mp; if(osize < 4608) { return MP3_ERR; } if(in && !addbuf(mp, in, isize)) { return MP3_ERR; } if (!mp->framesize) { if(mp->bsize < 4) return MP3_NEED_MORE; read_head(mp); while(!head_check(mp->header)) { read_head(mp); } if(decode_header(&mp->fr,mp->header) == -1) { return MP3_ERR; } mp->framesize = mp->fr.framesize; } if(mp->fr.framesize > mp->bsize) return MP3_NEED_MORE; wordpointer = mp->bsspace[mp->bsnum] + 512; mp->bsnum = (mp->bsnum + 1) & 0x1; bitindex = 0; len = 0; while (len < mp->framesize) { int nlen; int blen = mp->tail->size - mp->tail->pos; if ((mp->framesize - len) <= blen) { nlen = mp->framesize-len; } else { nlen = blen; } memcpy (wordpointer+len,mp->tail->pnt+mp->tail->pos,nlen); len += nlen; mp->tail->pos += nlen; mp->bsize -= nlen; if(mp->tail->pos == mp->tail->size) remove_buf(mp); } *done = 0; if(mp->fr.error_protection) getbits(16); switch(mp->fr.lay) { case 1: do_layer1 (&mp->fr, (uint8_t *) out, done); break; case 2: do_layer2 (&mp->fr, (uint8_t *) out, done); break; case 3: do_layer3 (&mp->fr, (uint8_t *) out, done); break; } mp->fsizeold = mp->framesize; mp->framesize = 0; return MP3_OK; } /** * **/ int set_pointer(long backstep) { uint8_t *bsbufold; if(gmp->fsizeold < 0 && backstep > 0) { return MP3_ERR; } bsbufold = gmp->bsspace[gmp->bsnum] + 512; wordpointer -= backstep; if (backstep) memcpy(wordpointer,bsbufold+gmp->fsizeold-backstep,backstep); bitindex = 0; return MP3_OK; }