📄 fllrc.c
字号:
case FL_CMDPATH_DIR_DOWN:
fgFlLrcEntDir(0x0, FALSE);
break;
case FL_CMDPATH_DIR_UP_0:
vFlClNext();
fgFlLrcEntDir(0x0, TRUE);
break;
case FL_CMDPATH_PL_RM:
vFlLrcDrawPage();
fgFlLrcEntItem(_bFlMnCurItemIdx);
vFlClRls();
break;
case FL_CMDPATH_SEL_0:
_fgFlMdChg = TRUE;
switch (bFlGetItemType(_bFlMnCurItemIdx))
{
case FTYPE_FOLDER:
vFlClNext();
vFlSetCmdTarget(FL_CMD_TARGET_MENU);
vLrcParseFolderName(_bFlMnCurItemIdx, bGetStackTop());
break;
case FTYPE_AUDIO:
vFlClNext();
vFlSetCmdTarget(FL_CMD_TARGET_MENU);
break;
case FTYPE_STILL:
vFlClNext();
vFlSetCmdTarget(FL_CMD_TARGET_JPEG);
break;
case FTYPE_AV:
vFlClNext();
vFlSetCmdTarget(FL_CMD_TARGET_MPEG);
break;
}
break;
default:
break;
}
}
else
{
// - error occurs, mark the number of item is negative
LRC_DBGLogS("vFlLrcRetGetItems: Ret Error");
vFlCmdDone();
// Added by Hiker Hauk on 20071018 for many deadlock issues
// Temp Solution
vFlClRls();
// Hiker Hauk: Added End
switch(bFlClPath())
{
case FL_CMDPATH_CHG_LIST:
bType = bSharedInfo(FL_LIST_FIELD(_bFlMnListId));
switch (bType)
{
case FLPARM_LIST_FOLDER:
bType = FLPARM_LIST_DISC;
_wFlCurAdoIdx = _wFlFdIdx;
break;
case FLPARM_LIST_DISC:
bType = FLPARM_LIST_PLAYLIST;
_wFlCurAdoIdx = _wFlFlIdx;
break;
case FLPARM_LIST_INVALID:
case FLPARM_LIST_PLAYLIST:
bType = FLPARM_LIST_FOLDER;
_wFlCurAdoIdx = _wFlPlIdx;
break;
}
switch (bType)
{
case FLPARM_LIST_FOLDER:
vFlCmdSet(_bFlMnListId, FLPARM_LIST_FOLDER, 0,
_wBaseDir, FLPARM_FF_DIR | FLPARM_FF_MP3, FLPARM_SO_GDIR);
break;
case FLPARM_LIST_DISC:
case FLPARM_LIST_PLAYLIST:
default:
vFlCmdSet(_bFlMnListId, bType, 0x0,
0x0, FLPARM_FF_DIR | FLPARM_FF_MP3, FLPARM_SO_GDIR);
}
break;
default:
_bFlMnCurItemIdx = 0xFF;
_bFlMnItemNs = 0xFF;
break;
}
}
return;
}
/**
* Check the return value of command "FLCMD_CLICK_ITEM".
* Function is cleaned up by Hiker Hauk on 20071017.
* Now only code for FTYPE_DIR and FTYPE_MP3 is left, as other cases should be illegal.
*/
static void vFlLrcRetClickItem(void) large
{
WORD wBlkPtr, wItem;
BYTE bRCode;
wBlkPtr = FL_CMD_BLK_SA + 1; // - shift to the parameter block
bRCode = bSharedInfo(wBlkPtr ++);
vFlCmdDone();
if (bRCode == FLRET_S_OK)
{
// Successful
switch (bSharedInfo(wBlkPtr ++))
{
case FTYPE_DIR:
LRC_DBGLogS("vFlLrcRetClickItem: FTYPE_DIR");
// We've clicked a dir, the list will go into it. Re-get items for redraw later.
vFlLrcRdListInfo(_bFlMnListId);
bLoByte(wItem) = bSharedInfo(wBlkPtr ++);
bHiByte(wItem) = bSharedInfo(wBlkPtr);
_bFlMnCurItemIdx = wItem % FLMP3LRCMN_ITEM_N;
_wFlFirstIdx = wItem - _bFlMnCurItemIdx;
fgFlCmdGetItems(_bFlMnListId, _wFlFirstIdx);
break;
case FTYPE_MP3:
LRC_DBGLogS("vFlLrcRetClickItem: FTYPE_MP3");
// We've clicked an Audio file
switch (bFlClPath())
{
case FL_CMDPATH_SEL_2:
vFlLrcDrawPage();
vFlLrcHiliItem(_bFlMnCurItemIdx, TRUE);
_wFlCurAdoDir = wFlMnGetListBaseDir(_bFlMnListId);
_wFlCurAdoIdx = wFlGetItemIdx(_bFlMnCurItemIdx);
break;
default:
LRC_DBGLogS("vFlLrcRetClickItem: Path Logical Error:");
LRC_DBGLogB((BYTE)bFlClPath(), 0, 0, 0);
break;
}
vFlClRls();
break;
default:
LRC_DBGLogS("vFlLrcRetClickItem: FTYPE Logical Error");
break;
}
}
else
{
// Failed
switch (bSharedInfo(wBlkPtr ++)) //panwei modify
{
case FTYPE_DIR:
//if (bFlClPath() == FL_CMDPATH_CHG_DIR)
{
vFlLrcDrawPage();
fgFlLrcEntItem(_bFlMnCurItemIdx);
fgPopStack(&_wBaseDir, &_wCurrItem);
vFlClRls();
}
break;
}
LRC_DBGLogS("vFlLrcRetClickItem: RET failed.");
}
return;
}
/**
* Check the return value of command "FLCMD_ADD_TO_PL".
*/
static void vFlLrcRetAddToPl(void) large
{
WORD wBlkPtr;
BYTE bRCode;
wBlkPtr = FL_CMD_BLK_SA + 1; // - shift to the parameter block
bRCode = bSharedInfo(wBlkPtr ++);
_bFlMnPLNs++;
vFlCmdDone();
// added by msz00049 for CR PL00105822
if(fgFlClIsLock() && bFlClPath() == FL_CMDPATH_ADDTO_PLAYLIST)
{
vFlClRls();
}
// added end
// Added by Hiker Hauk for test reason
else
{
LRC_DBGLogS("Locked is released, but for unknown lock.");
vFlClRls();
}
// Added end
fgFlMp3LrcRedrawPlList();
return;
}
/**
* Check the return value of command "FLCMD_RM_FROM_PL".
*/
static void vFlLrcRetRmFromPl(void) large
{
WORD wBlkPtr,wPos;
BYTE bRCode;
wBlkPtr = FL_CMD_BLK_SA + 1; // - shift to the parameter block
bRCode = bSharedInfo(wBlkPtr ++);
vFlCmdDone();
_bFlMnPLNs = bSharedInfo(SI_FS_PLLISTNS);
if (bRCode == FLRET_S_OK)
{
if(_bFlMnPLNs > 0) //playlist is not empty
{
#ifdef MP3_LYRICS_PL_15_SONGS
if (_bFlMnCurItemIdx >= _bFlMnPLNs && _fgIsInPlayList)
{
_bFlMnCurItemIdx--;
}
#endif
if (fgFllrcMenuOn())
{
if (fgFlClLock(FL_CMDPATH_REDRAW_PLAYLIST))
{
fgFlCmdGetItems(_bFlPlListId, 0x0);
}
}
else
{
vFlCmdClickItem(_bFlPlListId, 0);
}
}
#ifdef MP3_LYRICS_PL_15_SONGS
else //playlist is empty
{
if (_fgIsInPlayList)
{
fgFlLrcOnIrLeft();
}
//if (!fgFllrcMenuOn())
//{
// fgFlLrcOnIrMenu();
//}
}
#endif
}
else
{
// - error occurs
_wFlMnListLen = 0xFF;
}
return;
}
/**
* Check the return value of command "FLCMD_CLEAN".
*/
static void vFlLrcRetRmAllFromPl(void) large
{
WORD wBlkPtr;
BYTE bRCode;
vFlCmdDone();
wBlkPtr = FL_CMD_BLK_SA + 1; // - shift to the parameter block
bRCode = bSharedInfo(wBlkPtr ++);
if (bRCode == FLRET_S_OK)
{
// - successful
if(fgFllrcMenuOn())
{
_fgFlRedrawPlPlay = FALSE;
fgFlMp3LrcRedrawPlList();
}
//fgFlLrcChgListType();
}
else
{
// - error occurs
}
}
static void vFlLrcRetQueryItem(void) large
{
WORD wBlkPtr, wTmp;
BYTE bRCode;
BYTE bTmp1, bTmp2;
wBlkPtr = FL_CMD_BLK_SA + 1;
bRCode = bSharedInfo(wBlkPtr ++);
if ((bRCode != FLRET_S_OK) || !fgFlClIsLock())
return;
vFlCmdDone();
switch (bFlClPath())
{
case FL_CMDPATH_ATPLY_0:
vFlClNext();
wBlkPtr += 5;
bLoByte(wTmp) = bSharedInfo(wBlkPtr);
bHiByte(wTmp) = bSharedInfo(wBlkPtr + 1);
if (_wFlCurAdoDir != wTmp)
{
_wFlCurAdoDir = wTmp;
bLoByte(_wFlCurAdoIdx) = bSharedInfo(wBlkPtr + 2);
bHiByte(_wFlCurAdoIdx) = bSharedInfo(wBlkPtr + 3);
vFlCmdSet(_bFlMnListId, FLPARM_LIST_FOLDER, 0,
_wFlCurAdoDir, FLPARM_FF_DIR | FLPARM_FF_MP3, FLPARM_SO_GDIR);
}
else
{
bLoByte(wTmp) = bSharedInfo(wBlkPtr + 2);
bHiByte(wTmp) = bSharedInfo(wBlkPtr + 3);
bTmp1 = (BYTE) (wTmp % FLMN_ITEM_N);
bTmp2 = (BYTE) (_wFlCurAdoIdx % FLMN_ITEM_N);
if ((bTmp1 > bTmp2) && (bTmp1 < (bTmp2 + FLMN_ITEM_N)))
{
vFlCmdClickItem(_bFlMnListId, _wFlCurAdoIdx);
}
else
{
_wFlFirstIdx = _wFlCurAdoIdx - (_wFlCurAdoIdx % FLMN_ITEM_N);
fgFlCmdGetItems(_bFlMnListId, _wFlFirstIdx);
}
}
break;
default:
vFlClRls();
break;
}
return;
}
DWRD dwMakeDWord(WORD wPos) large
{
DWRD dwVal;
bLoByte(wLoWord(dwVal)) = bSharedInfo(wPos);
bHiByte(wLoWord(dwVal)) = bSharedInfo(wPos + 1);
bLoByte(wHiWord(dwVal)) = bSharedInfo(wPos + 2);
bHiByte(wHiWord(dwVal)) = bSharedInfo(wPos + 3);
return dwVal;
}
////////////////////////////////////////////////////////////////////////////////
/**
* Clear the working area barrowed from DRAM.
*/
static void vLrcWorkAreaClear(void) large
{
BYTE bLen, i;
DWRD dwAddr;
bLen = bSharedInfo(SI_FS_WA_SZ);
dwAddr = dwMakeDWord(SI_FS_WA_SA_B1);
WriteDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr), 0);
dwAddr++;
WriteDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr), 0);
dwAddr++;
WriteDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr), 0);
dwAddr++;
WriteDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr), '\0');
dwAddr++;
for (i = 4; i < bLen - 4; i++)
{
WriteDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr), 0);
}
return;
}
/**
* Preprocess the given name string. The namae string is given by
* pointer to it and its length. We adjust the pointer and the len to
* indicate the new string.
*
* The current preprocess includes:
* 1. Cut out the extension name
* 2. Etc ...
*/
static void vFlLrcPProcName(DWRD *pdwAddr, BYTE *pbLen) large
{
BYTE bChar, bIdx, bLen;
DWRD dwAddr;
if (!pdwAddr || !pbLen)
return;
dwAddr = (DWRD)(*pdwAddr);
bLen = (*pbLen);
// - move the pointer to the end of the string
dwAddr += (DWRD)bLen;
// - check each char
for (bIdx = 1; bIdx < bLen; bIdx ++)
{
dwAddr --;
bChar = bReadDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr));
if (bChar == '.')
break;
}
// - cut out the ext
if (bIdx < bLen)
bLen -= bIdx;
//#ifdef FLMN_DONT_SHOW_NONPRINTABLE_CHAR
if (bLen > FLLRC_FILENAME_LEN)
bLen = FLLRC_FILENAME_LEN;
(*pbLen) = bLen;
}
/**
* Calculate the name string of the folder.
*/
static void vLrcParseFolderName(BYTE bItem, BYTE bDepth) large
{
BYTE bSrcLen, bDesLen, bTmp, i;
WORD wPos, wBsDir;
DWRD dwSrcAddr, dwDesAddr;
if (bDepth == 0)
{
return;
}
wPos = FL_ITEM_FIELD(bItem);
dwDesAddr = dwMakeDWord(SI_FS_WA_SA_B1) + 32 * (bDepth - 1);
dwSrcAddr = dwMakeDWord(wPos);
bSrcLen = bSharedInfo(FL_ITEM_FIELD(bItem) + 4);
if (bSrcLen > FLMN_MAX_WA_SIZE - 4)
{
bSrcLen = FLMN_MAX_WA_SIZE - 4;
}
WriteDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr), bSrcLen);
dwDesAddr++;
for (i = 0; i < bSrcLen; i++)
{
bTmp = bReadDRAMTbl(bLoByte(wHiWord(dwSrcAddr)), wLoWord(dwSrcAddr));
WriteDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr), bTmp);
dwSrcAddr++;
dwDesAddr++;
}
WriteDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr), '\0');
}
////////////////////////////////////////////////////////////////////////////////
//
// General Display Function
//
/**
* Draw the name string of the current folder.
*/
static void vLrcDrawFolderName(BYTE bDepth) large
{
BYTE bLen, i;
DWRD dwAddr;
_wStartX = FLMP3LRCMN_ITEM_L;
_wEndX = FLMP3LRCMN_ITEM_L + FLMP3LRCMN_ITEM_W - 1;
_wStartY = (FLMP3LRCMN_HEAD_H - FLMP3LRCMN_ITEM_H) / 2;
_wEndY = (FLMP3LRCMN_HEAD_H - FLMP3LRCMN_ITEM_H) / 2 + FLMP3LRCMN_ITEM_H - 1;
vRectangle(MP3LRC_MENU_WB, 0, 0, TRUE, 6);
vSetMsgCol4(MP3LRC_MENU_WB, 6, 6, 6, 1);
_wStartX = FLMP3LRCMN_ITEM_L;
_wStartY = (FLMP3LRCMN_HEAD_H - FLMP3LRCMN_ITEM_H) / 2;
if (bDepth == 0)
{
vOsdMsgPaste(MP3LRC_MENU_WB, OSD_MSG_MENU/*OSD_MSG_MENU*/);
}
else
{
dwAddr = dwMakeDWord(SI_FS_WA_SA_B1);
dwAddr += 32 * (bDepth - 1);
bLen = bReadDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr));
if (bLen > FLMP3_FOLDER_LEN)
{
bLen = FLMP3_FOLDER_LEN;
}
dwAddr++;
//vSetFsCodePage(0);
#ifdef SUPPORT_KOREAN_FILE_NAME
vPasteMsgAddr(MP3LRC_MENU_WB, bLen, dwAddr, bSharedInfo(SI_JOLIET_LEVEL));
#else
vPasteMsgAddr(MP3LRC_MENU_WB, bLen, dwAddr);
#endif
//vSetFsCodePage(CODE_PAGE_MENU);
}
}
/**
* This function draw the file name of the given item by the
* new OSD command "vpast_msg_addr".
*
* It also demos how to get item info from descriptor.
*/
static void vFlLrcDrawItem(BYTE bItemIdx) large
{
DWRD dwAddr;
WORD wPos;
BYTE bFType, bStrLen;
WORD wIdx, wDirIdx;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -