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

📄 dsasl.c

📁 ESS3890+SL原代码(1*16内存)
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -