📄 dosusr.c
字号:
#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 + -