239 lines
5.2 KiB
C
239 lines
5.2 KiB
C
|
|
#ifndef __MP3PLAY_H__
|
|||
|
|
#define __MP3PLAY_H__
|
|||
|
|
#include <stm32f4xx.h>
|
|||
|
|
#include <mp3dec.h>
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//本程序移植自helix MP3解码库
|
|||
|
|
//ALIENTEK STM32F407开发板
|
|||
|
|
//MP3 解码代码
|
|||
|
|
//正点原子@ALIENTEK
|
|||
|
|
//技术论坛:www.openedv.com
|
|||
|
|
//创建日期:2014/6/29
|
|||
|
|
//版本:V1.0
|
|||
|
|
//********************************************************************************
|
|||
|
|
//V1.0 说明
|
|||
|
|
//1,支持16位单声道/立体声MP3的解码
|
|||
|
|
//2,支持CBR/VBR格式MP3解码
|
|||
|
|
//3,支持ID3V1和ID3V2标签解析
|
|||
|
|
//4,支持所有比特率(MP3最高是320Kbps)解码
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
#define MP3_TITSIZE_MAX 40 //歌曲名字最大长度
|
|||
|
|
#define MP3_ARTSIZE_MAX 40 //歌曲名字最大长度
|
|||
|
|
#define MP3_FILE_BUF_SZ 20*1024 //MP3解码时,文件buf大小
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//取2个值里面的较小值.
|
|||
|
|
#ifndef AUDIO_MIN
|
|||
|
|
#define AUDIO_MIN(x,y) ((x)<(y)? (x):(y))
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//ID3V1 标签
|
|||
|
|
typedef __packed struct
|
|||
|
|
{
|
|||
|
|
u8 id[3]; //ID,TAG三个字母
|
|||
|
|
u8 title[30]; //歌曲名字
|
|||
|
|
u8 artist[30]; //艺术家名字
|
|||
|
|
u8 year[4]; //年代
|
|||
|
|
u8 comment[30]; //备注
|
|||
|
|
u8 genre; //流派
|
|||
|
|
}ID3V1_Tag;
|
|||
|
|
|
|||
|
|
//ID3V2 标签头
|
|||
|
|
typedef __packed struct
|
|||
|
|
{
|
|||
|
|
u8 id[3]; //ID
|
|||
|
|
u8 mversion; //主版本号
|
|||
|
|
u8 sversion; //子版本号
|
|||
|
|
u8 flags; //标签头标志
|
|||
|
|
u8 size[4]; //标签信息大小(不包含标签头10字节).所以,标签大小=size+10.
|
|||
|
|
}ID3V2_TagHead;
|
|||
|
|
|
|||
|
|
//ID3V2.3 版本帧头
|
|||
|
|
typedef __packed struct
|
|||
|
|
{
|
|||
|
|
u8 id[4]; //帧ID
|
|||
|
|
u8 size[4]; //帧大小
|
|||
|
|
u16 flags; //帧标志
|
|||
|
|
}ID3V23_FrameHead;
|
|||
|
|
|
|||
|
|
//MP3 Xing帧信息(没有全部列出来,仅列出有用的部分)
|
|||
|
|
typedef __packed struct
|
|||
|
|
{
|
|||
|
|
u8 id[4]; //帧ID,为Xing/Info
|
|||
|
|
u8 flags[4]; //存放标志
|
|||
|
|
u8 frames[4]; //总帧数
|
|||
|
|
u8 fsize[4]; //文件总大小(不包含ID3)
|
|||
|
|
}MP3_FrameXing;
|
|||
|
|
|
|||
|
|
//MP3 VBRI帧信息(没有全部列出来,仅列出有用的部分)
|
|||
|
|
typedef __packed struct
|
|||
|
|
{
|
|||
|
|
u8 id[4]; //帧ID,为Xing/Info
|
|||
|
|
u8 version[2]; //版本号
|
|||
|
|
u8 delay[2]; //延迟
|
|||
|
|
u8 quality[2]; //音频质量,0~100,越大质量越好
|
|||
|
|
u8 fsize[4]; //文件总大小
|
|||
|
|
u8 frames[4]; //文件总帧数
|
|||
|
|
}MP3_FrameVBRI;
|
|||
|
|
|
|||
|
|
|
|||
|
|
//MP3控制结构体
|
|||
|
|
typedef __packed struct
|
|||
|
|
{
|
|||
|
|
u8 title[MP3_TITSIZE_MAX]; //歌曲名字
|
|||
|
|
u8 artist[MP3_ARTSIZE_MAX]; //艺术家名字
|
|||
|
|
u32 totsec ; //整首歌时长,单位:秒
|
|||
|
|
u32 cursec ; //当前播放时长
|
|||
|
|
|
|||
|
|
u8 *jpeg_data; //专辑封面
|
|||
|
|
u32 jpeg_len; //专辑封面长度
|
|||
|
|
|
|||
|
|
u32 bitrate; //比特率
|
|||
|
|
u32 samplerate; //采样率
|
|||
|
|
u16 outsamples; //PCM输出数据量大小(以16位为单位),单声道MP3,则等于实际输出*2(方便DAC输出)
|
|||
|
|
|
|||
|
|
u32 datastart; //数据帧开始的位置(在文件里面的偏移)
|
|||
|
|
}__mp3ctrl;
|
|||
|
|
|
|||
|
|
//extern __mp3ctrl * mp3ctrl;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//音乐播放操作结果定义
|
|||
|
|
typedef enum {
|
|||
|
|
AP_OK=0X00, //正常播放完成
|
|||
|
|
AP_NEXT, //播放下一曲
|
|||
|
|
AP_PREV, //播放上一曲
|
|||
|
|
AP_ERR=0X80, //播放有错误(没定义错误代码,仅仅表示出错)
|
|||
|
|
}APRESULT;
|
|||
|
|
|
|||
|
|
//音乐播放控制器
|
|||
|
|
typedef __packed struct
|
|||
|
|
{
|
|||
|
|
//2个I2S解码的BUF
|
|||
|
|
u8 *i2sbuf1;
|
|||
|
|
u8 *i2sbuf2;
|
|||
|
|
u8 *tbuf; //零时数组
|
|||
|
|
u32(*file_seek)(u32);//文件快进快退函数
|
|||
|
|
|
|||
|
|
vu8 status; //bit0:0,暂停播放;1,继续播放
|
|||
|
|
//bit1:0,结束播放;1,开启播放
|
|||
|
|
//bit2~3:保留
|
|||
|
|
//bit4:0,无音乐播放;1,音乐播放中 (对外标记)
|
|||
|
|
//bit5:0,无动作;1,执行了一次切歌操作(对外标记)
|
|||
|
|
//bit6:0,无动作;1,请求终止播放(但是不删除音频播放任务),处理完成后,播放任务自动清零该位
|
|||
|
|
//bit7:0,音频播放任务已删除/请求删除;1,音频播放任务正在运行(允许继续执行)
|
|||
|
|
|
|||
|
|
u8 mode; //播放模式
|
|||
|
|
//0,全部循环;1,单曲循环;2,随机播放;
|
|||
|
|
|
|||
|
|
u8 *name; //当前播放的MP3歌曲名字
|
|||
|
|
u16 namelen; //name所占的点数.
|
|||
|
|
u16 curnamepos; //当前的偏移
|
|||
|
|
|
|||
|
|
u32 totsec ; //整首歌时长,单位:秒
|
|||
|
|
u32 cursec ; //当前播放时长
|
|||
|
|
u32 bitrate; //比特率(位速)
|
|||
|
|
u32 samplerate; //采样率
|
|||
|
|
u16 bps; //位数,比如16bit,24bit,32bit
|
|||
|
|
|
|||
|
|
|
|||
|
|
}__audiodev;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
u16 GetRBIT16 (u16);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void mp3_i2s_dma_tx_callback(void) ;
|
|||
|
|
void mp3_fill_buffer(u16* buf,u16 size,u8 nch);
|
|||
|
|
u8 mp3_id3v1_decode(u8* buf,__mp3ctrl *pctrl);
|
|||
|
|
u8 mp3_id3v2_decode(u8* buf,u32 size,__mp3ctrl *pctrl);
|
|||
|
|
u8 mp3_get_info(u8 *data,u32 size,__mp3ctrl* pctrl);
|
|||
|
|
|
|||
|
|
__audiodev *mp3_getAudiodev (void);
|
|||
|
|
__mp3ctrl *mp3_getMp3Info (void);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 返回0 支持,非0 不支持
|
|||
|
|
int mp3_get_support (u8* data,u32 size) ;
|
|||
|
|
int mp3_get_support_name (const char *name);
|
|||
|
|
|
|||
|
|
// 播放内存中的mp3文件
|
|||
|
|
u8 mp3_play_song(u8* data,u32 size);
|
|||
|
|
|
|||
|
|
// 获取当前播放的曲目名,返回非0成功
|
|||
|
|
char *mp3_get_name(void);
|
|||
|
|
|
|||
|
|
// 获取当前播放的艺术家,返回非0成功
|
|||
|
|
char *mp3_get_artist(void);
|
|||
|
|
|
|||
|
|
// 获取当前播放的时间,返回1成功
|
|||
|
|
int mp3_get_time(int *totsec,int *cursec);
|
|||
|
|
|
|||
|
|
void mp3_stop (void);
|
|||
|
|
void mp3_play (void);
|
|||
|
|
void mp3_suspend (void);
|
|||
|
|
|
|||
|
|
// 设置音量
|
|||
|
|
int mp3_set_vol(int vol);
|
|||
|
|
|
|||
|
|
// 增加音量
|
|||
|
|
int mp3_add_val(int vol);
|
|||
|
|
|
|||
|
|
// 减少音量
|
|||
|
|
int mp3_sub_val(int vol);
|
|||
|
|
|
|||
|
|
// 获取音量
|
|||
|
|
int mp3_get_vol(void);
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|