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

📄 fllrc.c

📁 手机8032的完整代码。吐血推荐。小做改动就可以生产。
💻 C
📖 第 1 页 / 共 5 页
字号:
      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 + -