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

📄 goto.c

📁 mtkDVD源代码程序4*16 很好玩的内置5.1环绕音效 大家可以玩一下
💻 C
📖 第 1 页 / 共 5 页
字号:
/**********************************************************************/
/***************    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 + -