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

176 lines
4.6 KiB
C
Raw Normal View History

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