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

📄 cdfunc.c

📁 这是一个VCD解码的学习资料,主要是CD SERVO 的一些源代码!以供大家参考!
💻 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 + -