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

📄 dosusr.c

📁 凌阳MP3 spSPCA755yuanma
💻 C
📖 第 1 页 / 共 4 页
字号:
#include <ctype.h>
#include "general.h"
#include "asicreg.h"
#include "cardimpt.h"
#include "cardui.h"
#include "dosusr.h"
#include "doslink.h"
#include "uiflow.h"
#include "main.h"
//#include "dosvar.h"

#include "ID3.H"//add by xyq

code	BYTE	C_USR_Dir0Name[] =
{
	'A', 'U', 'D', 'I', 'O', 'S', ' ', ' ', ' ', ' ', ' ', 0x10
};

code	BYTE	C_USR_Dir1Name[K_USR_MaxDirCount][12] =
{
	'M', 'U', 'S', 'I', 'C', ' ', ' ', ' ', ' ', ' ', ' ', 0x10,
	//'W', 'M', 'A', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0x10,
	//'A', 'D', 'P', 'C', 'M', ' ', ' ', ' ', ' ', ' ', ' ', 0x10,
        //'G', '7', '2', '3', ' ', ' ', ' ', ' ', '1', ' ', ' ', 0x10
        'D', 'V', 'R', '0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0x10,
        'D', 'V', 'R', '1', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0x10,
        'D', 'V', 'R', '2', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0x10,
        'D', 'V', 'R', '3', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0x10

};

xdata	Dir1_struct	G_USR_DirList[K_USR_MaxDirCount]; //0:MUSIC, 1:DVR
xdata   WORD            G_USR_Dir0Cluster;
xdata   USHORT          G_USR_TotalDirectory;
data    BIT             _G723=0;                            //@@chchang_012203
data    BIT             _WMA=0;                            //@@chchang_012803

#if (ID3Tag_OPTION==1)
//add by xyq
unsigned int  xdata G_CurrentFile_StartCluster;
unsigned char xdata SongNameNDSingerName[61];
unsigned char xdata G_SongNameNDSingerName_Length;
unsigned long xdata G_OldLongFDB_SectorAddr;
unsigned long xdata G_CurrentLongFDB_SectorAddr;
#endif
unsigned  char fdbBack[32];
ULONG deletedfdbLogAddr;
ULONG movingfdbLogAddr;
WORD deletedfdbOffset;
WORD movingfdbOffset;

//
//-----------------------------------------------------------------------------
//USR_DirInitialize
//-----------------------------------------------------------------------------
BYTE USR_DirInitialize(void) USING_0
{
        BYTE sts = TRUE;
        BYTE name[12];
        BYTE filereq;
        ULONG startCluster;
        WORD k;


        // build "AUDIOS" folder
        USR_SetDir0Name(name);
        if ((startCluster = DOS_RootFindName(name)) == 0)
        {
                if ((startCluster = DOS_RootMakeDir(name, 1)) == 0)
                {
              	        return FALSE;
                }
        }
        G_USR_Dir0Cluster = startCluster;


        // build "MP3","WMA", etc folder under "AUDIOS" folder
        DOS_SetCurrDir(G_USR_Dir0Cluster);

        // @patch 5.1@010703@wyeo@prevent dir hang, begin
        if (USR_FindDir1s()==0xffff)
        	return FALSE;
        // @patch 5.1@010703@wyeo@prevent dir hang, end

	for (k = 0; k < K_USR_MaxDirCount; k++)
	{
		if (G_USR_DirList[k].startCluster == 0)
		{
			USR_SetDir1Name(name, k);
			if ((startCluster = DOS_MakeDir(name, 1)) == 0)
			{
				return FALSE;
			}
			else
			{
			        G_USR_DirList[k].startCluster = startCluster;
			        G_USR_TotalDirectory++;
			}
		}
                G_USR_DirList[k].totalFile = 0;
                G_USR_DirList[k].lastFileIndex = 0;
	}


        // calculate totalFile for each folder
	for (k = 0 ; k < K_USR_MaxDirCount && sts; k++)
	{
                if ( G_USR_DirList[k].startCluster != 0)
                {
                        DOS_SetCurrDir(G_USR_DirList[k].startCluster);
                        filereq=USR_GetFileType(k);
                        sts = USR_InitFileCount(&G_USR_DirList[k].totalFile,filereq);
                }
	}
	Init_MultiDvr_Dir();

	if(G_USR_DirList[G_UIMODE].totalFile)
	{
		G_FileCurrentIndex = 1;
	}else{
		G_FileCurrentIndex = 0;
	}
	return sts;
}

//-----------------------------------------------------------------------------
//USR_FindDir1s
//-----------------------------------------------------------------------------
WORD USR_FindDir1s(void) USING_0
{
        ULONG logAddr;
        USHORT k;
        WORD startCluster;
        WORD searchCluster;
        WORD prevCluster;
        WORD maxLoopCount;	// @patch 5.1@010703@wyeo@prevent dir hang
        WORD loopCount;		// @patch 5.1@010703@wyeo@prevent dir hang

        G_USR_TotalDirectory=0;
        for (k = 0 ; k < K_USR_MaxDirCount; k++)
        {
           G_USR_DirList[k].startCluster = 0;
        }

        startCluster = 0;
        searchCluster = G_DOS_CurrDirCluster;

        // @patch 5.1@010703@wyeo@prevent dir hang, begin
        if (G_DOS_FileSystemType == 0x00) // FAT12
        	maxLoopCount = 4096;
        else
        	maxLoopCount = 0xffff;
        loopCount = 0;
	// @patch 5.1@010703@wyeo@prevent dir hang

        while (searchCluster != 0xffff)
        {
                prevCluster = searchCluster;
                logAddr = DOS_ClusterLogAddr(searchCluster);
                startCluster = DOS_FindFdb(K_USR_MatchDcfDir1Index, (ULONG)0, logAddr, G_DOS_ClusterSize, 0, 0);
                if (startCluster == 0)
                {
	             break;
                }

                searchCluster = DOS_GetNextCluster(searchCluster);
                if (prevCluster == searchCluster || searchCluster == 0)//@wyeo@110502
                {
                        startCluster = 0;
                        break;
                }
                // @patch 5.1@010703@wyeo@prevent dir hang, begin
                loopCount++;
                if (loopCount >= maxLoopCount)
                {
                	startCluster = 0xffff;
                	break;
                }
                // @patch 5.1@010703@wyeo@prevent dir hang, end
        }

        return startCluster;
}

BYTE USR_GetFileType(BYTE dir) USING_0
{
    BYTE filereq;
       switch(dir)
       {
           case K_USR_MP3_DIR:
                filereq=K_USR_MP3_TYPE;
                break;
           case K_USR_ADPCM_DIR:
		   default:		//hxd030518 add 
                filereq=K_USR_ADPCM_TYPE;
                break;
       }
    return filereq;
}


//-----------------------------------------------------------------------------
//USR_InitFileCount
//-----------------------------------------------------------------------------
BYTE USR_InitFileCount(WORD *pTotalFile,BYTE filereq) USING_0
{
	BYTE sts = TRUE;
    WORD j, k, count=0;
    ULONG logAddr;
    WORD searchCluster;
    WORD prevCluster;
	WORD fileIndex;
    BYTE fileType;

   *pTotalFile = 0;
    searchCluster = G_DOS_CurrDirCluster;
    while ( (searchCluster != 0xffff) && sts)
    {
         prevCluster = searchCluster;
         logAddr = DOS_ClusterLogAddr(searchCluster);
         for (j = 0; j < G_DOS_ClusterSize && sts; j += K_DOS_SectorSize)
         {
            sts = DOS_ReadSector(K_DOS_DstSram, logAddr+j, 0);
         	if (sts)
            {
            	for (k = 0; k < K_DOS_SectorSize; k += 32)
                {
                                        if (G_ucDataBuffer[k] != 0x00)
                                        {
                                                fileType = USR_CheckType(&G_ucDataBuffer[k]);
                                                //DbgPrint("before file open_G723=%bx\n",(BYTE)_G723);
                                                if (fileType!=0)
                                                {
                                                        if(fileType==filereq)
                                                        {
						        	count++;
                                                        }

                          			        if(fileType >= K_USR_MP3_TYPE)
						        {
                                                                fileIndex = USR_CalFileIndex(&G_ucDataBuffer[k]);
								//DbgPrint("fileIndex %d\n", fileIndex);
                                                                if (fileIndex > G_USR_DirList[fileType-1].lastFileIndex)
                                                                {
                                                                   G_USR_DirList[fileType-1].lastFileIndex = fileIndex;
                                                                }
						        }
					        }
                                        }
                                        else
                                        {
                                                *pTotalFile = count;
                                                return TRUE;
                                        }
                                }// end for
                        }
               	} // end for

       		searchCluster = DOS_GetNextCluster(searchCluster);
		if ((prevCluster == searchCluster) || searchCluster == 0)//@wyeo@110502
                {
                   break;
                }

        } // end while

        *pTotalFile = count;

        return sts;
}

//-----------------------------------------------------------------------------
//USR_MatchFdb
//-----------------------------------------------------------------------------
BYTE USR_MatchFdb(BYTE matchCond, BYTE *fdb, ULONG refCon) USING_0
{
        BYTE match = FALSE;
        USHORT k;
        BYTE fileType;

        switch (matchCond)
        {
                case K_USR_MatchDcfDir1Index:
                        if (fdb[0] == 0x00)
                        {
                                fdb[26] = 0;
                                fdb[27] = 0;
                                match = TRUE;
                        }
                        else
                        {
                                //Neither erased nor '.','..' and is a directory
                                if ((fdb[0] != 0x00) && (fdb[0] != 0xe5) && \
                                        (fdb[0] != 0x2e) && (fdb[11] & 0x10))
                                {
                                        for (k = 0; k < K_USR_MaxDirCount; k++ )
					{
						if (USR_IsOurDir1Name(fdb, k))
						{
							G_USR_DirList[k].startCluster = fdb[0x1a] | (USHORT)fdb[0x1b]<<8;
							G_USR_TotalDirectory++;
							break;
						}
					}
				 }
                        }
                	break;

		case K_USR_MatchFileType:
			fileType = USR_CheckType(fdb);
			if (fileType == refCon)
                        {
			   match = TRUE;
                        }
			break;
		#if 1
		// TESTTEST, 102502@wyep
		case K_USR_Match_MyFileType:
			if ((fdb[0] != 0xe5) && (fdb[0] != 0x2e) && (fdb[11] != 0x0f))
			{
		        	if (    (fdb[8]  == 'T' || fdb[8]  == 't') && \
		                	(fdb[9]  == 'X' || fdb[9]  == 'x') && \
		                	(fdb[10] == 'T' || fdb[10]  == 't') )
		        		match = TRUE;
			}
			break;
		#endif

        } // end switch

        return match;
}

//-----------------------------------------------------------------------------
//USR_SetDir0Name
//-----------------------------------------------------------------------------
void USR_SetDir0Name(BYTE *name) USING_0
{
        BYTE k;

        for (k = 0; k < 12; k++)
        {
           name[k] = C_USR_Dir0Name[k];
        }
}

//-----------------------------------------------------------------------------
//USR_SetDir1Name
//-----------------------------------------------------------------------------
void USR_SetDir1Name(BYTE *name, WORD count) USING_0
{
        BYTE k;

	for (k = 0; k < 12; k++)
        {
           name[k]  = C_USR_Dir1Name[count][k];
        }
}

//-----------------------------------------------------------------------------
//USR_SetWaveName
//-----------------------------------------------------------------------------
void USR_SetWaveName(BYTE *name, WORD fileIndex) USING_0
{
	//set the file name
	name[0]  = 'R';
	name[1]  = 'E';
	name[2]  = 'C';
	name[3]  = '_';
	name[4]  = '0'+(BYTE)((fileIndex/1000)%10);
	name[5]  = '0'+(BYTE)((fileIndex/100)%10);
	name[6]  = '0'+(BYTE)((fileIndex/10)%10);
	name[7]  = '0'+(BYTE)(fileIndex%10);
        if(_G723==FALSE)  //@@chchang_010303
        {//ADPCM
		name[8]  = 'W';
		name[9]  = 'A';
		name[10] = 'V';
        }
        else
        {//G723
//          DbgPrint("USR_SetWaveName _G723=%bx\n",(BYTE)_G723);
                name[8]  = 'A';
		name[9]  = 'S';
		name[10] = 'F';
        }
	name[11] = 0x20;

	return;
}

//-----------------------------------------------------------------------------
//USR_IsOurDir1Name

⌨️ 快捷键说明

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