📄 dsasl.c
字号:
int pt_B0, pt_C0;
int multi_session;
int first_session_cdda=0; /*set if the first session has CDDA track*/
#ifdef MULTI_SESSION
int return_val=0;
int last_session_msf_1=0;
int first_session_retry_cnt=0;
#endif
CDinited = 0; /* Avoid partially initialized CD info */
#if (defined MP3_LOGO && defined ENABLE_MP3)
if (power_up) {
int timer = glbTimer + HALF_SECOND;
while(glbTimer<timer);
}
#ifdef CXD3059
CLEAR_SERVO_MUTE; /* enable cxd3059 audio-dac */
#endif
/*moved here from top.c, for slideshow problems due to longjump*/
play_mp3_logo((int *)mp3logo, T_mp3logo_SZ>>2);
#endif /* MP3_LOGO */
dsa_close(0);
#ifdef ECHO
if(echo_resume_flag!=-1)
{
vcx_echo=echo_resume_flag;
echo_resume_flag=-1;
MIC_init();
MIC_start_take_in();
}
#endif
retry_cnt = 0;
SERVO_ltoc_retry:
/* Interrupted by user */
if (SERVO_check_key_new())
goto ltoc_err_return;
if (retry_cnt >= 5) {
CDinfo.type = CD_UNKNOWN;
err_code = ERR_LTOC;
goto ltoc_err_return; /* Retried twice and still fails */
}
retry_cnt ++;
if (!SERVO_goto_toc())
goto SERVO_ltoc_retry;
return_value = SERVO_play();
if ((return_value == 0) || (return_value == -1))
goto SERVO_ltoc_retry;
else if (return_value == -2)
{
if (retry_cnt <= 2)
{
RESET_servo_flag();
goto SERVO_ltoc_retry;
}
CDinfo.type = CD_NODISC;
err_code = ERR_TRAYEMPTY;
goto ltoc_err_return;
}
/* initialize some CDinfo */
CDinfo.type = 255;
CDinfo.firsttrack = 0;
CDinfo.lasttrack = 0;
for (i = 0; i < szTk; i++)
pTk[i] = xff000000;
pt_A0 = pt_A1 = pt_A2 = 0;
track_rd_num = num_of_track = 0;
multi_session = 0;
num_of_session = 1;
#ifdef MULTI_SESSION
pt_B0 = pt_C0 = 0;
last_session_msf = 0;
#endif MULTI_SESSION
/* process received data until it is done */
loopcnt = ltoc_done = 0;
SERVO_new_Qcode = 0;
#if defined(CD_TEXT) && !defined(ANTI_SHOCK)
CD_text_init(1);
#endif
servo_kick_timer_interval = 2;
timeout = glbTimer + TEN_SECOND;
while (!ltoc_done) {
#ifdef ECHO
MIC_service();
#endif
VCX_service();
#ifdef LTOC_TV_CHANGE
DISP_TV_service();
#endif
loopcnt++;
if (loopcnt > 500) {
/*
* Servo is going crazy! This rarely happens; however, I have
* seen this happened!
*/
goto SERVO_ltoc_retry;
}
/* Higher priority command received. Go handle it */
if ((loopcnt % 8) == 0)
if(SERVO_check_key_new()) goto ltoc_err_return;
do {
SERVO_service(0);
if (glbTimer > timeout) {
goto SERVO_ltoc_retry; /* Focus is down or time out, *
* do not proceed */
}
if (SERVO_new_Qcode) {
SERVO_new_Qcode = 0;
break;
}
if (SERVO_check_key_new())
goto ltoc_err_return;
#ifdef LTOC_TV_CHANGE
DISP_TV_service();
#endif
} while (1);
switch (SERVO_Qarray_new[SERVO_QTRACK]) {
case 0x00:
switch (SERVO_Qarray_new[SERVO_QPOINT]) {
case 0xA0:
CDinfo.firsttrack = bcd2hex[SERVO_Qarray_new[SERVO_QPMIN]];
pt_A0_PSEC = SERVO_Qarray_new[SERVO_QPSEC];
if (pt_A0_PSEC == 0xa)
CDinfo.type = CD_CDI;
pt_A0 = 1;
break;
case 0xA1:
/*make sure we have read first track info before set pt_A1*/
if(!pt_A0) break;
CDinfo.lasttrack =
bcd2hex[SERVO_Qarray_new[SERVO_QPMIN]] - 1;
if (CDinfo.type == CD_CDI)
num_of_track = -1;
else
num_of_track =
CDinfo.lasttrack - CDinfo.firsttrack + 1;
pt_A1 = 1;
break;
case 0xA2:
CDinfo.leadout = SERVO_Qarray_new[SERVO_QPMIN]<<16 ;
CDinfo.leadout |= SERVO_Qarray_new[SERVO_QPSEC]<<8;
CDinfo.leadout |= SERVO_Qarray_new[SERVO_QPFRAME];
pt_A2 = 1;
break;
#ifdef MULTI_SESSION
case 0xB0:
if (pt_B0) break;
first_session_retry_cnt++;
if (!((SERVO_Qarray_new[SERVO_QRMIN]==0xff) &&
(SERVO_Qarray_new[SERVO_QRSEC]==0xff) &&
(SERVO_Qarray_new[SERVO_QRFRAME]==0xff))){
if(last_session_msf==((SERVO_Qarray_new[SERVO_QRMIN]<<16)|(SERVO_Qarray_new[SERVO_QRSEC]<<8)|SERVO_Qarray_new[SERVO_QRFRAME]))
break;
multi_session=1;
last_session_msf_1=last_session_msf;
last_session_msf = SERVO_Qarray_new[SERVO_QRMIN]<<16 ;
last_session_msf|= SERVO_Qarray_new[SERVO_QRSEC]<<8;
last_session_msf|= SERVO_Qarray_new[SERVO_QRFRAME];
}
pt_B0 = 1;
break;
case 0xC0:
pt_C0=1;
break;
#endif /*MULTI_SESSION*/
default:
if ((SERVO_Qarray_new[SERVO_QPOINT] < 0xa0) &&
(SERVO_Qarray_new[SERVO_QPOINT] > 0x00)) {
int trk_index;
trk_index =
bcd2hex[SERVO_Qarray_new[SERVO_QPOINT]] - 1;
/*allow toc overriding*/
i = (SERVO_Qarray_new[SERVO_QCTRADD] << 24) |
(SERVO_Qarray_new[SERVO_QPMIN] << 16)|
(SERVO_Qarray_new[SERVO_QPSEC] << 8)|
SERVO_Qarray_new[SERVO_QPFRAME];
if(pTk[trk_index] != i){
if (pTk[trk_index] == xff000000) track_rd_num++;
pTk[trk_index] = i;
if ((num_of_session==1) &&
((SERVO_Qarray_new[SERVO_QCTRADD] & 0x4f) == 0x01))/*CDDA*/
first_session_cdda = 1;
#if 0
/* for single session DATA discs (MP3...) which have
* only one track, depending on the order of Q-code,
* we may not have a chance to set tk1_ctl_adr.
* tk1_ctl_adr can be more reliably set after all the
* TOC info has been acquired.
*/
if (SERVO_Qarray_new[SERVO_QPOINT] ==
CDinfo.firsttrack)
tk1_ctl_adr = SERVO_Qarray_new[SERVO_QCTRADD];
#endif
}
}
break;
} /*One Point of a qcode*/
if ((pt_A0 && pt_A1 && pt_A2) &&
(track_rd_num > num_of_track)) {
#ifdef MULTI_SESSION
if((num_of_session==1) &&
((!pt_C0 && pt_B0) /*more than two open/close sessions*/
|| (!first_session_cdda && (CDinfo.firsttrack >1)))){/*two closed sessions*/
if (first_session_retry_cnt < 20) { /*11 normally*/
pt_A0 = pt_A1 = pt_A2 = pt_B0 = pt_C0 =0;
last_session_msf_1 =last_session_msf=0;
track_rd_num =0;
multi_session=0;
num_of_track =0;
first_session_cdda = 0;
for (i = 0; i < szTk; i++)
pTk[i] = xff000000;
break;
} else { /*first session locate error*/
last_session_msf= last_session_msf_1;
multi_session=0;
}
}
track_rd_num =0;
pt_C0 =0;
/* if 1st session is CDDA then set disc type
* as CDDA, else let last track of last session
* decide the CD type
*/
tk1_ctl_adr = (first_session_cdda)
? 0x01 : (pTk[CDinfo.lasttrack] >> 24);
#else
/* set tk1_ctl_adr after getting all toc info */
tk1_ctl_adr = pTk[CDinfo.firsttrack-1] >> 24;
#endif /* MULTI_SESSION */
pt_A0 = pt_A1 = pt_A2 = pt_B0 = 0;
if ((tk1_ctl_adr & 0xcf) == 0x01)
CDinfo.type = CD_CDDA;
else if (pt_A0_PSEC != 0 &&
(tk1_ctl_adr == 0x41 ||
tk1_ctl_adr == 0x61))
CDinfo.type = CD_VCD;
/* Note: Photo-CD will also pass as VCD */
else {
#ifdef DATA_CD
if (!pt_A0_PSEC)
CDinfo.type = CD_DATA;
else
#endif
CDinfo.type = CD_UNKNOWN;
}
if (!multi_session || first_session_cdda){
ltoc_done = 1;
}
#ifdef MULTI_SESSION
else {
return_val = SERVO_go_next_session();
if ((return_val ==3 )||
(return_val ==1 )) { /*due to time out*/
last_session_msf=last_session_msf_1;
ltoc_done = 1;
} else if (!return_val) {
goto SERVO_ltoc_retry;
} else {
multi_session = 0;
loopcnt=0;
num_of_session++;
timeout = glbTimer + TEN_SECOND;
/*debug_osd("SESS ", num_of_session, 7);*/
}
}
#endif MULTI_SESSION
}
break;
default:
break;
}
} /* end of while(ltoc_done) */
#if defined(CD_TEXT) && !defined(ANTI_SHOCK)
CD_text_init(0);
#endif
dsa_mode(MODE_ATTI_REL | MODE_CDROM | MODE_SPEED_NORMAL);
CDinited = 1;
CPRINTF("LTOC", retry_cnt);
DISP_cigam(CDinfo.type != CD_CDDA);
if (!SERVO_out_toc())
SERVO_out_toc();
SET_EAUX17;
return(1);
ltoc_err_return:
cd_stop = CDinited = 1;
dsa_stop();
return(0);
}
/*
* Goto time. This command forces the CD-module to jump to the requested
* absolute time location.
*
* Input:
* time: CD sector time in MMSSFF format where each of MM/SS/FF
* is a BCD number.
*
* Return:
* 1: successful
* 0: otherwise
*/
int dsa_go(unsigned int time)
{
int return_val;
int r_tmp;
dsa_go_state = DSA_GO_INIT;
do {
return_val = dsa_go_step_by_step(time);
#ifdef ECHO
MIC_service();
#endif
MP3CDG_service();
} while (return_val==1);
VCX_service();
return ((return_val == 2));
}
int SERVO_dsa_go_state(void)
{
return (dsa_go_state);
}
void reset_dsa_go(void)
{
dsa_go_state = DSA_GO_INIT;
}
/****************************************************************************
Step by step go time. Returns 0 if failed, 1 if don't know, 2 if succeed.
****************************************************************************/
PRIVATE int dsa_go_step_by_step(unsigned int time)
{
int return_val, r_tmp;
static int search_timer;
switch (dsa_go_state) {
case DSA_GO_INIT:
SERVO_target_msf = time;
/* For bad discs limit search time..
* more consistent than retry limits used before.
*/
//if ((STREAM_type == MP3_ID)||(play_state==PLAY_STEP_STATE))
// TDM_force_stop(1);
search_timer = glbTimer + 5*ONE_SECOND;
SERVO_mode = SERVO_SEARCH;
SERVO_search_init();
dsa_go_state = DSA_GO_STILL_SEARCHING;
return_val = 1;
break;
case DSA_GO_STILL_SEARCHING:
return_val = SERVO_search_request();
if (return_val == 2) dsa_go_state = DSA_GO_FOUND_TARGET;
check_user_input(); /* derek */
if(forceDSAabort || (glbTimer > search_timer)) {
/* failed..goto idle */
dsa_go_state = DSA_GO_INIT;
return_val = 0;
} else {
return_val = 1;
}
break;
case DSA_GO_FOUND_TARGET:
//if ((STREAM_type == MP3_ID)||(play_state==PLAY_STEP_STATE))
// TDM_turn_on();
SERVO_get_servo_info();
#if 0
/* the Sub-Q we get here is most likely from the end of the
* last track.
*/
updateLCDtime();
OSD_update_info(); /* OSD info needs to update */
#endif
SERVO_mode = SERVO_PLAY;
dsa_go_state = DSA_GO_INIT;
return_val = 2;
break;
}
return (return_val);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -