📄 dvb_music.c
字号:
#include <string.h>
#include "dvb_sys.h"
#ifndef CT216T_ELGIST_MM
#include "dvb_type.h"
#include "dvb_av.h"
#else
#include "sys_api.h"
#include "mem_api.h"
#include "e_types.h"
#include "Ap_defs.h"
#endif
#include "dvb_music.h"
#include "dvb_device.h"
#include "dvb_file.h"
#include "ct_fd.h"
#include "ct_audio.h"
#include "ct_video.h"
#include "ct_adac.h"
#include "ct_os.h"
#include "Task_cfg.h"
#include "ct_type.h"
/*******************************************************************************************/
//#define DVB_WMA_TEST
/*******************************************************************************************/
//#define DVB_MUSIC_DEBUG
/*******************************************************************************************/
#if 0
#define MUSIC_MSG(p)
#else
#define MUSIC_MSG(p) printf p
#endif
#if 1
#define MUSIC_DBG(p)
#else
#define MUSIC_DBG(p) printf p
#endif
/*******************************************************************************************/
#define DVB_MUSIC_PROGRESS_TIME_00100_MS (500/CTOS_MS_PER_TICKS) // 1 tick = 10 ms
#define DVB_MUSIC_PROGRESS_TIME_00500_MS (500/CTOS_MS_PER_TICKS) // 1 tick = 10 ms
#define DVB_MUSIC_PROGRESS_TIME_10000_MS (10000/CTOS_MS_PER_TICKS) // 1 tick = 10 ms
#define DVB_MUSIC_PROGRESS_TIME_20000_MS (20000/CTOS_MS_PER_TICKS) // 1 tick = 10 ms
/*******************************************************************************************/
#ifdef USB_ENABLE
EN_DEVICE_TYPE _enMUSICDeviceType = EN_USB_DEVICE;
#else
EN_DEVICE_TYPE _enMUSICDeviceType = EN_CARDREADER_DEVICE;
#endif
EN_MUSICPLAYER_TASK_CMD enMusicPlayerCmd = EN_MUSICPLAYER_TASK_COMMAND_NONE;
#define DVB_PLAYER_WAIT_50_MS (50/CTOS_MS_PER_TICKS) // 1 tick = 10 ms
#define TASK_PRIORITY_WITH_SLIDE_SHOW EN_CTOS_PRIORITY_5
/*************************************************************************************************/
#define MUSIC_READ_FILE_SIZE 1024*5
#define MPEG2 0x2//10
#define MPEG1 0x3//11
#define LAYER3 0x1//01
#define LAYER2 0x2//10
#define LAYER1 0x3//11
#ifdef CT216T_ELGIST_MM
extern u32 gen_point;
#endif
extern char *strupr(char *string);
//Create Queue
#define MUSICPLAYER_COMMAND_QUEUE_SIZE 1024
static bool8 b8MusicPlayerQueueInit = FALSE;
u32 au32PlayCommandQueueStack[ MUSICPLAYER_COMMAND_QUEUE_SIZE ];
CTOS_QUEUE stPlayerQueueCtrlBlk;
/*************************************************************************************************/
//Create Task
static bool8 b8PlayerTaskInit = FALSE;
static bool8 b8MusicwithSlideshow = FALSE;
u8 au8PlayerTaskStack[ DVB_PLAYER_TASK_STACK_SIZE ];
CTOS_TASK stPlayerTaskCtrlBlk;
/*************************************************************************************************/
static bool8 b8PlayerServiceInit = FALSE;
static bool8 b8PauseFlag = FALSE;
static bool8 b8RepeatFlag = FALSE;
static bool8 b8PlayInit = FALSE;
/*************************************************************************************************/
static EN_MUSIC_FILETYPE enMusicFileType = EN_MUSIC_FILETYPE_MP3;
static bool8 b8TaskRcvStart = FALSE;
CTOS_SEMAPHORE stMusicSemaphore;
typedef struct
{
u32 u32Length;
u32 u32Handle;
u32 u32FileIndex;
u32 u32SrcDev;
u8 *pu8Buffer;
}DVB_PLAYER_PLAYData;
static DVB_PLAYER_PLAYData *pstMusic_PlayData = NULL;
typedef struct
{
u32 u32FiillDataHandle;
u32 u32MusicDataLen;
u32 u32PrePcmScaler;
u32 u32SamplePerFrame;
u32 u32Bitrate;
u32 u32TotalTime;
u32 u32CurrentTime;
u32 u32ProcessTimeOut;
u32 u32ProgressFillTimeOut;
u32 u32LastProgress;
u32 u32FinishDetectCount;
EN_CT_AUDIO_FREQ enAudioFreq;
EN_CT_AUDIO_MEDIA_ATTR enPrvAudioMediaAttr;
EN_CT_AUDIO_MODE enPrvAudioType;
EN_CT_AUDIO_MODE enActAudioType;
bool8 b8PlayStart;
bool8 b8PauseStatus;
bool8 b8FrameCountDetect;
bool8 b8TotatTimeDetect;
bool8 b8PlayInfoDetect;
u32 u32PreFrameCount;
u32 u32DetectFrameCount;
u8* pu8MusicDataBuff;
} DVB_MusicHandle;
/*******************************************************************************************/
u32 u32BitrateTable[16][5] =
{
{0, 0, 0, 0, 0},
{32, 32, 32, 32, 0},
{64, 48, 40, 64, 16},
{96, 56, 48, 56, 24},
{128, 64, 56, 64, 32},
{160, 80, 64, 80, 40},
{192, 96, 80, 96, 48},
{224, 112, 96, 112, 56},
{256, 128, 112, 128, 64},
{288, 160, 128, 144, 80},
{320, 192, 160, 160, 96},
{352, 224, 192, 176, 112},
{384, 256, 224, 192, 128},
{416, 320, 256, 224, 144},
{448, 384, 320, 256, 160},
{0, 0, 0, 0, 0}
};
//Global variable
static DVB_MusicHandle* pstDvbMusicHandle = NULL;
//(xbjiang 015)>>
static u32 DVB_Muic_Current_Playing_File=0;
//(xbjiang 015)<<
EN_MUSIC_FILETYPE _enMusicDecoder = EN_MUSIC_FILETYPE_MP3;
EN_MUSICPLAYER_STATUS MusicPlayerServiceInit(void);
/*! \fn EN_MUSICPLAYER_STATUS MusicPlayerServiceInit(void);
\brief Initial player service
\return status defined in EN_MUSICPLAYER_STATUS
*/
bool8 MusicPlayer_DecodeInit(u32 u32SrcDev);
/*! \fn bool8 MusicPlayer_DecodeInit(u32 u32SrcDev);
\brief Initital music decode module
\param u32SrcDev (Input) which kind of music source(From dram or FS)
\return TRUE if success
*/
//Callback function to moving data
EN_DRV_RESULT MusicPlayer_ReadFsData(u8* pu8Puffer, u32 u32Offset, u32 u32ReadLen);
/*! \fn EN_DRV_RESULT MusicPlayer_ReadFsData(u8* pu8Puffer, u32 u32Offset, u32 u32ReadLen);
\brief Callback function to move data from FS
\param pu8Puffer (Input) target address to be move to
\param u32Offset (Input) offset from start address of music buffer
\param u32ReadLen (Input)data size to be read
\return DRV_OK if success
*/
EN_DRV_RESULT MusicPlayer_ReadArrayData(u8* pu8Puffer, u32 u32Offset, u32 u32ReadLen);
/*! \fn EN_DRV_RESULT MusicPlayer_ReadArrayData(u8* pu8Puffer, u32 u32Offset, u32 u32ReadLen);
\brief Callback function to move data from dram
\param pu8Puffer (Input) target address to be move to
\param u32Offset (Input) offset from start address of music buffer
\param u32ReadLen (Input)data size to be read
\return DRV_OK if success
*/
extern bool8 DVB_DEVCTRL_HoldFs(bool8 b8Hold, EN_MEDIA_TYPE enMediaType);
/*******************************************************************************************/
u32 _music_get_bitrate(u8 u8index, u8 u8MPEGVer, u8 u8Layer)
{
u8 u8ColIndex = 0;
if(u8MPEGVer == MPEG1)
{
if(u8Layer == LAYER1)
{
u8ColIndex = 0;
}
else if(u8Layer == LAYER2)
{
u8ColIndex = 1;
}
else if(u8Layer == LAYER3)
{
u8ColIndex = 2;
}
}
else if(u8MPEGVer == MPEG2)
{
if(u8Layer == LAYER1)
{
u8ColIndex = 3;
}
else if((u8Layer == LAYER2) || (u8Layer == LAYER3))
{
u8ColIndex = 4;
}
}
return u32BitrateTable[u8index][u8ColIndex];
}
//(xbjiang 015)>>
void DVB_MUSIC_Set_Current_Playing_File(u32 u32FileIndex)
{
DVB_Muic_Current_Playing_File=u32FileIndex;
}
u32 DVB_MUSIC_Get_Current_Playing_File(void)
{
return DVB_Muic_Current_Playing_File;
}
//(xbjiang 015)<<
bool8 DVB_Music_Get_Bitrate(u32 u32FileIndex)
{
u8* pu8Puffer = NULL;
u8 u8FrameCnt = 0;
u8* pu8Ptr = NULL;
u32 u32PtrPos = 0, u32FileSize = 0, u32ReadSize = 0, u32GotSize = 0;
u8 au8Header1[4], u8MPEGVer = 0, u8Layer = 0, u8BitrateIdx = 0;
u32 u32Bitrate = 0, u32BitrateTmp = 0,u32TotalBitrate = 0, u8BRSameCnt = 1;
bool8 b8GotFirstHeader = FALSE, b8IsCBRFile = FALSE;//b8IsCBRFile for checking file is Constant Bitrate file or not
u8 au8FileName[13] = {0};
u32 u32FileHandle = 0;
u8 auu8ExtName [4], u8Index;
bool8 bIsFoundPoint = FALSE;
u32 u32ID3Size;
//DVB_FILECTRL_FileSeek(_enMUSICDeviceType, pstMusic_PlayData->u32Handle, 0, EN_FILE_START);
DVB_DEVCTRL_HoldFs(TRUE, EN_MEDIA_MUSIC);
DVB_FILECTRL_GetFilenameWithIndex(_enMUSICDeviceType, EN_FILE_TYPE_MUSIC, u32FileIndex, &au8FileName[0]);
DVB_DEVCTRL_HoldFs(FALSE, EN_MEDIA_MUSIC);
// 浪琩
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -