📄 goto.c
字号:
_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 + -