📄 cdfunc.c
字号:
#include "config.h"
#include "global.h"
#include "avd.h"
#include "util.h"
#include "func.h"
#include "cfont.h"
#include "cd.h"
#include "dsa.h"
#include "cdfunc.h"
//#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_tray(int func)
{
#if SUPPORT_DSA
if (func==CD_FUNC_OPEN)
dsaSendCommand(DSA_OPEN_TRAY);
else
dsaSendCommand(DSA_CLOSE_TRAY);
#endif
return 0;
}
#ifdef CAR_VCD //kenny 891220
int cd_func_next_disk(void) //kenny 891213
{
dsaSendCommand(DSA_NEXT_DISK);
return 0;
}
int cd_func_pre_disk(void) //kenny 891213
{
dsaSendCommand(DSA_PRE_DISK);
return 0;
}
int cd_func_eject_mega(void) //kenny 891213
{
dsaSendCommand(DSA_EJECT_MEGA);
return 0;
}
int cd_func_insert_mega(void) //kenny 891213
{
dsaSendCommand(DSA_INSERT_MEGA);
return 0;
}
int cd_func_to_one_disk(void)
{
dsaSendCommand(DSA_TO_ONE_DISK);
return 0;
}
#endif
int cd_func_stop(void)
{
#if SUPPORT_DSA
dsaSendCommand(DSA_STOP);
#endif
return 0;
}
int cd_func_playtrack(int trk)
{
#if SUPPORT_DSA
if (trk>=100 && trk<0)
return -1;
goto_active=0x0f;
ChkIsSkipTrk=0;
/* jjding 89/10/31,
** suggested by dennis YU
** We remove this statement,playing MP3 very smoothly !
** But I think it may has problem in a pure DSA-cdkit
*/
//dsaSendCommand(DSA_PAUSE_RELEASE);
timestamp_cd = regs0->rtc_15_0;
dsaSendCommand(DSA_PLAY | trk);
#endif
return 0;
}
int cd_func_gotomsf(UINT32 x_msf)
{
#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));
}
#endif
#if SUPPORT_DSA
/* jjding 89/10/31,
** suggested by dennis YU
** We remove this statement,playing MP3 very smoothly !
** But I think it may has problem in a pure DSA-cdkit
*/
//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));
timestamp_cd = regs0->rtc_15_0;
#endif
return 0;
}
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 6//terry 11/3
#define READTOC_INIT (UINT32)(-1)
int cd_func_readtoc(int session)
{
int toc_retry;
dsa_state = DSA_READTOC;
/*
** send READ_TOC
*/
dsaSendCommand(DSA_READ_TOC | session);
toc_retry = 0;
cd_trk_lo =
cd_trk_hi = 0xff;
AVD_ResetMediaStatus();
#ifdef READ_MUTI_SESSION
timeout_playback = 2000/16; ///* 20 second. */
#else
timeout_playback = 1000/16; ///* 20 second. */
#endif
regs0->rtc_31_16 = 0;
while (1)
{
polling();
polling_dsar(0);
polling_timeout();
if (cd_trk_lo!=0xff && cd_trk_hi!=0xff)
{
//NowPrint("==========a\n");
//printf("cd_trk_lo:%d cd_trk_hi:%d\n",cd_trk_lo,cd_trk_hi);
//NowPrint("==========b\n");
if( (!cd_trk_hi) && (!cd_trk_lo) )
return -2;
if(cd_trk_hi>=cd_trk_lo)
break;
}
if (CDOpened())
{
return -1;
}
if(play_state==VCD_STATE_IDLE)
return -2;
if(system_state==SYSTEM_POWER)
return -3;
if (IsAVDMediaTimeout())
{
if (toc_retry > READTOC_RETRY)
{
#ifdef SUPPORT_EXT_HW_DSA //kenny 891129
cd_type_loaded = CDNODISK;
#else
cd_type_loaded = CDUNKNOWN;
#endif
//play_state = VCD_STATE_IDLE;
return -2;
}
else
{
AVD_ResetMediaStatus();
regs0->rtc_31_16 = 0;
toc_retry++;
dsaSendCommand(DSA_READ_TOC | session);
}
}
}
//dsa_state = 0;
return 0;
}
int cd_func_readlongtoc(int session)
{
int done;
int toc_retry;
/*
** 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);
//for (i=0x64; i<=0x66; i++)
//settrkmsf(0x64, READTOC_INIT);
settrkmsf(0x66, READTOC_INIT);
}
dsa_state = DSA_READLONGTOC;
#ifdef READ_MUTI_SESSION
timeout_playback = 2000/8; ///* 20 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++)
{
polling();
polling_dsar(0);
if (CDOpened())
return -1;
if(play_state==VCD_STATE_IDLE)
return -2;
if(system_state==SYSTEM_POWER)
return -3;
}
polling_timeout();
if (IsAVDMediaTimeout())
{
if (toc_retry > READTOC_RETRY)
{
#ifdef SUPPORT_EXT_HW_DSA //kenny 891129
cd_type_loaded = CDNODISK;
#else
cd_type_loaded = CDUNKNOWN;
#endif
//play_state = VCD_STATE_IDLE;
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;
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;}
}
} while (!done);
//dsa_state = 0;
return 0;
}
int ReadSessionData(BYTE session)
{
int Res;
#ifdef READ_MUTI_SESSION
BYTE min,max;
min=cd_trk_lo;
max=cd_trk_hi;
#endif
Res=cd_func_readtoc(session);
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);
}
}
#endif
#ifdef MONE_TOC_DATA
{
int i;
for (i=cd_trk_lo; i<=cd_trk_hi; i++)
{
UINT32 msf = gettrkmsf(i);
psprintf(linebuf, "Trk %02d: %02d:%02d:%02d %02x\n", i, msf_mm(msf), msf_ss(msf), msf_ff(msf), msf_cna(msf));
epp_write_slow(linebuf);
}
}
#endif
dsa_state = 0;
return Res;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -