2025-07-06 17:11:38 +08:00
|
|
|
|
#ifndef __MP3PLAY_H__
|
|
|
|
|
#define __MP3PLAY_H__
|
2025-06-27 00:32:57 +08:00
|
|
|
|
#include <mp3dec.h>
|
2025-07-06 17:11:38 +08:00
|
|
|
|
#include <stm32f4xx.h>
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2>helix MP3<50><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// MP3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/6/29
|
|
|
|
|
// <20>汾<EFBFBD><E6B1BE>V1.0
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//********************************************************************************
|
2025-07-06 17:11:38 +08:00
|
|
|
|
// V1.0 ˵<><CBB5>
|
|
|
|
|
// 1,֧<><D6A7>16λ<36><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MP3<50>Ľ<EFBFBD><C4BD><EFBFBD>
|
|
|
|
|
// 2,֧<><D6A7>CBR/VBR<42><52>ʽMP3<50><33><EFBFBD><EFBFBD>
|
|
|
|
|
// 3,֧<><D6A7>ID3V1<56><31>ID3V2<56><32>ǩ<EFBFBD><C7A9><EFBFBD><EFBFBD>
|
|
|
|
|
// 4,֧<><D6A7><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>(MP3<50><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>320Kbps)<29><><EFBFBD><EFBFBD>
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
#define MP3_TITSIZE_MAX 40 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
#define MP3_ARTSIZE_MAX 40 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
#define MP3_FILE_BUF_SZ 20 * 1024 // MP3<50><33><EFBFBD><EFBFBD>ʱ,<2C>ļ<EFBFBD>buf<75><66>С
|
|
|
|
|
|
|
|
|
|
// ȡ2<C8A1><32>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD>Сֵ.
|
|
|
|
|
#ifndef AUDIO_MIN
|
|
|
|
|
#define AUDIO_MIN(x, y) ((x) < (y) ? (x) : (y))
|
2025-06-27 00:32:57 +08:00
|
|
|
|
#endif
|
|
|
|
|
|
2025-07-06 17:11:38 +08:00
|
|
|
|
// ID3V1 <20><>ǩ
|
|
|
|
|
typedef struct __packed {
|
|
|
|
|
u8 id[3]; // ID,TAG<41><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
|
|
|
|
|
u8 title[30]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
u8 artist[30]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
u8 year[4]; // <20><><EFBFBD><EFBFBD>
|
|
|
|
|
u8 comment[30]; // <20><>ע
|
|
|
|
|
u8 genre; // <20><><EFBFBD><EFBFBD>
|
|
|
|
|
} ID3V1_Tag;
|
|
|
|
|
|
|
|
|
|
// ID3V2 <20><>ǩͷ
|
|
|
|
|
typedef struct __packed {
|
|
|
|
|
u8 id[3]; // ID
|
|
|
|
|
u8 mversion; // <20><><EFBFBD>汾<EFBFBD><E6B1BE>
|
|
|
|
|
u8 sversion; // <20>Ӱ汾<D3B0><E6B1BE>
|
|
|
|
|
u8 flags; // <20><>ǩͷ<C7A9><CDB7>־
|
|
|
|
|
u8 size[4]; // <20><>ǩ<EFBFBD><C7A9>Ϣ<EFBFBD><CFA2>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǩͷ10<31>ֽ<EFBFBD>).<2E><><EFBFBD><EFBFBD>,<2C><>ǩ<EFBFBD><C7A9>С=size+10.
|
|
|
|
|
} ID3V2_TagHead;
|
|
|
|
|
|
|
|
|
|
// ID3V2.3 <20>汾֡ͷ
|
|
|
|
|
typedef struct __packed {
|
|
|
|
|
u8 id[4]; // ֡ID
|
|
|
|
|
u8 size[4]; // ֡<><D6A1>С
|
|
|
|
|
u16 flags; // ֡<><D6A1>־
|
|
|
|
|
} ID3V23_FrameHead;
|
|
|
|
|
|
|
|
|
|
// MP3 Xing֡<67><D6A1>Ϣ(û<><C3BB>ȫ<EFBFBD><C8AB><EFBFBD>г<EFBFBD><D0B3><EFBFBD>,<2C><><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>õIJ<C3B5><C4B2><EFBFBD>)
|
|
|
|
|
typedef struct __packed {
|
|
|
|
|
u8 id[4]; // ֡ID,ΪXing/Info
|
|
|
|
|
u8 flags[4]; // <20><><EFBFBD>ű<EFBFBD>־
|
|
|
|
|
u8 frames[4]; // <20><>֡<EFBFBD><D6A1>
|
|
|
|
|
u8 fsize[4]; // <20>ļ<EFBFBD><C4BC>ܴ<EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID3)
|
|
|
|
|
} MP3_FrameXing;
|
|
|
|
|
|
|
|
|
|
// MP3 VBRI֡<49><D6A1>Ϣ(û<><C3BB>ȫ<EFBFBD><C8AB><EFBFBD>г<EFBFBD><D0B3><EFBFBD>,<2C><><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>õIJ<C3B5><C4B2><EFBFBD>)
|
|
|
|
|
typedef struct __packed {
|
|
|
|
|
u8 id[4]; // ֡ID,ΪXing/Info
|
|
|
|
|
u8 version[2]; // <20>汾<EFBFBD><E6B1BE>
|
|
|
|
|
u8 delay[2]; // <20>ӳ<EFBFBD>
|
|
|
|
|
u8 quality[2]; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>,0~100,Խ<><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>
|
|
|
|
|
u8 fsize[4]; // <20>ļ<EFBFBD><C4BC>ܴ<EFBFBD>С
|
|
|
|
|
u8 frames[4]; // <20>ļ<EFBFBD><C4BC><EFBFBD>֡<EFBFBD><D6A1>
|
|
|
|
|
} MP3_FrameVBRI;
|
|
|
|
|
|
|
|
|
|
// MP3<50><33><EFBFBD>ƽṹ<C6BD><E1B9B9>
|
|
|
|
|
typedef struct __packed {
|
|
|
|
|
u8 title[MP3_TITSIZE_MAX]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
u8 artist[MP3_ARTSIZE_MAX]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
u32 totsec; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>,<2C><>λ:<3A><>
|
|
|
|
|
u32 cursec; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
|
|
|
|
u8 *jpeg_data; // ר<><D7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
u32 jpeg_len; // ר<><D7A8><EFBFBD><EFBFBD><EFBFBD>泤<EFBFBD><E6B3A4>
|
|
|
|
|
|
|
|
|
|
u32 bitrate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
u32 samplerate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
u16 outsamples; // PCM<43><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(<28><>16λΪ<CEBB><CEAA>λ),<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MP3,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*2(<28><><EFBFBD><EFBFBD>DAC<41><43><EFBFBD><EFBFBD>)
|
|
|
|
|
|
|
|
|
|
u32 datastart; // <20><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>ʼ<EFBFBD><CABC>λ<EFBFBD><CEBB>(<28><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>)
|
|
|
|
|
} __mp3ctrl;
|
|
|
|
|
|
|
|
|
|
// extern __mp3ctrl * mp3ctrl;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ֲ<EFBFBD><D6B2>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
typedef enum {
|
|
|
|
|
AP_OK = 0X00, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
AP_NEXT, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|
|
|
|
AP_PREV, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|
|
|
|
AP_ERR = 0X80, // <20><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>(û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>)
|
|
|
|
|
} APRESULT;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ֲ<EFBFBD><D6B2>ſ<EFBFBD><C5BF><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
typedef struct __packed {
|
|
|
|
|
// 2<><32>I2S<32><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BUF
|
|
|
|
|
u8 *i2sbuf1;
|
|
|
|
|
u8 *i2sbuf2;
|
|
|
|
|
u8 *tbuf; // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
|
|
|
|
u32 (*file_seek)(u32); // <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><CBBA><EFBFBD>
|
|
|
|
|
|
|
|
|
|
vu8 status; // bit0:0,<2C><>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// bit1:0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// bit2~3:<3A><><EFBFBD><EFBFBD>
|
|
|
|
|
// bit4:0,<2C><><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>;1,<2C><><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
// bit5:0,<2C><EFBFBD><DEB6><EFBFBD>;1,ִ<><D6B4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
// bit6:0,<2C><EFBFBD><DEB6><EFBFBD>;1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>(<28><><EFBFBD>Dz<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
|
|
|
|
// bit7:0,<2C><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>/<2F><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>;1,<2C><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>)
|
|
|
|
|
|
|
|
|
|
u8 mode; // <20><><EFBFBD><EFBFBD>ģʽ
|
|
|
|
|
// 0,ȫ<><C8AB>ѭ<EFBFBD><D1AD>;1,<2C><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>;2,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|
|
|
|
|
|
|
|
|
u8 *name; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD>MP3<50><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
u16 namelen; // name<6D><65>ռ<EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>.
|
|
|
|
|
u16 curnamepos; // <20><>ǰ<EFBFBD><C7B0>ƫ<EFBFBD><C6AB>
|
|
|
|
|
|
|
|
|
|
u32 totsec; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>,<2C><>λ:<3A><>
|
|
|
|
|
u32 cursec; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
u32 bitrate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(λ<><CEBB>)
|
|
|
|
|
u32 samplerate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
u16 bps; // λ<><CEBB>,<2C><><EFBFBD><EFBFBD>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);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>0 ֧<>֣<EFBFBD><D6A3><EFBFBD>0 <20><>֧<EFBFBD><D6A7>
|
2025-07-06 17:11:38 +08:00
|
|
|
|
int mp3_get_support(u8 *data, u32 size);
|
|
|
|
|
int mp3_get_support_name(const char *name);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>е<EFBFBD>mp3<70>ļ<EFBFBD>
|
2025-07-06 17:11:38 +08:00
|
|
|
|
u8 mp3_play_song(u8 *data, u32 size);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD>0<EFBFBD>ɹ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
char *mp3_get_name(void);
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD><D2A3><EFBFBD><EFBFBD>ط<EFBFBD>0<EFBFBD>ɹ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
char *mp3_get_artist(void);
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>1<EFBFBD>ɹ<EFBFBD>
|
2025-07-06 17:11:38 +08:00
|
|
|
|
int mp3_get_time(int *totsec, int *cursec);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 17:11:38 +08:00
|
|
|
|
void mp3_stop(void);
|
|
|
|
|
void mp3_play(void);
|
|
|
|
|
void mp3_suspend(void);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int mp3_set_vol(int vol);
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int mp3_add_val(int vol);
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int mp3_sub_val(int vol);
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int mp3_get_vol(void);
|
|
|
|
|
|
|
|
|
|
#endif
|