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