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

📄 discinfo.c

📁 详细介绍DVD的读碟片程序:TOC表
💻 C
📖 第 1 页 / 共 4 页
字号:
/***************    MTK CONFIDENTIAL & COPYRIGHTED     ****************/
/***************                                       ****************/
/***************  $Modtime:: 05/06/30 9:12a    $       ****************/
/***************  $Revision:: 16               $       ****************/
/***************                                       ****************/
/*************** Description : Disc Info relative      ****************/
/***************               routines used for       ****************/
/***************               Channel decoder         ****************/
/***************                                       ****************/
/***************     Company : MediaTek Inc.           ****************/
/***************  Programmer : Joseph Lin              ****************/
/***************               Yih-Shin Weng           ****************/
/**********************************************************************/

#define _C_DISCINFO_

#include "general.h"

#pragma NOAREGS

/***************************************************************************
     Function : BIT fgDIReadDiscInfo(void)
  Dsecription : Call from :
                 main();
                 ATAPIStartStop()
                Read TOC when 1.) Reset
                              2.) New Dis
                              3.) Start Unit
                Read TOC is Done Over Here !!
                Also Set Disc Speed !!
    Parameter : None
       Return : TRUE - read successfully
                FALSE - the reading was interrupted
***************************************************************************/
BIT fgDIReadDiscInfo(void)
{
  WORD wIdx;
  BIT fgSuccess = FALSE;

  _fgReadDiscInfo = TRUE;             // Servo is Reading Disc Information
  _bCDVDStatus = ST_READ_TOC;         // reading toc

  _bTotalSen = 0;                     // Reset _bTotalSen

#ifdef VCD_SPEED_ON_M2F2
  _bVCDPlaying = FALSE;               // VCD playing
#endif

  if (fgGetMediaType())               // get DISC type
  {
#ifdef SUPPORT_DVDRAM_FAMILY
    WriteBLK(RW_NBLK, _wTotalBlk);            // Total Block Numbers
    WriteBLKC(RW_BCL, _wTotalBlk - 17);       // Set Buffer Bound
#endif
    if (_fgDiskIsDVD)                 // DVD
    {
      ChangeToDVD();                  // Change to DVD Mode
      _bMaxSpeed = MAX_DVD_SPEED;     // Pre-set : Normal Data at Max Speed
      WriteDEC(RW_SEEKLMT, DVD_SEEK_LIMIT); // Servo Read Error Sectors Limit
      fgSuccess = fgDIBuildDVDTOC();  // Read DVD Lead in area and Build TOC
    }
    else                              // CD
    {
      ChangeToCD();                   // Change to CD Mode
      _bMaxSpeed = MAX_CD_SPEED;      // Pre-set : Normal Data at Max Speed
      WriteDEC(RW_SEEKLMT, CD_SEEK_LIMIT); // Servo Read Error Sectors Limit
      fgSuccess = fgDIReadTOC();      // Read TOC
      DIBuildDiscMap();               // Build Disc Map of Track Format
    }
    if (!fgSuccess)
    {
      _bTotalSen = 0;
    }
  }

  if (_bTotalSen)                     // Disc Present & Read TOC OK
  {
    if (!_fgDiskIsDVD)
    {
      // Audio     Disc : All Tracks are Audio, No Data Track.
      // CD+       Disc : Take As Audio Disc
      // ENHANCECD Disc : Take As Audio Disc
      wIdx = 6;                       // Point To TOC Record

      // Check For CD+ Disc
      if ((_bDiscType != CDI_DISC) && (_bDiscType != CDXA_DISC) &&
        ((bReadTOCMem(wIdx + 1) & 0x40) == 0))
      {
        // Reports Data Tracks Included --> Data Tracks After Audio Tracks
        if (_fgHaveData)
        {
          _bMaxSpeed = CDPLUS_SPEED;      // CD+ Fixed at 8x Speed

          _bDiscType = CDPLUS_DISC;
        }
        // Hidden Data Track Exists --> Data Tracks Before Audio Tracks
        else if ((bReadTOCMem(wIdx + 3) != 0x00) ||
                 (bReadTOCMem(wIdx + 4) != 0x02) ||
                 (bReadTOCMem(wIdx + 5) != 0x00))
        {
          _bMaxSpeed = ENHANCECD_SPEED;     // Enhance CD Fixed at 8x Speed

          _bDiscType = ENHANCECD_DISC;
        }
        else
        {
          _bMaxSpeed = CDDA_SPEED;     // CDDA CD

          _bDiscType = CDDA_DISC;
        }
      }

      if ((_bDiscType == CDI_DISC) || (_bDiscType == CDXA_DISC))
      {
        // Save CD-ROM BLOCK LENGTH To System Ram
#ifdef VCD_CDR_SPEED
        if (_fgDiskIsCDRW || _fgDiskIsCDR)
        {
          _bMaxSpeed = VCD_CDR_SPEED; // CD-I & VCD on Lower Speed
        }
        else
#endif
#ifdef VCD_SPEED_ON_M2F2
        _bMaxSpeed = MAX_CD_SPEED;      // Keep in CDROM Speed
#else
        _bMaxSpeed = VCD_SPEED;         // CD-I & VCD on Lower Speed
#endif
      }

#ifdef LIMIT_CDRW_SPEED
      if (_fgDiskIsCDRW)
      {
        // Audio Disc, CD PLUS Disc, Enhanced CD
        if (_bDiscType & 0xC0)
        {
          _bMaxSpeed = CDDA_SPEED;          // CD-RW Audio at 8x Speed
        }
        else
        {
          _bMaxSpeed = CDRW_SPEED;          // CD-RW Data  at 12x Speed
        }
      }
#endif

      if (_fgHaveAudio)
      {
#ifdef SUPPORT_DTS_CD
        _fgDTSCD = fgChkDTSCD();
        if (_fgDTSCD)                       // DTS CD or not
        {
          WriteTOCMem(3, bReadTOCMem(3) | 0x04);
        }
#endif

#ifdef SUPPORT_CD_TEXT
        GetCDText();
#endif
      }

#ifdef SUPPORT_CDI
      if ((_bDiscType == CDI_DISC) || (_bDiscType == CDXA_DISC))
      {
        WriteTOCMem(3, bReadTOCMem(3) | 0x08);
      }
#endif

      // It can be marked if servo & decoder co-use the same flag _fgMultiSen
//      if (_fgMultiSen)
//      {
//        SRVSetExtraType(EXTRA_MULTI_SESSION); // set extra DISC type
//      }

      // Reset some variables
      _fgPktWrite = FALSE;
      _fgMethod2 = FALSE;
    }
    else  // DVD Disc
    {
      _bDiscType = DVDROM_DISC;

#ifdef SUPPORT_DVDRAM_FAMILY
      if (_fgDiskIsDVDRAM)
      {
        _bDiscType = DVDRAM_DISC;
        _bMaxSpeed = (_fgDiskIsDVDRAM2 ?
                      MAX_RAMV2_SPEED : MAX_RAMV1_SPEED);
      }
      else
#endif
      if (_fgDiskIsDVDR)
      {
        _bMaxSpeed = MAX_DVDR_SPEED;
      }
      else if (_fgDiskIsDVDRW)
      {
        _bMaxSpeed = (_fgDiskIsDVDMRW ?
                      MAX_DVDMRW_SPEED : MAX_DVDPRW_SPEED);

      }
      else if (_fgTwoLayer)                    // Dual-Layer
      {
        _bMaxSpeed = MAX_TWO_DVD_SPEED;
      }
    }

    if (_fgDiskIsDVD)
    {
      bLoByte(wIdx) = DT_DVD_DISC;
    }
    else if (_fgDiskIsCDRW)
    {
      bLoByte(wIdx) = DT_CDRW_DISC;
    }
#ifdef SUPPORT_DVDRAM_FAMILY
    else if (_fgDiskIsDVDRAM)
    {
      bLoByte(wIdx) = DT_DVDRAM_DISC;
    }
#endif
    else if (_fgDiskIsDVDR)
    {
      bLoByte(wIdx) = DT_DVDR_DISC;
    }
    else if (_fgDiskIsDVDRW)
    {
      bLoByte(wIdx) = DT_DVDRW_DISC;
    }
    else
    {
      bLoByte(wIdx) = DT_CDROM_DISC;
    }

    WriteTOCMem(0, bLoByte(wIdx));

    _bOptimumSpeed = _bMaxSpeed;        // Initialize Read Init Speed

    _fgPause = TRUE;

#ifdef  SEEK_ADJUSTABLE
    _cSeekOffset = INIT_SEEKOFFSET;  // Reset Seek Offset when Disc Changed
#else
    _cSeekOffset = FIXED_SEEKOFFSET; // Reset Seek Offset when Disc Changed
#endif

    LEDOn();                              // Turn On LED When Disc Present
  }
  else                                    // No Disc
  {
#ifdef AUDIO_IN_EN
    if (fgIsFuncAin())
    {
      MSRVFree();
    }
    else
#endif
    {
      MSRVStop();                           // No Disc, Stop Motor
    }

    WriteTOCMem(0, DT_NO_DISC);           // store disc type

    LEDOff();                             // Turn Off Ready or Busy LED

    // Media Not Present, goto STANDBY mode
    // But for player, this can't be done directly
  }

  _fgSkipSrvStart = FALSE;                // Clear _fgSkipSrvStart
  _bCDVDStatus = ST_READY;                // initial status
  _fgReadDiscInfo = FALSE;                // Servo is Reading TOC

  _wPauseTimer = 0;
  return (fgSuccess);
}

/***************************************************************************
     Function : BIT fgDIReadTOC(void)
  Dsecription : DIReadTOC SUBROUTINES
                Unity with hex format expect CONTROL_ADDRESS field
                OUTPUT  : READ TOC DATA AND SETUP IN MEMORY
                CALL BY : DIReadDiscInfo()  ONLY !!

    Parameter : None
       Return : TRUE - read successfully
                FALSE - the reading was interrupted
***************************************************************************/
// Reads the whole TOC Data from Servo to the TOC memory.
BIT fgDIReadTOC(void)
{
  WORD wIdx;

  _fgHaveAudio = FALSE;                   // No Audio Track
  _fgHaveData = FALSE;                    // No Data  Track
  _fgMultiSen = FALSE;                    // Default NOT Multi-Session

  wIdx = 6;                               // Track Index Pointer
  _bTotalSen = 1;                         // First Session

#ifdef SUPPORT_DACD
  _dMaxLBA = 150;
#endif

  _dPrevSessAddr = 0;

  wIdx = wReadTOC(wIdx);                  // Reads TOC

  if (_fgAbort)
  {
    wIdx = 6;                             // Points to Head of TOC Table
    _bTotalSen = 0;                       // TOC is Invalid
    _fgMultiSen = FALSE;                  // Ignore Any Subsequent Session
    _bPlayerStatus = PLAYER_READY;
  }

  if (_bPlayerStatus != PLAYER_READY)
  {
    wIdx = 6;                         // Track Index Pointer
    _bTotalSen = 1;                   // First Session

    wIdx = wReadTOC(wIdx);            // Read Once More if Read Failed

    if ((_bPlayerStatus != PLAYER_READY) || (_fgAbort))
    {
      wIdx = 6;                           // Points to Head of TOC Table
      _bTotalSen = 0;                     // TOC is Invalid
    }
  }

  while (_testbit_(_fgMultiSen))          // Multi-Session
  {
    _bTotalSen++;                         // Next Session

    wIdx = wReadTOC(wIdx);                // Reads TOC of Next Session

    if (_bPlayerStatus != PLAYER_READY)
    {
      _bTotalSen--;                       // Abandon This Session
      break;
    }

    if (_fgAbort)
    {
      wIdx = 6;                           // Points to Head of TOC Table
      _bTotalSen = 0;                     // TOC is Invalid
      _fgMultiSen = FALSE;              // Ignore Any Subsequent Session
    }
  }

  if (_bTotalSen > 1)
  {
    _fgMultiSen = TRUE;
  }
  else
  {
    _fgMultiSen = FALSE;                // Ignore Any Subsequent Session
  }

  // Total Track Count
  WriteTOCMem(1, _bLastTNo - _bFirstTNo + 1);
  WriteTOCMem(2, _bTotalSen);           // Total Session Count
  // ATE and DTE bits
  bLoByte(wIdx) = (_fgHaveAudio? 2:0) + (_fgHaveData? 1:0);
  WriteTOCMem(3, bLoByte(wIdx));

  return (!_fgAbort);
}

// Disc Key Addresses
WORD code pwDiscKeyAddr[10] = {
  0x0000, 0x0001, 0x0002, 0x0003, 0x0004,
  0x026C, 0x026D, 0x026E, 0x026F, 0x0270
};

#ifdef SUPPORT_DVD_AUDIO
// CPPM Key Address
WORD code pwCPPMKeyAddr[8] = {
  0x0050, 0x0051, 0x0052, 0x0053,
  0x0054, 0x0055, 0x0056, 0x0057
};
#endif

/***************************************************************************
     Function : BIT fgDIBuildDVDTOC(void)
  Dsecription : Build a DVD Lead In Area Table
    Parameter : None
       Return : TRUE - read successfully
                FALSE - the reading was interrupted
***************************************************************************/
BIT fgDIBuildDVDTOC(void)
{
  BYTE bCnt, _bEmptyFlag ;
  WORD wBAddr;
#if 1 // VCPS_SUPPORT
  BYTE bVcpsDisc;
#endif

  _fgHaveAudio = FALSE;                   // No Audio Track
  _fgHaveData = FALSE;                    // No Data  Track
  _fgMultiSen = FALSE;                    // Default NOT Multi-Session
  _bTotalSen = 1;                         // First Session
  _bVRDiscFlag = _bEmptyFlag = FALSE;			  //

  _bSeekLayer = SEEK_LAYER0;              // Read Lead in at layer0

  /* Jacob: init the data offset */
  _dwDataAreaOfst = 0;

⌨️ 快捷键说明

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