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

📄 main.c

📁 MP3的代码很实用 MP3的代码很实用
💻 C
字号:
/********************************************************************************************
*filename:			main.c						
*author:			zhangbing	
*create date:		2005-5-9                 
*description:	    This file is used for MP3 player demo                                                              
*modify history:	                                                                      
*misc:           
********************************************************************************************/
#include "HA_typedef.h"
#include "hardware.h"
#include "hardware_reg.h" 
#include "HA_AC97.h"
//****************************for MP3
#include <stdio.h>
#include <stdlib.h>

#include "mpg123.h"
#include "mpglib.h"
//********************************



#define ENC_SIZE	(3862763)
#define DEC_SIZE	(6*1024*1024)


static char encbuf[ENC_SIZE] =		//mp3 music data
{
	#include "mbtt.data"
};

char decbuf[DEC_SIZE];				//buffer to save PCM data
//****************************************

int base;
                                           
/*系统时钟配置函数*/
void config_pmu(U32 sysclk)
{
	U32 m,n;
	
	*(RP)(PMU_PSCR) =0x17fff;	//open all module
	
	
	*(RP)(PMU_PMDR)	=0X01;
	*(RP)PMU_PLTR=0x00d200cd;	//MLTV=210,ULTV=205
	
	n = 2;
	m = 8*sysclk/10000000;
	*(RP)(PMU_PMCR) = (n << 8) | m;
	*(RP)(PMU_PMCR) = (1 << 12) | (n << 8) | m;
		
	*(RP)PMU_PUCR=0x1530;		//parameter PD=5,D=48
		
}



int play_mp3(S8 * mp3_ptr)
{
	U32 i;

	int pcmsize;
	int stereo;
	struct frame fr;
	 int nframe;
	int lenenc, lendec, incenc, incdec;
	unsigned long penc, pdec;
	
	init_intc();		//初始化中断控制器							
									 
	base =(int)decbuf;	//DMA传送边界对齐(64字节对齐)
	base=base+(0x40-base%0x40);
	
	InitMP3(&gmp);		//初始化MP3解码器有关变量
	nframe = 0;			//帧计数器清零
	pcmsize = 0;		//PCM码尺寸清零
	stereo = 1;			//立体声
	lenenc = ENC_SIZE;	//剩余歌曲长度初始为歌曲总长度
	lendec = DEC_SIZE;	//解码缓冲区剩余空间
	penc = 0;			//编码缓冲区(歌曲缓冲)下标初始为0
	pdec = 0;			//解码缓冲区下标初始为0	
	
#ifdef	NEED_AIFF
	pdec += AIFF_HEAD_LENGTH;
#endif

	i=0;

	while(1)
	{
	
		incenc = decodeMP3(&gmp, mp3_ptr+penc, lenenc, &decbuf[pdec], lendec, &incdec);

		if (incenc == 0) 
			break;
		penc += incenc;
		lenenc -= incenc;
		pdec += incdec;
		lendec -= incdec;
		if (nframe == 0) 
		{
			fr = gmp.fr;
			stereo = fr.stereo;
		}
		pcmsize += incdec / sizeof(short) / stereo;

		if(nframe==5)			//预解码10帧后开始播放
		{
			irq_enable(INT_DMA);//使能DMA中断
			unmask_irq(INT_DMA);//取消DMA中断屏蔽
			InitDMA();			//初始化DMA
			InitAC97();			//初始化AC97(包括CODEC)
		}
		++nframe;
		
		#ifdef	NEED_AIFF
		write_aiff((unsigned char *)decbuf, &fr, pcmsize);
		#endif
	}
		
	
	while(1);
	
	return 0;
	
}


int main(void)
{
	config_pmu(80000000);	//系统时钟设为80MHZ	
	play_mp3(&encbuf[0]);	//encbuf为存放MP3歌曲的首地址
	return 0;
}




⌨️ 快捷键说明

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