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

📄 goto.c

📁 mtkDVD源代码程序4*16 很好玩的内置5.1环绕音效 大家可以玩一下
💻 C
📖 第 1 页 / 共 5 页
字号:
    case IR_PLAY_ENTER:
      switch (bPbcState)
      {
        case SV_FF:
        case SV_FR:
        case SV_SF:
        case SV_SR:
        case SV_PAUSE:
        case SV_STEP:
          return (FALSE);  // don't process this key in Goto
          break;
          
        default:
          break;
      }
      
      if (fgIsDvdPlay())
      {
        switch (_bGotoCurItem)
        {
          case STGOTO_DVD_CHAPTER:
          case STGOTO_DVD_TITLE:
          case STGOTO_DVD_ANGLE:
          case STGOTO_DVD_TIME:
          case STGOTO_DVD_TIME_CH:
            if (_bGotoState != STGOTO_MAIN)
              break;
              
            // check disallowed operations
            if (_bGotoCurItem == STGOTO_DVD_TITLE && !fgIsTTLSearchAllow())
              break;
            if (_bGotoCurItem == STGOTO_DVD_CHAPTER && !fgIsPTTSearchAllow())
              break;
            if ((_bGotoCurItem == STGOTO_DVD_TIME || _bGotoCurItem == STGOTO_DVD_TIME_CH)
                && !fgIsTimeSearchAllow())
              break;

            _bGotoState = _bGotoCurItem;
            vInvokeFun(_bGotoState, TRUE);
            if ((_bGotoCurItem == STGOTO_DVD_CHAPTER || _bGotoCurItem == STGOTO_DVD_TIME || _bGotoCurItem == STGOTO_DVD_TIME_CH) &&
                _bGotoState == STGOTO_MAIN)
            // go back from that state and need to redraw
            {
              vRedrawGotoItem(TRUE);
              vGotoHLItem(TRUE);
            }
            break;
          case STGOTO_DVD_AUDIO:
            // check disallowed operations
            if (!fgIsAudioChangeAllow())
              break;
          case STGOTO_DVD_SUBTITLE:
          case STGOTO_DVD_REPEAT:
          case STGOTO_DVD_TIMEDISP:
            if (_bGotoState == STGOTO_MAIN)
            {
              _bGotoState = _bGotoCurItem;
            }
            vInvokeFun(_bGotoState, TRUE);
            if (_bGotoState == STGOTO_MAIN)
            // go back from that state and need to redraw
            {
              vRedrawGotoItem(TRUE);
              vGotoHLItem(TRUE);
            }
            break;
        }
      }
      else if (fgIsVcdPlay())
      {
        switch (_bGotoCurItem)
        {
          case STGOTO_VCD_TIME_CH:
            if (bSharedInfo(SI_TRACK_NO) == 0)
              return (TRUE);
          case STGOTO_VCD_CHAPTER:
          case STGOTO_VCD_TITLE:
          case STGOTO_VCD_TIME:
            if (_bGotoState != STGOTO_MAIN)
              break;
            _bGotoState = _bGotoCurItem;
            vInvokeFun(_bGotoState, TRUE);
            if ((_bGotoCurItem == STGOTO_VCD_TIME || _bGotoCurItem == STGOTO_VCD_CHAPTER || _bGotoCurItem == STGOTO_VCD_TIME_CH)
                && _bGotoState == STGOTO_MAIN)
            // go back from that state and need to redraw
            {
              vRedrawGotoItem(TRUE);
              vGotoHLItem(TRUE);
            }
            break;
          case STGOTO_VCD_REPEAT:
            // disallow repeat when PBC on
            if (bSharedInfo(SI_PBC_SWITCH) == SV_PBC_ON)
              break;
          case STGOTO_VCD_TIMEDISP:
            if (_bGotoState == STGOTO_MAIN)
            {
              _bGotoState = _bGotoCurItem;
            }
            vInvokeFun(_bGotoState, TRUE);
            if (_bGotoState == STGOTO_MAIN)
            // go back from that state and need to redraw
            {
              vRedrawGotoItem(TRUE);
              vGotoHLItem(TRUE);
            }
            break;
        }
      }
      break;
    /*
      switch (bPbcState)
      {
        case SV_PLAY: // show invalid input icon here??
                      break;
        
        case SV_PAUSE: vSendUopCmd(UOP_PAUSE, 0, 0, 0);
                       vGotoShowPlayIcon();
                       break;
      }
      break;
    */

    case IR_UP:
      if (_bGotoState == STGOTO_MAIN)
      {
        vGotoHLItem(FALSE);
        if (!_bGotoCurItem--)
        {
#ifdef NO_SCROLL_OVER
          _bGotoCurItem = 0;
#else
          // scroll over the top
          _bGotoCurItem = bGotoTotalItem() - 1;
          _bGotoBeg = _bGotoCurItem - GOTO_PAGE_ITEM_NUM + 1;
          if (_bGotoBeg < 0)
            _bGotoBeg = 0;
          if (bGotoTotalItem() <= GOTO_PAGE_ITEM_NUM)
            vRedrawGotoItem(FALSE);
          else
            vRedrawGotoItem(TRUE);
#endif /* NO_SCROLL_OVER */
        }
        else if (_bGotoCurItem < _bGotoBeg && 1)
        {
          // scrolling up
          _bGotoBeg--;
          vRedrawGotoItem(TRUE);
        }
        vGotoHLItem(TRUE);
          
        break;
      }
      goto UP_DOWN_HANDLER;        // temp solution
      /*
      if (fgIsDvdPlay())
      {
        switch (_bGotoState)
        {
          case STGOTO_DVD_AUDIO:
          case STGOTO_DVD_SUBTITLE:
          case STGOTO_DVD_REPEAT:
          case STGOTO_DVD_TIMEDISP:
            vInvokeFun(_bGotoState, TRUE);
            break;
        }
      }
      else if (fgIsVcdPlay())
      {
        switch (_bGotoState)
        {
          case STGOTO_VCD_REPEAT:
          case STGOTO_VCD_TIMEDISP:
            vInvokeFun(_bGotoState, TRUE);
            break;
        }
      }
      break;
      */

    case IR_DOWN:
      if (_bGotoState == STGOTO_MAIN)
      {
        vGotoHLItem(FALSE);
        _bGotoCurItem = ++_bGotoCurItem % bGotoTotalItem();
        if (_bGotoCurItem == 0)
        {
#ifdef NO_SCROLL_OVER
          _bGotoCurItem = bGotoTotalItem() - 1;
#else
          // scroll over the bottom
          _bGotoBeg = 0;
          if (bGotoTotalItem() <= GOTO_PAGE_ITEM_NUM)
            vRedrawGotoItem(FALSE);
          else
            vRedrawGotoItem(TRUE);
#endif /* NO_SCROLL_OVER */
        }
        else if (_bGotoCurItem >= _bGotoBeg + GOTO_PAGE_ITEM_NUM)
        {
          // scrolling down
          _bGotoBeg++;
          vRedrawGotoItem(TRUE);
        }
        vGotoHLItem(TRUE);
        
        break;
      }
UP_DOWN_HANDLER:
      if (fgIsDvdPlay())
      {
        switch (_bGotoState)
        {
          case STGOTO_DVD_AUDIO:
          case STGOTO_DVD_SUBTITLE:
          case STGOTO_DVD_REPEAT:
          case STGOTO_DVD_TIMEDISP:
            vInvokeFun(_bGotoState, TRUE);
            break;
        }
      }
      else if (fgIsVcdPlay())
      {
        switch (_bGotoState)
        {
          case STGOTO_VCD_REPEAT:
          case STGOTO_VCD_TIMEDISP:
            vInvokeFun(_bGotoState, TRUE);
            break;
        }
      }
      break;
    
    case IR_LEFT:
      if (_bGotoState == STGOTO_MAIN)
        break;
      if (fgIsDvdPlay())
      {
        switch (_bGotoState)
        {
          case STGOTO_DVD_CHAPTER:
          case STGOTO_DVD_TITLE:
          case STGOTO_DVD_ANGLE:
          case STGOTO_DVD_TIME:
          case STGOTO_DVD_TIME_CH:
            vGotoBackMain();
            vRedrawGotoItem(FALSE);
            break;
          case STGOTO_DVD_AUDIO:
          case STGOTO_DVD_SUBTITLE:
          case STGOTO_DVD_REPEAT:
          case STGOTO_DVD_TIMEDISP:
            vGotoBackMain();
            vRedrawGotoItem(TRUE);
            break;
        }
      }
      else if (fgIsVcdPlay())
      {
        switch (_bGotoState)
        {
          case STGOTO_VCD_CHAPTER:
          case STGOTO_VCD_TITLE:
          case STGOTO_VCD_TIME:
          case STGOTO_VCD_TIME_CH:
            vGotoBackMain();
            vRedrawGotoItem(FALSE);
            break;
          case STGOTO_VCD_REPEAT:
          case STGOTO_VCD_TIMEDISP:
            vGotoBackMain();
            vRedrawGotoItem(TRUE);
            break;
        }
      }
      vGotoHLItem(TRUE);
      break;
    
    case IR_DISPLAY:
#ifdef GOTO_STATUS_NO_TTCH
      if (bSharedInfo(SI_NTSC_PAL) == SV_PAL)
      {
        vOsdPosClear(OSD_POS_GOTO_DISP_P);
      }
      else
      {
        vOsdPosClear(OSD_POS_GOTO_DISP);
      }
#endif
      _rOsdStateCtx.bGotoTimeType++;
      _rOsdStateCtx.bGotoTimeType %= 4;
      vUpdateGotoShow(GOTO_SHOW_PANEL_TIME);
      vDealGotoTimedisp(FALSE);
      break;
      
    default:
      if (_bGotoState != STGOTO_MAIN)
      {
        vInvokeFun(_bGotoState, TRUE);
        break;
      }
      if (_bIRKey >= IR_INTERNAL_KEY_START)
      {
      	if (fgIsNoInputState() && _bIRKey != IR_CMD_DONE)
      	{
          vOsdPosClear(OSD_POS_ZOOM);
          vSendUopCmd(UOP_ZOOM_IN, SV_ZOOM_1, 0, 0x80);
          vGotoClose();
          vGotoExit();
        }
        return (FALSE);
      }
      break;
  }
  
  return (TRUE);
}

// common portion of original vDealGotoChapter and vDealGotoTitle
static void v2DigitInputHandler(BYTE bCurr, BYTE bTotal, BYTE bUopId, WORD wY) large
{
  BYTE bNum;
  BYTE pbStr[] = { 5, '1', '2', '/', '3', '4' };
  
  pbStr[1] = bCurr / 10 + '0';
  pbStr[2] = bCurr % 10 + '0';
  pbStr[4] = bTotal / 10 + '0';
  pbStr[5] = bTotal % 10 + '0';

  switch (_bIRKey)
  {
    case IR_PLAY:
    case IR_ENTER:
    case IR_PLAY_ENTER:
      if (_bInputPos == 0xFF)
      {
        _bInputPos = 0;
        _bInputNum = 0;
        pbStr[1] = '_';
        pbStr[2] = '0';
        vSetMsgCol4(_bWBGotoMenu, 0, 3, 2, 4);
        vOsdShowStrXY(GOTO_RITEM_X, wY, _bWBGotoMenu, pbStr);
      }
      break;
      
    case IR_NUM0:
    case IR_NUM1:
    case IR_NUM2:
    case IR_NUM3:
    case IR_NUM4:
    case IR_NUM5:
    case IR_NUM6:
    case IR_NUM7:
    case IR_NUM8:
    case IR_NUM9:
      pbStr[1] = '0' + _bInputNum / 10;
      pbStr[2] = '0' + _bInputNum % 10;
      bNum = _bIRKey - IR_NUM0;
      if (_bInputPos == 0)
      {
        if (bNum > (bTotal / 10))         // invalid input
          break;
        _bInputNum = 10 * bNum;
        pbStr[1] = '0' + bNum;
        pbStr[2] = '_';
        _bInputPos++;
      }
      else
      {
        if (_bInputNum + bNum > bTotal)
          break;  // input exceeding valid range
        if (_bInputNum + bNum == 0)
          break;  // input 00
        _bInputNum += bNum;
        pbStr[2] = '0' + bNum;
        _bInputPos++;
      }
      vSetMsgCol4(_bWBGotoMenu, 0, 3, 2, 4);
      vOsdShowStrXY(GOTO_RITEM_X, wY, _bWBGotoMenu, pbStr);
      
      if (_bInputPos == 2)  // input completed (2-digit)
      {
        vSendUopCmd(bUopId, _bInputNum, 0, 0);
        vSetMsgCol4(_bWBGotoMenu, 0, 3, 2, 1);
        vOsdShowStrXY(GOTO_RITEM_X, wY, _bWBGotoMenu, pbStr);
        //vRedrawGotoItem(TRUE);
        //vGotoHLItem(TRUE);
        vGotoBackMain();
      }
      break;
  }
}

void vDealGotoChapter(BYTE fgDeal) large
{
  BYTE bYPos = (fgIsDvdPlay() ? STGOTO_DVD_CHAPTER : STGOTO_VCD_CHAPTER) -
                _bGotoBeg;
  WORD wY = GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * bYPos;
  // when VCD, use PTT as the analogy to DVD's chapter
  BYTE bChNo = bSharedInfo(fgIsDvdPlay() ? SI_CHAP_NO : SI_PTT_NO);
  BYTE bChNs = bSharedInfo(fgIsDvdPlay() ? SI_CHAP_NS : SI_PTT_NS);
  BYTE bDom = bSharedInfo(SI_DVD_DOM);
  
  if (!fgDeal)
  {
    vShowGotoChapter();
    return;
  }
  
  if (fgIsDvdPlay() && bSharedInfo(SI_DVD_DOM) != SV_VTSTT_DOM)
  {
    vGotoBackMain();
    return;
  }

  v2DigitInputHandler(bChNo, bChNs, UOP_PTT_PLAY, wY);
}

void vDealGotoTitle(BYTE fgDeal) large
{
  BYTE bYPos = (fgIsDvdPlay() ? STGOTO_DVD_TITLE : STGOTO_VCD_TITLE) -
                _bGotoBeg;
  WORD wY = GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * bYPos;
  // when VCD, use TRACK as the analogy to DVD's title
  BYTE bTtNo = bSharedInfo(fgIsDvdPlay() ? SI_TT_NO : SI_TRACK_NO);
  BYTE bTtNs = bSharedInfo(fgIsDvdPlay() ? SI_TT_NS : SI_TRACK_NS);
  BYTE bUopId;
  
  if (!fgDeal)
  {
    vShowGotoTitle();
    return;
  }
  
  if (fgIsDvdPlay())
    bUopId = UOP_TITLE_PLAY;
  else if (fgIsVcdPlay())
    bUopId = UOP_TRACK_PLAY;
  
  v2DigitInputHandler(bTtNo, bTtNs, bUopId, wY);
}

// the following global variables are for vRedrawGotoItemPage() only
// !!! if we use auto variables instead, there will be strange error !!!
static xdata void (*_pvFunBak)(BYTE, BYTE, BYTE) large;
static BYTE xdata _bCntI;
static BYTE xdata _bTotal;

static void vRedrawGotoItemPage(BYTE bTotal, WORD wMsgIdx, void (*pvFun)(BYTE, BYTE, BYTE) large) large
{
  _bTotal = bTotal;
  _pvFunBak = pvFun;
  
  // clear all pasted messages
  vSolidRect(_bWBGotoMenu, GOTO_PANEL_WIDTH + 11, GOTO_ITEM_BEGIN_Y - 2,
             GOTO_WINDOW_END_X, GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * 4 + 5, 3);

  // draw the top green rectangle and paste menu title
  vSolidRect(_bWBGotoMenu, GOTO_LITEM_X, 0,
             GOTO_WINDOW_END_X - 17, GOTO_ITEM_BEGIN_Y - 3, 0);
  vSetMsgCol4(_bWBGotoMenu, 0, 0, 2, 4);
  vOsdPasteMsgXY(GOTO_LITEM_X, GOTO_ITEM_BEGIN_Y - 34,

⌨️ 快捷键说明

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