📄 cderr.c
字号:
#include "config.h"
#include "global.h"
#include "regmap.h"
#include "avd.h"
#include "sig.h"
#include "cd.h"
#include "func.h"
#include "cdfunc.h"
#include "util.h"
#include "dsa.h"
#define NEW_ERR_HANDER//jhuang playability 2002/12/4
#if CONFIG==CONFIG_COMBO_SVCD
#define SECTOR_EARLY_TIMES 40
#define SECTOR_LATE_TIMES 6//3//jhuang playability
#define SECTOR_LATE_RESEEK_TIMES 25//20//jhuang playability
#else
#define SECTOR_EARLY_TIMES 40 //24
#define SECTOR_LATE_TIMES 5
#define SECTOR_LATE_RESEEK_TIMES 20//jhuang 2003/3/10
#endif
#define MP3_NEW_ERR_HANDLER //wyf add 2-5-30 20:41.
//#define MONE_CDERR_LEVEL0
//#define MONE_CDERR_LEVEL1
//#define CDERR_RECOVER
//#define MONE_CD_SEEK
extern BYTE IsMp3BufEmpty(void);
extern void ircmd_stop(void);
extern void Mp3_ChkSkipData(void);
#ifdef SUPPORT_UDF
#define _MSF2l(mm,ss,ff) (((mm)*60+(ss))*75+(ff)-150)
#endif
/*
**
*/
void Mp3Seek(UINT16 f, UINT8 do_goto)
{
UINT32 x;
#ifdef MONE_CDERR_LEVEL1
epp_write("Mp3Seek...\n");
#endif
if(do_goto && IsMp3BufEmpty())
f += 8;
#ifdef MONE_CDERR_LEVEL1
psprintf(linebuf, "I buf:%d s:%x e:%x p:%x f:%ld len:%ld r:%d\n",
IsMp3BufEmpty(), s_msf, e_msf, p_msf, f, s_len, RetryFlyingDisk);
epp_write(linebuf);
#endif
s_msf = addmsf(s_msf, f * (1 + adv_search_time * 5));
x = s_len - f * 2048 * (1 + adv_search_time * 5);
if(x > 0)
{
goto_active = GOTO_PROCEED; //1;
if(IsMp3BufEmpty())
p_msf = s_msf;
else
p_msf = addmsf(p_msf, f * (1 + adv_search_time * 5));
s_len = x;
if(do_goto)
{
#ifdef MONE_DO_SEEK
epp_write("DD seek 8\n");
#endif
do_cd_seek(-4);
}
Mp3_ChkSkipData();
}
else
{
s_len = 0;
AVD_SetMediaInterrupt();
}
#ifdef MONE_CDERR_LEVEL1
psprintf(linebuf, "Out s:%x e:%x p:%x f:%ld len:%ld r:%d\n", s_msf, e_msf,
p_msf, f, s_len, RetryFlyingDisk);
epp_write(linebuf);
#endif
}
/*
**Check msf time in the same track
**ChkTrkTmByMSF
**Terry, 890918
*/
UINT32 ChkTrkTmByMSF(UINT32 msf)
{
BYTE now = cd_trk_now, intr = 0;
UINT32 min, max;
if(IsAVDMediaTimeout())
return 0;
if(cd_type_loaded == CDROM)
return 1;
if(rep_ab_mode == REPEAT_FIND_B)
return 1;
if(cd_type_loaded != CDDA)
{
if(!(psd_state & PSD_PLAY_TRACK))
return 1;
}
// I don't know what happened
#if 0
else if(!cd_trk_now)
now = v11_trk_now;
#endif
min = gettrkmsf(now) & 0x00FFFFFF;
if(now == cd_trk_hi)
max = gettrkmsf_leadout();
else
max = gettrkmsf(now + 1) & 0x00FFFFFF;
if(adv_search_time)
{
if((min >= msf) || (msf >= max))
intr = 1;
}
else
{
if((min > msf) || (msf > max))
intr = 1;
}
if(intr)
{
#ifdef MONE_INTR
epp_write("CD INTR6\n");
#endif
SetIntrFlag(GetIntrFlag() | INTR_PROG_END);
#if 0 //SUPPORT_FF_ACROSS_TRACK //JJDing remarked.2002/08/07
if(adv_search_time == 0)
{
AVD_SetMediaTimeout();
AVD_SetMediaInterrupt();
}
#else
AVD_SetMediaTimeout();
AVD_SetMediaInterrupt();
#endif
PostCommand(CMD_FUNC | CMD_FUNC_TIMEOUT);
#ifdef MONE_DSA_TIMEOUT
printf("ChkTrkTmByMSF Timeout\n");
printf("cd_trk_now:%d max:%d min:%d now:%d\n", now, max, min, msf);
#endif
return 0;
}
return 1;
}
/*
**
*/
void StopSeek(void)
{
#ifdef MONE_CDERR_LEVEL1
epp_write("stop seek\n");
#endif
cd_seek_error = 8;
AVD_SetMediaTimeout();
regs0->cddsp_control = (RF_CDDSP_RESET | RF_CDDSP_STOP);
bad_msf = s_msf;
}
/*
** FUNCTION
** cderr_handler
**
** DESCRIPTION
** return 1 to retry
** return 0 to giveup
*/
int cderr_handler(int cderr_no)
{
UINT32 t_msf = 0;
#ifdef MONE_CDERR_LEVEL0
psprintf(linebuf, "CDERR %x @%06x\n", cderr_no, s_msf);
//epp_write_slow(linebuf);
epp_write_wait(linebuf); // VICTOR TEST
#endif
#ifdef LINEAR_PLAYBACK
return 1;
#endif
if(IsAVDData())
cd_seek_error_max = 2;//3;//5;//jhuang playability 2002/12/4
else
{
if(cd_type_loaded == CDROM)
cd_seek_error_max = 3;
else if((!(psd_state & PSD_SEL_LIST)) && (!(psd_state & PSD_PLAY_SEG)))
#ifdef NEW_ERR_HANDER
cd_seek_error_max = 1;
#else
cd_seek_error_max = 2;
#endif
else
cd_seek_error_max = 3;//6;//jhuang playability 2002/12/5
}
switch (cderr_no)
{
case CDERR_CRC_ERROR:
cd_crc_error++;
#ifdef MONE_CDERR_LEVEL1
epp_write("CRC cd seek\n");
#endif
return 0;
case CDERR_EARLY_SECTOR:
if(Mp3_trkload_Timer)
return 0;
cd_sequencerES_error++;//jhuang playability 2002/12/4
//if( cd_type_loaded==CDSVCD)
// cd_sequencerES_error>>=1;
#ifdef MONE_CDERR_LEVEL1//jhuang playability 2002/12/4
psprintf(linebuf, "ES:%d(%d),n:%d-%d-%d s:%d-%d-%d ,goto:%d\n ", cd_sequencerES_error,cd_sequencer_max,
msf_mm(n_msf),msf_ss(n_msf),msf_ff(n_msf),msf_mm(s_msf),msf_ss(s_msf),msf_ff(s_msf),goto_active);
epp_write_wait(linebuf);
#endif
if(cd_sequencerES_error < cd_sequencer_max)
{
#ifdef SUPPORT_ESP//716 16/64
if(cd_type_loaded == CDROM) //JJDing 2003/7/21 01:42
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -