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

📄 goto.c

📁 mtkDVD源代码程序4*16 很好玩的内置5.1环绕音效 大家可以玩一下
💻 C
📖 第 1 页 / 共 5 页
字号:
                 _bWBGotoMenu, wMsgIdx);
  
  vSetMsgCol4(_bWBGotoMenu, 0, 3, 2, 1);
  for (_bCntI = 0; _bCntI < GOTO_PAGE_ITEM_NUM; _bCntI++)
  {
    if (_bCntI + _bInputBeg >= _bTotal)
      break;
    _pvFunBak(_bCntI + _bInputBeg, _bCntI, _bTotal);
  }

  vGotoShowUDMark(_bInputBeg, _bTotal);
}

static void vGotoHLItemPage(BYTE fgShow, BYTE bTotal, void (*pvFun)(BYTE, BYTE, BYTE) large) large
{
  BYTE bYPos = _bInputPos - _bInputBeg;
  BYTE bColor;
  
  if (fgShow)
    bColor = 5;  // highlight this item
  else
    bColor = 3;  // unhighlight this item
    
  vSolidRect(_bWBGotoMenu,
             GOTO_LITEM_X - 23, GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * bYPos,
             GOTO_RITEM_X + 125, GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * (bYPos + 1) - 1,
             bColor);
  vSetMsgCol4(_bWBGotoMenu, 0, bColor, 2, 1);
  
  pvFun(_bInputPos, bYPos, bTotal);
}  

static void vShowGotoAudioStr(BYTE bAtNo, BYTE bYPos, BYTE bDummy) large
{
  BYTE bLcd0, bLcd1;
  BYTE pbStr[7];
  WORD wMsgIdx;
  
  pbStr[0] = 6;
  wMsgIdx = wOsdGetAudChMsg(bSharedInfo(wSIItemPos(SI_AUD_LCD_GRP, 17 + bAtNo)));
  pbStr[1] = bLoByte(wMsgIdx);
  pbStr[2] = bHiByte(wMsgIdx);
  wMsgIdx = wOsdGetAudAtrMsg(bSharedInfo(wSIItemPos(SI_AUD_LCD_GRP, 25 + bAtNo)));
  pbStr[3] = bLoByte(wMsgIdx);
  pbStr[4] = bHiByte(wMsgIdx);
  bLcd0 = bSharedInfo(wSIItemPos(SI_AUD_LCD_GRP, 1 + bAtNo * 2));
  bLcd1 = bSharedInfo(wSIItemPos(SI_AUD_LCD_GRP, 2 + bAtNo * 2));
  wMsgIdx = wOsdGetLcdMsg(bLcd0, bLcd1);
  pbStr[5] = bLoByte(wMsgIdx);
  pbStr[6] = bHiByte(wMsgIdx);

  vOsdPasteMsgXYArg(GOTO_LITEM_X, GOTO_ITEM_BEGIN_Y + bYPos * LINE_HEIGHT,
                    _bWBGotoMenu, OSD_MSG_AUDIO_G, pbStr);
}
static void vShowGotoSubtStr(BYTE bStNo, BYTE bYPos, BYTE bStNs) large
{
  BYTE bLcd0, bLcd1;
  WORD wMsgIdx;

  if (bStNo == bStNs - 1)
    wMsgIdx = OSD_MSG_OFF;
  else if (bStNo <= 15)
  {
    bLcd0 = bSharedInfo(wSIItemPos(SI_SP_LCD_GRP0, 1 + bStNo * 2));
    bLcd1 = bSharedInfo(wSIItemPos(SI_SP_LCD_GRP0, 2 + bStNo * 2));
    wMsgIdx = wOsdGetLcdMsg(bLcd0, bLcd1);
  }
  else
  {
    bLcd0 = bSharedInfo(wSIItemPos(SI_SP_LCD_GRP1, -31 + bStNo * 2));
    bLcd1 = bSharedInfo(wSIItemPos(SI_SP_LCD_GRP1, -30 + bStNo * 2));
    wMsgIdx = wOsdGetLcdMsg(bLcd0, bLcd1);
  }
  
  vOsdPasteMsgXY(GOTO_LITEM_X, GOTO_ITEM_BEGIN_Y + bYPos * LINE_HEIGHT,
                 _bWBGotoMenu, wMsgIdx);
}
static void vShowGotoReptStr(BYTE bReptNo, BYTE bYPos, BYTE bDummy) large
{
  WORD pwMsgIdxDVD[] = { OSD_MSG_ICON_RPT_CH,
                         OSD_MSG_ICON_RPT_TT,
                         OSD_MSG_ICON_RPT_ALL,
                         OSD_MSG_OFF };
  WORD pwMsgIdxVCD[] = { OSD_MSG_ICON_RPT_TRK,
                         OSD_MSG_ICON_RPT_ALL,
                         OSD_MSG_OFF };

  if (fgIsDvdPlay())
  {
    vOsdPasteMsgXY(GOTO_LITEM_X, GOTO_ITEM_BEGIN_Y + bYPos * LINE_HEIGHT,
                   _bWBGotoMenu, pwMsgIdxDVD[bReptNo]);
  }
  else if (fgIsVcdPlay())
  {
    vOsdPasteMsgXY(GOTO_LITEM_X, GOTO_ITEM_BEGIN_Y + bYPos * LINE_HEIGHT,
                   _bWBGotoMenu, pwMsgIdxVCD[bReptNo]);
  }
}
static void vShowGotoTimeDispStr(BYTE bTDNo, BYTE bYPos, BYTE bDummy) large
{
  WORD pwMsgIdxDVD[] = { OSD_MSG_TITLE_ELAPSED,
                         OSD_MSG_TITLE_REMAIN,
                         OSD_MSG_CHAPTER_ELAPSED,
                         OSD_MSG_CHAPTER_REMAIN };
  WORD pwMsgIdxVCD[] = { OSD_MSG_TOTAL_ELAPSED,
                         OSD_MSG_TOTAL_REMAIN,
                         OSD_MSG_SINGLE_ELAPSED,
                         OSD_MSG_SINGLE_REMAIN };

  if (fgIsDvdPlay())
  {
    vOsdPasteMsgXY(GOTO_LITEM_X, GOTO_ITEM_BEGIN_Y + bYPos * LINE_HEIGHT,
                   _bWBGotoMenu, pwMsgIdxDVD[bTDNo]);
  }
  else if (fgIsVcdPlay())
  {
    vOsdPasteMsgXY(GOTO_LITEM_X, GOTO_ITEM_BEGIN_Y + bYPos * LINE_HEIGHT,
                   _bWBGotoMenu, pwMsgIdxVCD[bTDNo]);
  }
}

void vRedrawGotoAudioItem(BYTE bAtNs) large
{
  vRedrawGotoItemPage(bAtNs, OSD_MSG_AUDIO_SETTING, vShowGotoAudioStr);
}
void vGotoAudioHLItem(BYTE fgShow) large
{
  vGotoHLItemPage(fgShow, 0, vShowGotoAudioStr);
}

void vRedrawGotoSubtItem(BYTE bStNs) large
{
  vRedrawGotoItemPage(bStNs, OSD_MSG_SUBTITLE_SETTING, vShowGotoSubtStr);
}
void vGotoSubtHLItem(BYTE fgShow) large
{
  BYTE bStNs = bSharedInfo(SI_SPST_NS) + 1;  // additional "OFF"
  
  vGotoHLItemPage(fgShow, bStNs, vShowGotoSubtStr);
}

void vRedrawGotoReptItem(BYTE bRptModeNum) large
{
  vRedrawGotoItemPage(bRptModeNum, OSD_MSG_REPEAT, vShowGotoReptStr);
}
void vGotoReptHLItem(BYTE fgShow) large
{
  vGotoHLItemPage(fgShow, 0, vShowGotoReptStr);
}

void vRedrawGotoTimedispItem(BYTE bTDModeNum) large
{
  vRedrawGotoItemPage(bTDModeNum, OSD_MSG_TIMEDISP_G, vShowGotoTimeDispStr);
}
void vGotoTimedispHLItem(BYTE fgShow) large
{
  vGotoHLItemPage(fgShow, 0, vShowGotoTimeDispStr);
}


// the following variables are for vPullDownMenuHandler() only
static xdata void (*_pvHLFun)(BYTE) large;
static xdata void (*_pvRedrawFun)(BYTE) large;

static void vPullDownMenuHandler(void) large
{
  switch (_bIRKey)
  {
    case IR_UP:
      _pvHLFun(FALSE);
      if (!_bInputPos--)
#ifdef NO_SCROLL_OVER
        _bInputPos = 0;
#else
        _bInputPos = _bTotal - 1;
      if (_bInputPos == _bTotal - 1 && _bTotal > GOTO_PAGE_ITEM_NUM)
      // scroll over the top
      {
        _bInputBeg = _bInputPos - GOTO_PAGE_ITEM_NUM + 1;
        _pvRedrawFun(_bTotal);
      }
      else if (_bInputPos < _bInputBeg)
      {
        // scrolling
        _bInputBeg--;
        _pvRedrawFun(_bTotal);
      }
#endif /* NO_SCROLL_OVER */
      _pvHLFun(TRUE);
      break;

    case IR_DOWN:
      _pvHLFun(FALSE);
      _bInputPos = ++_bInputPos % _bTotal;
#ifdef NO_SCROLL_OVER
      if (_bInputPos == 0)
        _bInputPos = _bTotal - 1;
#else
      if (_bInputPos == 0 && _bTotal > GOTO_PAGE_ITEM_NUM)
      // scroll over the bottom
      {
        _bInputPos = 0;
        _bInputBeg = 0;
        _pvRedrawFun(_bTotal);
      }
      else if (_bInputPos >= _bInputBeg + GOTO_PAGE_ITEM_NUM)
      {
        // scrolling
        _bInputBeg++;
        _pvRedrawFun(_bTotal);
      }
#endif /* NO_SCROLL_OVER */
      _pvHLFun(TRUE);
      break;
  }
}


void vDealGotoAudio(BYTE fgDeal) large
{
  BYTE bAtNo = bSharedInfo(SI_AST_NO);
  BYTE bAtNs = bSharedInfo(SI_AST_NS);
  BYTE bType = (bSharedInfo(SI_A_CH_CFG) << 4) | bSharedInfo(SI_A_CODE_MODE);
  BYTE bLcd0 = bSharedInfo(SI_A_LCD_0);
  BYTE bLcd1 = bSharedInfo(SI_A_LCD_1);
  WORD wMsgIdx1, wMsgIdx2;
  BYTE bCntI;

  if (!fgIsDvdPlay())
    return;
    
  wMsgIdx1 = wOsdGetAudChMsg((bType & 0xf0) >> 4);
  wMsgIdx2 = wOsdGetLcdMsg(bLcd0, bLcd1);

  if (!fgDeal)  // show current audio setting
  {
    vShowGotoAudio(0, wMsgIdx1, wMsgIdx2);
    return;
  }
  
  switch (_bIRKey)
  {
    case IR_ENTER:
    case IR_PLAY:
    case IR_PLAY_ENTER:
      if (_bInputPos == 0xFF)  // just enter by pressing PLAY
      {
        _bInputPos = bAtNo;
        if (_bInputPos >= GOTO_PAGE_ITEM_NUM)
          _bInputBeg = _bInputPos - GOTO_PAGE_ITEM_NUM + 1;
        else
          _bInputBeg = 0;
        vRedrawGotoAudioItem(bAtNs);
        vGotoAudioHLItem(TRUE);
        break;
      }
      else  // switch to current audio setting
      {
        if (bAtNo == _bInputPos)  // don't switch to the same one
        {
          vGotoBackMain();
          break;
        }
        else
        {
          bAtNo = _bInputPos;
        }
  #ifdef PLAYER_KARAOKE
        if (fgIsVocalAssistOn())
        {
          vAdspVocalAssist(VOCAL_NO_ASSIST);
        }
  #endif /* PLAYER_KARAOKE */
        if ((bSharedInfo(SI_PBC_STATE) != SV_PLAY) ||
            (bAtNs <= 1) || (bAtNs > 8) || (bAtNo >= bAtNs))
        {
          //return (UOP_FAIL);
        }
        else
        {
          vSendUopCmd(UOP_CHANGE_ASTN, bAtNo,
                      DVD_CHG_AST_OPT2, DVD_CHG_AST_OPT3);
        }
        vGotoBackMain();
        break;
      }
  }
  
  _pvHLFun = vGotoAudioHLItem;
  _pvRedrawFun = vRedrawGotoAudioItem;
  _bTotal = bAtNs;
  vPullDownMenuHandler();
}


void vDealGotoSubtitle(BYTE fgDeal) large
{
  BYTE bStNo = bSharedInfo(SI_SPST_NO);
  BYTE bStNs = bSharedInfo(SI_SPST_NS) + 1;  // additional "OFF"
  BYTE bCh1 = bSharedInfo(SI_SP_LCD_0);
  BYTE bCh2 = bSharedInfo(SI_SP_LCD_1);
  BYTE bDom = bSharedInfo(SI_DVD_DOM);
  WORD wMsgIdx;
  BYTE bCntI;

  if (bDom != SV_VTSTT_DOM)  // force no subtitle selection in non-VTSTT domain
    bStNs = 1;
    
  if (bStNo == 0 || bStNs == 1)  // bStNs = 1 when no subtitle available
    wMsgIdx = OSD_MSG_OFF;
  else
    wMsgIdx = wOsdGetLcdMsg(bCh1, bCh2);

  if (!fgDeal)  // show current subtitle setting
  {
    vShowGotoSubtitle(wMsgIdx);
    return;
  }
  
  switch (_bIRKey)
  {
    case IR_ENTER:
    case IR_PLAY:
    case IR_PLAY_ENTER:
      if (bStNs == 1)
      {
        vGotoBackMain();
        break;
      }
      if (_bInputPos == 0xFF)  // just enter by pressing PLAY
      {
        if (bStNo == 0)
          _bInputPos = bStNs - 1;
        else
          _bInputPos = bStNo & 0xBF;
        if (_bInputPos >= GOTO_PAGE_ITEM_NUM)
          _bInputBeg = _bInputPos - GOTO_PAGE_ITEM_NUM + 1;
        else
          _bInputBeg = 0;
        vRedrawGotoSubtItem(bStNs);
        vGotoSubtHLItem(TRUE);
        break;
      }
      else  // switch to current subtitle setting
      {
        if (_bInputPos == bStNs - 1)
          bStNo = 0;
        else
          bStNo = (_bInputPos & 0x1f) | 0x40;
        vSendUopCmd(UOP_CHANGE_SPSTN, bStNo, 0, 0);
        vGotoBackMain();
        break;
      }
  }
  
  _pvHLFun = vGotoSubtHLItem;
  _pvRedrawFun = vRedrawGotoSubtItem;
  _bTotal = bStNs;
  vPullDownMenuHandler();
}


void vDealGotoAngle(BYTE fgDeal) large
{
  BYTE bAgNo = bSharedInfo(SI_AGL_NO);
  BYTE bAgNs = bSharedInfo(SI_AGL_NS);
  BYTE bYPos = STGOTO_DVD_ANGLE - _bGotoBeg;
  WORD wY = GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * bYPos;
  BYTE pbStr[] = { 3, '1', '/', '2' };
  BYTE bNum;
  
  if (!fgDeal)  // show status only
  {
    vShowGotoAngle();
    return;
  }

  if (bAgNo == 0xFF)
    bAgNo = 1;
  
  pbStr[1] = bAgNo + '0';
  pbStr[3] = bAgNs + '0';

  switch (_bIRKey)
  {
    case IR_PLAY:
    case IR_ENTER:
    case IR_PLAY_ENTER:
      if (_bInputPos == 0xFF)
      {
        _bInputPos = 0;
        _bInputNum = 0;
        pbStr[1] = '_';
        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:
      bNum = _bIRKey - IR_NUM0;
      if (bNum > bAgNs)         // invalid input
        break;
      _bInputNum = bNum;
      pbStr[1] = '0' + bNum;
      _bInputPos++;
      vSetMsgCol4(_bWBGotoMenu, 0, 3, 2, 4);
      vOsdShowStrXY(GOTO_RITEM_X, wY, _bWBGotoMenu, pbStr);
      
      if (_bInputPos == 1)  // angle input completed
      {
        vSendUopCmd(UOP_CHANGE_AGL, _bInputNum, 0, 0);
        vSetMsgCol4(_bWBGotoMenu, 0, 3, 2, 1);
        vOsdShowStrXY(GOTO_RITEM_X, wY, _bWBGotoMenu, pbStr);
        vGotoBackMain();
      }
      break;
  }
}


static void vTimeInputHandler(BYTE fgDeal, BYTE bHH, BYTE bMM, BYTE bSS, BYTE bYPos, BYTE bUopId, void (*pvFun)() large) large
{
  BYTE bDom = bSharedInfo(SI_DVD_DOM);
  BYTE pbStr[] = { 7, '_', ':', '0', '0', ':', '0', '0' };
  WORD wY = GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * bYPos;
  BYTE bNum;
  BYTE bUopParam;

  if (!fgDeal)
  {
    pvFun();
    return;
  }

  if (bUopId == UOP_PTT_TIME_PLAY)
    bUopParam = SV_TIME_TRACK;
  else if (bUopId == UOP_TIME_PLAY)
    bUopParam = SV_TIME_DISC;
  
  if (BCD2DEC(bMM) >= 60)  // for VCD only, assume max 99:59
  {
    bMM = ((BCD_HI(bMM) - 6) << 4) | BCD_LO(bMM);
    bHH++;
  }
      
  switch (_bIRKey)
  {
    case IR_PLAY:
    case IR_ENTER:
    case IR_PLAY_ENTER:
      if (fgIsDvdPlay() && bDom != SV_VTSTT_DOM)  // force no time jump in non-VTSTT domain
      {
        vGotoBackMain();

⌨️ 快捷键说明

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