Files
player/Project/Src/MP3/mp3play.h

239 lines
5.2 KiB
C
Raw Permalink Normal View History

2025-06-27 00:32:57 +08:00
#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