📄 mp3svr.c
字号:
/**********************************************************
* 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 + -