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

📄 mp3svr.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 2 页
字号:

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 + -