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

📄 cdfunc.c

📁 代码有点长,需细心阅读,仅供影音视听类产品的开发人员参考
💻 C
字号:
#include "config.h"
#include "global.h"
#include "regmap.h"
#include "avd.h"
#include "util.h"
#include "func.h"

#include "cd.h"
#include "dsa.h"

#include "cdfunc.h"
#include "iop.h"//2003/4/1

//#define MONE_TOC_DATA
/*
int cd_func_init(void)
{
#if SUPPORT_DSA
  reset_dsa();
  dsaSendCommand(DSA_SET_DAC_MODE | CDDAC_SONY_16_FS);
  dsaSendCommand(DSA_SET_MODE | (CDDA_SPEED_1x | CDDA_CDROM | CDDA_ATTI_abs));
#endif
  dsaSendCommand(0x8010); //abs time
  return 0;
}
*/
int cd_func_speed_init(BYTE speed)
{
#if SUPPORT_DSA
    reset_dsa();
    dsaSendCommand(DSA_SET_DAC_MODE | CDDAC_SONY_16_FS);
    dsaSendCommand(DSA_SET_MODE | (speed | CDDA_CDROM | CDDA_ATTI_abs));
    if(speed == CDDA_SPEED_2x)
        cdrom_speed = 1;
    else
        cdrom_speed = 0;
#endif
    dsaSendCommand(0x8010);             //abs time
    return 0;
}

/*
int cd_func_2X_init(void)
{
#if SUPPORT_DSA
  reset_dsa();
  dsaSendCommand(DSA_SET_DAC_MODE | CDDAC_SONY_16_FS);
  dsaSendCommand(DSA_SET_MODE | (CDDA_SPEED_2x | CDDA_CDROM | CDDA_ATTI_abs));
  cdrom_speed = 1;
#endif
  dsaSendCommand(0x8010); //abs time
  return 0;
}
*/
int cd_func_tray(int func)
{
#if SUPPORT_DSA
#if !defined(SUPPORT_DISCMAN) || !defined(SUPPORT_BOOMBOX_ESP)
    if(func == CD_FUNC_OPEN)
        dsaSendCommand(DSA_OPEN_TRAY);
    else
        dsaSendCommand(DSA_CLOSE_TRAY);
#endif
#endif
    return 0;
}


int cd_func_stop(void)
{
#if SUPPORT_DSA
    dsaSendCommand(DSA_STOP);
#endif
    return 0;
}


int cd_func_playtrack(int trk)
{
#ifdef SUPPORT_ESP
    ESP_SHOCK_GOTO_SET();//regs0->iop_data[4] &= (~(1 << 5));
#endif
#if SUPPORT_DSA
    if(trk >= 100 && trk < 0)
        return -1;

    goto_active = GOTO_NONE;
    ChkIsSkipTrk = 1;//for CDDA skate condition 2003/3/16

    timestamp_cd = regs0->rtc_15_0;
    dsaSendCommand(DSA_PLAY | trk);
#endif
    return 0;

#if 0
#if SUPPORT_DSA
    if(trk >= 100 && trk < 0)
        return -1;
    dsaSendCommand(DSA_PAUSE_RELEASE);
    dsaSendCommand(DSA_PLAY | trk);
#endif
    return 0;
#endif
}


int cd_func_gotomsf(UINT32 x_msf)
{
#ifdef SUPPORT_ESP//jhuang 2003/3/3 move to top
    ESP_SHOCK_GOTO_SET();//regs0->iop_data[4] &= (~(1 << 5));
#endif
#ifdef SUPPORT_COMBO
    if(cd_type != CDDA)
    {
        regs0->cddsp_mm_bcd = bin2bcd(msf_mm(x_msf));
        regs0->cddsp_ss_bcd = bin2bcd(msf_ss(x_msf));
        regs0->cddsp_ff_bcd = bin2bcd(msf_ff(x_msf));
        
        //psprintf(linebuf,"SET %x %x %x\n",regs0->cddsp_mm_bcd,regs0->cddsp_ss_bcd,regs0->cddsp_ff_bcd);
    //epp_write_wait(linebuf);
    }
#endif

#if SUPPORT_DSA
    dsaSendCommand(DSA_GOTO_MM | msf_mm(x_msf));
    dsaSendCommand(DSA_GOTO_SS | msf_ss(x_msf));
    dsaSendCommand(DSA_GOTO_FF | msf_ff(x_msf));
    timestamp_cd = regs0->rtc_15_0;

    dsa_found = C_FALSE;

#endif
    return 0;
#if 0
#if SUPPORT_DSA
    dsaSendCommand(DSA_PAUSE_RELEASE);
    dsaSendCommand(DSA_GOTO_MM | msf_mm(x_msf));
    dsaSendCommand(DSA_GOTO_SS | msf_ss(x_msf));
    dsaSendCommand(DSA_GOTO_FF | msf_ff(x_msf));
#endif
    return 0;
#endif
}


int cd_func_pause(int pause)
{
#if SUPPORT_DSA
    if(pause)
        dsaSendCommand(DSA_PAUSE);
    else
        dsaSendCommand(DSA_PAUSE_RELEASE);
#endif
    return 0;
}


int cd_func_setspeed(int speed)
{
#if SUPPORT_DSA
    if(speed == 1)
    {
        dsaSendCommand(DSA_SET_MODE_DEFAULT_1x);
    }
    else if(speed == 2)
    {
        dsaSendCommand(DSA_SET_MODE_DEFAULT_2x);
    }
    else
    {
        dsaSendCommand(DSA_SET_MODE_DEFAULT_4x);
    }
#endif
    return 0;
}


UINT32 cd_func_gettime(void)
{
    return MSF(cd_qcode_mm, cd_qcode_ss, 0);
}


/*
** FUNCTION
** cd_func_readtoc(int session)
**
*/
#define READTOC_RETRY   4
#define READTOC_INIT    (UINT32)(-1)

int cd_func_readtoc(int session)
{
    int     toc_retry;

#if 1
    UISetState(VCD_STATE_READTOC);
    dsa_state = DSA_READTOC;
    /*
     ** send READ_TOC
     */
    dsaSendCommand(DSA_READ_TOC | session);

    toc_retry = 0;
    cd_trk_lo = 0xff;
    cd_trk_hi = 0xff;

    AVD_ResetMediaStatus();
#ifdef READ_MUTI_SESSION
    timeout_playback = 1600 / 16;   /* 20 second. */
#else
    timeout_playback = 800 / 16;    /* 10 second. */
#endif

    regs0->rtc_31_16 = 0;

    while(1)
    {
        polling();
        //polling_dsar(0);//jhuang playability 2002/12/4
        polling_timeout();

        if(cd_trk_lo != 0xff && cd_trk_hi != 0xff)
        {
            if((!cd_trk_hi) && (!cd_trk_lo))
                return -2;
            if(cd_trk_hi >= cd_trk_lo)
                break;
        }

        if(CDOpened())
            return -1;

        if(CheckUIState(VCD_STATE_IDLE))
            return -2;
              #ifdef POWER_KEY   
                   if(system_state==SYSTEM_POWER)      //zhyf test 2-9-11 21:12
                          return -3;          
               #endif  





        if(IsAVDMediaTimeout())
        {
            if(toc_retry > READTOC_RETRY)
            {
                cd_type_loaded = CDUNKNOWN;
                return -2;
            }
            else
            {
                AVD_ResetMediaStatus();
                #ifdef READ_MUTI_SESSION
                timeout_playback = 1600 / 16;   /* 20 second. */
                #else
                timeout_playback = 800 / 16;    /* 10 second. */
                #endif
                regs0->rtc_31_16 = 0;
                toc_retry++;
                dsaSendCommand(DSA_READ_TOC | session);
            }
        }
    }
    return 0;
#endif
}


int cd_func_readlongtoc(int session)
{
    int     done;
    int     toc_retry;

#if 1
    /*
     ** send READ_LONGTOC (for session-0)
     */
#define READTOC_INIT    (UINT32)(-1)
    {
        int     i;

        for(i = cd_trk_lo; i <= cd_trk_hi; i++)
            settrkmsf(i, READTOC_INIT);
        settrkmsf(0x66, READTOC_INIT);
        settrkmsf(0, 0); //rbhung 2002/12/9 for leadin time
    }

    dsa_state = DSA_READLONGTOC;

#ifdef READ_MUTI_SESSION
    timeout_playback = 2000 / 8;    /* 40 second. */
#else
    timeout_playback = 2000 / 16;   /* 20 second. */
#endif

    AVD_ResetMediaStatus();
    regs0->rtc_31_16 = 0;
    toc_retry = 0;
    cd_trk_no = 0xff;
    dsaSendCommand(DSA_READ_LONG_TOC | session);

    do
    {
        int     i;

        //for(i = 0; i < 256; i++)
        for(i = 0; i < 256; i++)
        {
            polling();
            //polling_dsar(0);//jhuang playability 2002/12/4
            if(CDOpened())
                return -1;
            if(CheckUIState(VCD_STATE_IDLE))
                return -2;

                       #ifdef POWER_KEY
                           if(system_state==SYSTEM_POWER)  //zhyf test 2-9-11 21:12
                             return -3;
                      #endif

        }

        polling_timeout();

        if(IsAVDMediaTimeout())
        {
            if(toc_retry > READTOC_RETRY)
            {
                cd_type_loaded = CDUNKNOWN;
                return -2;
            }
            else
            {
                AVD_ResetMediaStatus();
                regs0->rtc_31_16 = 0;
                toc_retry++;
                cd_trk_no = 0xff;
                dsaSendCommand(DSA_READ_LONG_TOC | session);
            }
        }
        /*
         ** CHECK if cd_trk_lo to cd_trk_hi and 0x64-0x66 valid
         */
        done = 1;
        #if 0
        for(i = cd_trk_lo; i <= TRACK_INFO_MAX; i++)
        {
            if(i > cd_trk_hi && i < 0x64)
                continue;
            if(gettrkmsf(i) == READTOC_INIT)
            {
                done = 0;
                break;
            }
        }
        #endif
        if(gettrkmsf(TRACK_INFO_MAX) == READTOC_INIT)
        {
            done = 0;
        }
        for(i = cd_trk_lo; i <= cd_trk_hi; i++)
        {
            if(gettrkmsf(i) == READTOC_INIT)
            {
                done = 0;
                break;
            }    
        }
    } while(!done);
    return 0;
#endif
}

/*
** ReadSessionData 
*/
int ReadSessionData(BYTE session)
{
    int     Res;

#ifdef SUPPORT_EPP_DBG
#ifdef MONE_TOC_DATA
    BYTE    fff;
#endif
#endif

#ifdef READ_MUTI_SESSION
    BYTE    min, max;

    min = cd_trk_lo;
    max = cd_trk_hi;
#endif

    Res = cd_func_readtoc(session);

#ifdef MONE_TOC_DATA
    if(Res >= 0)
    {
        psprintf(linebuf, "Res:%x Trk %d - Trk %d\n", Res, cd_trk_lo, cd_trk_hi);
        epp_write_slow(linebuf);
    }
    else
    {
        psprintf(linebuf, "===RTOC FAIL==\n");
        epp_write_slow(linebuf);
        fff = 1;
    }
#endif

    if(Res >= 0)
        Res = cd_func_readlongtoc(session);

#ifdef READ_MUTI_SESSION
    if(Res < 0)
    {
        SessionNs = 0;
        cd_trk_lo = min;
        cd_trk_hi = max;
    }
    else
    {

        UINT32  i;

        for(i = 0; i < 0x3fff; i++)
        {                                                       //waiting for number of session 
            if(SessionNs)
                break;
            polling();
            //polling_dsar(0);//jhuang not used 2003/2/24
        }

    }
#endif

#ifdef MONE_TOC_DATA
    if(fff != 1)
    {
        int     i;

        for(i = cd_trk_lo; i <= cd_trk_hi; i++)
        {
            UINT32  msf = gettrkmsf(i);

            psprintf(linebuf, "Trk %02d: %02d:%02d:%02d \n", i, msf_mm(msf),
                             msf_ss(msf), msf_ff(msf) /*, msf_cna(msf) */ );
            epp_write_slow(linebuf);
        }
    }

    psprintf(linebuf, "Long TOC Res:%x\n", Res);
    epp_write_slow(linebuf);
#endif

    dsa_state = 0;
    return Res;
}

#if defined(SUPPORT_OKO_DISC)
/*
*** make toc table 
*** we assume cdi file is continuing
*** 
*/
void make_toc_tab(UINT32 msf)
{
    int     i;

    cd_trk_hi++;
    track_info[cd_trk_hi] = (0x41 << 24) | msf;

    for(i = 1; i < cd_trk_hi; i++)
    {
        if(track_info[i] > track_info[cd_trk_hi])
        {
            msf = track_info[i];
            track_info[i] = track_info[cd_trk_hi];
            track_info[cd_trk_hi] = msf;
        }
        psprintf(linebuf, "i:%x  msf:%x\n", cd_trk_hi, track_info[i]);
        epp_write(linebuf);
    }
}


void make_oko_addr(UINT32 * msf, UINT32 s)
{
    int     ss, ff;

    ss = s / 10;
    ff = ((s - (ss * 10)) / 10) + (ss * 75) * 2;
    *msf = (0x41 << 24) | addmsf(track_info[2], ff);

    //psprintf(linebuf,"trks:%x s:%x\n",track_info[2],*msf);
    //epp_write(linebuf);
}

/*
*** make toc table 
*** we assume cdi file is continuing
*** 
*/
void make_oko_toc_tab(UINT32 s, UINT32 e, UINT32 a_o)
{

    //psprintf(linebuf,"s:%d e:%d a_o:%x\n",s,e,a_o);
    //epp_write(linebuf);
 //psprintf(linebuf,"hi:%d\n",cd_trk_hi);          
      //  epp_write_wait(linebuf);
    if(cd_trk_hi < 99)
    {
    //    if((cd_trk_hi != 2) || s) //Mark off by Gary
            cd_trk_hi++;

        make_oko_addr(&track_info[cd_trk_hi], s);
        make_oko_addr(&oko_trk_end[cd_trk_hi], e);
        oko_trk_end[cd_trk_hi] = (oko_trk_end[cd_trk_hi] & 0x00ffffff) | a_o;
        //psprintf(linebuf,"cd_trk_hi:%d s_msf:%x e_msf:%x\n",cd_trk_hi,track_info[cd_trk_hi],oko_trk_end[cd_trk_hi]);
      
    }
}
#endif

⌨️ 快捷键说明

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