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

📄 enhanced_selector_prev_for_ape.c

📁 MP3 整个 SDK
💻 C
📖 第 1 页 / 共 2 页
字号:
*
* Returns     : 
*    TRUE:  success.
*    FALSE: fail, detail info store in fselError.
* Notes       : rewind to the last valid directory when fselDir == 0;
*
********************************************************************************/
BOOL fselPrevDir(char *strDir)
{
    WORD wtemp;

    if(fselDirNo[fselDirLayer] <= 1)
    {
        return FALSE;
    }
    //seek to the prev valid directory enty
    wtemp = fselDirNo[fselDirLayer];
    wtemp --;
    if ( !ToDirEntry1(strDir, wtemp))
    {    
        return FALSE;
    }
    fselDirNo[fselDirLayer] = wtemp;
    return TRUE;
}  
/********************************************************************************
* Description : in current dir get the last dir 
*
* Arguments  : 
            strDir:output Dir name
* Returns    :
            TRUE: Successful
            FALSE: fail.
* Notes       :  None
*
********************************************************************************/
/*BOOL FS_LASTDir(char *strDir)
{
    if( fselDirLayer > 7 )
        return FALSE;
    fselDirNo[fselDirLayer] = 0;
    if ( !FS_Dir(m_szTemp1, IgnoreExt1, FS_DIR_DIR) )    // if no dir ,return error
       return FALSE;
    fselDirNo[fselDirLayer] = 1;
    memcpy(strDir,m_szTemp1,12);    
    while ( FS_Dir(m_szTemp1, IgnoreExt1, FS_DIR_DIR_CONT))
    {
        fselDirNo[fselDirLayer]++;
        memcpy(strDir,m_szTemp1,12);    
    }
    return TRUE;
} */
/********************************************************************************
* Description : Seek to the prev file 
*
* Arguments  : 
        strFile:output file name
* Returns     :
            TRUE: Successful
            FALSE: fail.
* Notes       :  目录数检查,先子目录(子目录N -- 子目录1)再父目录.
*
********************************************************************************/
BOOL SelectPrev_8Layer(char *strFile)
{
    char    strDir[12];
    
    //在当前目录向下找文件
    fselError = 0;
    if (fselTotal == 0)
        fselTotal=GetFileTotalCur(FALSE);
    if ( !SelectPrev(strFile) )
    {
        //检查父目录.
ParentDiragainNext: 
//            output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);          
	_ClearWatchDog();
            if ( FS_CD("\\"))
            {
                if( fselDirNo[fselDirLayer] == 0)
                {
                    fselDirLayer--;
                }
                
                if ( fselDirLayer < 0 || fselDirLayer > 7)
                {
                    fselError = FSEL_ERR_OUTOF;     //已经返回到根目录,重新初始化
                    fselInit(fselType, fselMode,0,fselDiskLetter);
                    
                    return FALSE;
                }
                
                if ( fselPrevDir(strDir) )
                {    
                    goto CurrentDiragainNext;
                }
                else   
                {   //当前目录下有效的文件
                    fselDirNo[fselDirLayer] = 0;
                    fselTotal=GetFileTotalCur(FALSE);
                    fselFileNo = 0;
                    fselExtNo = 0;             
#ifdef __APE_SUPPORT
                    fselFileNo_APE = 0;
                    CurApe_TotalNo = 0;
#endif
                    if ( SelectPrev(strFile) )
                    {
                        fselError = 0;
                        fselDirLayer--;
                        return TRUE;
                    }
                    //  当前目录分支没有合适的文件,退回上级目录
                    goto ParentDiragainNext;
                }
            }   
            else
            {
                fselError = FSEL_ERR_OUTOF;
                return FALSE;    
            }
//寻找当前目录下的所有目录
CurrentDiragainNext:
//        output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
	_ClearWatchDog();
        FS_CD(strDir);
        if (fselDirLayer > 7 )
        {
            FS_CD("\\");
            fselDirLayer--;
            fselDirNo[fselDirLayer] = 0;
            goto ParentDiragainNext;
        }
        fselDirLayer++;
        if ( FS_LASTDir(strDir) )
        {           
            goto CurrentDiragainNext;
        }
        else    // 寻找当前目录的下一个目录(平级寻找)
        {
            fselDirLayer--;
            fselTotal=GetFileTotalCur(FALSE);
            fselFileNo = 0;
            fselExtNo = 0;             
#ifdef __APE_SUPPORT
            fselFileNo_APE = 0;
            CurApe_TotalNo = 0;
#endif
            if ( SelectPrev(strFile) )
            {
                fselError = 0;
                return TRUE;
            }
            //  当前目录分支没有合适的文件,退回上级目录
            goto ParentDiragainNext;
        }
    }
    return TRUE;
}
/********************************************************************************
* Description : Select the Prev file according to type & mode, then get the name of file.
*
* Arguments  : 
            strFile: Dos 8.3 file name of selected file.
* Returns     :
            TRUE: Successful.
            FALSE: Fail, detail information in fselError
* Notes       :  None
*
********************************************************************************/
BOOL fselGetPrev( char *strFile)
{
    //uchar temp, num;
    char temp[12];
    
    switch ( fselMode)
    {
        case FSEL_ALL_REPEATONE:
        case FSEL_DIR_RANDOM:
            return fselGetNext(strFile);
            //break;
        case FSEL_DIR_SEQUENCE:
        case FSEL_DIR_INTRO:
            return SelectPrev(strFile);
        case FSEL_ALL_SEQUENCE:
            return SelectPrev_8Layer(strFile);
        case FSEL_ALL_REPEATALL:
            if (SelectPrev_8Layer(strFile))
                return TRUE;
            else
            {
                fselInit(fselType, fselMode,0,fselDiskLetter);
                //fselTotal = GetFileTotalCur (FALSE);
                //fselFileNo =  fselTotal  + 1;
                while(FS_LASTDir(temp))
                {
                    FS_CD(temp);
                    fselDirLayer++;
//                    output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
	_ClearWatchDog();
                }
                fselDirLayer--;    
                return SelectPrev_8Layer(strFile);
            }
        case FSEL_DIR_REPEATALL:
            if (SelectPrev(strFile ))
                return TRUE;
            fselFileNo = 0;
            fselExtNo = 0;
#ifdef __APE_SUPPORT
            fselFileNo_APE = 0;
            CurApe_TotalNo = 0;
#endif
            return SelectPrev(strFile);
        default:
            return FALSE;
    }
    
}
/********************************************************************************
* Description : Set the selected location which is specified by location.
*
* Arguments  : 
*            location:     store drive name, path name, file name.
* Returns     :
*            TRUE:    Successful
*            FALSE:    Fail, detail information in fselError
* Notes       :  Should select path in the case of only file name is invalid 
*
********************************************************************************/
BYTE fselSetLocationC(file_location_t  *location)
{
    BYTE i,iTag;
    
    iTag = 0;
    //Active the disk & file system;
    if(( !DRV_ActiveDrive(location->disk, 1))
        ||(!FS_Init()))
    {
        fselError = FSEL_ERR_DISK;
        return FALSE;
    }
    //initialize FSEL 
    Init1(fselType, fselMode);
    fselDiskLetter= location->disk;
    
    for(i=0; i<TOTALDIRLAYER; i++)
       fselDirNo[i] = location->DirNo[i];
    
    //output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);    
    if (!FS_SetCurDir(location->ClusterNo))
    {
        fselError = FSEL_ERR_SETDIR;
        return FALSE;
    }

    fselDirLayer = location->dirLayer;
    
        if( fselDirNo[0] != 0)
        {
            FS_CD("\\");
            ToDirEntry1(m_szTemp1,fselDirNo[fselDirLayer]);
            FS_CD(m_szTemp1);
//            output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);  
	_ClearWatchDog();
            if ( memcmp(m_szTemp1,location->path,11) != 0) //path is invalid
            {
                fselError = FSEL_ERR_SETDIR;
                return FALSE;
            }
        }
        else
        {
            
            if(location->path[0] != ':')
            {
                fselError = FSEL_ERR_SETDIR;
                return FALSE;
            }
            FS_CD(RootName1);
        }

    
    //Select the specify file by location
    if ('\0'==location->filename[0])
    {
        return TRUE;
    }

    if(0==fselTotal)   
    {
        fselError = FSEL_ERR_SETFILE;
        return FALSE;
    }
    fselFileNo = 0;
    fselExtNo = 0;
#ifdef __APE_SUPPORT
    fselFileNo_APE = 0;
    CurApe_TotalNo = 0;
#endif


    do {
//        output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);    
	_ClearWatchDog();
        if (!SelectNext1(m_szTemp1))
        {
            fselError = FSEL_ERR_SETFILE;
            fselFileNo = 0;
#ifdef __APE_SUPPORT
            fselFileNo_APE = 0;
            CurApe_TotalNo = 0;
#endif
            fselExtNo = 0;
            return FALSE;
        }
        iTag = 1;
        for(i=0; i<11; i++)
        {
            if (m_szTemp1[i] != location->filename[i])
                iTag = 0;
        }
	 if(iTag && !memcmp(location->filename+8,APEExt1,3))
	 {
		while(fselFileNo+CurApe_TotalNo-fselFileNo_APE<location->APE_Cur)
			if(!SelectNext1(m_szTemp1))
			    break;
	 }
    } while( iTag == 0 );

    return TRUE;
}

/********************************************************************************
* Description : Get the selected location
*
* Arguments  : 
*            location:    the buffer to store location
* Returns     :
*            TRUE: Successful
*            FALSE: Fail, detail information in fselError.
* Notes       :  None
*
********************************************************************************/

BOOL fselGetLocationC(file_location_t  *location)
{
    BYTE    i;
    long    lEntry;
    location->disk = fselDiskLetter;
    
    for(i=0; i<TOTALDIRLAYER; i++)
        location->DirNo[i] = fselDirNo[i];
    
    location->ClusterNo = FS_GetCurDir();
    location->dirLayer = fselDirLayer;
#ifdef __APE_SUPPORT
    location->APE_Cur = fselFileNo+CurApe_TotalNo-fselFileNo_APE;
#endif

    lEntry = FS_GetCurDirEntry();
    if (fselFileNo != 0 )
    {
        if ( !fselGetByNO(location->filename, fselFileNo) )
         {
            location->filename[0] = 0x00;
            location->path[0] = ':';
            location->dirLayer = 0;
            return FALSE;
        }
    }
    else
    {
        location->filename[0] = 0x00;
    	}
      
    // 只有在fselDirNo[0] == 0时,当前目录是根目录.
    if ( fselDirLayer > 7 || fselDirNo[0] == 0)
    {
         m_szTemp1[0] = ':';
         fselDirNo[0] = 0;
         fselDirLayer = 0;
    }
    else
    {
         FS_CD("\\");
         ToDirEntry1(m_szTemp1,fselDirNo[fselDirLayer]);
    }
//    output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);  
	_ClearWatchDog();
    memcpy(location->path, m_szTemp1, 11);
    FS_CD(m_szTemp1);
            
    FS_SetCurDirEntry(lEntry);
    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -