整理一些格式
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
#include "avi.h"
|
||||
#include "dac.h"
|
||||
#include "ff.h"
|
||||
#include "lcd_rgb.h"
|
||||
#include "mjpeg.h"
|
||||
#include "mymem.h"
|
||||
#include "timer.h"
|
||||
#include "touch_043.h"
|
||||
#include "usart.h"
|
||||
#include "timer.h"
|
||||
#include "avi.h"
|
||||
#include "mjpeg.h"
|
||||
#include "lcd_rgb.h"
|
||||
#include "mymem.h"
|
||||
#include "ff.h"
|
||||
#include "dac.h"
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
|
||||
// ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -24,35 +24,34 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AVI_INFO avix; // avi<76>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
u8*const AVI_VIDS_FLAG_TBL[2]={"00dc","01dc"};//<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,00dc/01dc
|
||||
u8*const AVI_AUDS_FLAG_TBL[2]={"00wb","01wb"};//<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,00wb/01wb
|
||||
u8 *const AVI_VIDS_FLAG_TBL[2] = {"00dc",
|
||||
"01dc"}; // <EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>,00dc/01dc
|
||||
u8 *const AVI_AUDS_FLAG_TBL[2] = {"00wb",
|
||||
"01wb"}; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,00wb/01wb
|
||||
|
||||
static vu8 g_i2splaybuf; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static u8 *g_i2sbuf[4]; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>֡,<2C><>4֡,4*5K=20K
|
||||
|
||||
// <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>I2S DMA<4D><41><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
||||
void audio_i2s_dma_callback(DAC_UserStruct *dac)
|
||||
{
|
||||
void audio_i2s_dma_callback(DAC_UserStruct *dac) {
|
||||
g_i2splaybuf++;
|
||||
if(g_i2splaybuf>3)g_i2splaybuf=0;
|
||||
if(dac->buff_useing==1)
|
||||
{
|
||||
DMA_MemoryTargetConfig(DMA1_Stream5,(u32)g_i2sbuf[g_i2splaybuf], DMA_Memory_0);
|
||||
}
|
||||
else
|
||||
{
|
||||
DMA_MemoryTargetConfig(DMA1_Stream5,(u32)g_i2sbuf[g_i2splaybuf], DMA_Memory_1);
|
||||
if (g_i2splaybuf > 3)
|
||||
g_i2splaybuf = 0;
|
||||
if (dac->buff_useing == 1) {
|
||||
DMA_MemoryTargetConfig(DMA1_Stream5, (u32)g_i2sbuf[g_i2splaybuf],
|
||||
DMA_Memory_0);
|
||||
} else {
|
||||
DMA_MemoryTargetConfig(DMA1_Stream5, (u32)g_i2sbuf[g_i2splaybuf],
|
||||
DMA_Memory_1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// avi<76><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
// buf:<3A><><EFBFBD>뻺<EFBFBD><EBBBBA><EFBFBD><EFBFBD>
|
||||
// size:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:AVI_OK,avi<76>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
AVISTATUS avi_init(u8 *buf,int size)
|
||||
{
|
||||
AVISTATUS avi_init(u8 *buf, int size) {
|
||||
u16 offset;
|
||||
u8 *tbuf;
|
||||
AVISTATUS res = AVI_OK;
|
||||
@@ -66,30 +65,41 @@ AVISTATUS avi_init(u8 *buf,int size)
|
||||
|
||||
tbuf = buf;
|
||||
aviheader = (AVI_HEADER *)buf;
|
||||
if(aviheader->RiffID!=AVI_RIFF_ID)return AVI_RIFF_ERR; //RIFF ID<49><44><EFBFBD><EFBFBD>
|
||||
if(aviheader->AviID!=AVI_AVI_ID)return AVI_AVI_ERR; //AVI ID<49><44><EFBFBD><EFBFBD>
|
||||
if (aviheader->RiffID != AVI_RIFF_ID)
|
||||
return AVI_RIFF_ERR; // RIFF ID<49><44><EFBFBD><EFBFBD>
|
||||
if (aviheader->AviID != AVI_AVI_ID)
|
||||
return AVI_AVI_ERR; // AVI ID<49><44><EFBFBD><EFBFBD>
|
||||
buf += sizeof(AVI_HEADER); // ƫ<><C6AB>
|
||||
listheader = (LIST_HEADER *)(buf);
|
||||
if(listheader->ListID!=AVI_LIST_ID)return AVI_LIST_ERR; //LIST ID<49><44><EFBFBD><EFBFBD>
|
||||
if(listheader->ListType!=AVI_HDRL_ID)return AVI_HDRL_ERR; //HDRL ID<49><44><EFBFBD><EFBFBD>
|
||||
if (listheader->ListID != AVI_LIST_ID)
|
||||
return AVI_LIST_ERR; // LIST ID<49><44><EFBFBD><EFBFBD>
|
||||
if (listheader->ListType != AVI_HDRL_ID)
|
||||
return AVI_HDRL_ERR; // HDRL ID<49><44><EFBFBD><EFBFBD>
|
||||
buf += sizeof(LIST_HEADER); // ƫ<><C6AB>
|
||||
avihheader = (AVIH_HEADER *)(buf);
|
||||
if(avihheader->BlockID!=AVI_AVIH_ID)return AVI_AVIH_ERR; //AVIH ID<49><44><EFBFBD><EFBFBD>
|
||||
if (avihheader->BlockID != AVI_AVIH_ID)
|
||||
return AVI_AVIH_ERR; // AVIH ID<49><44><EFBFBD><EFBFBD>
|
||||
avix.SecPerFrame = avihheader->SecPerFrame; // <20>õ<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
avix.TotalFrame = avihheader->TotalFrame; // <20>õ<EFBFBD><C3B5><EFBFBD>֡<EFBFBD><D6A1>
|
||||
buf += avihheader->BlockSize + 8; // ƫ<><C6AB>
|
||||
listheader = (LIST_HEADER *)(buf);
|
||||
if(listheader->ListID!=AVI_LIST_ID)return AVI_LIST_ERR; //LIST ID<49><44><EFBFBD><EFBFBD>
|
||||
if(listheader->ListType!=AVI_STRL_ID)return AVI_STRL_ERR; //STRL ID<49><44><EFBFBD><EFBFBD>
|
||||
if (listheader->ListID != AVI_LIST_ID)
|
||||
return AVI_LIST_ERR; // LIST ID<49><44><EFBFBD><EFBFBD>
|
||||
if (listheader->ListType != AVI_STRL_ID)
|
||||
return AVI_STRL_ERR; // STRL ID<49><44><EFBFBD><EFBFBD>
|
||||
strhheader = (STRH_HEADER *)(buf + 12);
|
||||
if(strhheader->BlockID!=AVI_STRH_ID)return AVI_STRH_ERR; //STRH ID<49><44><EFBFBD><EFBFBD>
|
||||
if (strhheader->BlockID != AVI_STRH_ID)
|
||||
return AVI_STRH_ERR; // STRH ID<49><44><EFBFBD><EFBFBD>
|
||||
if (strhheader->StreamType == AVI_VIDS_STREAM) // <20><>Ƶ֡<C6B5><D6A1>ǰ
|
||||
{
|
||||
if(strhheader->Handler!=AVI_FORMAT_MJPG)return AVI_FORMAT_ERR; //<2F><>MJPG<50><47>Ƶ<EFBFBD><C6B5>,<2C><>֧<EFBFBD><D6A7>
|
||||
if (strhheader->Handler != AVI_FORMAT_MJPG)
|
||||
return AVI_FORMAT_ERR; // <20><>MJPG<50><47>Ƶ<EFBFBD><C6B5>,<2C><>֧<EFBFBD><D6A7>
|
||||
avix.VideoFLAG = (u8 *)AVI_VIDS_FLAG_TBL[0]; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "00dc"
|
||||
avix.AudioFLAG = (u8 *)AVI_AUDS_FLAG_TBL[1]; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "01wb"
|
||||
bmpheader=(STRF_BMPHEADER*)(buf+12+strhheader->BlockSize+8);//strf
|
||||
if(bmpheader->BlockID!=AVI_STRF_ID)return AVI_STRF_ERR; //STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
bmpheader =
|
||||
(STRF_BMPHEADER *)(buf + 12 + strhheader->BlockSize + 8); // strf
|
||||
if (bmpheader->BlockID != AVI_STRF_ID)
|
||||
return AVI_STRF_ERR; // STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
avix.Width = bmpheader->bmiHeader.Width;
|
||||
avix.Height = bmpheader->bmiHeader.Height;
|
||||
buf += listheader->BlockSize + 8; // ƫ<><C6AB>
|
||||
@@ -99,15 +109,18 @@ AVISTATUS avi_init(u8 *buf,int size)
|
||||
avix.SampleRate = 0; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
avix.Channels = 0; // <20><>Ƶͨ<C6B5><CDA8><EFBFBD><EFBFBD>
|
||||
avix.AudioType = 0; // <20><>Ƶ<EFBFBD><C6B5>ʽ
|
||||
|
||||
}else
|
||||
{
|
||||
if(listheader->ListType!=AVI_STRL_ID)return AVI_STRL_ERR; //STRL ID<49><44><EFBFBD><EFBFBD>
|
||||
} else {
|
||||
if (listheader->ListType != AVI_STRL_ID)
|
||||
return AVI_STRL_ERR; // STRL ID<49><44><EFBFBD><EFBFBD>
|
||||
strhheader = (STRH_HEADER *)(buf + 12);
|
||||
if(strhheader->BlockID!=AVI_STRH_ID)return AVI_STRH_ERR; //STRH ID<49><44><EFBFBD><EFBFBD>
|
||||
if(strhheader->StreamType!=AVI_AUDS_STREAM)return AVI_FORMAT_ERR;//<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
wavheader=(STRF_WAVHEADER*)(buf+12+strhheader->BlockSize+8);//strf
|
||||
if(wavheader->BlockID!=AVI_STRF_ID)return AVI_STRF_ERR; //STRF ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (strhheader->BlockID != AVI_STRH_ID)
|
||||
return AVI_STRH_ERR; // STRH ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (strhheader->StreamType != AVI_AUDS_STREAM)
|
||||
return AVI_FORMAT_ERR; // <20><>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
wavheader =
|
||||
(STRF_WAVHEADER *)(buf + 12 + strhheader->BlockSize + 8); // strf
|
||||
if (wavheader->BlockID != AVI_STRF_ID)
|
||||
return AVI_STRF_ERR; // STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
avix.SampleRate = wavheader->SampleRate; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
avix.Channels = wavheader->Channels; // <20><>Ƶͨ<C6B5><CDA8><EFBFBD><EFBFBD>
|
||||
avix.AudioType = wavheader->FormatTag; // <20><>Ƶ<EFBFBD><C6B5>ʽ
|
||||
@@ -116,31 +129,42 @@ AVISTATUS avi_init(u8 *buf,int size)
|
||||
{
|
||||
avix.VideoFLAG = (u8 *)AVI_VIDS_FLAG_TBL[1]; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "01dc"
|
||||
avix.AudioFLAG = (u8 *)AVI_AUDS_FLAG_TBL[0]; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "00wb"
|
||||
wavheader=(STRF_WAVHEADER*)(buf+12+strhheader->BlockSize+8);//strf
|
||||
if(wavheader->BlockID!=AVI_STRF_ID)return AVI_STRF_ERR; //STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
wavheader =
|
||||
(STRF_WAVHEADER *)(buf + 12 + strhheader->BlockSize + 8); // strf
|
||||
if (wavheader->BlockID != AVI_STRF_ID)
|
||||
return AVI_STRF_ERR; // STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
avix.SampleRate = wavheader->SampleRate; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
avix.Channels = wavheader->Channels; // <20><>Ƶͨ<C6B5><CDA8><EFBFBD><EFBFBD>
|
||||
avix.AudioType = wavheader->FormatTag; // <20><>Ƶ<EFBFBD><C6B5>ʽ
|
||||
buf += listheader->BlockSize + 8; // ƫ<><C6AB>
|
||||
listheader = (LIST_HEADER *)(buf);
|
||||
if(listheader->ListID!=AVI_LIST_ID)return AVI_LIST_ERR; //LIST ID<49><44><EFBFBD><EFBFBD>
|
||||
if(listheader->ListType!=AVI_STRL_ID)return AVI_STRL_ERR; //STRL ID<49><44><EFBFBD><EFBFBD>
|
||||
if (listheader->ListID != AVI_LIST_ID)
|
||||
return AVI_LIST_ERR; // LIST ID<49><44><EFBFBD><EFBFBD>
|
||||
if (listheader->ListType != AVI_STRL_ID)
|
||||
return AVI_STRL_ERR; // STRL ID<49><44><EFBFBD><EFBFBD>
|
||||
strhheader = (STRH_HEADER *)(buf + 12);
|
||||
if(strhheader->BlockID!=AVI_STRH_ID)return AVI_STRH_ERR; //STRH ID<49><44><EFBFBD><EFBFBD>
|
||||
if(strhheader->StreamType!=AVI_VIDS_STREAM)return AVI_FORMAT_ERR;//<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
bmpheader=(STRF_BMPHEADER*)(buf+12+strhheader->BlockSize+8);//strf
|
||||
if(bmpheader->BlockID!=AVI_STRF_ID)return AVI_STRF_ERR; //STRF ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(bmpheader->bmiHeader.Compression!=AVI_FORMAT_MJPG)return AVI_FORMAT_ERR;//<2F><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
||||
if (strhheader->BlockID != AVI_STRH_ID)
|
||||
return AVI_STRH_ERR; // STRH ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (strhheader->StreamType != AVI_VIDS_STREAM)
|
||||
return AVI_FORMAT_ERR; // <20><>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
bmpheader =
|
||||
(STRF_BMPHEADER *)(buf + 12 + strhheader->BlockSize + 8); // strf
|
||||
if (bmpheader->BlockID != AVI_STRF_ID)
|
||||
return AVI_STRF_ERR; // STRF ID<49><44><EFBFBD><EFBFBD>
|
||||
if (bmpheader->bmiHeader.Compression != AVI_FORMAT_MJPG)
|
||||
return AVI_FORMAT_ERR; // <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
||||
avix.Width = bmpheader->bmiHeader.Width;
|
||||
avix.Height = bmpheader->bmiHeader.Height;
|
||||
}
|
||||
offset = avi_srarch_id(tbuf, size, "movi"); // <20><><EFBFBD><EFBFBD>movi ID
|
||||
if(offset==0)return AVI_MOVI_ERR; //MOVI ID<49><44><EFBFBD><EFBFBD>
|
||||
if (offset == 0)
|
||||
return AVI_MOVI_ERR; // MOVI ID<49><44><EFBFBD><EFBFBD>
|
||||
if (avix.SampleRate) // <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,<2C>Ų<EFBFBD><C5B2><EFBFBD>
|
||||
{
|
||||
tbuf += offset;
|
||||
offset = avi_srarch_id(tbuf, size, avix.AudioFLAG); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(offset==0)return AVI_STREAM_ERR; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (offset == 0)
|
||||
return AVI_STREAM_ERR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
tbuf += offset + 4;
|
||||
avix.AudioBufSize = *((u16 *)tbuf); // <20>õ<EFBFBD><C3B5><EFBFBD>Ƶ<EFBFBD><C6B5>buf<75><66>С.
|
||||
}
|
||||
@@ -163,47 +187,37 @@ AVISTATUS avi_init(u8 *buf,int size)
|
||||
// size:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
// id:Ҫ<><D2AA><EFBFBD>ҵ<EFBFBD>id,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>,<2C><><EFBFBD><EFBFBD>:movi IDƫ<44><C6AB><EFBFBD><EFBFBD>
|
||||
u16 avi_srarch_id(u8* buf,int size,u8 *id)
|
||||
{
|
||||
u16 avi_srarch_id(u8 *buf, int size, u8 *id) {
|
||||
u16 i;
|
||||
size -= 4;
|
||||
for(i=0;i<size;i++)
|
||||
{
|
||||
for (i = 0; i < size; i++) {
|
||||
if (buf[i] == id[0])
|
||||
if (buf[i + 1] == id[1])
|
||||
if (buf[i + 2] == id[2])
|
||||
if(buf[i+3]==id[3])return i;//<2F>ҵ<EFBFBD>"id"<22><><EFBFBD>ڵ<EFBFBD>λ<EFBFBD><CEBB>
|
||||
if (buf[i + 3] == id[3])
|
||||
return i; // <20>ҵ<EFBFBD>"id"<22><><EFBFBD>ڵ<EFBFBD>λ<EFBFBD><CEBB>
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
// <20>õ<EFBFBD>stream<61><6D><EFBFBD><EFBFBD>Ϣ
|
||||
// buf:<3A><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>01wb/00wb/01dc/00dc<64><63>ͷ)
|
||||
AVISTATUS avi_get_streaminfo(u8* buf)
|
||||
{
|
||||
AVISTATUS avi_get_streaminfo(u8 *buf) {
|
||||
int offset = 0;
|
||||
avix.StreamID = MAKEWORD(buf + 2); // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
avix.StreamSize = MAKEDWORD(buf + 4); // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>С
|
||||
if(avix.StreamSize%2)avix.StreamSize++; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1(avix.StreamSize,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC>)
|
||||
if(avix.StreamID==AVI_VIDS_FLAG||avix.StreamID==AVI_AUDS_FLAG)return AVI_OK;
|
||||
if (avix.StreamSize % 2)
|
||||
avix.StreamSize++; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1(avix.StreamSize,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC>)
|
||||
if (avix.StreamID == AVI_VIDS_FLAG || avix.StreamID == AVI_AUDS_FLAG)
|
||||
return AVI_OK;
|
||||
return AVI_STREAM_ERR;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static vu8 g_frame_en = 0;
|
||||
|
||||
|
||||
void avi_timer_irq (void)
|
||||
{
|
||||
g_frame_en=1;
|
||||
}
|
||||
void avi_timer_irq(void) { g_frame_en = 1; }
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>avix.SecPerFrame
|
||||
void avi_timer_init (u32 t)
|
||||
{
|
||||
void avi_timer_init(u32 t) {
|
||||
TIMER_InitStruct timer_init = {0};
|
||||
timer_init.Cycle = t / 1;
|
||||
timer_init.Tim = TIM3;
|
||||
@@ -211,30 +225,13 @@ void avi_timer_init (u32 t)
|
||||
TIMER_InitNormal(&timer_init);
|
||||
}
|
||||
|
||||
|
||||
void avi_tiemr_delete (void)
|
||||
{
|
||||
TIMER_DeInit (TIM3);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void avi_tiemr_delete(void) { TIMER_DeInit(TIM3); }
|
||||
|
||||
#define AVI_AUDIO_BUF_SIZE 1024 * 5 // <20><><EFBFBD><EFBFBD>avi<76><69><EFBFBD><EFBFBD>ʱ,<2C><>Ƶbuf<75><66>С.
|
||||
#define AVI_VIDEO_BUF_SIZE 1024 * 200 // <20><><EFBFBD><EFBFBD>avi<76><69><EFBFBD><EFBFBD>ʱ,<2C><>Ƶbuf<75><66>С.
|
||||
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ
|
||||
int video_play (char *pname,int loop)
|
||||
{
|
||||
|
||||
int video_play(char *pname, int loop) {
|
||||
|
||||
u8 listhead[8] = {0}; // <20><><EFBFBD><EFBFBD>ͷ
|
||||
u32 fresh = 0;
|
||||
@@ -259,30 +256,29 @@ int video_play (char *pname,int loop)
|
||||
mymemset(g_i2sbuf[1], 0, AVI_AUDIO_BUF_SIZE);
|
||||
mymemset(g_i2sbuf[2], 0, AVI_AUDIO_BUF_SIZE);
|
||||
mymemset(g_i2sbuf[3], 0, AVI_AUDIO_BUF_SIZE);
|
||||
while(res==0)
|
||||
{
|
||||
while (res == 0) {
|
||||
res = f_open(favi, (char *)pname, FA_READ);
|
||||
if(res==0)
|
||||
{
|
||||
if (res == 0) {
|
||||
pbuf = framebuf;
|
||||
res = f_read(favi, pbuf, AVI_VIDEO_BUF_SIZE, &nr); // <20><>ʼ<EFBFBD><CABC>ȡ
|
||||
if(res)
|
||||
{
|
||||
if (res) {
|
||||
break;
|
||||
}
|
||||
// <20><>ʼavi<76><69><EFBFBD><EFBFBD>
|
||||
res = avi_init(pbuf, AVI_VIDEO_BUF_SIZE); // avi<76><69><EFBFBD><EFBFBD>
|
||||
if(res)
|
||||
{
|
||||
if (res) {
|
||||
break;
|
||||
}
|
||||
// avi_timer_init (avix.SecPerFrame);
|
||||
offset=avi_srarch_id(pbuf,AVI_VIDEO_BUF_SIZE,(u8*)"movi");//Ѱ<><D1B0>movi ID
|
||||
offset =
|
||||
avi_srarch_id(pbuf, AVI_VIDEO_BUF_SIZE, (u8 *)"movi"); // Ѱ<><D1B0>movi ID
|
||||
avi_get_streaminfo(pbuf + offset + 4); // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ϣ
|
||||
f_lseek(favi, offset + 12 - 8); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ID,<2C><><EFBFBD><EFBFBD>ַƫ<D6B7>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>ʼ<EFBFBD><CABC>
|
||||
extern void jdmerge_setvideo_xsize(int xsize, int lcd_xsize);
|
||||
jdmerge_setvideo_xsize(avix.Width, LCD_GetLcdSizeX()); // <20><><EFBFBD>õ<EFBFBD>ַ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
res=mjpegdec_init((LCD_GetLcdSizeX()-avix.Width)/2,(LCD_GetLcdSizeY()-avix.Height)/2);//JPG<50><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
res =
|
||||
mjpegdec_init((LCD_GetLcdSizeX() - avix.Width) / 2,
|
||||
(LCD_GetLcdSizeY() - avix.Height) / 2); // JPG<50><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
if (avix.SampleRate) // <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>Ϣ,<2C>ų<EFBFBD>ʼ<EFBFBD><CABC>
|
||||
{
|
||||
// <20><>ʼ<EFBFBD><CABC>DAC
|
||||
@@ -300,24 +296,26 @@ int video_play (char *pname,int loop)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (Touch_GetState()->x[1]!=0) break; //<2F><>Ļ<EFBFBD><C4BB><EFBFBD>㴥<EFBFBD><E3B4A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (USART3_GetKeyPressed()&(0x08)) break;//<2F><><EFBFBD>·<EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (Touch_GetState()->x[1] != 0)
|
||||
break; // <EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>㴥<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (USART3_GetKeyPressed() & (0x08))
|
||||
break; // <20><><EFBFBD>·<EFBFBD><C2B7>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (avix.StreamID == AVI_VIDS_FLAG) // <20><>Ƶ<EFBFBD><C6B5>
|
||||
{
|
||||
pbuf = framebuf;
|
||||
// mymemset (pbuf,0,AVI_VIDEO_BUF_SIZE);
|
||||
f_read(favi,pbuf,avix.StreamSize+8-8,&nr); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡+<2B><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<49><44>Ϣ
|
||||
f_read(favi, pbuf, avix.StreamSize + 8 - 8,
|
||||
&nr); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡+<2B><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<49><44>Ϣ
|
||||
// <20>ȴ<EFBFBD>֡ʱ<D6A1><CAB1>
|
||||
// while (g_frame_en==0){} g_frame_en=0;
|
||||
while (LCD_GetLayerUpdataStat ()==0);
|
||||
while (LCD_GetLayerUpdataStat() == 0)
|
||||
;
|
||||
LCD_SwitchLayerBuff();
|
||||
res = mjpegdec_decode(pbuf, avix.StreamSize);
|
||||
if (res==0)
|
||||
{
|
||||
if (res == 0) {
|
||||
LCD_ExitLayerBuff();
|
||||
}
|
||||
if(res)
|
||||
{
|
||||
if (res) {
|
||||
// break;
|
||||
}
|
||||
} else // <20><>Ƶ<EFBFBD><C6B5>
|
||||
@@ -325,14 +323,17 @@ int video_play (char *pname,int loop)
|
||||
// f_read(favi,audio_buff,avix.StreamSize+8-8,&nr);//<2F><><EFBFBD><EFBFBD>i2sbuf
|
||||
// pbuf=audio_buff;
|
||||
i2ssavebuf++;
|
||||
if(i2ssavebuf>3)i2ssavebuf=0;
|
||||
do
|
||||
{
|
||||
if (i2ssavebuf > 3)
|
||||
i2ssavebuf = 0;
|
||||
do {
|
||||
nr = g_i2splaybuf;
|
||||
if(nr)nr--;
|
||||
else nr=3;
|
||||
if (nr)
|
||||
nr--;
|
||||
else
|
||||
nr = 3;
|
||||
} while (i2ssavebuf == nr); // <20><>ײ<EFBFBD>ȴ<EFBFBD>.
|
||||
f_read(favi,g_i2sbuf[i2ssavebuf],avix.StreamSize,&nr);//<2F><><EFBFBD><EFBFBD>i2sbuf
|
||||
f_read(favi, g_i2sbuf[i2ssavebuf], avix.StreamSize,
|
||||
&nr); // <20><><EFBFBD><EFBFBD>i2sbuf
|
||||
u16 *p = (u16 *)g_i2sbuf[i2ssavebuf];
|
||||
for (int i = 0; i < avix.StreamSize / 2; i++)
|
||||
p[i] = (p[i] + 0x8000) >> 4;
|
||||
@@ -355,15 +356,4 @@ int video_play (char *pname,int loop)
|
||||
myfree(g_i2sbuf[3]);
|
||||
DAC_NormalDeInit(&dac);
|
||||
return (int)res;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -33,8 +33,6 @@ typedef enum {
|
||||
AVI_STREAM_ERR, // 11,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
} AVISTATUS;
|
||||
|
||||
|
||||
|
||||
#define AVI_RIFF_ID 0X46464952
|
||||
#define AVI_AVI_ID 0X20495641
|
||||
#define AVI_LIST_ID 0X5453494C
|
||||
@@ -50,18 +48,15 @@ typedef enum {
|
||||
#define AVI_VIDS_STREAM 0X73646976 // <20><>Ƶ<EFBFBD><C6B5>
|
||||
#define AVI_AUDS_STREAM 0X73647561 // <20><>Ƶ<EFBFBD><C6B5>
|
||||
|
||||
|
||||
#define AVI_VIDS_FLAG 0X6463 // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>־
|
||||
#define AVI_AUDS_FLAG 0X7762 // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>־
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define AVI_FORMAT_MJPG 0X47504A4D
|
||||
|
||||
|
||||
// AVI <20><>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
// <20><>һЩ<D2BB><D0A9>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
typedef struct __packed
|
||||
{
|
||||
typedef struct __packed {
|
||||
u32 SecPerFrame; // <20><>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>(<28><>λΪus)
|
||||
u32 TotalFrame; // <20>ļ<EFBFBD><C4BC><EFBFBD>֡<EFBFBD><D6A1>
|
||||
u32 Width; // ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
@@ -80,32 +75,27 @@ typedef struct __packed
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// AVI <20><><EFBFBD><EFBFBD>Ϣ
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
u32 RiffID; // RiffID=='RIFF'==0X61766968
|
||||
u32 FileSize; // AVI<56>ļ<EFBFBD><C4BC><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,ҲRIFFID<49><44>FileSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u32 AviID; // AviID=='AVI '==0X41564920
|
||||
} AVI_HEADER;
|
||||
|
||||
// AVI <20><><EFBFBD><EFBFBD>Ϣ
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
u32 FrameID; // ֡ID,FrameID=='RIFF'==0X61766968
|
||||
u32 FrameSize; // ֡<><D6A1>С
|
||||
} FRAME_HEADER;
|
||||
|
||||
|
||||
// LIST <20><><EFBFBD><EFBFBD>Ϣ
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
u32 ListID; // ListID=='LIST'==0X4c495354
|
||||
u32 BlockSize; // <20><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,ҲListID<49><44>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u32 ListType; // LIST<53>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD>:hdrl(<28><>Ϣ<EFBFBD><CFA2>)/movi(<28><><EFBFBD>ݿ<EFBFBD>)/idxl(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>DZ<EFBFBD><C7B1><EFBFBD>,<2C>ǿ<EFBFBD>ѡ<EFBFBD><D1A1>)
|
||||
} LIST_HEADER;
|
||||
|
||||
// avih <20>ӿ<EFBFBD><D3BF><EFBFBD>Ϣ
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
u32 BlockID; // <20><><EFBFBD><EFBFBD>־:avih==0X61766968
|
||||
u32 BlockSize; // <20><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD>BlockID<49><44>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u32 SecPerFrame; // <20><>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>(<28><>λΪus)
|
||||
@@ -122,8 +112,7 @@ typedef struct
|
||||
} AVIH_HEADER;
|
||||
|
||||
// strh <20><>ͷ<EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD>Ϣ(strh<72><68>strl)
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
u32 BlockID; // <20><><EFBFBD><EFBFBD>־:strh==0X73747268
|
||||
u32 BlockSize; // <20><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD>BlockID<49><44>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u32 StreamType; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>࣬vids(0X73646976):<3A><>Ƶ;auds(0X73647561):<3A><>Ƶ
|
||||
@@ -149,8 +138,7 @@ typedef struct
|
||||
} STRH_HEADER;
|
||||
|
||||
// BMP<4D>ṹ<EFBFBD><E1B9B9>
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
u32 BmpSize; // bmp<6D>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD>С,<2C><><EFBFBD><EFBFBD>(BmpSize<7A><65><EFBFBD><EFBFBD>)
|
||||
long Width; // ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
long Height; // ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
@@ -165,8 +153,7 @@ typedef struct
|
||||
} BMP_HEADER;
|
||||
|
||||
// <20><>ɫ<EFBFBD><C9AB>
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
u8 rgbBlue; // <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ֵ<><D6B5>ΧΪ0-255)
|
||||
u8 rgbGreen; // <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ֵ<><D6B5>ΧΪ0-255)
|
||||
u8 rgbRed; // <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ֵ<><D6B5>ΧΪ0-255)
|
||||
@@ -174,8 +161,7 @@ typedef struct
|
||||
} AVIRGBQUAD;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>strh,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,strf(<28><><EFBFBD><EFBFBD>ʽ)ʹSTRH_BMPHEADER<45><52>
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
u32 BlockID; // <20><><EFBFBD><EFBFBD>־,strf==0X73747266
|
||||
u32 BlockSize; // <20><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD>BlockID<49>ͱ<EFBFBD>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
BMP_HEADER bmiHeader; // λͼ<CEBB><CDBC>Ϣͷ
|
||||
@@ -183,8 +169,7 @@ typedef struct
|
||||
} STRF_BMPHEADER;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>strh,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,strf(<28><><EFBFBD><EFBFBD>ʽ)ʹSTRH_WAVHEADER<45><52>
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
u32 BlockID; // <20><><EFBFBD><EFBFBD>־,strf==0X73747266
|
||||
u32 BlockSize; // <20><><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽ<EFBFBD>,Ҳ<><D2B2><EFBFBD><EFBFBD>BlockID<49>ͱ<EFBFBD>BlockSize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
u16 FormatTag; // <20><>ʽ<EFBFBD><CABD>־:0X0001=PCM,0X0055=MP3...
|
||||
@@ -195,33 +180,26 @@ typedef struct
|
||||
u16 Size; // <20>ýṹ<C3BD><E1B9B9>С
|
||||
} STRF_WAVHEADER;
|
||||
|
||||
#define MAKEWORD(ptr) (u16)(((u16)*((u8*)(ptr))<<8)|(u16)*(u8*)((ptr)+1))
|
||||
#define MAKEDWORD(ptr) (u32)(((u16)*(u8*)(ptr)|(((u16)*(u8*)(ptr+1))<<8)|\
|
||||
(((u16)*(u8*)(ptr+2))<<16)|(((u16)*(u8*)(ptr+3))<<24)))
|
||||
|
||||
#define MAKEWORD(ptr) \
|
||||
(u16)(((u16) * ((u8 *)(ptr)) << 8) | (u16) * (u8 *)((ptr) + 1))
|
||||
#define MAKEDWORD(ptr) \
|
||||
(u32)(((u16) * (u8 *)(ptr) | (((u16) * (u8 *)(ptr + 1)) << 8) | \
|
||||
(((u16) * (u8 *)(ptr + 2)) << 16) | \
|
||||
(((u16) * (u8 *)(ptr + 3)) << 24)))
|
||||
|
||||
AVISTATUS avi_init(u8 *buf, int size); // <20><>ʼ<EFBFBD><CABC>avi<76><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 avi_srarch_id(u8 *buf, int size, u8 *id); // <20><><EFBFBD><EFBFBD>ID,ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD>
|
||||
AVISTATUS avi_get_streaminfo(u8 *buf); // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ϣ
|
||||
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ,loop==1,ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int video_play(char *pname, int loop);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
u8 Avih_Parser(u8 *buffer);
|
||||
u8 Strl_Parser(u8 *buffer);
|
||||
u8 Strf_Parser(u8 *buffer);
|
||||
|
||||
|
||||
|
||||
u16 Search_Movi(u8 *buffer);
|
||||
u16 Search_Fram(u8 *buffer);
|
||||
u32 ReadUnit(u8 *buffer, u8 index, u8 Bytes, u8 Format);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "mjpeg.h"
|
||||
#include "mymem.h"
|
||||
#include "ff.h"
|
||||
#include "lcd_rgb.h"
|
||||
#include "mymem.h"
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
|
||||
// ALIENTEK STM32F407<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -18,62 +18,52 @@
|
||||
// <20><>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
struct jpeg_decompress_struct *cinfo;
|
||||
struct my_error_mgr *jerr;
|
||||
u8 *jpegbuf; // jpeg<65><67><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
u32 jbufsize; // jpeg buf<75><66>С
|
||||
u16 imgoffx, imgoffy; // ͼ<><CDBC><EFBFBD><EFBFBD>x,y<><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><EFBFBD><F2B5A5BF>ٵ<EFBFBD><D9B5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
|
||||
#define MJPEG_MAX_MALLOC_SIZE 38 * 1024 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>38K<38>ֽ<EFBFBD>
|
||||
|
||||
|
||||
u8 *jmembuf; // mjpeg<65><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڴ<EFBFBD><DAB4><EFBFBD>
|
||||
u32 jmempos; // <20>ڴ<EFBFBD><DAB4><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
|
||||
// mjpeg<65><67><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
void* mjpeg_malloc(u32 num)
|
||||
{
|
||||
void *mjpeg_malloc(u32 num) {
|
||||
u32 curpos = jmempos; // <20>˴η<CBB4><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
jmempos += num; // <20><>һ<EFBFBD>η<EFBFBD><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
if(jmempos>MJPEG_MAX_MALLOC_SIZE)
|
||||
{
|
||||
if (jmempos > MJPEG_MAX_MALLOC_SIZE) {
|
||||
printf("mem error:%d,%d", curpos, num);
|
||||
}
|
||||
return (void *)&jmembuf[curpos]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뵽<EFBFBD><EBB5BD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ַ
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
|
||||
static void my_error_exit(j_common_ptr cinfo)
|
||||
{
|
||||
static void my_error_exit(j_common_ptr cinfo) {
|
||||
my_error_ptr myerr = (my_error_ptr)cinfo->err;
|
||||
(*cinfo->err->output_message)(cinfo);
|
||||
longjmp(myerr->setjmp_buffer, 1);
|
||||
}
|
||||
|
||||
METHODDEF(void) my_emit_message(j_common_ptr cinfo, int msg_level)
|
||||
{
|
||||
METHODDEF(void)
|
||||
my_emit_message(j_common_ptr cinfo, int msg_level) {
|
||||
my_error_ptr myerr = (my_error_ptr)cinfo->err;
|
||||
if(msg_level<0)
|
||||
{
|
||||
if (msg_level < 0) {
|
||||
printf("emit msg:%d\r\n", msg_level);
|
||||
longjmp(myerr->setjmp_buffer, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Դ,<2C><>ִ<EFBFBD><D6B4><EFBFBD>κβ<CEBA><CEB2><EFBFBD>
|
||||
static void init_source(j_decompress_ptr cinfo)
|
||||
{
|
||||
static void init_source(j_decompress_ptr cinfo) {
|
||||
// <20><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>.
|
||||
return;
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뻺<EFBFBD><EBBBBA><EFBFBD><EFBFBD>,һ<><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><C8A1>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
|
||||
static boolean fill_input_buffer(j_decompress_ptr cinfo)
|
||||
{
|
||||
static boolean fill_input_buffer(j_decompress_ptr cinfo) {
|
||||
if (jbufsize == 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
// printf("jd read off\r\n");
|
||||
@@ -82,8 +72,7 @@ static boolean fill_input_buffer(j_decompress_ptr cinfo)
|
||||
jpegbuf[1] = (u8)JPEG_EOI;
|
||||
cinfo->src->next_input_byte = jpegbuf;
|
||||
cinfo->src->bytes_in_buffer = 2;
|
||||
}else
|
||||
{
|
||||
} else {
|
||||
cinfo->src->next_input_byte = jpegbuf;
|
||||
cinfo->src->bytes_in_buffer = jbufsize;
|
||||
jbufsize -= jbufsize;
|
||||
@@ -91,16 +80,13 @@ static boolean fill_input_buffer(j_decompress_ptr cinfo)
|
||||
return TRUE;
|
||||
}
|
||||
// <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>num_bytes<65><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static void skip_input_data(j_decompress_ptr cinfo, long num_bytes)
|
||||
{
|
||||
static void skip_input_data(j_decompress_ptr cinfo, long num_bytes) {
|
||||
/* Just a dumb implementation for now. Could use fseek() except
|
||||
* it doesn't work on pipes. Not clear that being smart is worth
|
||||
* any trouble anyway --- large skips are infrequent.
|
||||
*/
|
||||
if (num_bytes > 0)
|
||||
{
|
||||
while(num_bytes>(long) cinfo->src->bytes_in_buffer)
|
||||
{
|
||||
if (num_bytes > 0) {
|
||||
while (num_bytes > (long)cinfo->src->bytes_in_buffer) {
|
||||
num_bytes -= (long)cinfo->src->bytes_in_buffer;
|
||||
(void)cinfo->src->fill_input_buffer(cinfo);
|
||||
/* note we assume that fill_input_buffer will never
|
||||
@@ -112,42 +98,37 @@ static void skip_input_data(j_decompress_ptr cinfo, long num_bytes)
|
||||
}
|
||||
}
|
||||
// <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>jpeg_finish_decompress<73><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
static void term_source(j_decompress_ptr cinfo)
|
||||
{
|
||||
static void term_source(j_decompress_ptr cinfo) {
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>κδ<CEBA><CEB4><EFBFBD>
|
||||
return;
|
||||
}
|
||||
// <20><>ʼ<EFBFBD><CABC>jpeg<65><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
|
||||
static void jpeg_filerw_src_init(j_decompress_ptr cinfo)
|
||||
{
|
||||
static void jpeg_filerw_src_init(j_decompress_ptr cinfo) {
|
||||
if (cinfo->src == NULL) /* first time for this JPEG object? */
|
||||
{
|
||||
cinfo->src = (struct jpeg_source_mgr *)
|
||||
(*cinfo->mem->alloc_small)((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
||||
sizeof(struct jpeg_source_mgr));
|
||||
cinfo->src = (struct jpeg_source_mgr *)(*cinfo->mem->alloc_small)(
|
||||
(j_common_ptr)cinfo, JPOOL_PERMANENT, sizeof(struct jpeg_source_mgr));
|
||||
}
|
||||
cinfo->src->init_source = init_source;
|
||||
cinfo->src->fill_input_buffer = fill_input_buffer;
|
||||
cinfo->src->skip_input_data = skip_input_data;
|
||||
cinfo->src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
|
||||
cinfo->src->resync_to_restart =
|
||||
jpeg_resync_to_restart; /* use default method */
|
||||
cinfo->src->term_source = term_source;
|
||||
cinfo->src->bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
|
||||
cinfo->src->next_input_byte = NULL; /* until buffer loaded */
|
||||
}
|
||||
|
||||
|
||||
// mjpeg <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
// offx,offy:x,y<><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>;
|
||||
// 1,ʧ<><CAA7>
|
||||
u8 mjpegdec_init(u16 offx,u16 offy)
|
||||
{
|
||||
u8 mjpegdec_init(u16 offx, u16 offy) {
|
||||
cinfo = mymalloc(sizeof(struct jpeg_decompress_struct));
|
||||
jerr = mymalloc(sizeof(struct my_error_mgr));
|
||||
// <20><><EFBFBD><EFBFBD>sram<61><6D><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>--2020.6.2
|
||||
jmembuf = mymalloc_fast(MJPEG_MAX_MALLOC_SIZE); // MJPEG<45><47><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(cinfo==0||jerr==0||jmembuf==0)
|
||||
{
|
||||
if (cinfo == 0 || jerr == 0 || jmembuf == 0) {
|
||||
mjpegdec_free();
|
||||
return 1;
|
||||
}
|
||||
@@ -157,8 +138,7 @@ u8 mjpegdec_init(u16 offx,u16 offy)
|
||||
return 0;
|
||||
}
|
||||
// mjpeg<65><67><EFBFBD><EFBFBD>,<2C>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
void mjpegdec_free(void)
|
||||
{
|
||||
void mjpegdec_free(void) {
|
||||
myfree(cinfo);
|
||||
myfree(jerr);
|
||||
myfree(jmembuf);
|
||||
@@ -169,10 +149,10 @@ void mjpegdec_free(void)
|
||||
// bsize:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>
|
||||
u8 mjpegdec_decode(u8* buf,u32 bsize)
|
||||
{
|
||||
u8 mjpegdec_decode(u8 *buf, u32 bsize) {
|
||||
JSAMPARRAY buffer;
|
||||
if(bsize==0)return 1;
|
||||
if (bsize == 0)
|
||||
return 1;
|
||||
jpegbuf = buf;
|
||||
jbufsize = bsize;
|
||||
jmempos = 0; // MJEPG<50><47><EFBFBD><EFBFBD>,<2C><><EFBFBD>´<EFBFBD>0<EFBFBD><30>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
||||
@@ -197,27 +177,10 @@ u8 mjpegdec_decode(u8* buf,u32 bsize)
|
||||
unsigned short *lcd_addr = (unsigned short *)LCD_GetDrawAddr();
|
||||
// lcd_addr+=LCD_GetLcdSizeX()*LCD_GetLcdSizeY()-1-(imgoffx+imgoffy*LCD_GetLcdSizeX());
|
||||
jdmerge_setlcdaddr(lcd_addr); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾλ<CABE><CEBB>
|
||||
while (cinfo->output_scanline < cinfo->output_height)
|
||||
{
|
||||
while (cinfo->output_scanline < cinfo->output_height) {
|
||||
jpeg_read_scanlines(cinfo, buffer, 1);
|
||||
}
|
||||
jpeg_finish_decompress(cinfo);
|
||||
jpeg_destroy_decompress(cinfo);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#ifndef __MJPEG_H
|
||||
#define __MJPEG_H
|
||||
#include "stdio.h"
|
||||
#include <cdjpeg.h>
|
||||
#include "stm32f4xx.h"
|
||||
#include <cdjpeg.h>
|
||||
#include <setjmp.h>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
|
||||
@@ -20,8 +20,6 @@
|
||||
// <20><>
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
struct my_error_mgr {
|
||||
struct jpeg_error_mgr pub;
|
||||
jmp_buf setjmp_buffer; // for return to caller
|
||||
@@ -33,4 +31,3 @@ void mjpegdec_free(void);
|
||||
u8 mjpegdec_decode(u8 *buf, u32 bsize);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,19 +1,16 @@
|
||||
#include "mp3play.h"
|
||||
#include "stm32f4xx.h"
|
||||
#include "dac.h"
|
||||
#include "delay.h"
|
||||
#include "mymem.h"
|
||||
#include "usart.h"
|
||||
#include "string.h"
|
||||
#include "rtthread.h"
|
||||
#include "ftfile.h"
|
||||
#include "mymem.h"
|
||||
#include "rtthread.h"
|
||||
#include "stm32f4xx.h"
|
||||
#include "string.h"
|
||||
#include "usart.h"
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>ת<EFBFBD><D7AA>
|
||||
#include "char_encode.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>
|
||||
@@ -37,22 +34,20 @@ static vu8 g_buff_useing; //
|
||||
static int g_vol = 5; // <20><><EFBFBD><EFBFBD> 0~10<31><30>
|
||||
#define MP3_VOL_MAX 10
|
||||
|
||||
|
||||
// MP3 DMA<4D><41><EFBFBD>ͻص<CDBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
||||
static void dma_tx_callback(DAC_UserStruct *dac)
|
||||
{
|
||||
static void dma_tx_callback(DAC_UserStruct *dac) {
|
||||
u16 i;
|
||||
if (dac->buff_useing==1)
|
||||
{
|
||||
if (dac->buff_useing == 1) {
|
||||
if ((audiodev.status & 0X01) == 0) // <20><>ͣ<EFBFBD><CDA3>,<2C><><EFBFBD><EFBFBD>0
|
||||
{
|
||||
for(i=0;i<2304*2;i++)audiodev.i2sbuf1[i]=0;
|
||||
for (i = 0; i < 2304 * 2; i++)
|
||||
audiodev.i2sbuf1[i] = 0;
|
||||
}
|
||||
}else
|
||||
{
|
||||
} else {
|
||||
if ((audiodev.status & 0X01) == 0) // <20><>ͣ<EFBFBD><CDA3>,<2C><><EFBFBD><EFBFBD>0
|
||||
{
|
||||
for(i=0;i<2304*2;i++)audiodev.i2sbuf2[i]=0;
|
||||
for (i = 0; i < 2304 * 2; i++)
|
||||
audiodev.i2sbuf2[i] = 0;
|
||||
}
|
||||
}
|
||||
g_buff_useing = dac->buff_useing;
|
||||
@@ -62,35 +57,28 @@ static void dma_tx_callback(DAC_UserStruct *dac)
|
||||
// buf:PCM<43><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
// size:pcm<63><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(16λΪ<CEBB><CEAA>λ)
|
||||
// nch:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
void mp3_fill_buffer(u16* buf,u16 size,u8 nch)
|
||||
{
|
||||
void mp3_fill_buffer(u16 *buf, u16 size, u8 nch) {
|
||||
u16 i;
|
||||
s16 *p;
|
||||
while (g_buff_Invalid == 0) // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
rt_thread_delay(5); //
|
||||
};
|
||||
if(g_buff_useing==0)
|
||||
{
|
||||
if (g_buff_useing == 0) {
|
||||
p = (s16 *)audiodev.i2sbuf2;
|
||||
}else
|
||||
{
|
||||
} else {
|
||||
p = (s16 *)audiodev.i2sbuf1;
|
||||
}
|
||||
if(nch==2)
|
||||
{
|
||||
for(i=0;i<size;i++)
|
||||
{
|
||||
if (nch == 2) {
|
||||
for (i = 0; i < size; i++) {
|
||||
// p[i]=((buf[i]+0x8000)>>4);
|
||||
int temp = (int16_t)buf[i];
|
||||
temp = temp * g_vol / MP3_VOL_MAX;
|
||||
p[i] = ((temp + 0x8000) >> 4);
|
||||
}
|
||||
}
|
||||
else //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
for(i=0;i<size;i++)
|
||||
} else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
for (i = 0; i < size; i++) {
|
||||
int temp = (int16_t)buf[i];
|
||||
temp = temp * g_vol / MP3_VOL_MAX;
|
||||
p[2 * i] = ((temp + 0x8000) >> 4);
|
||||
@@ -101,36 +89,26 @@ void mp3_fill_buffer(u16* buf,u16 size,u8 nch)
|
||||
g_buff_Invalid = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void mp3_get_string(u8 type, u8 *out, u8 *in, int size);
|
||||
|
||||
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ID3V1
|
||||
// buf:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>(<28><>С<EFBFBD>̶<EFBFBD><CCB6><EFBFBD>128<32>ֽ<EFBFBD>)
|
||||
// pctrl:MP3<50><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:0,<2C><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>,<2C><>ȡʧ<C8A1><CAA7>
|
||||
u8 mp3_id3v1_decode(u8* buf,__mp3ctrl *pctrl)
|
||||
{
|
||||
u8 mp3_id3v1_decode(u8 *buf, __mp3ctrl *pctrl) {
|
||||
ID3V1_Tag *id3v1tag;
|
||||
id3v1tag = (ID3V1_Tag *)buf;
|
||||
if (strncmp("TAG", (char *)id3v1tag->id, 3) == 0) // <20><>MP3 ID3V1 TAG
|
||||
{
|
||||
mp3_get_string(0, pctrl->title, id3v1tag->title, 30);
|
||||
mp3_get_string(0, pctrl->artist, id3v1tag->artist, 30);
|
||||
}else return 1;
|
||||
} else
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static void mp3_get_string (u8 type,u8 *out,u8 *in,int size)
|
||||
{
|
||||
static void mp3_get_string(u8 type, u8 *out, u8 *in, int size) {
|
||||
if (type == 1) // UNICODE16
|
||||
{
|
||||
u8 *char_uni = mymalloc(128);
|
||||
@@ -139,8 +117,7 @@ static void mp3_get_string (u8 type,u8 *out,u8 *in,int size)
|
||||
// UnicodeתGBK
|
||||
uni2gbk_str(char_uni, out);
|
||||
myfree(char_uni);
|
||||
}
|
||||
else if (type==3)//UTF8
|
||||
} else if (type == 3) // UTF8
|
||||
{
|
||||
u8 *char_utf8 = mymalloc(128);
|
||||
mymemset(char_utf8, 0, 128);
|
||||
@@ -150,29 +127,19 @@ static void mp3_get_string (u8 type,u8 *out,u8 *in,int size)
|
||||
utf82gbk_str(char_utf8, out);
|
||||
|
||||
myfree(char_utf8);
|
||||
}
|
||||
else //(type==0)//ASCII
|
||||
} else //(type==0)//ASCII
|
||||
{
|
||||
strncpy((char *)out, (char *)(in), size);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ID3V2
|
||||
// buf:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||
// size:<3A><><EFBFBD>ݴ<EFBFBD>С
|
||||
// pctrl:MP3<50><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:0,<2C><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>,<2C><>ȡʧ<C8A1><CAA7>
|
||||
u8 mp3_id3v2_decode(u8* buf,u32 size,__mp3ctrl *pctrl)
|
||||
{
|
||||
u8 mp3_id3v2_decode(u8 *buf, u32 size, __mp3ctrl *pctrl) {
|
||||
ID3V2_TagHead *taghead;
|
||||
ID3V23_FrameHead *framehead;
|
||||
u32 t;
|
||||
@@ -181,26 +148,31 @@ u8 mp3_id3v2_decode(u8* buf,u32 size,__mp3ctrl *pctrl)
|
||||
taghead = (ID3V2_TagHead *)buf;
|
||||
if (strncmp("ID3", (const char *)taghead->id, 3) == 0) // <20><><EFBFBD><EFBFBD>ID3?
|
||||
{
|
||||
tagsize=((u32)taghead->size[0]<<21)|((u32)taghead->size[1]<<14)|((u16)taghead->size[2]<<7)|taghead->size[3];//<2F>õ<EFBFBD>tag <20><>С
|
||||
tagsize = ((u32)taghead->size[0] << 21) | ((u32)taghead->size[1] << 14) |
|
||||
((u16)taghead->size[2] << 7) | taghead->size[3]; // <20>õ<EFBFBD>tag <20><>С
|
||||
pctrl->datastart = tagsize; // <20>õ<EFBFBD>mp3<70><33><EFBFBD>ݿ<EFBFBD>ʼ<EFBFBD><CABC>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
|
||||
if(tagsize>size)tagsize=size; //tagsize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bufsize<7A><65>ʱ<EFBFBD><CAB1>,ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>size<7A><65>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(taghead->mversion<3)
|
||||
{
|
||||
if (tagsize > size)
|
||||
tagsize = size; // tagsize<7A><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bufsize<7A><65>ʱ<EFBFBD><CAB1>,ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>size<7A><65>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (taghead->mversion < 3) {
|
||||
printf("not supported mversion!\r\n");
|
||||
return 1;
|
||||
}
|
||||
t = 10;
|
||||
while(t<tagsize)
|
||||
{
|
||||
while (t < tagsize) {
|
||||
framehead = (ID3V23_FrameHead *)(buf + t);
|
||||
frame_size=((u32)framehead->size[0]<<24)|((u32)framehead->size[1]<<16)|((u32)framehead->size[2]<<8)|framehead->size[3];//<2F>õ<EFBFBD>֡<EFBFBD><D6A1>С
|
||||
if (strncmp("TT2",(char*)framehead->id,3)==0||strncmp("TIT2",(char*)framehead->id,4)==0)//<2F>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡,<2C><>֧<EFBFBD><D6A7>unicode<64><65>ʽ!!
|
||||
frame_size =
|
||||
((u32)framehead->size[0] << 24) | ((u32)framehead->size[1] << 16) |
|
||||
((u32)framehead->size[2] << 8) | framehead->size[3]; // <20>õ<EFBFBD>֡<EFBFBD><D6A1>С
|
||||
if (strncmp("TT2", (char *)framehead->id, 3) == 0 ||
|
||||
strncmp("TIT2", (char *)framehead->id, 4) ==
|
||||
0) // <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡,<2C><>֧<EFBFBD><D6A7>unicode<64><65>ʽ!!
|
||||
{
|
||||
u8 *dat_ptr = (buf + t + sizeof(ID3V23_FrameHead));
|
||||
int size = AUDIO_MIN(frame_size - 1, MP3_TITSIZE_MAX - 1);
|
||||
mp3_get_string(dat_ptr[0], pctrl->title, dat_ptr + 1, size);
|
||||
}
|
||||
if (strncmp("TP1",(char*)framehead->id,3)==0||strncmp("TPE1",(char*)framehead->id,4)==0)//<2F>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
|
||||
if (strncmp("TP1", (char *)framehead->id, 3) == 0 ||
|
||||
strncmp("TPE1", (char *)framehead->id, 4) == 0) // <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
|
||||
{
|
||||
u8 *dat_ptr = (buf + t + sizeof(ID3V23_FrameHead));
|
||||
int size = AUDIO_MIN(frame_size - 1, MP3_ARTSIZE_MAX - 1);
|
||||
@@ -209,17 +181,18 @@ u8 mp3_id3v2_decode(u8* buf,u32 size,__mp3ctrl *pctrl)
|
||||
// if (strncmp("APIC",(char*)framehead->id,4)==0)
|
||||
// {
|
||||
// //ר<><D7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// u8 *dat_ptr=(buf+t+sizeof(ID3V23_FrameHead));
|
||||
// if (pctrl->jpeg_data) myfree(pctrl->jpeg_data);
|
||||
// pctrl->jpeg_data=mymalloc(frame_size);
|
||||
// pctrl->jpeg_len=frame_size;
|
||||
// mymemcpy (pctrl->jpeg_data,dat_ptr,frame_size);
|
||||
// u8
|
||||
//*dat_ptr=(buf+t+sizeof(ID3V23_FrameHead)); if (pctrl->jpeg_data)
|
||||
// myfree(pctrl->jpeg_data);
|
||||
// pctrl->jpeg_data=mymalloc(frame_size); pctrl->jpeg_len=frame_size;
|
||||
// mymemcpy
|
||||
//(pctrl->jpeg_data,dat_ptr,frame_size);
|
||||
// }
|
||||
t += frame_size + sizeof(ID3V23_FrameHead);
|
||||
}
|
||||
return 0;
|
||||
}else
|
||||
{ pctrl->datastart=0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID3,mp3<70><33><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD>0<EFBFBD><30>ʼ
|
||||
} else {
|
||||
pctrl->datastart = 0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID3,mp3<70><33><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD>0<EFBFBD><30>ʼ
|
||||
return (u8)-1;
|
||||
}
|
||||
}
|
||||
@@ -229,8 +202,7 @@ u8 mp3_id3v2_decode(u8* buf,u32 size,__mp3ctrl *pctrl)
|
||||
// pctrl:MP3<50><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>,ʧ<><CAA7>
|
||||
u8 mp3_get_info(u8 *data,u32 size,__mp3ctrl* pctrl)
|
||||
{
|
||||
u8 mp3_get_info(u8 *data, u32 size, __mp3ctrl *pctrl) {
|
||||
HMP3Decoder decoder = {0};
|
||||
MP3FrameInfo frame_info = {0};
|
||||
MP3_FrameXing *fxing = 0;
|
||||
@@ -261,35 +233,46 @@ u8 mp3_get_info(u8 *data,u32 size,__mp3ctrl* pctrl)
|
||||
data_ptr = data + pctrl->datastart;
|
||||
mymemcpy(buf, data_ptr, MP3_FILE_BUF_SZ);
|
||||
offset = MP3FindSyncWord(buf, MP3_FILE_BUF_SZ); // <20><><EFBFBD><EFBFBD>֡ͬ<D6A1><CDAC><EFBFBD><EFBFBD>Ϣ
|
||||
if(offset>=0&&MP3GetNextFrameInfo(decoder,&frame_info,&buf[offset])==0)//<2F>ҵ<EFBFBD>֡ͬ<D6A1><CDAC><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>,<2C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||
if (offset >= 0 &&
|
||||
MP3GetNextFrameInfo(decoder, &frame_info, &buf[offset]) ==
|
||||
0) // <20>ҵ<EFBFBD>֡ͬ<D6A1><CDAC><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>,<2C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||
{
|
||||
p = offset + 4 + 32;
|
||||
fvbri = (MP3_FrameVBRI *)(buf + p);
|
||||
if (strncmp("VBRI", (char *)fvbri->id, 4) == 0) // <20><><EFBFBD><EFBFBD>VBRI֡(VBR<42><52>ʽ)
|
||||
{
|
||||
if (frame_info.version==MPEG1)samples_per_frame=1152;//MPEG1,layer3ÿ֡<C3BF><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1152
|
||||
else samples_per_frame=576;//MPEG2/MPEG2.5,layer3ÿ֡<C3BF><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>576
|
||||
totframes=((u32)fvbri->frames[0]<<24)|((u32)fvbri->frames[1]<<16)|((u16)fvbri->frames[2]<<8)|fvbri->frames[3];//<2F>õ<EFBFBD><C3B5><EFBFBD>֡<EFBFBD><D6A1>
|
||||
pctrl->totsec=totframes*samples_per_frame/frame_info.samprate;//<2F>õ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ܳ<EFBFBD><EFBFBD><EFBFBD>
|
||||
if (frame_info.version == MPEG1)
|
||||
samples_per_frame = 1152; // MPEG1,layer3ÿ֡<C3BF><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1152
|
||||
else
|
||||
samples_per_frame = 576; // MPEG2/MPEG2.5,layer3ÿ֡<C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>576
|
||||
totframes =
|
||||
((u32)fvbri->frames[0] << 24) | ((u32)fvbri->frames[1] << 16) |
|
||||
((u16)fvbri->frames[2] << 8) | fvbri->frames[3]; // <20>õ<EFBFBD><C3B5><EFBFBD>֡<EFBFBD><D6A1>
|
||||
pctrl->totsec = totframes * samples_per_frame /
|
||||
frame_info.samprate; // <20>õ<EFBFBD><C3B5>ļ<EFBFBD><C4BC>ܳ<EFBFBD><DCB3><EFBFBD>
|
||||
} else // <20><><EFBFBD><EFBFBD>VBRI֡,<2C><><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD>Xing֡(VBR<42><52>ʽ)
|
||||
{
|
||||
if (frame_info.version == MPEG1) // MPEG1
|
||||
{
|
||||
p = frame_info.nChans == 2 ? 32 : 17;
|
||||
samples_per_frame = 1152; // MPEG1,layer3ÿ֡<C3BF><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1152
|
||||
}else
|
||||
{
|
||||
} else {
|
||||
p = frame_info.nChans == 2 ? 17 : 9;
|
||||
samples_per_frame = 576; // MPEG2/MPEG2.5,layer3ÿ֡<C3BF><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>576
|
||||
}
|
||||
p += offset + 4;
|
||||
fxing = (MP3_FrameXing *)(buf + p);
|
||||
if(strncmp("Xing",(char*)fxing->id,4)==0||strncmp("Info",(char*)fxing->id,4)==0)//<2F><>Xng֡
|
||||
if (strncmp("Xing", (char *)fxing->id, 4) == 0 ||
|
||||
strncmp("Info", (char *)fxing->id, 4) == 0) // <20><>Xng֡
|
||||
{
|
||||
if (fxing->flags[3] & 0X01) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>frame<6D>ֶ<EFBFBD>
|
||||
{
|
||||
totframes=((u32)fxing->frames[0]<<24)|((u32)fxing->frames[1]<<16)|((u16)fxing->frames[2]<<8)|fxing->frames[3];//<2F>õ<EFBFBD><C3B5><EFBFBD>֡<EFBFBD><D6A1>
|
||||
pctrl->totsec=totframes*samples_per_frame/frame_info.samprate;//<2F>õ<EFBFBD><C3B5>ļ<EFBFBD><C4BC>ܳ<EFBFBD><DCB3><EFBFBD>
|
||||
totframes = ((u32)fxing->frames[0] << 24) |
|
||||
((u32)fxing->frames[1] << 16) |
|
||||
((u16)fxing->frames[2] << 8) |
|
||||
fxing->frames[3]; // <20>õ<EFBFBD><C3B5><EFBFBD>֡<EFBFBD><D6A1>
|
||||
pctrl->totsec = totframes * samples_per_frame /
|
||||
frame_info.samprate; // <20>õ<EFBFBD><C3B5>ļ<EFBFBD><C4BC>ܳ<EFBFBD><DCB3><EFBFBD>
|
||||
} else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>frames<65>ֶ<EFBFBD>
|
||||
{
|
||||
pctrl->totsec = size / (frame_info.bitrate / 8);
|
||||
@@ -301,12 +284,18 @@ u8 mp3_get_info(u8 *data,u32 size,__mp3ctrl* pctrl)
|
||||
}
|
||||
pctrl->bitrate = frame_info.bitrate; // <20>õ<EFBFBD><C3B5><EFBFBD>ǰ֡<C7B0><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
mp3ctrl->samplerate = frame_info.samprate; // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
if(frame_info.nChans==2)mp3ctrl->outsamples=frame_info.outputSamps; //<2F><><EFBFBD><EFBFBD>PCM<43><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
else mp3ctrl->outsamples=frame_info.outputSamps*2; //<2F><><EFBFBD><EFBFBD>PCM<43><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С,<2C><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>MP3,ֱ<><D6B1>*2,<2C><><EFBFBD><EFBFBD>Ϊ˫<CEAA><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}else res=0XFE;//δ<>ҵ<EFBFBD>ͬ<EFBFBD><CDAC>֡
|
||||
if (frame_info.nChans == 2)
|
||||
mp3ctrl->outsamples = frame_info.outputSamps; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCM<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
else
|
||||
mp3ctrl->outsamples =
|
||||
frame_info.outputSamps *
|
||||
2; // <20><><EFBFBD><EFBFBD>PCM<43><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С,<2C><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>MP3,ֱ<><D6B1>*2,<2C><><EFBFBD><EFBFBD>Ϊ˫<CEAA><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
} else
|
||||
res = 0XFE; // δ<>ҵ<EFBFBD>ͬ<EFBFBD><CDAC>֡
|
||||
MP3FreeDecoder(decoder); // <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
}
|
||||
}else res=0XFF;
|
||||
} else
|
||||
res = 0XFF;
|
||||
myfree(buf);
|
||||
return res;
|
||||
}
|
||||
@@ -316,14 +305,15 @@ u8 mp3_get_info(u8 *data,u32 size,__mp3ctrl* pctrl)
|
||||
// void mp3_get_curtime(FIL*fx, FILINFO *finfo,__mp3ctrl *mp3x)
|
||||
//{
|
||||
// u32 fpos=0;
|
||||
// if(fx->fptr>mp3x->datastart)fpos=fx->fptr-mp3x->datastart; //<2F>õ<EFBFBD><C3B5><EFBFBD>ǰ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5>ĵط<C4B5>
|
||||
// mp3x->cursec=fpos*mp3x->totsec/(finfo->fsize-mp3x->datastart); //<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
// if(fx->fptr>mp3x->datastart)fpos=fx->fptr-mp3x->datastart;
|
||||
////<2F>õ<EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>ĵط<EFBFBD>
|
||||
// mp3x->cursec=fpos*mp3x->totsec/(finfo->fsize-mp3x->datastart);
|
||||
////<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD><C5B5>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
// }
|
||||
// mp3<70>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><CBBA><EFBFBD>
|
||||
// pos:<3A><>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>λ<EFBFBD><CEBB>
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:<3A><>ǰ<EFBFBD>ļ<EFBFBD>λ<EFBFBD><CEBB>(<28><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>)
|
||||
u32 mp3_file_seek(u32 pos)
|
||||
{
|
||||
u32 mp3_file_seek(u32 pos) {
|
||||
// if(pos>audiodev.file->fsize)
|
||||
// {
|
||||
// pos=audiodev.file->fsize;
|
||||
@@ -333,27 +323,23 @@ u32 mp3_file_seek(u32 pos)
|
||||
return pos;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// <20>ж<EFBFBD>mp3<70>Ƿ<EFBFBD>֧<EFBFBD><D6A7>
|
||||
// <20><>ȡ MP3_FILE_BUF_SZ <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ݾ<EFBFBD><DDBE><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>0 ֧<>֣<EFBFBD><D6A3><EFBFBD>0 <20><>֧<EFBFBD><D6A7>
|
||||
int mp3_get_support (u8* data,u32 size)
|
||||
{
|
||||
int mp3_get_support(u8 *data, u32 size) {
|
||||
int res = 0;
|
||||
__mp3ctrl *mp3ctrl = mymalloc(sizeof(__mp3ctrl));
|
||||
mymemset(mp3ctrl, 0, sizeof(__mp3ctrl)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
res = mp3_get_info(data, size, mp3ctrl);
|
||||
if (mp3ctrl->jpeg_data) myfree(mp3ctrl->jpeg_data);
|
||||
if (mp3ctrl->jpeg_data)
|
||||
myfree(mp3ctrl->jpeg_data);
|
||||
myfree(mp3ctrl);
|
||||
mp3ctrl = 0;
|
||||
return res;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>0 ֧<>֣<EFBFBD><D6A3><EFBFBD>0 <20><>֧<EFBFBD><D6A7>
|
||||
int mp3_get_support_name (const char *name)
|
||||
{
|
||||
int mp3_get_support_name(const char *name) {
|
||||
// <20><><EFBFBD>巵<EFBFBD>ر<EFBFBD><D8B1><EFBFBD>
|
||||
int res = 0;
|
||||
|
||||
@@ -376,7 +362,8 @@ int mp3_get_support_name (const char *name)
|
||||
taghead = (ID3V2_TagHead *)buf;
|
||||
if (strncmp("ID3", (const char *)taghead->id, 3) == 0) // <20><><EFBFBD><EFBFBD>ID3?
|
||||
{
|
||||
tagsize=((u32)taghead->size[0]<<21)|((u32)taghead->size[1]<<14)|((u16)taghead->size[2]<<7)|taghead->size[3];//<2F>õ<EFBFBD>tag <20><>С
|
||||
tagsize = ((u32)taghead->size[0] << 21) | ((u32)taghead->size[1] << 14) |
|
||||
((u16)taghead->size[2] << 7) | taghead->size[3]; // <20>õ<EFBFBD>tag <20><>С
|
||||
}
|
||||
|
||||
// У<><D0A3><EFBFBD><EFBFBD>ʽ<EFBFBD>Ƿ<EFBFBD>֧<EFBFBD><D6A7>
|
||||
@@ -387,9 +374,12 @@ int mp3_get_support_name (const char *name)
|
||||
ft_if_fseek(file, tagsize, SEEK_SET);
|
||||
ft_if_fread(buf, 1, buf_size, file);
|
||||
offset = MP3FindSyncWord(buf, buf_size); // <20><><EFBFBD><EFBFBD>֡ͬ<D6A1><CDAC><EFBFBD><EFBFBD>Ϣ
|
||||
if(offset>=0&&MP3GetNextFrameInfo(decoder,&frame_info,&buf[offset])==0)//<2F>ҵ<EFBFBD>֡ͬ<D6A1><CDAC><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>,<2C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||
{ res=0; }
|
||||
else res=-1;
|
||||
if (offset >= 0 && MP3GetNextFrameInfo(decoder, &frame_info, &buf[offset]) ==
|
||||
0) // <20>ҵ<EFBFBD>֡ͬ<D6A1><CDAC><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>,<2C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||
{
|
||||
res = 0;
|
||||
} else
|
||||
res = -1;
|
||||
MP3FreeDecoder(decoder); // <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
|
||||
// <20>ر<EFBFBD><D8B1>ļ<EFBFBD>
|
||||
@@ -405,20 +395,16 @@ int mp3_get_support_name (const char *name)
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>MP3<50><33><EFBFBD><EFBFBD>
|
||||
// fname:MP3<50>ļ<EFBFBD>·<EFBFBD><C2B7>.
|
||||
// <20><><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//[b7]:0,<2C><><EFBFBD><EFBFBD>״̬;1,<2C><><EFBFBD><EFBFBD>״̬
|
||||
//[b6:0]:b7=0ʱ,<2C><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// b7=1ʱ,<2C><>ʾ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>(<28><><EFBFBD>ﲻ<EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,0X80~0XFF,<2C><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD>)
|
||||
u8 mp3_play_song(u8* data,u32 size)
|
||||
{
|
||||
u8 mp3_play_song(u8 *data, u32 size) {
|
||||
|
||||
if (mp3ctrl) return AP_ERR;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룡
|
||||
if (mp3ctrl)
|
||||
return AP_ERR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룡
|
||||
HMP3Decoder mp3decoder = {0};
|
||||
MP3FrameInfo mp3frameinfo = {0};
|
||||
u8 res = 0;
|
||||
@@ -439,7 +425,8 @@ u8 mp3_play_song(u8* data,u32 size)
|
||||
audiodev.tbuf = mymalloc(2304 * 2);
|
||||
audiodev.file_seek = mp3_file_seek;
|
||||
|
||||
if(!mp3ctrl||!buffer||!audiodev.i2sbuf1||!audiodev.i2sbuf2||!audiodev.tbuf)//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
if (!mp3ctrl || !buffer || !audiodev.i2sbuf1 || !audiodev.i2sbuf2 ||
|
||||
!audiodev.tbuf) // <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
{
|
||||
myfree(mp3ctrl);
|
||||
myfree(buffer);
|
||||
@@ -452,8 +439,7 @@ u8 mp3_play_song(u8* data,u32 size)
|
||||
mymemset(audiodev.i2sbuf2, 0, 2304 * 2); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
mymemset(mp3ctrl, 0, sizeof(__mp3ctrl)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
res = mp3_get_info(data, size, mp3ctrl);
|
||||
if(res==0)
|
||||
{
|
||||
if (res == 0) {
|
||||
|
||||
// <20><>ʼ<EFBFBD><CABC>DAC
|
||||
dac.buff1 = (u32 *)audiodev.i2sbuf1;
|
||||
@@ -471,16 +457,17 @@ u8 mp3_play_song(u8* data,u32 size)
|
||||
{
|
||||
// f_lseek(audiodev.file,mp3ctrl->datastart); //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ͷ<EFBFBD><CDB7>tag<61><67>Ϣ
|
||||
data_ptr = data + mp3ctrl->datastart;
|
||||
//audio_start(); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
||||
while(res==0)
|
||||
{
|
||||
// audio_start();
|
||||
// //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
||||
while (res == 0) {
|
||||
readptr = buffer; // MP3<50><33>ָ<EFBFBD><D6B8>ָ<EFBFBD><D6B8>buffer
|
||||
offset = 0; // ƫ<><C6AB><EFBFBD><EFBFBD>Ϊ0
|
||||
outofdata = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
bytesleft = 0;
|
||||
// res=f_read(audiodev.file,buffer,MP3_FILE_BUF_SZ,&br);//һ<>ζ<EFBFBD>ȡMP3_FILE_BUF_SZ<53>ֽ<EFBFBD>
|
||||
br = MP3_FILE_BUF_SZ;
|
||||
if (br>data+size-data_ptr) br=data+size-data_ptr;
|
||||
if (br > data + size - data_ptr)
|
||||
br = data + size - data_ptr;
|
||||
mymemcpy(buffer, data_ptr, br);
|
||||
data_ptr += br;
|
||||
if (res) // <20><><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -497,7 +484,8 @@ u8 mp3_play_song(u8* data,u32 size)
|
||||
err = 0;
|
||||
while (!outofdata) // û<>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣(<28><><EFBFBD>ɷ<EFBFBD><C9B7>ҵ<EFBFBD>֡ͬ<D6A1><CDAC><EFBFBD>ַ<EFBFBD>)
|
||||
{
|
||||
offset=MP3FindSyncWord(readptr,bytesleft);//<2F><>readptrλ<72><CEBB>,<2C><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ַ<EFBFBD>
|
||||
offset = MP3FindSyncWord(readptr,
|
||||
bytesleft); // <20><>readptrλ<72><CEBB>,<2C><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ַ<EFBFBD>
|
||||
if (offset < 0) // û<><C3BB><EFBFBD>ҵ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ַ<EFBFBD>,<2C><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
||||
{
|
||||
outofdata = 1; // û<>ҵ<EFBFBD>֡ͬ<D6A1><CDAC><EFBFBD>ַ<EFBFBD>
|
||||
@@ -505,32 +493,38 @@ u8 mp3_play_song(u8* data,u32 size)
|
||||
{
|
||||
readptr += offset; // MP3<50><33>ָ<EFBFBD><D6B8>ƫ<EFBFBD>Ƶ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>.
|
||||
bytesleft -= offset; // buffer<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥƫ<C8A5><C6AB><EFBFBD><EFBFBD>
|
||||
err=MP3Decode(mp3decoder,&readptr,&bytesleft,(short*)audiodev.tbuf,0);//<2F><><EFBFBD><EFBFBD>һ֡MP3<50><33><EFBFBD><EFBFBD>
|
||||
err = MP3Decode(mp3decoder, &readptr, &bytesleft,
|
||||
(short *)audiodev.tbuf, 0); // <20><><EFBFBD><EFBFBD>һ֡MP3<50><33><EFBFBD><EFBFBD>
|
||||
|
||||
if(err!=0)
|
||||
{
|
||||
if (err != 0) {
|
||||
// printf("decode error:%d\r\n",err);
|
||||
break;
|
||||
}else
|
||||
{
|
||||
MP3GetLastFrameInfo(mp3decoder,&mp3frameinfo); //<2F>õ<EFBFBD><C3B5>ոս<D5B8><D5BD><EFBFBD><EFBFBD><EFBFBD>MP3֡<33><D6A1>Ϣ
|
||||
} else {
|
||||
MP3GetLastFrameInfo(mp3decoder,
|
||||
&mp3frameinfo); // <EFBFBD>õ<EFBFBD><EFBFBD>ոս<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MP3֡<EFBFBD><EFBFBD>Ϣ
|
||||
if (mp3ctrl->bitrate != mp3frameinfo.bitrate) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
mp3ctrl->bitrate = mp3frameinfo.bitrate;
|
||||
}
|
||||
mp3_fill_buffer((u16*)audiodev.tbuf,mp3frameinfo.outputSamps,mp3frameinfo.nChans);//<2F><><EFBFBD><EFBFBD>pcm<63><6D><EFBFBD><EFBFBD>
|
||||
mp3_fill_buffer((u16 *)audiodev.tbuf, mp3frameinfo.outputSamps,
|
||||
mp3frameinfo.nChans); // <20><><EFBFBD><EFBFBD>pcm<63><6D><EFBFBD><EFBFBD>
|
||||
}
|
||||
if(bytesleft<MAINBUF_SIZE*2)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>2<EFBFBD><32>MAINBUF_SIZE<5A><45>ʱ<EFBFBD><CAB1>,<2C><><EFBFBD>벹<EFBFBD><EBB2B9><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>.
|
||||
if (bytesleft <
|
||||
MAINBUF_SIZE *
|
||||
2) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>2<EFBFBD><32>MAINBUF_SIZE<5A><45>ʱ<EFBFBD><CAB1>,<2C><><EFBFBD>벹<EFBFBD><EBB2B9><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>.
|
||||
{
|
||||
memmove(buffer,readptr,bytesleft);//<2F>ƶ<EFBFBD>readptr<74><72>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>buffer<65><72><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>СΪ:bytesleft
|
||||
memmove(
|
||||
buffer, readptr,
|
||||
bytesleft); // <20>ƶ<EFBFBD>readptr<74><72>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>buffer<65><72><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>СΪ:bytesleft
|
||||
// f_read(audiodev.file,buffer+bytesleft,MP3_FILE_BUF_SZ-bytesleft,&br);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>
|
||||
br = MP3_FILE_BUF_SZ - bytesleft;
|
||||
if (br>data+size-data_ptr) br=data+size-data_ptr;
|
||||
if (br > data + size - data_ptr)
|
||||
br = data + size - data_ptr;
|
||||
mymemcpy(buffer + bytesleft, data_ptr, br);
|
||||
data_ptr += br;
|
||||
if(br<MP3_FILE_BUF_SZ-bytesleft)
|
||||
{
|
||||
mymemset(buffer+bytesleft+br,0,MP3_FILE_BUF_SZ-bytesleft-br);
|
||||
if (br < MP3_FILE_BUF_SZ - bytesleft) {
|
||||
mymemset(buffer + bytesleft + br, 0,
|
||||
MP3_FILE_BUF_SZ - bytesleft - br);
|
||||
}
|
||||
bytesleft = MP3_FILE_BUF_SZ;
|
||||
readptr = buffer;
|
||||
@@ -540,14 +534,18 @@ u8 mp3_play_song(u8* data,u32 size)
|
||||
rt_thread_delay(5);
|
||||
// mp3_get_curtime(audiodev.file,mp3ctrl);
|
||||
u32 fpos = 0;
|
||||
if(data_ptr>data)fpos=data_ptr-data; //<2F>õ<EFBFBD><C3B5><EFBFBD>ǰ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5>ĵط<C4B5>
|
||||
mp3ctrl->cursec=fpos*mp3ctrl->totsec/(size-mp3ctrl->datastart); //<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
if (data_ptr > data)
|
||||
fpos = data_ptr - data; // <20>õ<EFBFBD><C3B5><EFBFBD>ǰ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>ĵط<EFBFBD>
|
||||
mp3ctrl->cursec =
|
||||
fpos * mp3ctrl->totsec /
|
||||
(size - mp3ctrl->datastart); // <20><>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD><C5B5>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
audiodev.totsec = mp3ctrl->totsec; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
audiodev.cursec = mp3ctrl->cursec;
|
||||
audiodev.bitrate = mp3ctrl->bitrate;
|
||||
audiodev.samplerate = mp3ctrl->samplerate;
|
||||
audiodev.bps = 16; // MP3<50><33>֧<EFBFBD><D6A7>16λ
|
||||
if(audiodev.status&0X01)break;//û<>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD>ͣ
|
||||
if (audiodev.status & 0X01)
|
||||
break; // û<>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD>ͣ
|
||||
}
|
||||
if ((audiodev.status & (1 << 1)) == 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
@@ -559,9 +557,11 @@ u8 mp3_play_song(u8* data,u32 size)
|
||||
}
|
||||
}
|
||||
// audio_stop();//<2F>ر<EFBFBD><D8B1><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
|
||||
}else res=AP_ERR;//<2F><><EFBFBD><EFBFBD>
|
||||
} else
|
||||
res = AP_ERR; // <20><><EFBFBD><EFBFBD>
|
||||
MP3FreeDecoder(mp3decoder); // <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
||||
if (mp3ctrl->jpeg_data) myfree(mp3ctrl->jpeg_data);
|
||||
if (mp3ctrl->jpeg_data)
|
||||
myfree(mp3ctrl->jpeg_data);
|
||||
myfree(mp3ctrl);
|
||||
myfree(buffer);
|
||||
myfree(audiodev.i2sbuf1);
|
||||
@@ -574,119 +574,85 @@ u8 mp3_play_song(u8* data,u32 size)
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD>0<EFBFBD>ɹ<EFBFBD>
|
||||
char *mp3_get_name(void)
|
||||
{
|
||||
char *mp3_get_name(void) {
|
||||
if (mp3ctrl)
|
||||
return (char *)mp3ctrl->title;
|
||||
else return 0;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD><D2A3><EFBFBD><EFBFBD>ط<EFBFBD>0<EFBFBD>ɹ<EFBFBD>
|
||||
char *mp3_get_artist(void)
|
||||
{
|
||||
char *mp3_get_artist(void) {
|
||||
if (mp3ctrl)
|
||||
return (char *)mp3ctrl->artist;
|
||||
else return 0;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ŵ<EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>1<EFBFBD>ɹ<EFBFBD>
|
||||
int mp3_get_time(int *totsec,int *cursec)
|
||||
{
|
||||
if(mp3ctrl)
|
||||
{
|
||||
if(totsec) *totsec=mp3ctrl->totsec;
|
||||
if(cursec) *cursec=mp3ctrl->cursec;
|
||||
int mp3_get_time(int *totsec, int *cursec) {
|
||||
if (mp3ctrl) {
|
||||
if (totsec)
|
||||
*totsec = mp3ctrl->totsec;
|
||||
if (cursec)
|
||||
*cursec = mp3ctrl->cursec;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
__audiodev *mp3_getAudiodev(void) { return &audiodev; }
|
||||
|
||||
__mp3ctrl *mp3_getMp3Info(void) { return mp3ctrl; }
|
||||
|
||||
__audiodev *mp3_getAudiodev (void)
|
||||
{
|
||||
return &audiodev;
|
||||
}
|
||||
void mp3_stop(void) { mp3_getAudiodev()->status = 0; }
|
||||
|
||||
__mp3ctrl *mp3_getMp3Info (void)
|
||||
{
|
||||
return mp3ctrl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void mp3_stop (void)
|
||||
{
|
||||
mp3_getAudiodev()->status=0;
|
||||
}
|
||||
|
||||
|
||||
void mp3_play (void)
|
||||
{
|
||||
void mp3_play(void) {
|
||||
// <20><>ͣ<EFBFBD><CDA3>
|
||||
if (mp3_getAudiodev()->status&1)
|
||||
{
|
||||
if (mp3_getAudiodev()->status & 1) {
|
||||
mp3_getAudiodev()->status &= (~1);
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
else
|
||||
{
|
||||
else {
|
||||
mp3_getAudiodev()->status |= 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void mp3_suspend (void)
|
||||
{
|
||||
mp3_getAudiodev()->status|=1;
|
||||
}
|
||||
void mp3_suspend(void) { mp3_getAudiodev()->status |= 1; }
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int mp3_set_vol(int vol)
|
||||
{
|
||||
if(vol>MP3_VOL_MAX) vol=MP3_VOL_MAX;
|
||||
else if(vol<0) vol=0;
|
||||
|
||||
int mp3_set_vol(int vol) {
|
||||
if (vol > MP3_VOL_MAX)
|
||||
vol = MP3_VOL_MAX;
|
||||
else if (vol < 0)
|
||||
vol = 0;
|
||||
g_vol = vol;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int mp3_add_val(int vol)
|
||||
{
|
||||
int mp3_add_val(int vol) {
|
||||
vol = vol + g_vol;
|
||||
if(vol>MP3_VOL_MAX) vol=MP3_VOL_MAX;
|
||||
else if(vol<0) vol=0;
|
||||
|
||||
if (vol > MP3_VOL_MAX)
|
||||
vol = MP3_VOL_MAX;
|
||||
else if (vol < 0)
|
||||
vol = 0;
|
||||
g_vol = vol;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int mp3_sub_val(int vol)
|
||||
{
|
||||
int mp3_sub_val(int vol) {
|
||||
vol = g_vol - vol;
|
||||
if(vol>MP3_VOL_MAX) vol=MP3_VOL_MAX;
|
||||
else if(vol<0) vol=0;
|
||||
|
||||
if (vol > MP3_VOL_MAX)
|
||||
vol = MP3_VOL_MAX;
|
||||
else if (vol < 0)
|
||||
vol = 0;
|
||||
g_vol = vol;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||
int mp3_get_vol(void)
|
||||
{
|
||||
return g_vol;
|
||||
}
|
||||
|
||||
|
||||
int mp3_get_vol(void) { return g_vol; }
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef __MP3PLAY_H__
|
||||
#define __MP3PLAY_H__
|
||||
#include <stm32f4xx.h>
|
||||
#include <mp3dec.h>
|
||||
#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>
|
||||
@@ -22,21 +22,13 @@
|
||||
#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))
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
// ID3V1 <20><>ǩ
|
||||
typedef struct __packed
|
||||
{
|
||||
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>
|
||||
@@ -46,8 +38,7 @@ typedef struct __packed
|
||||
} ID3V1_Tag;
|
||||
|
||||
// ID3V2 <20><>ǩͷ
|
||||
typedef struct __packed
|
||||
{
|
||||
typedef struct __packed {
|
||||
u8 id[3]; // ID
|
||||
u8 mversion; // <20><><EFBFBD>汾<EFBFBD><E6B1BE>
|
||||
u8 sversion; // <20>Ӱ汾<D3B0><E6B1BE>
|
||||
@@ -56,16 +47,14 @@ typedef struct __packed
|
||||
} ID3V2_TagHead;
|
||||
|
||||
// ID3V2.3 <20>汾֡ͷ
|
||||
typedef struct __packed
|
||||
{
|
||||
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
|
||||
{
|
||||
typedef struct __packed {
|
||||
u8 id[4]; // ֡ID,ΪXing/Info
|
||||
u8 flags[4]; // <20><><EFBFBD>ű<EFBFBD>־
|
||||
u8 frames[4]; // <20><>֡<EFBFBD><D6A1>
|
||||
@@ -73,8 +62,7 @@ typedef struct __packed
|
||||
} 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
|
||||
{
|
||||
typedef struct __packed {
|
||||
u8 id[4]; // ֡ID,ΪXing/Info
|
||||
u8 version[2]; // <20>汾<EFBFBD><E6B1BE>
|
||||
u8 delay[2]; // <20>ӳ<EFBFBD>
|
||||
@@ -83,10 +71,8 @@ typedef struct __packed
|
||||
u8 frames[4]; // <20>ļ<EFBFBD><C4BC><EFBFBD>֡<EFBFBD><D6A1>
|
||||
} MP3_FrameVBRI;
|
||||
|
||||
|
||||
// MP3<50><33><EFBFBD>ƽṹ<C6BD><E1B9B9>
|
||||
typedef struct __packed
|
||||
{
|
||||
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><>
|
||||
@@ -104,12 +90,6 @@ typedef struct __packed
|
||||
|
||||
// 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>
|
||||
@@ -119,8 +99,7 @@ typedef enum {
|
||||
} APRESULT;
|
||||
|
||||
// <20><><EFBFBD>ֲ<EFBFBD><D6B2>ſ<EFBFBD><C5BF><EFBFBD><EFBFBD><EFBFBD>
|
||||
typedef struct __packed
|
||||
{
|
||||
typedef struct __packed {
|
||||
// 2<><32>I2S<32><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BUF
|
||||
u8 *i2sbuf1;
|
||||
u8 *i2sbuf2;
|
||||
@@ -148,21 +127,10 @@ typedef struct __packed
|
||||
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);
|
||||
@@ -172,9 +140,6 @@ u8 mp3_get_info(u8 *data,u32 size,__mp3ctrl* pctrl);
|
||||
__audiodev *mp3_getAudiodev(void);
|
||||
__mp3ctrl *mp3_getMp3Info(void);
|
||||
|
||||
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>0 ֧<>֣<EFBFBD><D6A3><EFBFBD>0 <20><>֧<EFBFBD><D6A7>
|
||||
int mp3_get_support(u8 *data, u32 size);
|
||||
int mp3_get_support_name(const char *name);
|
||||
@@ -208,31 +173,3 @@ int mp3_sub_val(int vol);
|
||||
int mp3_get_vol(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user