📄 flmenu.c
字号:
}
#endif
/**
* Return the icon index of the given type.
*/
BYTE bFlMnGetIconIdx(BYTE bFType) large
{
switch (bFType)
{
case FTYPE_MP3:
case FTYPE_MP2:
case FTYPE_MP1:
return BMP_MP3;
case FTYPE_JPG:
return BMP_PIC;
case FTYPE_WMA:
return BMP_WMA;
case FTYPE_DIR:
return BMP_FOLDER;
case FTYPE_MPG:
case FTYPE_DAT:
case FTYPE_VOB:
case FTYPE_AVI:
return BMP_MPG;
case FTYPE_CDA:
case FTYPE_UNKNOWN:
default:
return BMP_INVALID;
}
}
static BOOL fgFlMnIsCurrPlayItem(BYTE bIdx) large
{
if ((_wFlCurAdoDir == wFlMnGetListBaseDir(_bFlMnListId)) &&
(_wFlCurAdoIdx == wFlGetItemIdx(bIdx)) &&
// PL00003187, because disclist and playlist both has same dir index(0xFFFF), need to check if same list type
(_bFlPlayListType == bSharedInfo(FL_LIST_FIELD(_bFlMnListId))))
return TRUE;
return FALSE;
}
static void vFlMnHiliOn(BYTE bItemIdx, BYTE bHiliIdx, BYTE bColor1, BYTE bColor2) large
{
_wStartX = _prFlMnItemTbl[bItemIdx].wLeft + FL_ICON_W;
_wEndX = _prFlMnItemTbl[bItemIdx].wRight;
_wStartY = _prFlMnItemTbl[bItemIdx].wTop;
_wEndY = _prFlMnItemTbl[bItemIdx].wBottom;
switch (bHiliIdx)
{
case FLMN_HILI_SEL:
// if (_bFlMnHiliPos1 != 0x0F)
// return;
_bFlMnHiliClrSrc1 = bColor1;
_bFlMnHiliClrDes1 = bColor2;
_bFlMnHiliPos1 = bItemIdx;
break;
case FLMN_HILI_PLAY:
// if (_bFlMnHiliPos2 != 0x0F)
// return;
_bFlMnHiliClrSrc2 = bColor1;
_bFlMnHiliClrDes2 = bColor2;
_bFlMnHiliPos2 = bItemIdx;
break;
}
#ifdef CDG_SUPPORT
// 20050527, if CDG changed track, don't show hilight again
if (bSharedInfo(SI_CDG_DISC) == SV_ON && bSharedInfo(SI_PBC_STATE) != SV_STOP)
return ;
#endif
vChgColRep(FL_MENU_WB, bColor1, bColor2);
}
static void vFlMnHiliOff(BYTE bHiliIdx) large
{
switch (bHiliIdx)
{
case FLMN_HILI_SEL:
if (_bFlMnHiliPos1 == 0x0F)
return;
_wStartX = _prFlMnItemTbl[_bFlMnHiliPos1].wLeft + FL_ICON_W;
_wEndX = _prFlMnItemTbl[_bFlMnHiliPos1].wRight;
_wStartY = _prFlMnItemTbl[_bFlMnHiliPos1].wTop;
_wEndY = _prFlMnItemTbl[_bFlMnHiliPos1].wBottom;
//vChgColRep(FL_MENU_WB, _bFlMnHiliClrDes1, _bFlMnHiliClrSrc1);
vChgColRep(FL_MENU_WB, _bFlMnHiliClrDes1, FLMN_CLR_BG);
_bFlMnHiliClrSrc1 = 0x0F;
_bFlMnHiliClrDes1 = 0x0F;
_bFlMnHiliPos1 = 0x0F;
break;
case FLMN_HILI_PLAY:
if (_bFlMnHiliPos2 == 0x0F)
return;
_wStartX = _prFlMnItemTbl[_bFlMnHiliPos2].wLeft + FL_ICON_W;
_wEndX = _prFlMnItemTbl[_bFlMnHiliPos2].wRight;
_wStartY = _prFlMnItemTbl[_bFlMnHiliPos2].wTop;
_wEndY = _prFlMnItemTbl[_bFlMnHiliPos2].wBottom;
//vChgColRep(FL_MENU_WB, _bFlMnHiliClrDes2, _bFlMnHiliClrSrc2);
vChgColRep(FL_MENU_WB, _bFlMnHiliClrDes2, FLMN_CLR_BG);
_bFlMnHiliClrSrc2 = 0x0F;
_bFlMnHiliClrDes2 = 0x0F;
_bFlMnHiliPos2 = 0x0F;
break;
}
}
/**
* The turn on/off the given item.
*
* DES: Use change color to implement this function.
*/
static void vFlMnHiliItem(BYTE bItemIdx, BOOL fgOn) large
{
WORD wYOfst, wXOfst;
BOOL fgIsCurrPlay;
if ((bItemIdx >= _bFlMnItemNs) || (bItemIdx >= FLMN_PAGE_SZ))
return;
_wStartX = _prFlMnItemTbl[bItemIdx].wLeft + FL_ICON_W;
_wEndX = _prFlMnItemTbl[bItemIdx].wRight;
_wStartY = _prFlMnItemTbl[bItemIdx].wTop;
_wEndY = _prFlMnItemTbl[bItemIdx].wBottom;
fgIsCurrPlay = fgFlMnIsCurrPlayItem(bItemIdx);
if (fgOn)
{
#ifdef CDG_SUPPORT
// 20050505, PL00000334, if CD-G is playing, don't display hilight
if((bSharedInfo(SI_CDG_DISC) == SV_ON) && (bSharedInfo(SI_PBC_STATE) != SV_STOP) && (bSharedInfo(SI_PBC_STATE) != SV_PBC_INIT))
return ;
#endif
if (fgIsCurrPlay)
{
//vFlMnHiliOff(FLMN_HILI_PLAY);
vFlMnHiliOff(FLMN_HILI_PLAY);
vFlMnHiliOn(bItemIdx, FLMN_HILI_SEL, FLMN_CLR_BG, FLMN_CLR_SEL);
//vFlMnHiliOn(bItemIdx, FLMN_HILI_PLAY, FLMN_CLR_BG, FLMN_CLR_PLAY);
}
else
{
vFlMnHiliOn(bItemIdx, FLMN_HILI_SEL, FLMN_CLR_BG, FLMN_CLR_SEL);
}
}
else
{
if (fgIsCurrPlay)
{
vFlMnHiliOff(FLMN_HILI_PLAY);//for VBR issue
vFlMnHiliOn(bItemIdx, FLMN_HILI_PLAY, FLMN_CLR_SEL, FLMN_CLR_PLAY);
}
else
{
vFlMnHiliOff(FLMN_HILI_SEL);
}
}
return;
}
/**
* Perform the operation to the given item when the hover cursor leave it.
*/
static BOOL fgFlMnLeavItem(BYTE bItemIdx) large
{
if ((bItemIdx >= _bFlMnItemNs) || (bItemIdx >= FLMN_PAGE_SZ))
return FALSE;
vFlMnHiliItem(bItemIdx, FALSE);
#ifdef ENABLE_ID3
if ((_bFlMnItemType == FTYPE_AUDIO) && fgFlMnIsCurrPlayItem(bItemIdx))
{
_wStartX = (WORD) FLMN_PREVIEW_X - FSMENU_BASIC_WB_LEFT;
_wStartY = (WORD) FLMN_PREVIEW_Y - FSMENU_BASIC_WB_TOP + 15;
vOsdClearPos(FL_MENU_WB, 200, 180);
}
#endif
#ifdef SHOW_FS_SLIDER
vMoveSlider(wFlGetItemIdx(bItemIdx), _wFlMnListLen, FALSE);
#endif
#ifdef JPG_PREVIEW_SUPPORT
// - terminate the JPEG preview timing
_bPreview = PREVIEW_STATE_IDLE;
#endif
return TRUE;
}
/**
* Perform the operation to the given item when the hover cursor enter it.
*/
static BOOL fgFlMnEntItem(BYTE bItemIdx) large
{
WORD wNum;
if ((bItemIdx >= _bFlMnItemNs) || (bItemIdx >= FLMN_PAGE_SZ))
return FALSE;
wNum = wFlGetItemIdx(bItemIdx);
vFlMnHiliItem(bItemIdx, TRUE);
#ifdef SHOW_FS_SLIDER
vMoveSlider(wNum, _wFlMnListLen, TRUE);
#endif
_bFlMnItemType = bFlGetItemType(bItemIdx);
vFlIpShowInfo(IP_INFO_FILE_INDEX, 0, wNum);
#ifdef JPG_PREVIEW_SUPPORT
// - restart the JPEG preview timing if we enter a JPEG file
if (_bFlMnItemType == FTYPE_STILL)
{
_bPreview = PREVIEW_STATE_START;
}
#endif
// - move current item to the given one
_bFlMnCurItemIdx = bItemIdx;
#ifdef ENABLE_ID3
if ((_bFlMnItemType == FTYPE_AUDIO) && fgFlMnIsCurrPlayItem(_bFlMnCurItemIdx))
{
vFlGetId3Info();
}
#endif
vFlUpdateVfd(FALSE);
return TRUE;
}
/**
* Read in the list info from proper shared info group.
*/
void vFlMnRdListInfo(BYTE bId) large
{
BYTE bType, bIncItemType;
WORD wBsDir, wPos;
if (bId >= FL_MAX_LIST_NS)
return;
wPos = FL_LIST_FIELD(bId);
bType = bSharedInfo(wPos);
bIncItemType = bSharedInfo(wPos + 1);
bLoByte(wBsDir) = bSharedInfo(wPos + 2);
bHiByte(wBsDir) = bSharedInfo(wPos + 3);
bLoByte(_wFlMnListLen) = bSharedInfo(wPos + 4);
bHiByte(_wFlMnListLen) = bSharedInfo(wPos + 5);
return;
}
/**
* Leave the current dir to its parent.
*/
// 20040809 by RC. Roll back to version 36 due to issue CR00000187
static BOOL fgFlMnLeavDir(void) large
{
WORD wPos, wBsDir;
// - check current dir
wPos = FL_LIST_FIELD(_bFlMnListId);
bLoByte(wBsDir) = bSharedInfo(wPos + 2);
bHiByte(wBsDir) = bSharedInfo(wPos + 3);
if (!wBsDir)
return FALSE;
if (fgFlCmdIsOOC()) // 20040810 by RC. Prevent doing fgFlMnEntDir() when other command is not return.
return FALSE;
#ifdef SUPPORT_PCD
if (fgIsPcdPlay())
return FALSE;
#endif
// - get in parent dir
fgFlMnLeavItem(_bFlMnCurItemIdx); // - leave current item
if ((wFlGetItemIdx(0) == 0) && (bFlGetItemType(0) == FTYPE_FOLDER))
{
if (fgFlClLock(FL_CMDPATH_DIR_UP_1))
{
fgFlMnEntDir(0, TRUE);
}
}
else
{
//_bFlMnCurItemIdx = 0; // this should be ".."
//fgFlCmdGetItems(_bFlMnListId, 0x0, FLCMD_RET_OP_ENTDIR);
if (fgFlClLock(FL_CMDPATH_DIR_UP_0))
fgFlCmdGetItems(_bFlMnListId, 0x0);
}
return TRUE;
}
/**
* Enter the dir given by item index.
*/
static BOOL fgFlMnEntDir(BYTE bItemIdx, BOOL fgMoveUp) large
{
WORD wPos, wBsDir, wIdx;
BYTE bFType;
if (bItemIdx >= FL_MIN(_bFlMnItemNs, FLMN_PAGE_SZ))
{
return FALSE;
}
// - check the type of the given item
wPos = FL_ITEM_FIELD(bItemIdx);
// - parse the full path
_bFlMnMemLock = TRUE;
vParseFolderName(bItemIdx, fgMoveUp);
/*
if (bFlClPath() == FL_CMDPATH_CHG_DIR)
{
bLoByte(wIdx) = bSharedInfo(FL_ITEM_FIELD(0) + 12);
bHiByte(wIdx) = bSharedInfo(FL_ITEM_FIELD(0) + 13);
_bFlMnCurItemIdx = (BYTE) (wIdx % FLMN_ITEM_N);
}
*/
// - get the base dir index and set the list to it
bLoByte(wBsDir) = bSharedInfo(wPos + 12);
bHiByte(wBsDir) = bSharedInfo(wPos + 13);
wPos = FL_LIST_FIELD(_bFlMnListId);
// tmp solution
// if (fgFlClIsLock() || fgFlClLock(FL_CMDLOCK_SMN, FL_CMDPATH_CHG_DIR, 0))
// vFlCmdSet(_bFlMnListId, bSharedInfo(wPos),
// bSharedInfo(wPos + 1), wBsDir, 0xFFFF, FLPARM_SO_GDIR);
vFlCmdClickItem(_bFlMnListId, wFlGetItemIdx(bItemIdx));
return TRUE;
}
/**
* Handle the notification of MP3 playback status change.
*
* NOTE: In order to avoid the racing condition, check the parameters
* of notification instead of shared info slot.
*/
static void vFlMnChgMp3State(BYTE bStt) large
{
BYTE bIdx;
WORD wItemIdx, wIdx;
// - the current item of MP3 module
bLoByte(wItemIdx) = bSharedInfo(SI_MP3_ITEM_IDX_LO);
bHiByte(wItemIdx) = bSharedInfo(SI_MP3_ITEM_IDX_HI);
bStt = bSharedInfo(SI_MP3_STT);
switch (bStt)
{
case MP3STT_PB_ENB:
// - playback enabled
break;
case MP3STT_PB_STRT:
// - playback starts
_wFlCurAdoIdx = wItemIdx;
vFlUpdateVfd(FALSE);
// - temp solution
#ifdef SPTM_SUPPORT
if (_bFlIpState == IP_STATE_PANEL_1)
vFlIpShowInfo(IP_INFO_EQ, 0, 0);
else
vHideEqBar();
#endif
if (_wFlCurAdoDir == wFlMnGetListBaseDir(_bFlMnListId) &&
// PL00003187, because disclist and playlist both has same dir index(0xFFFF), need to check if same list type
(_bFlPlayListType == bSharedInfo(FL_LIST_FIELD(_bFlMnListId))))
{
vFlMnHiliOff(FLMN_HILI_PLAY);
_wFlCurAdoIdx = wItemIdx;
wIdx = wFlGetItemIdx(0);
if ((_wFlCurAdoIdx != wFlGetItemIdx(_bFlMnCurItemIdx)) &&
(wItemIdx >= wIdx) && (wItemIdx < wIdx + FLMN_ITEM_N))
{
bIdx = _wFlCurAdoIdx % FLMN_ITEM_N;
vFlMnHiliOn(bIdx, FLMN_HILI_PLAY, FLMN_CLR_BG, FLMN_CLR_PLAY);
}
}
// PL00003187, because disclist and playlist both has same dir index(0xFFFF), need to check if same list type
if (_bFlPlayListType == bSharedInfo(FL_LIST_FIELD(_bFlMnListId)))
vFlIpShowInfo(IP_INFO_FILE_INDEX, 0, wItemIdx);
vFlIpShowInfo(IP_INFO_TOTALTIME, bSharedInfo(SI_MP3_TOTAL_TIME_MM),
bSharedInfo(SI_MP3_TOTAL_TIME_SS));
vFlIpShowInfo(IP_INFO_PBC, 0, 0);
#ifdef ENABLE_ID3
vFlGetId3Info();
#endif
break;
case MP3STT_PB_FSH:
// - playback finishes
// break;
case MP3STT_PB_ABT:
// - playback is aborted
// break;
case MP3STT_PB_ERR:
// - temp solution
#ifdef SPTM_SUPPORT
vHideEqBar();
#endif
// - some playback erro occurs
vFlIpShowInfo(IP_INFO_PLAYTIME, 0, 0);
vFlIpShowInfo(IP_INFO_TOTALTIME, 0, 0);
if (_wFlCurAdoDir == wFlMnGetListBaseDir(_bFlMnListId))
{
vFlMnHiliOff(FLMN_HILI_PLAY);
_wFlCurAdoIdx = 0xFFFF;
}
#ifdef SPTM_SUPPORT // 20050324, IS00001866, this will clear 'HD'CD's HD. Since RISC didn't support SPTM, remark it.
if (_bFlIpState == IP_STATE_PANEL_1)
{
_wStartX = FS_EQ_X;
_wStartY = 32;
vOsdClearPos(FL_INFO_WB, 200, 32);
}
#endif
vFlIpShowInfo(IP_INFO_BITRATE, 0, 0xFFFF);
#ifdef ISO_AUTO_PLAY
fgFlAutoPlayNext();
/*
if (_fgFlIsAutoPlay)
{
_wFlAtplyIdx++;
if (fgFlClLock(FL_CMDPATH_ATPLY_0))
{
bLoByte(wIdx) = bSharedInfo(FL_LIST_FIELD(_bFlRefListId) + 4);
bHiByte(wIdx) = bSharedInfo(FL_LIST_FIELD(_bFlRefListId) + 5);
if ((_wFlAtplyIdx >= wIdx) || (!fgFlCmdGetItems(_bFlRefListId, _wFlAtplyIdx)))
{
_fgFlIsAutoPlay = FALSE;
vFlClRls();
}
}
}
*/
#endif
break;
default:
// - error occurs
break;
}
return;
}
/**
* Handle IR_CMD_DONE.
*/
BOOL fgFlMnIrCmdDoneHdr(void) large
{
if (FL_ACK(_dwIrDoneParm) == FL_CMD_ASSERT)
{
// - "FS LIST" command done, get return command
BYTE bCmd;
bCmd = bSharedInfo(FL_CMD_BLK_SA);
switch (bCmd)
{
case FLCMD_CREATE:
vFlMnRetCreate();
break;
case FLCMD_SET:
vFlMnRetSet();
break;
case FLCMD_GET_ITEMS:
vFlMnRetGetItems();
break;
case FLCMD_CLICK_ITEM:
vFlMnRetClickItem();
break;
#ifdef DATA_DISC_SUPPORT_PLAY_LIST
case FLCMD_ADD_TO_PL:
vFlMnR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -