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

📄 cderr.c

📁 代码有点长,需细心阅读,仅供影音视听类产品的开发人员参考
💻 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 + -