Files
player/Project/Src/MP3/mp3play.h
2025-06-27 00:32:57 +08:00

239 lines
5.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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