176 lines
4.6 KiB
C
176 lines
4.6 KiB
C
#ifndef __MP3PLAY_H__
|
||
#define __MP3PLAY_H__
|
||
#include <mp3dec.h>
|
||
#include <stm32f4xx.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 struct __packed {
|
||
u8 id[3]; // ID,TAG三个字母
|
||
u8 title[30]; // 歌曲名字
|
||
u8 artist[30]; // 艺术家名字
|
||
u8 year[4]; // 年代
|
||
u8 comment[30]; // 备注
|
||
u8 genre; // 流派
|
||
} ID3V1_Tag;
|
||
|
||
// ID3V2 标签头
|
||
typedef struct __packed {
|
||
u8 id[3]; // ID
|
||
u8 mversion; // 主版本号
|
||
u8 sversion; // 子版本号
|
||
u8 flags; // 标签头标志
|
||
u8 size[4]; // 标签信息大小(不包含标签头10字节).所以,标签大小=size+10.
|
||
} ID3V2_TagHead;
|
||
|
||
// ID3V2.3 版本帧头
|
||
typedef struct __packed {
|
||
u8 id[4]; // 帧ID
|
||
u8 size[4]; // 帧大小
|
||
u16 flags; // 帧标志
|
||
} ID3V23_FrameHead;
|
||
|
||
// MP3 Xing帧信息(没有全部列出来,仅列出有用的部分)
|
||
typedef struct __packed {
|
||
u8 id[4]; // 帧ID,为Xing/Info
|
||
u8 flags[4]; // 存放标志
|
||
u8 frames[4]; // 总帧数
|
||
u8 fsize[4]; // 文件总大小(不包含ID3)
|
||
} MP3_FrameXing;
|
||
|
||
// MP3 VBRI帧信息(没有全部列出来,仅列出有用的部分)
|
||
typedef struct __packed {
|
||
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 struct __packed {
|
||
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 struct __packed {
|
||
// 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
|