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

📄 vcd_main.c

📁 三星ic 9980的源代码. 718版.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "Vcd_def.h"
#include "All_Event.h"
#include "s5h_capability.h"
#include "Codec.h"
#include "Resource.h"

#if MAY_POWER_RESUME//maymeng 051011 added
#include "I2c_api.h"
extern volatile BYTE total_min;
extern volatile BYTE total_sec;
extern volatile BYTE total_frm;
volatile  BYTE power_on=0;
#endif

SysTask_t gTask_VCD;
SysQueue_t	gQ_VCD;
extern DiscModeForm_t	gDisc_mode;
#if _SUPPORT_GAMECD
extern BOOL gIsGameCD;
extern void	VP_SetOnOff(VP_OnOff_t onoff);
#endif
#if Echo_resume_open
extern BOOL  Echo_on_open;
extern void BE_HandleEchoUp(void);
#endif	

extern BOOL bVcd_normal_end;//maymeng 051028

BOOL Osdoff_rem = FALSE;
extern BOOL bOsdOn_OSDtask;
extern BOOL bOsdOn;



void Vcd_creat_task()
{
	//create vcd msg queue
	if(SYS_RETURN_FAIL==SysCreateMsgQ( &gQ_VCD, "VCDEvtQ", 10, MSG_FIXED_SIZE, sizeof( VCD_Msg), SYS_FIFO ) )
	{
#if VCD_NAV_DEBUG		
		SysPrintf("\n Creat VCD MsgQuene failed.");
#endif
		return;	
	}
	
	//create vcd task
	if(SysCreateTask( &gTask_VCD, "VCD", /*Vcd_main*/VcdNaviTask, 0, 0,
				STACK_SIZE_VCD_TASK, 2, 1, TASK_PREEMPT, TASK_START ) == SYS_RETURN_FAIL)
	{
#if VCD_NAV_DEBUG		
		SysPrintf("\n Creat VCD task failed.");
#endif
		return;	
	}
#if 1
	Vcd_initial();
	S5H_AttachPlayCallback(&Vcd_HandleNotification);
#endif
}

extern SysTask_t gTask_Watch;
void Vcd_end(void)
{
//	if(gVcdInfo != NULL)//Lumin20051022
	if(GetDiscType()==VCD_DISC)
	{
		VcdFree(gVcdInfo );
		gVcdInfo = NULL;
	}

//	if(gVcdEntry)
//		VcdFree(gVcdEntry);

	S5H_DetachPlayCallback();
	SysKillTimer(&gVcdSPIWaitTimer );
	SysDeleteMsgQ( &gQ_VCD );
	SysDeleteTask(&gTask_VCD );
#if WATCHDOGTIMER
	SysDeleteTask(&gTask_Watch);
	IO_WData32_EX((unsigned char *)&(*(volatile unsigned int *)0x390000),0x0,0x0a5 );
#endif
	MIX_SetBgColor ( MIXER_LOGO_BACKGROUND_COLOR );
}

void Vcd_initial(void)
{
//	gVcdInfo = NULL;//Lumin20051022
	gVcdEntry = NULL;
	gVcdPsdCnt = 0xFFFF;//initial this value to avoid to the first time VCD_Readpsd() return;

	gVcdDisplayTime = TRK_ELAPSE_TIME;

	bMixCDDAplay = FALSE;
	bFBEnd_PBCON = FALSE;

	SysSetTimer( 	&gVcdSPIWaitTimer, 
					"WAITTM", 
					(SysTimerExpire_t)Vcd_SendMsgTimeOut, 
					TIME_OUT,
					1, //2000*CalPlayItemWaitTime(gVcdCurrentList->PlayList.play_item_wait_time),
					0, 
					TIMER_DISABLE );
}

/********************************************************************
  *	for VCD:	  get track num, info, entry, Lot and PSD
  *	for CDDA: get track num
  ********************************************************************
  */
extern AVL_QSubInfo_t 	gVcdResumeSubQ;//maymeng 051011

extern unsigned char gWatchdog;
extern unsigned char gWatchdogrepeatfirst;
extern unsigned char gWatchdogRepeat;
void	Vcd_GetDiskInfo(void)
{
	MSF_STRUCT 		start;
	USHORT16		offset;
	#if MAY_POWER_RESUME//maymeng 051011 added
	UCHAR disctype, disctrk, discmin,discsec;
	BOOL btemp_fornormalstop = FALSE;	
	#endif

	if(AVL_GetDiscType() !=AVL_CDDA	)
	{
		Vcd_ReadInfo();  
		if( PBC_PBCON  == Vcd_GetPBCState() )
		{
			Vcd_ReadEntry(); 
			Vcd_ReadLot();   
		}
	}
	else
	{

		Vcd_ReadBasicInfo();

	}
	
	if( PBC_PBCON  == Vcd_GetPBCState() )
		Vcd_ReadPsd(0);
	else
	{
	#if WATCHDOGTIMER
		if(gWatchdogrepeatfirst)
		{
		Vcd_SetState(	VCD_CHGNULL, 
					  	MAIN_PLAY,
					  	gWatchdogRepeat,
					  	SUB2_NORMAL,
					  	SUB3_NORMAL	);
		}

		else
	#endif 
		{
			Vcd_SetState(	VCD_CHGNULL, 
					  	MAIN_PLAY,
					  	SUB1_TRACK_NORMAL,
					  	SUB2_NORMAL,
					  	SUB3_NORMAL	);
		}


		gWatchdogrepeatfirst=0;

	
	}
	
	gDisc_mode=CD_MODE2_FORM2;
	
#if _SUPPORT_GAMECD
if(!gIsGameCD)
#endif
{
	#if MAY_POWER_RESUME//maymeng 051011 added	
	Vcd_saveEepromValidId();
	if(Vcd_checkEepromValidId() )
	{
	   disctype = SL9908_Load_DiscType() ;
	   disctrk =  SL9908_Load_DiscTrk();
	   discmin = SL9908_Load_DiscTotalMin();
	   discsec = SL9908_Load_DiscTotalSec() ;
	   btemp_fornormalstop = SL9908_Load_VcdNormalStop() ;
	   SL9908_Save_VcdNormalStop();	   

	   if((disctype == AVL_GetDiscType()) && (disctrk == total_trk_counter)
	   	 && (discmin == total_min) && (discsec == total_sec)&&(power_on==0))
	   	{
	   	    power_on=1;
	   	    if(!btemp_fornormalstop)
	   	    {	   	
	   		Vcd_Load_ResumeInfo( );
			LbaToMsf(MsfToLba(gVcdResumeSubQ.abs_msf) , &gVcdPlayStart);
			gVcdPlayEnd = gVcdTrackInfo.CurrTrack_endMSF;
			}
	   	}
	   else
	   	{
	   		SL9908_Save_DiscType();
			SL9908_Save_DiscTrk();
			SL9908_Save_DiscTotalMin();
			SL9908_Save_DiscTotalSec();
	   	}
	}
	
	#endif


#if WATCHDOGTIMER  //power resume捞 登搁 gWatchdog捞 clear等促 . 般摹瘤 臼绰促
	if(gWatchdog)
	{		  			   				
		{
			UCHAR		i;
		
			i =IO_RData32_EX((unsigned char *)&TRACKNODRDAM);

			Vcd_UpdateTrackInfo((unsigned char)i);

			gVcdResumeSubQ.abs_msf.min = (unsigned char)IO_RData32_EX((unsigned char *)&MINDRAM);
	
			gVcdResumeSubQ.abs_msf.sec =(unsigned char) IO_RData32_EX((unsigned char *)&SECDRAM);
		
		}
		LbaToMsf(MsfToLba(gVcdResumeSubQ.abs_msf) , &gVcdPlayStart);
		gVcdPlayEnd = gVcdTrackInfo.CurrTrack_endMSF;		
	
	}
			
#endif 

	}
	OsdMsgDsp(DSP_PLAY);  //pwc
	Vcd_play(gVcdPlayStart, gVcdPlayEnd);
	#if Echo_resume_open
	if(Echo_on_open)
	if(GetDiscType () == VCD_DISC)
		{
		if(Echo_on_open)
	        BE_HandleEchoUp();
		  Echo_on_open=FALSE;
		}
	#endif
}

/********************************************************************
  *		get track num, also dump info.vcd & entries.vcd
  ********************************************************************
  */
void Vcd_ReadInfo(void)
{
//	MSF_STRUCT			sector_s,sector_e; 
	UCHAR8				i;

	extern BOOL gGamedisc_flag;//maymeng 051021
	
	Vcd_ReadBasicInfo();
#if 0//Lumin20051022		
	sector_s.min = 	0x00;
	sector_s.sec = 	0x04;
	sector_s.frame = 	0x00;
	sector_e.min = 	0x00;
	sector_e.sec = 	0x04;
	sector_e.frame = 	0x01;
	gVcdInfo =(VCD_INFO_STRUCT *)VcdMalloc(2352*2);
	if ( gVcdInfo == NULL )
	{
#if VCD_NAV_DEBUG		
		SysPrintf ( "Failed to allocate Memory in VCD Read info\n" );
#endif
		return;
	}
	if(OK == VcdDumpCd(sector_s, sector_e, (UCHAR8*)gVcdInfo))
	{
#endif

#if _SUPPORT_GAMECD
	 	if(gIsGameCD)
	  	{
	  		if(gVcdInfo->psd_size != 0)
				Vcd_SetState(	PBC_PBCON, 
						  	VCD_CHGNULL,
						  	VCD_CHGNULL,
						  	SUB2_NORMAL,
						  	SUB3_NORMAL	);
	  	}
	  	else
#endif
	  	{

	  	if(gGamedisc_flag)//maymeng 051021
	  		{
	  			if(gVcdInfo->psd_size != 0)
				Vcd_SetState(	PBC_PBCON, 
						  	VCD_CHGNULL,
						  	VCD_CHGNULL,
						  	SUB2_NORMAL,
						  	SUB3_NORMAL	);
	  			gGamedisc_flag = FALSE;
	  		}
	  	else
	  	{
	   #if FIRST_PBCON_DEFAULT
			if(gVcdInfo->psd_size != 0)
				Vcd_SetState(	PBC_PBCON, 
						  	VCD_CHGNULL,
						  	VCD_CHGNULL,
						  	SUB2_NORMAL,
						  	SUB3_NORMAL	);
	   #endif
	}
	}
 #if 0//Lumin20051022
	}
	else
		gVcdInfo->psd_size = 0;
#endif
	gVcdTrackInfo.Track1_startMSF = StartMsfCal(1);
	gVcdTrackInfo.LeadOut_MSF = EndMsfCal(gVcdTrackInfo.Total_track_cnt);	 
}

void Vcd_ReadEntry(void)
{
#if 0
	MSF_STRUCT			sector_add; 
	USHORT16			i;
	
	sector_add.min 		= 0x00;
	sector_add.sec 		= 0x04;
	sector_add.frame 		= 0x01;

	gVcdEntry =(VCD_ENTRY_STRUCT *)VcdMalloc(2352);
	
	VcdDumpCd(sector_add,sector_add, (UCHAR8*)gVcdEntry);
#else
	gVcdEntry = (VCD_ENTRY_STRUCT *)(((UCHAR8*)gVcdInfo)+2352);
	if ( gVcdInfo == NULL )
	{
#if VCD_NAV_DEBUG		
		SysPrintf ( "Failed to allocate Memory in VCD Read Entry\n" );
#endif
		return;
	}
#endif		
}
void	Vcd_ReadLot(void)
{
	/*	Nothing 	*/ 	
}

/********************************************************************
  *		get list type and list table
  ********************************************************************
  */
BOOL	Vcd_ReadPsd(USHORT16	offset)
{
#if 1
	MSF_STRUCT 		sector_add;
	USHORT16		cnt;
	USHORT16		i;
	
	if(offset == 0xFFFF)
		return FALSE;

	cnt = offset * 8 / 2048 ;
	
	if(gVcdPsdCnt != cnt)
	{
		//return ;
	
		gVcdPsdCnt = cnt;
		
		sector_add.min 		= 0x00;
		sector_add.sec 		=VcdHexToBcd(4+ (cnt + 34) /75 );
		sector_add.frame 		=VcdHexToBcd((cnt + 34) % 75) ;

		if(bMixCDDAplay)//Lumin20050810==>mixed CD issues
		{
			IODMA_Restart();
			bMixCDDAplay = FALSE;
			S5L_SetMemoryMap(MM_VCD);
		}
#if _SUPPORT_GAMECD		
		if(!gIsGameCD)
#endif
			S5H_Stop();

		VcdDumpCd(sector_add, sector_add, gVcdPSDBuffer);
	}
	offset = (offset * 8) % 2048;

	if( *(gVcdPSDBuffer +24 + offset) == PLAY_LIST_HEADER )
	{
		gVcdCurrentList = (VCD_LIST *)(gVcdPSDBuffer + offset + 24);
		for(i =0; i < gVcdCurrentList->PlayList.noi ; i++)
		{
			gVcd_NOI_NOS[i] = *((USHORT16 *)( gVcdPSDBuffer + offset + 24 +14 +2*i));
			if( i > 255) 
				break;
		}
		gVcd_PlaylistCurItemNo = 0;
		Vcd_PlayItemCheck( gVcd_NOI_NOS[gVcd_PlaylistCurItemNo]);
	}
	else if( *(gVcdPSDBuffer +24 + offset) == SELECTION_LIST_HEADER )
	{	
		gVcdCurrentList = (VCD_LIST *)( gVcdPSDBuffer+ offset +24);
		for(i =0; i < gVcdCurrentList->SelectionList.nos ; i++)
		{
			gVcd_NOI_NOS[i] = *((USHORT16 *)( gVcdPSDBuffer + offset + 24 +20 +2*i));
			if( i > 255) 
				break;
		}
		loop_count = gVcdCurrentList->SelectionList.loop_count_jump_timing & 0x7F;
		jump_timing = gVcdCurrentList->SelectionList.loop_count_jump_timing & 0x80;
		Vcd_PlayItemCheck(gVcdCurrentList->SelectionList.play_item_number);
	}
	else // if read psd data is wrong...
	{
#if 1
//		Vcd_OsdNotAvail();
		return FALSE;
#else
		gVcdCurrentState.pbc = PBC_NORMAL;
		Vcd_UpdateTrackInfo(1) ;
		gVcdPlayStart 	= gVcdTrackInfo.CurrTrack_startMSF;
		gVcdPlayEnd 	= gVcdTrackInfo.CurrTrack_endMSF;
#endif
	}
	return TRUE;
#else
	MSF_STRUCT 		sector_add;
	USHORT16		cnt;
	USHORT16		i;
	
	if(offset == 0xFFFF)
		return;

	cnt = offset * OFFSET_MULTIPLIER / SECTOR_UDATA_LEN;		//how many sector
	
	if(gVcdPsdCnt != cnt)
	{
		//return ;
	
		gVcdPsdCnt = cnt;
		
		sector_add.min 		= 0x00;
		sector_add.sec 		=VcdHexToBcd(4+ (cnt + 34) /75 );
		sector_add.frame 		=VcdHexToBcd((cnt + 34) % 75) ;

		VcdDumpCd(sector_add, sector_add, gVcdPSDBuffer);
	}
	offset = (offset * OFFSET_MULTIPLIER ) % SECTOR_UDATA_LEN;
	gVcdCurrentList = (VCD_LIST *)( gVcdPSDBuffer+SYNCHEAD_LEN+ offset);

	if( *((UCHAR8*)gVcdCurrentList) == PLAY_LIST_HEADER )
	{
		for(i =0; i < gVcdCurrentList->PlayList.noi ; i++)
		{
			gVcd_NOI_NOS[i] = *((USHORT16 *)( gVcdPSDBuffer + offset + SYNCHEAD_LEN +14 +2*i));
//			gVcd_NOI_NOS[i] = *((USHORT16 *)( gVcdCurrentList+14 +2*i));
			if( i > 255) 
				break;
		}
		gVcd_PlaylistCurItemNo = 0;
		Vcd_PlayItemCheck( gVcd_NOI_NOS[gVcd_PlaylistCurItemNo]);
	}
	else if( *((UCHAR8*)gVcdCurrentList)== SELECTION_LIST_HEADER )
	{	
		for(i =0; i < gVcdCurrentList->SelectionList.nos ; i++)
		{
			gVcd_NOI_NOS[i] = *((USHORT16 *)( gVcdPSDBuffer + offset + SYNCHEAD_LEN +20 +2*i));
//			gVcd_NOI_NOS[i] = *((USHORT16 *)( gVcdCurrentList+20 +2*i));
			if( i > 255) 
				break;
		}
		loop_count = gVcdCurrentList->SelectionList.loop_count_jump_timing & 0x7F;
		jump_timing = gVcdCurrentList->SelectionList.loop_count_jump_timing & 0x80;
		Vcd_PlayItemCheck(gVcdCurrentList->SelectionList.play_item_number);
	}
	else // if read psd data is wrong...
	{
		gVcdCurrentState.pbc = PBC_NORMAL;
		gVcdPlayStart 	= StartMsfCal(1);
		gVcdPlayEnd 	= EndMsfCal(1);
		gVcdTrackInfo.CurrTrack_no = 1;
		Vcd_UpdateTrackInfo(1) ;
	}
#endif	
}

extern VOID VD_Stop ( VOID );
extern VOID VD_Resume ( VOID );

#if _AUDIO_KARAOKE_
extern S5H_EchoLevel_t gEcho_level ;
#endif

void VcdNaviTask(SysArgc_t argc, SysArgv_t *argv )	//(void)
{
	VCD_Msg		VcdMsg;
	SysSize_t	realsize;
	OsdMsg_t	osd_msg;  // pwc add for longxin 2006.0223

	while(1)
	{
		if(SysReceiveMsg(&gQ_VCD,&VcdMsg,sizeof(VCD_Msg),&realsize, SYS_WAIT ) == SYS_RETURN_FAIL)
		{
#if VCD_NAV_DEBUG			
			SysPrintf("\nVCD get Msg failed!!");
#endif
			return;
		}
		else
		{
//******************************************
//here insert the same operation of PBCON and PBCOFF
			switch(VcdMsg.sender)
			{
				case EV_SENDER_DMA: //time display
					Vcd_PbcOff_HandleMsgFromDMA();
					continue;

			#if MAY_POWER_RESUME//maymeng 051011 added
			#if 0

				case EV_SENDER_SAVEINFO: //save resume info
					// SysPrintf("4");
					//if(gPBCOFF_DMAflag)
						{
							Vcd_Save_ResumeInfo();
							//gPBCOFF_DMAflag = FALSE;
						}
					continue;
			#endif
			#endif
					
				case EV_SENDER_BE:
					Vcd_GetDiskInfo();
					continue;

				case EV_SENDER_VID_DEC:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -