📄 main.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 + -