📄 vcd_main.c
字号:
#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 + -