⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dvb_music.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 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 + -