📄 goto.c
字号:
/**********************************************************************/
/*************** MTK CONFIDENTIAL & COPYRIGHTED ****************/
/*************** ****************/
/*************** $Modtime:: 04/08/27 9:40a $ ****************/
/*************** $Revision:: 1 $ ****************/
/*************** ****************/
/*************** Description : Goto State Machine ****************/
/*************** ****************/
/*************** Company : MediaTek Inc. ****************/
/*************** Programmer : Megaa Lin ****************/
/**********************************************************************/
#define _GOTO_C_
//#define SIMP_GOTO1
//#define SIMP_GOTO2
#include "general.h"
#include "osdshow.h"
#pragma NOAREGS
#ifdef PLAYER_GOTO
static void vGotoInitState(void) large;
static void vRedrawGotoItem(BYTE fgClear) large;
static void vGotoHLItem(BYTE fgShow) large;
static void vInvokeFun(BYTE bState, BYTE fgDeal) large;
static void vGotoBackMain(void) large;
static void vRedrawGotoAudioItem(BYTE bAtNs) large;
static void vRedrawGotoSubtItem(BYTE bStNs) large;
static void vRedrawGotoReptItem(BYTE bRptModeNum) large;
static void vRedrawGotoTimedispItem(BYTE bTDModeNum) large;
static void vGotoAudioHLItem(BYTE fgShow) large;
static void vGotoSubtHLItem(BYTE fgShow) large;
static void vGotoReptHLItem(BYTE fgShow) large;
static void vGotoTimedispHLItem(BYTE fgShow) large;
static void vGotoOsdLangKey(void) large;
static void vGotoClose(void) large;
static BYTE bGotoTotalItem(void) large;
static void vSolidRect(BYTE bWBIdx, WORD wSX, WORD wSY, WORD wEX, WORD wEY, BYTE bCol) large;
static void v2DigitInputHandler(BYTE bCurr, BYTE bTotal, BYTE bUopId, WORD wY) large;
static void vRedrawGotoItemPage(BYTE bTotal, WORD wMsgIdx, void (*pvFun)(BYTE, BYTE, BYTE) large) large;
static void vGotoHLItemPage(BYTE fgShow, BYTE bTotal, void (*pvFun)(BYTE, BYTE, BYTE) large) large;
static void vShowGotoAudioStr(BYTE bAtNo, BYTE bYPos, BYTE bDummy) large;
static void vShowGotoSubtStr(BYTE bStNo, BYTE bYPos, BYTE bStNs) large;
static void vShowGotoReptStr(BYTE bReptNo, BYTE bYPos, BYTE bDummy) large;
static void vShowGotoTimeDispStr(BYTE bTDNo, BYTE bYPos, BYTE bDummy) large;
static void vPullDownMenuHandler(void) large;
static void vTimeInputHandler(BYTE fgDeal, BYTE bHH, BYTE bMM, BYTE bSS, BYTE bYPos, BYTE bUopId, void (*pvFun)() large) large;
static void v2DigitFieldShower(BYTE bState, BYTE bNo, BYTE bNs) large;
static void vTimeFieldShower(BYTE bState, BYTE bHH, BYTE bMM, BYTE bSS) large;
#define fgIsTimeSearchAllow() ((fgCheckUopBlock(SV_NV_TIME_PLAY) == FALSE) && \
(fgCheckUopBlock(SV_NV_TIME_SEARCH) == FALSE))
#define fgIsAudioChangeAllow() (fgCheckUopBlock(SV_NV_A_CHANGE) == FALSE)
#ifdef DVD_NO_PTT_PLAY_UOP_BLOCK
#define fgIsPTTSearchAllow() (fgCheckUopBlock(SV_NV_TIME_SEARCH) == FALSE)
#else
#define fgIsPTTSearchAllow() ((fgCheckUopBlock(SV_NV_PTT_PLAY) == FALSE) && \
(fgCheckUopBlock(SV_NV_TIME_SEARCH) == FALSE))
#endif
#define fgIsTTLSearchAllow() (fgCheckUopBlock(SV_NV_TITLE_PLAY) == FALSE)
static code strucGotoItem _prGotoItemDVD[GOTO_TOTAL_ITEM_DVD] =
{
{ STGOTO_DVD_TITLE, OSD_MSG_TITLE_G },
{ STGOTO_DVD_CHAPTER, OSD_MSG_CHAPTER_G },
{ STGOTO_DVD_AUDIO, OSD_MSG_AUDIO_SETTING },
{ STGOTO_DVD_SUBTITLE, OSD_MSG_SUBTITLE_SETTING },
{ STGOTO_DVD_ANGLE, OSD_MSG_ANGLE_SETTING },
{ STGOTO_DVD_TIME, OSD_MSG_TT_TIME_G },
{ STGOTO_DVD_TIME_CH, OSD_MSG_CH_TIME_G },
{ STGOTO_DVD_REPEAT, OSD_MSG_REPEAT },
{ STGOTO_DVD_TIMEDISP, OSD_MSG_TIMEDISP_G }
};
static code strucGotoItem _prGotoItemVCD[GOTO_TOTAL_ITEM_VCD] =
{
{ STGOTO_VCD_TITLE, OSD_MSG_TRACK_G },
#ifdef GOTO_VCD_SEGMENT
{ STGOTO_VCD_CHAPTER, OSD_MSG_SEGMENT_G },
#endif
{ STGOTO_VCD_TIME, OSD_MSG_DISC_TIME_G },
{ STGOTO_VCD_TIME_CH, OSD_MSG_TRK_TIME_G },
{ STGOTO_VCD_REPEAT, OSD_MSG_REPEAT },
{ STGOTO_VCD_TIMEDISP, OSD_MSG_TIMEDISP_G }
};
static code WORD _pwGotoPbcIcon[] =
{
/* SV_PLAY */ OSD_MSG_ICON_PLAY,
/* SV_FF */ OSD_MSG_ICON_FFX,
/* SV_SF */ OSD_MSG_ICON_SFX,
/* SV_FR */ OSD_MSG_ICON_FRX,
/* SV_SR */ OSD_MSG_ICON_SRX,
/* SV_PAUSE */ OSD_MSG_ICON_PAUSE,
/* SV_STEP */ OSD_MSG_ICON_STEP
};
static xdata strucGotoItem *_prGotoItem;
static xdata BYTE _bGotoState;
static xdata BYTE _bGotoCurItem;
static xdata BYTE _bGotoBeg;
static xdata BYTE _bInputPos;
static xdata BYTE _bInputBeg;
static xdata BYTE _bInputNum;
static xdata BYTE _bTimeHH;
static xdata BYTE _bTimeMM;
static xdata BYTE _bTimeSS;
static xdata BYTE _bWBGotoPanel;
static xdata BYTE _bWBGotoMenu;
static BYTE bGotoTotalItem(void) large
{
if (fgIsDvdPlay())
return (GOTO_TOTAL_ITEM_DVD);
else if (fgIsVcdPlay())
return (GOTO_TOTAL_ITEM_VCD);
}
// megaa downsize begin
static void vSolidRect(BYTE bWBIdx, WORD wSX, WORD wSY, WORD wEX, WORD wEY, BYTE bCol) large
{
_wStartX = wSX;
_wStartY = wSY;
_wEndX = wEX;
_wEndY = wEY;
vRectangle(bWBIdx, 0, 0, TRUE, bCol);
}
// megaa downsize end
void vGotoShowIcon(WORD wMsgIdx, BYTE *pbStr) large
{
vSolidRect(_bWBGotoMenu, GOTO_STATUS_ICON_X + 40, GOTO_STATUS_ICON_Y,
GOTO_STATUS_ICON_X + 120, GOTO_STATUS_ICON_Y + LINE_HEIGHT, 0);
vSetMsgCol4(_bWBGotoMenu, 0, 0, 0, 2);
if (bSharedInfo(SI_NTSC_PAL) == SV_PAL)
{
vOsdPosPasteArg(OSD_POS_GOTO_ICON_P, wMsgIdx, pbStr, 0);
}
else
{
vOsdPosPasteArg(OSD_POS_GOTO_ICON, wMsgIdx, pbStr, 0);
}
}
// show up/down mark
void vGotoShowUDMark(BYTE bBegPos, BYTE bTotal) large
{
if (bBegPos > 0)
{
vSetMsgCol4(_bWBGotoMenu, 0, 3, 2, 1);
vOsdPasteMsgXY(GOTO_MARK_X, GOTO_ITEM_BEGIN_Y + 4,
_bWBGotoMenu, OSD_MSG_MARK_UP);
}
if (bBegPos + GOTO_PAGE_ITEM_NUM < bTotal)
{
vSetMsgCol4(_bWBGotoMenu, 0, 3, 2, 1);
vOsdPasteMsgXY(GOTO_MARK_X,
GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * (GOTO_PAGE_ITEM_NUM - 1) + 2,
_bWBGotoMenu, OSD_MSG_MARK_DOWN);
}
}
void vGotoInitState(void) large
{
BYTE bPbcState = bSharedInfo(SI_PBC_STATE);
BYTE bAuxCtrl = bSharedInfo(SI_USR_AUX_CTRL);
BYTE bDom = bSharedInfo(SI_DVD_DOM);
BYTE bVal = bSharedInfo(SI_PBC_SPEED);
BYTE bTvNtscPal = bSharedInfo(SI_NTSC_PAL);
BYTE bPNHeight;
BYTE pbStr[] = { 2, ' ', ' ' };
_rOsdStateCtx.fgGotoShow = FALSE;
if (bTvNtscPal == SV_PAL)
{
_bWBGotoPanel = WB_GOTO_PANEL_P;
_bWBGotoMenu = WB_GOTO_MENU_P;
bPNHeight = PNHEIGHT;
}
else
{
_bWBGotoPanel = WB_GOTO_PANEL;
_bWBGotoMenu = WB_GOTO_MENU;
bPNHeight = 0;
}
if (fgIsDvdPlay())
_prGotoItem = _prGotoItemDVD;
else if (fgIsVcdPlay())
_prGotoItem = _prGotoItemVCD;
if (bPbcState == SV_STOP)
{
vGotoExit();
return;
}
_rOsdStateCtx.bGotoTimeType = GOTO_SHOW_TITLE_ELAPSED;
_rOsdStateCtx.fgGotoShow = TRUE;
/*
if (fgIsVcdPlay())
{
// force PBC always off in Goto
if (bSharedInfo(SI_PBC_SWITCH) == SV_PBC_ON)
{
if (bSharedInfo(SI_TRACK_NO) == 0) // in menu??
{
// goto play track 1 directly
// UOP_TRACK_PLAY will automatically switch PBC off
vSendUopCmd(UOP_TRACK_PLAY, 1, 0, 0);
// zoom again because jumping out of menu will return normal size
//vSendUopCmd(UOP_ZOOM_IN, SV_ZOOM_41, 1, 0x87);
}
else
{
vSendUopCmd(UOP_PBC_SWITCH, 0, 0, 0);
}
}
}
*/
// change display mode
vOsdShowWb(OSD_WB_FULL_SCR);
// hide HL, disable change color
// ???
// megaa downsize begin
//vChgColDis();
//vHideHL(HL_1);
//vHideHL(HL_2);
// megaa downsize end
if (bTvNtscPal == SV_PAL)
{
vSendUopCmd(UOP_ZOOM_IN, SV_ZOOM_41, 2, 0x88);
}
else
{
vSendUopCmd(UOP_ZOOM_IN, SV_ZOOM_41, 1, 0x88);
}
_bGotoState = STGOTO_MAIN; // current state is in main menu
_bGotoCurItem = 0; // point to the first item
_bGotoBeg = 0; // begin from the first item
_bInputPos = 0xFF;
_bInputBeg = 0xFF;
_bInputNum = 0;
_bTimeHH = _bTimeMM = _bTimeSS = 0;
// create WBs
// WB creation and setup stuff here
// megaa downsize begin
vCreateWB(_bWBGotoMenu, TRUE);
vCreateWB(_bWBGotoPanel, TRUE);
vSetWBTcColor(_bWBGotoMenu);
vSetWBTcColor(_bWBGotoPanel);
vSetTransEn(_bWBGotoPanel, 0);
vEnableWB(_bWBGotoMenu);
vEnableWB(_bWBGotoPanel);
// megaa downsize end
// draw menu rectangles
/*
vSolidRect(_bWBGotoMenu, // fill menu area with black
0, 0, GOTO_MENU_WIDTH - 1, GOTO_MENU_HEIGHT - 1, 2);
*/
vFillWB(_bWBGotoMenu, 2);
vSolidRect(_bWBGotoMenu, // menu title strip
GOTO_WINDOW_BEGIN_X, 0, GOTO_WINDOW_END_X, GOTO_ITEM_BEGIN_Y - 3,
0);
vSolidRect(_bWBGotoMenu, // background for playtype icon
GOTO_WINDOW_BEGIN_X, GOTO_ITEM_BEGIN_Y - 2,
GOTO_PANEL_WIDTH + 9, GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * 4 + 5,
13);
vSolidRect(_bWBGotoMenu, // background for menu area
GOTO_PANEL_WIDTH + 10, GOTO_ITEM_BEGIN_Y - 2,
GOTO_WINDOW_END_X, GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * 4 + 5,
3);
// draw the bottom black strip
vSolidRect(_bWBGotoMenu, 0, GOTO_MENU_HEIGHT - 23,
GOTO_MENU_WIDTH - 1, GOTO_MENU_HEIGHT - 1, 2);
// draw the bottom status strip
vSolidRect(_bWBGotoMenu, GOTO_WINDOW_BEGIN_X, GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * 4 + 6,
GOTO_WINDOW_END_X, GOTO_MENU_HEIGHT - 19, 0);
vSetMsgCol4(_bWBGotoMenu, 0, 0, 2, 4);
vOsdPasteMsgXY(GOTO_BITRATE_X - 95, GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * 4 + 7,
_bWBGotoMenu, OSD_MSG_BITRATE_G);
// paste round style corner bitmaps
// vOsdPasteBmpXY(24, 0, _bWBGotoMenu, BMP_LT_CORNER);
// vOsdPasteBmpXY(24, GOTO_MENU_HEIGHT - 20 - 15, _bWBGotoMenu, BMP_LB_CORNER);
// vOsdPasteBmpXY(GOTO_WINDOW_END_X - 15, 0, _bWBGotoMenu, BMP_RT_CORNER);
// vOsdPasteBmpXY(GOTO_WINDOW_END_X - 15, GOTO_MENU_HEIGHT - 20 - 15, _bWBGotoMenu, BMP_RB_CORNER);
/*
vSolidRect(_bWBGotoPanel, // fill frame area with black
0, 0,
GOTO_FRAME_WIDTH - 1, GOTO_FRAME_HEIGHT - 1 + bPNHeight,
1);
*/
vFillWB(_bWBGotoPanel, 1);
if (fgIsDvdPlay() && bSharedInfo(SI_V_4_3) == SV_V_16_9)
{
// draw regular frame and paste corner bitmap
vSolidRect(_bWBGotoPanel, 97, 34, 566, GOTO_FRAME_HEIGHT - 5 + bPNHeight, 3);
vSolidRect(_bWBGotoPanel, 104, 28, 573, GOTO_FRAME_HEIGHT - 11 + bPNHeight, 2);
vSolidRect(_bWBGotoPanel, 108, 32, 569, GOTO_FRAME_HEIGHT - 15 + bPNHeight, 0);
vOsdPasteBmpXY(520, 28, _bWBGotoPanel, BMP_GOTO_FRAME_CORNER);
}
else
{
// draw regular frame and paste corner bitmap
vSolidRect(_bWBGotoPanel, 157, 34, 506, GOTO_FRAME_HEIGHT - 5 + bPNHeight, 3);
vSolidRect(_bWBGotoPanel, 164, 28, 513, GOTO_FRAME_HEIGHT - 11 + bPNHeight, 2);
vSolidRect(_bWBGotoPanel, 168, 32, 509, GOTO_FRAME_HEIGHT - 15 + bPNHeight, 0);
vOsdPasteBmpXY(460, 28, _bWBGotoPanel, BMP_GOTO_FRAME_CORNER);
}
// show current playing media and status
if (fgIsDvdPlay())
{
bVal = BMP_DVD;
}
else if (fgIsVcdPlay())
{
if (bSharedInfo(SI_DISC_TYPE) == SV_SVCD)
bVal = BMP_SVCD;
else
bVal = BMP_VCD;
}
vOsdPasteBmpXY(GOTO_PLAYTYPE_ICON_X, GOTO_PLAYTYPE_ICON_Y,
_bWBGotoMenu, bVal);
vGotoShowIcon(_pwGotoPbcIcon[bPbcState - 2], pbStr);
#ifndef NEW_SHOW
vDVDShowTrick(bPbcState);
#else
vShowTrick(bPbcState);
#endif
switch (bAuxCtrl)
{
case SV_REPEAT_SET_A:
vShowGotoPbc(OSD_MSG_ICON_RPT_A);
break;
case SV_REPEAT_AB:
vShowGotoPbc(OSD_MSG_ICON_RPT_AB);
break;
case SV_REPEAT_NONE:
case SV_REPEAT_ABNONE:
vShowGotoPbc(OSD_MSG_NULL);
break;
}
vRedrawGotoItem(TRUE);
vUpdateGotoShow(GOTO_SHOW_PANEL_ALL);
vGotoHLItem(TRUE); // highlight the current pointed-to item
return;
}
BOOL fgGotoState(void) large
{
BYTE bPbcState = bSharedInfo(SI_PBC_STATE);
switch (_bIRKey)
{
/* check if power down, goto close, open/close key, or open setup menu */
#ifdef GOTO_SEPARATE_KEY
case GOTO_SEPARATE_KEY:
#else
case IR_GOTO:
#endif
vOsdPosClear(OSD_POS_ZOOM);
vSendUopCmd(UOP_ZOOM_IN, SV_ZOOM_1, 0, 0x80);
vGotoClose();
vGotoExit();
break;
//case IR_SETUP: prevent entering setup in Goto
case IR_STOP:
vOsdPosClear(OSD_POS_ZOOM);
vSendUopCmd(UOP_ZOOM_IN, SV_ZOOM_1, 0, 0x80);
case IR_EJECT:
case IR_MANUAL_EJECT:
case IR_POWER:
vGotoClose();
vGotoExit();
return (FALSE);
case IR_NEXT:
case IR_PREV:
case IR_VOLUME_UP:
case IR_VOLUME_DOWN:
case IR_REPEAT:
case IR_SET_A:
case IR_AUDIO:
case IR_SUB_TITLE:
case IR_MUTE:
case IR_FF:
case IR_FR:
case IR_SF:
case IR_SR:
case IR_PAUSE:
case IR_PAUSE_STEP:
case IR_TITLE_MENU:
case IR_ROOT_MENU:
case IR_RETURN:
case IR_TITLE_PBC:
case IR_MENU_PBC:
//case IR_PAL_NTSC:
case IR_SURROUND:
return (FALSE);
case IR_ANGLE:
vSendUopCmd(UOP_NEXT_AGL, 0, 0, 0);
return (TRUE);
case IR_OSD_LANGUAGE:
if (_bGotoState != STGOTO_MAIN) // disallowed when not in main Goto state
{
return (TRUE);
}
else
{
vGotoOsdLangKey();
// draw the bottom status strip
vSolidRect(_bWBGotoMenu,
GOTO_WINDOW_BEGIN_X + 16, GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * 4 + 6,
GOTO_WINDOW_END_X - 16, GOTO_MENU_HEIGHT - 19, 0);
vSetMsgCol4(_bWBGotoMenu, 0, 0, 2, 4);
vOsdPasteMsgXY(GOTO_BITRATE_X - 95, GOTO_ITEM_BEGIN_Y + LINE_HEIGHT * 4 + 7,
_bWBGotoMenu, OSD_MSG_BITRATE_G);
vUpdateGotoShow(GOTO_SHOW_PANEL_ALL);
vRedrawGotoItem(TRUE);
vGotoHLItem(TRUE);
return (TRUE);
}
case IR_ENTER:
case IR_PLAY:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -