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

📄 vcd_main.c

📁 三星ic 9980的源代码. 718版.
💻 C
📖 第 1 页 / 共 2 页
字号:
					VD_Stop();
					VideoDecSetCmd ( VIDDEC_SENDER_APP, EV_VIDEO_DEC_SET_SEQ_HDR, SEQ_HDR_SET_NAVI );	
					VD_Resume();
					break;

				case EV_SENDER_DECODER:
					Vcd_Emergency();
					continue;
#if _SUPPORT_SOUTH_AMERICAN_DISC
				case EV_SENDER_PLAY_2X:
					S5H_Stop();
					South_American_disc = TRUE;
					Vcd_play(gVcdPlayStart, gVcdPlayEnd);
					continue;
#endif	/* _SUPPORT_SOUTH_AMERICAN_DISC */

				//By MayMeng 051205 for Along(can not read disc):
				case EV_SENDER_FECANNOTREAD:
					Vcd_CanNotReadEmergency();
					continue;
						
				case EV_SENDER_GCDNAVI:
					//gVcdCurrentState.pbc = TRUE;
					//VcdFree(gVcdInfo);
					//Vcd_GetDiskInfo();	
					Vcd_play(gVcdPlayStart, gVcdPlayEnd);
					OsdMsgDsp(DSP_RETURN);
					continue;
				default:
#if 0
					Vcd_HandleMsgFromRC(VcdMsg);
					continue;
#else
					if(RC_KEY_RECEIVED == VcdMsg.param)
					{
						switch(VcdMsg.ext1)
						{
#if _SUPPORT_REPEAT_AB
							case UOP_VCD_REPEAT_AB:
								Vcd_HandleRepeatAB();
								continue;
#endif								

#if _VCD_SUPPORT_PROGRAM_RANDOM_
							case UOP_VCD_PLAYMODE:
								Vcd_PlayMode(&VcdMsg);
								return;
#endif			

#if _SUPPORT_PGM_RANDOM
  #if SEPERATE_PGM_RAN
							case UOP_VCD_PROG:
								Vcd_HandleProgramKey();
								//PHK PROGRAM TEST 20051102
								continue;

							case UOP_VCD_RAN:
								Vcd_HandleRandomKey();
								continue;
  #else
							case UOP_VCD_PLAYMODE:
								Vcd_HandlePlaymode();
								continue;
  #endif/* SEPERATE_PGM_RAN */
#endif /* _SUPPORT_PGM_RANDOM */

#if _SUPPORT_INTRO_
							case UOP_VCD_INTRO:
								Vcd_HandleIntro();
//								Vcd_HandleDigest();
								continue;
#endif/* _SUPPORT_INTRO_ */

#if DIGEST_PREVIEW
							case UOP_VCD_DIGEST:
							#if  YDF_PBCON_PREVIEW
								Vcd_HandleDigest();
							#else
								if( PBC_PBCON == Vcd_GetPBCState())
								{
									OsdMsgDsp(DSP_PROHIBITION);
								}
								else
								Vcd_HandleDigest();
							#endif
								
								continue;
#endif/* DIGEST_PREVIEW*/

#if _SUPPORT_REMAIN_TIME_
							
#endif/* _SUPPORT_REMAIN_TIME_ */

							case UOP_PLAY:
								Vcd_HandlePlay();
								continue;

							case UOP_PAUSE:
								Vcd_HandlePause();
								continue;

							case UOP_STOP:
								Vcd_HandleStop();
								S5H_FEStop(); // pwc
								continue;
								//return;

							case UOP_VCD_FORWARD_SCAN:
								Vcd_HandleFF();
								continue;

							case UOP_VCD_BACKWARD_SCAN:
								Vcd_HandleFR();
								continue;

							case UOP_VCD_SLOW:
								Vcd_HandleSlow();
								continue;

							case UOP_VCD_STEP:
								Vcd_HandleStep();
								continue;

							case UOP_VCD_ZOOM:
								Vcd_HandleZoom();
								continue;

							case UOP_VCD_LEFT:
								// Vcd_HandleLeft();
								Vcd_HandlePan ( VP_PAN_LEFT );
								continue;

							case UOP_VCD_RIGHT:
								// Vcd_HandleRight();
								Vcd_HandlePan ( VP_PAN_RIGHT);
								continue;

							case UOP_VCD_UP:
								// Vcd_HandleUp();
								Vcd_HandlePan ( VP_PAN_UP);
								continue;

							case UOP_VCD_DOWN:
								// Vcd_HandleDown();
								Vcd_HandlePan ( VP_PAN_DOWN );
								continue;
#if _SUPPORT_REMAIN_TIME_
							case UOP_VCD_REMTIME:
							//#if 1
									if ((!bOsdOn) || ((Osdoff_rem) && (gVcdDisplayTime >= DISC_REMAIN_TIME)))

									{
                                                                   if(!bOsdOn)
                                                                   {
									     bOsdOn = TRUE;
									     Osdoff_rem = TRUE;
                                                                       	}
						                         else
						                         	{
						                         	 Osdoff_rem = FALSE;
										 bOsdOn = FALSE;	
										 gVcdDisplayTime--;
						                         	}
							
					             //	#endif
			                                         osd_msg.mode = DSP_FOROSD;
								 if(bOsdOn)
				                                  osd_msg.control = CTRL_OSDON_TEST;
			                                     else
				                                  osd_msg.control = CTRL_OSDOFF_TEST;
		                                             SysSendMsg(&gQ_OSD, &osd_msg, sizeof(OsdMsg_t), SYS_NO_WAIT);
									 
									}
								Vcd_HandleRemainTime();
								if(!Osdoff_rem)
								Vcd_PbcOff_HandleMsgFromDMA();	//when press REM key, updata time immediatly
								continue;
#endif/* _SUPPORT_REMAIN_TIME_ */

#if _SUPPORT_FREEZE_
							case UOP_VCD_FREEZE:
								Vcd_HandleFreeze();
								continue;
#endif/* _SUPPORT_FREEZE_ */

#if _SUPPORT_SCORE_
							case UOP_VCD_SCORE:
						#if _AUDIO_KARAOKE_
								if(gEcho_level)
								Vcd_HandleScore();
								else
									OsdMsgDsp(DSP_PROHIBITION);
						#endif
								continue;
#endif/* _SUPPORT_SCORE_ */

#if _SUPPORT_GOTO_
							case UOP_VCD_GOTO:
								if(bVcd_normal_end)//maymeng 051028
									{
									//bVcd_normal_end= FALSE;
									OsdMsgDsp(DSP_GOTO);
									OsdMsgDsp(DSP_STOP);
									break;
									}
								Vcd_HandleGoto();
								continue;
#endif/* _SUPPORT_GOTO_ */
						}
					}
#endif					
			}
			
//*******************************************		

			if( PBC_PBCON == Vcd_GetPBCState())
			{
				Vcd_PbcOn_HandleMsg(&VcdMsg);
			}
			else //VCD_PBCOFF
			{
				Vcd_PbcOff_HandleMsg(&VcdMsg);
			}
		}
	}
}

void Vcd_HandleNotification(S5H_Notification_t	type, void * data)
{
	VCD_Msg		VcdMsg;
	extern UCHAR	gVCD_DMAcounter;
	switch(type)	
	{
		case NOTIFICATION_ENDLBA:
			Vcd_EndOfPlay();
			break;

		case NOTIFICATION_START_TIME : 
			VcdMsg.sender = EV_SENDER_DMA;
			VcdMsg.param = BE_VCD_TIME;
			SysSendMsg(&gQ_VCD, &VcdMsg, sizeof(VCD_Msg), SYS_NO_WAIT );  /* send msg to VCD navi */
		// SysPrintf("1");
			break;

		#if MAY_POWER_RESUME//maymeng 051011 added
		#if 0
		case NOTIFICATION_SAVE_RESUMEINFO : 
			VcdMsg.sender = EV_SENDER_SAVEINFO;
			VcdMsg.param = BE_VCD_RESUME;
			SysSendMsg(&gQ_VCD, &VcdMsg, sizeof(VCD_Msg), SYS_NO_WAIT );  /* send msg to VCD navi */
			// SysPrintf("2");
			break;
		#endif
		#endif

		case NOTIFICATION_EMERGENCY:
			VcdMsg.sender = EV_SENDER_DECODER;
//			VcdMsg.param = BE_VCD_TIME;
			SysSendMsg(&gQ_VCD, &VcdMsg, sizeof(VCD_Msg), SYS_NO_WAIT );  /* send msg to VCD navi */
			break;

#if _SUPPORT_SOUTH_AMERICAN_DISC
		case NOTIFICATION_PLAY_2X:
			VcdMsg.sender = EV_SENDER_PLAY_2X;
			SysSendMsg(&gQ_VCD, &VcdMsg, sizeof(VCD_Msg), SYS_NO_WAIT );  /* send msg to VCD navi */	
			break;
#endif

		//BY maymeng 051205 for ALong(can not read disc):
		case NOTIFICATION_SERVO_CANNOT_READ:
			VcdMsg.sender = EV_SENDER_FECANNOTREAD;
			//VcdMsg.param = BE_VCD_TIME;
			SysSendMsg(&gQ_VCD, &VcdMsg, sizeof(VCD_Msg), SYS_NO_WAIT );  /* send msg to VCD navi */
			break;

		case NOTIFICATION_HIGH_STILL_PIC_ERR:
			Vcd_play(gVcdPlayStart, gVcdPlayEnd);
			break;
			
#if 0
		case :
			//from VBV Buffer, if finish decoding all data
			break;
		case :
			//from VD, after decode one I-frame , this for FF, FR
			//send msg to VCD_navi : VCD_PLAY_I_FRAME
			break;
#endif
		case NOTIFICATION_VIDDEC_USE_NAV_INFO:
			VcdMsg.sender = EV_SENDER_VID_DEC;
//			VcdMsg.param = BE_VCD_TIME;
			SysSendMsg(&gQ_VCD, &VcdMsg, sizeof(VCD_Msg), SYS_NO_WAIT );  /* send msg to VCD navi */			
			break;
			
		default:
			break;
	}
}
extern BOOL AVL_Get_Rec_Status(void);
extern ulong AVL_Emergency_MSF(void);
extern unsigned long gStill_picture;
UCHAR gEmerg_cnt =0;//maytest
ULONG Emerg1_save=0;//maytest
void Vcd_Emergency(void)
{
	ULONG Emergmsf1;
	S5H_MSF_t Emergmsf2;
    	UCHAR8    	temp_trkno = (gVcdTrackInfo.CurrTrack_no);
   	//maymeng 051026 for emergency-playing problem in pause and step mode:
	if((MAIN_PAUSE == Vcd_GetMainState())||(SUB2_TRICK_STEP == Vcd_GetSub2State()) )
		return;
	//end
	if(AVL_Get_Rec_Status())
		return;
	Emergmsf1=AVL_Emergency_MSF();
	
	if(Emerg1_save == Emergmsf1)//maytest	
		gEmerg_cnt++;
	else
       {
		Emerg1_save = Emergmsf1;
                gEmerg_cnt =1;
        }
	
	Emergmsf2.min=((Emergmsf1>>16)&0xff);
       Emergmsf2.sec=((Emergmsf1>>8)&0xff);
	Emergmsf2.frame=(Emergmsf1&0xff);
	
	
#if VCD_NAV_DEBUG
	SysPrintf("Emergency!\n");
#endif
	if (!gStill_picture ) 
	{
		if((PBC_DIGEST == Vcd_GetPBCState())||(PBC_INTRO == Vcd_GetPBCState())
				||(SUB2_TRICK_STEP < Vcd_GetSub2State()))
		{
		               if (MsfToLba(gVcdPlayStart)>MsfToLba(gVcdPlayEnd))
					 LbaToMsf((MsfToLba(Emergmsf2) -45), &gVcdPlayStart);
			       else
				        LbaToMsf((MsfToLba(Emergmsf2) + 30), &gVcdPlayStart);
		}
		else
		{//maymeng 051223 for very bad disc
			if( 1 == gEmerg_cnt)
			LbaToMsf((MsfToLba(Emergmsf2) + 75), &gVcdPlayStart);
			else
		{
				LbaToMsf((MsfToLba(Emergmsf2) + (75*(2*gEmerg_cnt-1))), &gVcdPlayStart);
				gEmerg_cnt = 0;
			}
		}


	    	//maymeng 051129 for continuous Emergency happened between the trks:
		if(Vcd_OverTrackEndCheck(MsfToLba(gVcdPlayStart)))
		{
			if(temp_trkno == gVcdTrackInfo.Total_track_cnt)	
			{
			    	if(SUB1_TRACK_REPEAT_ALL == Vcd_GetSub1State())
					Vcd_UpdateTrackInfo(1);
				else//BY MayMeng 051201
				{
					Vcd_HandleStop();
					S5H_FEStop();			
					return;
				}
			}
			else
			{
				temp_trkno ++;
				Vcd_UpdateTrackInfo(temp_trkno);
			}
			gVcdPlayStart = gVcdTrackInfo.CurrTrack_startMSF;
			gVcdPlayEnd = gVcdTrackInfo.CurrTrack_endMSF;

		}						
			
	}	
	
	Vcd_play(gVcdPlayStart, gVcdPlayEnd);
}

//BY maymeng 051205 for Along(can not read disc):
void Vcd_CanNotReadEmergency(void)
{
    UCHAR8    	temp_trkno = (gVcdTrackInfo.CurrTrack_no);

	if(temp_trkno == gVcdTrackInfo.Total_track_cnt)	
	{
			if(SUB1_TRACK_REPEAT_ALL == Vcd_GetSub1State())
				{
					Vcd_UpdateTrackInfo(1);
				}
			else
				{
					Vcd_HandleStop();
					S5H_FEStop();			
					return;
				}
	}
	else
	{
			temp_trkno ++;
			Vcd_UpdateTrackInfo(temp_trkno);
	}
	
	gVcdPlayStart = gVcdTrackInfo.CurrTrack_startMSF;	
	gVcdPlayEnd = gVcdTrackInfo.CurrTrack_endMSF;

	Vcd_play(gVcdPlayStart, gVcdPlayEnd);

}


#if MAY_POWER_RESUME//maymeng 051011 added
extern UCHAR SL_readEepromByte( UCHAR	addr );
extern void SL_writeEepromByte( UCHAR	addr, UCHAR data );
extern volatile BYTE 	total_trk_counter;
extern volatile BYTE total_min;
extern volatile BYTE total_sec;
extern volatile BYTE total_frm;
/******************************************************************************
 *  Function name : 	Vcd_Save_ResumeInfo
 *  Arguments  : 
 *       IN         
 *       OUT
 *       INOUT
 *  Return        	: 	void
 *  By            	:   maymeng 051015
 *  Description	:		save the current vcd-playing-info to the eeprom
 ******************************************************************************
 */
void Vcd_Save_ResumeInfo(void)
{
	if((VCD_DISC == GetDiscType())|| (CD_DA== GetDiscType()))
		{
			SL_writeEepromByte( EEPROM_PLAY_TRK, (UCHAR)gVcdTrackInfo.CurrTrack_no);
	
			SL_writeEepromByte( EEPROM_PLAY_MIN, (UCHAR)gVcdCurSubQ.abs_msf.min);
	
			SL_writeEepromByte( EEPROM_PLAY_SEC, (UCHAR)gVcdCurSubQ.abs_msf.sec);
	
			//SL_writeEepromByte( EEPROM_PLAY_FRM, (UCHAR)gVcdCurSubQ.abs_msf.frame );

			//Vcd_saveEepromValidId();
// #if VCD_NAV_DEBUG
//			SysPrintf("SaveCnt = %2d \n",(UCHAR)gVcdTrackInfo.CurrTrack_no);
// #endif

		}	
}
/******************************************************************************
 *  Function name : 	Vcd_Load_ResumeInfo
 *  Arguments  : 
 *       IN         
 *       OUT
 *       INOUT
 *  Return        	: 	void
 *  By            	:   maymeng 051015
 *  Description	:		load the previous vcd-playing-info when getting-disc-info
 ******************************************************************************
 */
void Vcd_Load_ResumeInfo(void)
{
	UCHAR		i;
	if((VCD_DISC == GetDiscType())|| (CD_DA== GetDiscType()))
		{
			i = SL_readEepromByte( EEPROM_PLAY_TRK);

			Vcd_UpdateTrackInfo(i);
#if VCD_NAV_DEBUG
			SysPrintf("LoadCnt = %2d \n",gVcdTrackInfo.CurrTrack_no);
#endif
			gVcdResumeSubQ.abs_msf.min = SL_readEepromByte( EEPROM_PLAY_MIN);
	
			gVcdResumeSubQ.abs_msf.sec = SL_readEepromByte( EEPROM_PLAY_SEC);
	
			//gVcdResumeSubQ.abs_msf.frame = SL_readEepromByte( EEPROM_PLAY_FRM);
		}
		
}

/******************************************************************************
 *  Function name : 	Vcd_saveEepromValidId
 *  Arguments  : 
 *       IN         
 *       OUT
 *       INOUT
 *  Return        	: 	void
 *  By            	:   maymeng 051015
 *  Description	:		save the valid id to eeprom
 ******************************************************************************
 */

void Vcd_saveEepromValidId( void )
{
	BYTE1	index = 0;

	for( index = 0; index < EEPROM_VALID_CHECK_COUNT; index++ )
		SL_writeEepromByte( (UCHAR) (EEPROM_ADDRESS_VALID_CHECK+index),(UCHAR) (EEPROM_VALID_DATA_CHECK) );

	/* EEPROM PARK */
	SL_readEepromByte( EEPROM_ADDRESS_PARK );
}
/******************************************************************************
 *  Function name : 	Vcd_saveEepromValidId
 *  Arguments  : 
 *       IN         
 *       OUT
 *       INOUT
 *  Return        	: 	BOOL
 *  By            	:   maymeng 051015
 *  Description	:		do the check of eeprom valid id
 ******************************************************************************
 */
BOOL Vcd_checkEepromValidId( VOID )
{
	BOOL	ret_value = TRUE;
	UCHAR 	temp;
	BYTE1	index = 0;

	for( index = 0; index < EEPROM_VALID_CHECK_COUNT; index++ )
	{
		temp = SL_readEepromByte( (UCHAR)(EEPROM_ADDRESS_VALID_CHECK + index) );
		if( temp != EEPROM_VALID_DATA_CHECK )
		{
			ret_value = FALSE;
			break;
		}
	}

	/* EEPROM PARK */
	SL_readEepromByte( EEPROM_ADDRESS_PARK );

	return ret_value;
}

#endif//#if MAY_POWER_RESUME//maymeng 051011 end

⌨️ 快捷键说明

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