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

📄 mp3svr.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********************************************************
 *  mp3svr v1.0
 *  programming by huaxifeng
 *
 *  modify by DSA	
 * 
 *  2004/09/01
 **********************************************************/
#include <stdio.h>
#include <stdlib.h>   //it is differ from template
#include <string.h>

#include "disp.h"
#include "bitmap.h"
#include "picture.h"
#include "asixapp.h"
//*****************************************for mp3
#include "HA_typedef.h"
#include "hardware.h"
#include "hardware_reg.h" 
#include "HA_AC97.h"
#include "mpg123.h"
#include "mpglib.h"
#include "FAL.h"
#include "mp3.h"


/*follow maybe modified by in fact music*/
#define FAST_FRAME  200
#define DEC_SIZE	1024*1200//1024*1024
#define ENCBUF1SIZE	13000
#define ENCBUF2SIZE	140000

extern int ii;
extern unsigned int outbyte;
extern int mp3_music_mum;
extern int volume;
extern char *	mp3_name;
extern char v_volume_level ;


extern U32 config_flag;
extern U32	play_flag;


char encbuf1[ENCBUF1SIZE];
char encbuf2[ENCBUF2SIZE];
char encbuf3[ENCBUF1SIZE];
char *encbuf;
char decbuf[DEC_SIZE];
int base;

short frame10[BUFFRAMENUM];
int frame11[BUFFRAMENUM];
DWORD	mp3_server_stk[MP3SVR_STACK_SIZE];

int d[200];


void Mp3Server( void );


TASKDESCRIPTION Mp3ServerDesp = 
{"mp3_server",	ASIX_SERVICE,	NOT_IN_ANYGROUP,	NULL,		4096,	0,	0,	0,	Mp3Server,	MP3_PRI};


TASKDESCRIPTIONLIST	Mp3tServerDespLst =
{NULL,	NULL,	&Mp3ServerDesp, MP3SERVER_ID, mp3_server_stk};


unsigned char Get_tagv2_st(FAL_FILE mp3_fp)		//确定文件是否有Tagv2
{
	unsigned char tagv2_st=0,i;
	char idp[4];
	TAGV2_HEAD tagv2_hd;
	
	NU_Seek( mp3_fp,0,PSEEK_SET );
	NU_Read(mp3_fp,&tagv2_hd,sizeof(TAGV2_HEAD));	
	
	for(i=0;i<4;i++)
		idp[i]=tagv2_hd.tag_id[i];
	idp[3]='\0';	
	
	if(strcmp(idp,"ID3")==0 )
		tagv2_st=1;
		
	return tagv2_st;
}




unsigned char Handle_tagv2_frame(FAL_FILE  mp3_fp)			//处理Tagv2的帧数据
{
	
	char * bodyp;
	unsigned long cnt=0,tagv2_size=0,body_size=0,i;
	TAGV2_HEAD * tagv2p;
	TAGV2_FRAME_HEAD * frame_hdp;


		
	if( Get_tagv2_st(mp3_fp) )
	{
		tagv2p = (TAGV2_HEAD *)malloc(sizeof(TAGV2_HEAD));
		if(tagv2p==NULL)
			return 0;
			
		NU_Seek( mp3_fp,0,PSEEK_SET );
		NU_Read(mp3_fp,tagv2p,sizeof(TAGV2_HEAD));
		
		for(i=0;i<4;i++)
		{
			tagv2_size |= (tagv2p->tagv2_size[i]<<(3-i)*8);
		}
		
		cnt = 0;
		/*申请帧头空间*/
		frame_hdp = (TAGV2_FRAME_HEAD *)malloc( sizeof(TAGV2_FRAME_HEAD) );
		if(frame_hdp==NULL)
			return 0;
				
		while(tagv2_size)
		{
			
			/*读取帧头数据,打印帧标识符*/	
			NU_Read(mp3_fp,frame_hdp,sizeof(TAGV2_FRAME_HEAD));
			printf("Frame%d is %s:",cnt,frame_hdp->frame_id);
			
			/*转换body尺寸数据*/
			for(i=0;i<4;i++)
				body_size |= ( frame_hdp->body_size[i]<<(3-i)*8 );
			
			/*申请body空间*/
			bodyp = (char *)malloc(body_size);
			if(bodyp==NULL)
				return 0;
			memset(bodyp,body_size,0);
				
			/*读取body数据并打印*/	
			NU_Seek( mp3_fp,1,SEEK_CUR );
			NU_Read(mp3_fp,bodyp,body_size-1);
			*(bodyp+body_size-1) = '\0';
			printf("%s\n",bodyp);
			
			/*总帧数据尺寸自减,释放body空间*/
			tagv2_size -= (body_size+10);
			body_size = 0;
			cnt++;
			if(bodyp!=NULL)
				free(bodyp);
			
		}
		
			
		/*释放帧头空间*/
		if(frame_hdp!=NULL)
			free(frame_hdp);		
			
		return 1;
	}
	else
	{
		printf("No tagv2 in this MP3 file!\n");
		return 0;
	}

}



unsigned long Skip_tagv2(FAL_FILE  mp3_fp)		//获取Tagv2大小(包括音频数据帧前的填充数据)
{
	unsigned long tagv2_size=0,tmp,tmp32=0;
	ID3_TAGV2 * tagv2p;
	char  hdp[4];
	unsigned find_flag=0;
	int i;
	
	tagv2p = (ID3_TAGV2 *)malloc(sizeof(ID3_TAGV2));
	if(tagv2p==NULL)
		return 0;
		
	NU_Read(mp3_fp,tagv2p,sizeof(ID3_TAGV2));
	
	for(i=0;i<3;i++)
		hdp[i]=tagv2p->tagv2_hd.tag_id[i];
	hdp[3]='\0';
		
	
	if(strcmp(hdp,"ID3")!=0 )
	{	
		NU_Seek( mp3_fp,-(sizeof(ID3_TAGV2)),PSEEK_CUR );
		tmp=0;
		NU_Read(mp3_fp,&tmp,1);
		while( !find_flag )
		{
			if( tmp==0xff )
			{
				NU_Read(mp3_fp,&tmp,1);
				if( (tmp&0xf0)==0xf0 )
				{
					find_flag=1;
					break;
				}
				else
					NU_Seek(mp3_fp,-1,PSEEK_CUR);	
			}
			tagv2_size ++;
			NU_Read(mp3_fp,&tmp,1);				
		}
		return tagv2_size;
		
	}
	
	for(i=0;i<4;i++)
	{
		tmp = tagv2p->tagv2_hd.tagv2_size[3-i];
		tmp32 |= tmp<<8*i;
	}	 

	/*tmp = tmp32&0x7f;
	tmp |= (tmp32>>1)&0x80;
	
	tmp |= (tmp32>>1)&0x3f00;
	tmp |= (tmp32>>2)&0xc000;
	
	tmp |= (tmp32>>2)&0x1f0000;
	tmp |= (tmp32>>3)&0xe00000;
	
	tmp |= (tmp32>>3)&0x0f000000;*/
	
	tagv2_size = tmp32+10;
	NU_Seek(mp3_fp,tagv2_size,PSEEK_SET);
	
	NU_Read(mp3_fp,&tmp,1);
	while( !find_flag )
	{
		if( tmp==0xff )
		{
			NU_Read(mp3_fp,&tmp,1);
			if( (tmp&0xf0)==0xf0 )
			{
				find_flag=1;
				break;
			}
			else
				NU_Seek(mp3_fp,-1,PSEEK_CUR);	
		}
			tagv2_size ++;
			NU_Read(mp3_fp,&tmp,1);				
	}
	/*while( (tmp&0xff)!=0xff )
	{	
		tagv2_size++;
		fread(&tmp,1,1,mp3_fp);
	}*/
	free(tagv2p);
	return tagv2_size;
	
}


/*calculate the source size/per frame*/
//static int sizeperframe( char *filename){
static int sizeperframe(FAL_FILE fd1){
	int size;
	int bitrate, samplerate,pad;
	unsigned char framehead[4];
	unsigned int temp;
	//FAL_FILE 		fd1;

	//fd1 = NU_Open(filename, PO_RDWR|PO_CREAT, FAL_IWRITE|FAL_IREAD);
	NU_Read( fd1,framehead, 4 );
	//NU_Close(fd1);
	
	temp = framehead[2]&0xF0;
	if(temp == 0x00000010)
		bitrate = 32000;
	else if(temp == 0x00000020)
		bitrate = 40000;
	else if(temp == 0x00000030)
		bitrate = 48000;
	else if(temp == 0x00000040)
		bitrate = 56000;
	else if(temp == 0x00000050)
		bitrate = 64000;
	else if(temp == 0x00000060)
		bitrate = 80000;
	else if(temp == 0x00000070)
		bitrate = 96000;
	else if(temp == 0x00000080)
		bitrate = 112000;
	else if(temp == 0x00000090)
		bitrate = 128000;
	else if(temp == 0x000000A0)
		bitrate = 160000;
	else if(temp == 0x000000B0)
		bitrate = 192000;
	else if(temp == 0x000000C0)
		bitrate = 224000;
	else if(temp == 0x000000D0)
		bitrate = 256000;
	else if(temp == 0x000000E0)
		bitrate = 320000;
	else
		printf("find bitrate error!\n");
	
	temp = framehead[2]&0x0C;
	if(temp == 0x00000000)
		samplerate = 44100;
	else if(temp == 0x00000004)
		samplerate = 48000;
	else if(temp == 0x00000008)
		samplerate = 32000;
	else
		printf("find samplerate error!\n");
	
	temp = framehead[2]&0x02;
	if(temp == 0x00000000)
		pad = 0;
	else if(temp == 0x00000002)
		pad = 1;
	else
		printf("find pad error!\n");
	
	size = (int)(144 * bitrate /samplerate + pad);
	return size;
}


int head_seek(int lenth)
{
	unsigned long rval;
	int i;
	
	for(i=0;i<lenth;i++)
	{
		if((encbuf3[i]==0xff)&&(encbuf3[i+1]==0xfb))  break;
	}
	return i;
}

⌨️ 快捷键说明

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