⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interface.cpp

📁 VC++视频开发实例集锦(包括“远程视频监控”"语音识别系统"等13个经典例子)
💻 CPP
字号:

#include <stdlib.h>
#include <stdio.h>

#include <windows.h>

#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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -