📄 mp3svr.c
字号:
void Mp3Server( )
{
UINT flgptn; // flag pattern
UINT uartflg, waitptn; // wait pattern
FAL_FILE fd;
FAL_DIR statobj;
unsigned int lenmp3;
char *name;
int mp3_num;
int stereo;
struct frame fr;
int nframe, totalframe;
int pcmsize;
int lenenc, lendec, incenc, incdec;
int penc, pdec;
int i=0;
int framesize;
char *px,*py;
int templen;
int len_fast;
int len_readfile;
char namename[20];
static short tempii;
/*test right chanel*/
//FAL_FILE testfd;
static int fderror = 0;
unsigned long size;
volume = 16;//32
TAG1:
memset(encbuf1, 0, ENCBUF1SIZE);
memset(encbuf2, 0, ENCBUF2SIZE);
memset(decbuf, 0, DEC_SIZE);
flgptn = 0;
ii=0;
outbyte=0;
templen = 0;
len_readfile = 0;
base =(int)decbuf;
InitMP3(&gmp);
nframe = 0;
pcmsize = 0;
stereo = 1;
lendec = DEC_SIZE;
penc = 0;
//pdec = 0;
pdec = 0x40-(int)decbuf&0x3f;//0x40-(int)decbuf%0x40;
wai_flg( &flgptn, MP3_EVENT, 0XFFFF, TWF_ORW);
if( flgptn & MP3_SELECT_FLG ){
mp3_num = (flgptn & MP3_SELECT_FLG)-1;
clr_flg(MP3_EVENT,~MP3_SELECT_FLG);
goto TAG1;
}else if( flgptn & MP3_ADDV_FLG ){
clr_flg(MP3_EVENT,~MP3_ADDV_FLG);
volume_up();
goto TAG1;
}else if( flgptn & MP3_SUBV_FLG ){
clr_flg(MP3_EVENT,~MP3_SUBV_FLG);
volume_down();
goto TAG1;
}else if( flgptn & MP3_START_FLG ){
clr_flg(MP3_EVENT,~MP3_START_FLG);
//if(!config_flag)
//AC97self_adjust();
/*follow copy 200 frame to source pool*/
strcpy(namename,(mp3_name+mp3_num*MP3_NAME_LEN));
//framesize = sizeperframe( mp3_name+mp3_num*MP3_NAME_LEN );
fderror++;
if( fderror == 0x2B)
printf("please stop here");
fd = FAL_Open((mp3_name+mp3_num*MP3_NAME_LEN), PO_RDWR|PO_CREAT, FAL_IWRITE|FAL_IREAD);
FAL_Find_First((mp3_name+mp3_num*MP3_NAME_LEN), &statobj, NULL);
FAL_Find_Close(0, &statobj);
lenenc = statobj.fsize;
size = Skip_tagv2(fd);
NU_Seek(fd,size,PSEEK_SET);
lenenc -= size;
framesize = sizeperframe(fd);
NU_Seek(fd,size,PSEEK_SET);
totalframe = lenenc/framesize + 1;
NU_Read (fd, encbuf1, framesize*(5 + 1));
len_readfile+=framesize*(5 + 1);
//FAL_Fread( encbuf1, framesize*(5 + 1), fd );
//FAL_Fread( encbuf2, framesize*BUFFRAMENUM, fd );
encbuf = encbuf1;
//ac97_unmute();
/*test right chanel*/
//testfd = FAL_Open("c:\\test", PO_RDWR|PO_CREAT, FAL_IWRITE|FAL_IREAD);
}else{
if( flgptn )
clr_flg(MP3_EVENT,~flgptn);
goto TAG1;
}
while( 1 ){
pol_flg( &flgptn, MP3_EVENT, 0XFFFF, TWF_ORW);
if( flgptn){
if( flgptn & MP3_PAUSE_FLG ){
clr_flg(MP3_EVENT,~MP3_PAUSE_FLG);
irq_disable(INT_DMA);
ac97_mute();
TAG2:
wai_flg( &flgptn, MP3_EVENT, 0XFFFF, TWF_ORW);
if( flgptn & MP3_START_FLG ){
clr_flg(MP3_EVENT,~MP3_START_FLG);
//ac97_unmute();
irq_enable(INT_DMA);
/* goto follow decode operation. */
}else if( flgptn & MP3_STOP_FLG ){
clr_flg(MP3_EVENT,~MP3_STOP_FLG);
*(RP)DMA_ENABLE=0x2002;//dor interrupt real
irq_enable(INT_DMA); /* decode error handle*/
ac97_mute();
FAL_Fclose(fd, 0); //add by DSA 2005.03.30
goto TAG1;
}else{
/* Here are other case. We forbid these operation. */
clr_flg(MP3_EVENT,~flgptn);
goto TAG2;
}
//}else if( flgptn & MP3_ADDV_FLG ){
//clr_flg(MP3_EVENT,~MP3_ADDV_FLG);
//volume_up();
//}else if( flgptn & MP3_SUBV_FLG ){
//clr_flg(MP3_EVENT,~MP3_SUBV_FLG);
//volume_down();
}else if( flgptn & MP3_FAST_FLG ){
/*
irq_disable(INT_DMA);
clr_flg(MP3_EVENT,~(MP3_FAST_FLG));
penc +=(FAST_FRAME*417);
pdec = 0;
ii=0;
outbyte=0;
nframe=0;
memset(decbuf, 0, DEC_SIZE);
*/
irq_disable(INT_DMA);
clr_flg(MP3_EVENT,~(MP3_FAST_FLG));
if( statobj.fsize - len_readfile > (framesize*BUFFRAMENUM) ){
memset(encbuf1, 0, ENCBUF1SIZE);
memset(encbuf2, 0, ENCBUF2SIZE);
NU_Seek(fd, framesize*BUFFRAMENUM, PSEEK_CUR);
len_readfile += (framesize*BUFFRAMENUM);
NU_Read (fd, encbuf3, framesize*6);
len_fast = head_seek(framesize*6);
lenenc = statobj.fsize - len_readfile - len_fast;
len_readfile += (framesize*6);
memcpy(encbuf1, encbuf3 + len_fast, (framesize *6)-len_fast);
penc = 0;
//pdec = 0;
pdec = 0x40-(int)decbuf&0x3f;//0x40-(int)decbuf%0x40;
ii=0;
outbyte=0;
nframe=0;
memset(decbuf, 0, DEC_SIZE);
encbuf = encbuf1;
}
}else if( flgptn & MP3_SLOW_FLG ){
/*
irq_disable(INT_DMA);
clr_flg(MP3_EVENT,~(MP3_SLOW_FLG));
penc -=(FAST_FRAME*417);
if(penc < 0)
penc=0;
pdec = 0;
ii=0;
outbyte=0;
nframe=0;
memset(decbuf, 0, DEC_SIZE);
*/
irq_disable(INT_DMA);
clr_flg(MP3_EVENT,~(MP3_SLOW_FLG));
if(len_readfile > (framesize*2*BUFFRAMENUM) ){
memset(encbuf1, 0, ENCBUF1SIZE);
memset(encbuf2, 0, ENCBUF2SIZE);
NU_Seek(fd, -framesize*2*BUFFRAMENUM, PSEEK_CUR);
len_readfile -= (framesize*2*BUFFRAMENUM);
NU_Read (fd, encbuf3, framesize*6);
len_fast = head_seek(framesize*6);
lenenc = statobj.fsize - len_readfile - len_fast;
len_readfile += (framesize*6);
memcpy(encbuf1, encbuf3 + len_fast, (framesize *6)-len_fast);
penc = 0;
//pdec = 0;
pdec = 0x40-(int)decbuf&0x3f;//0x40-(int)decbuf%0x40;
ii=0;
outbyte=0;
nframe=0;
memset(decbuf, 0, DEC_SIZE);
encbuf = encbuf1;
}
}else if( flgptn & MP3_STOP_FLG ){
clr_flg(MP3_EVENT,~MP3_STOP_FLG);
irq_disable(INT_DMA);
ac97_mute();
*(RP)DMA_ENABLE=0x2002;//dor interrupt real
irq_enable(INT_DMA); /* decode error handle*/
FAL_Fclose(fd, 0); //add by DSA 2005.03.30
goto TAG1;
}else if( flgptn & MP3_ADDV_FLG ){
clr_flg(MP3_EVENT,~MP3_ADDV_FLG);
if(v_volume_level < 20)
{
v_volume_level+=2;
Rec_Refreshvolum(v_volume_level);
}
volume_up();
}else if( flgptn & MP3_SUBV_FLG ){
clr_flg(MP3_EVENT,~MP3_SUBV_FLG);
if(v_volume_level > 0)
{
v_volume_level-=2;
Rec_Refreshvolum(v_volume_level);
}
volume_down();
}else{
/* Here is some error operation, we ignore them. */
clr_flg(MP3_EVENT,~flgptn);
}
}
/* Follow is decode part. */
if((nframe & DBUFFRAMENUM) == 0){//if(nframe % BUFFRAMENUM == 0){
//pdec = 0;
pdec = 0x40-(int)decbuf&0x3f;//0x40-(int)decbuf%0x40;
frame11[nframe&DBUFFRAMENUM] = pdec;//frame11[nframe%BUFFRAMENUM] = pdec;
}
if( ( (nframe & DBUFFRAMENUM) == 5)&&(nframe > 5) ){//if( (nframe % BUFFRAMENUM == 5)&&(nframe > 5) ){
#if 0
if(i == 0){
d[i++] = ii;
tempii = d[i-1];
}
else{
d[i++] = ii - tempii;
tempii = ii;
}
#endif
memcpy(encbuf2, encbuf2 + penc, templen - penc);
NU_Read (fd, encbuf2 + templen - penc, framesize*(BUFFRAMENUM+ 1));
len_readfile += (framesize*(BUFFRAMENUM+ 1));
templen = templen - penc + framesize*(BUFFRAMENUM+ 1);
penc = 0;
wai_flg( &flgptn, BUF_DMA_EVENT, 0XFFFF, TWF_ORW);
}
if( flgptn & BUF_DMA_FLG ){
clr_flg( BUF_DMA_EVENT,~(BUF_DMA_FLG) );
}
incenc = decodeMP3(&gmp, &encbuf[penc], lenenc, &decbuf[pdec], lendec, &incdec);
if(incenc == 0){
irq_disable(INT_DMA); /* decode error handle*/
*(RP)DMA_ENABLE=0x2002;//dor interrupt real
irq_enable(INT_DMA); /* decode error handle*/
FAL_Fclose(fd, 0);
/*test right chanel*/
//FAL_Fclose(testfd, 0);
//NU_Close_Disk("c");
set_flg( BUF_DMA_EVENT, DEC_OVER_FLG );
goto TAG1;
}
/*test right chanel*/
//NU_Write(testfd, &decbuf[pdec], incdec);
penc += incenc;
lenenc -= incenc;
//pdec += incdec;
pdec += incdec + (0x40-(int)incdec&0x3f);//(0x40-incdec%0x40);
if (nframe == 0) {
fr = gmp.fr;
stereo = fr.stereo;
}
frame10[nframe&DBUFFRAMENUM]=incdec;
nframe++;
frame11[nframe&DBUFFRAMENUM] = pdec;
// printf("nframe=%d\n",nframe);
if( (nframe==30)&&(config_flag==1) ){
encbuf = encbuf2;
memcpy(encbuf2, encbuf1 + penc, framesize * (30+1) - penc);
NU_Read (fd, encbuf2 + framesize * (30+1) - penc, framesize*(BUFFRAMENUM+ 1));
len_readfile += (framesize*(BUFFRAMENUM+ 1));
templen = framesize * (30+1) - penc + framesize*(BUFFRAMENUM+ 1);
penc = 0;
play_flag=1;
irq_enable(INT_DMA);
unmask_irq(INT_DMA);
InitDMA();
*(RP)AC97_CRAC=WRITE+ 0x20000 + 0x0808; //0dB attenuation
do{}while(!OVER_WRITE);
*(RP)AC97_CRAC=WRITE + 0x6a0000 + 0x50; //head phone
do{}while(!OVER_WRITE);
//ConfigurationCodec(VRA_SAMPLE);
}
}
//set_flg( MP3_EVENT, DEC_OVER_FLG );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -