#ifdef FILTE_MANAGE_TEST
#include
#include
#include
#include
#define FILEMANAGE_PATH "/mnt/datatest/"
#define FILEMANAGE_FILE_HEAD "test_"
#define FILEMANAGE_ERR_OK (0)
#define FILEMANAGE_ERR_BASE (0x10000000)
#define FILEMANAGE_ERR_INVALID_PARAM (0x00000001 + FILEMANAGE_ERR_BASE)
#define FILEMANAGE_ERR_NULL_POINTER (0x00000002 + FILEMANAGE_ERR_BASE)
#define FILEMANAGE_ERR_PROCESS_FAILED (0x00000003 + FILEMANAGE_ERR_BASE)
#define FILEMANAGE_ERR_NOT_READY (0x00000004 + FILEMANAGE_ERR_BASE)
#define FILEMANAGE_ERR_INIT_FAILED (0x00000005 + FILEMANAGE_ERR_BASE)
#define FILEMANAGE_ERR_ALLOC_MEM_FAIED (0x00000006 + FILEMANAGE_ERR_BASE)
#define FILEMANAGE_ERR_OPEN_FILE_FAILE (0x00000007 + FILEMANAGE_ERR_BASE)
typedef struct {
char riffType[4];
unsigned int riffSize;
char wavType[4];
char formatType[4];
unsigned int formatSize;
unsigned short compressionCode;
unsigned short numChannels;
unsigned int sampleRate;
unsigned int bytesPerSecond;
unsigned short blockAlign;
unsigned short bitsPerSample;
char dataType[4];
unsigned int dataSize;
}WAV_DATA_HEAD;
class CFileManage
{
public:
CFileManage();
~CFileManage();
int OpenFile(char const *pName);
int OpenFile(void);
void CloseFile(void);
int Write(void *pIn, uint32_t size, bool bUser, uint32_t offset);
int Read(void *pOut, uint32_t size, bool bUser, uint32_t offset);
public:
int WavUpdateHead(int sampleRate, int bitWidth, int chanNum, int totalSize);
private:
FILE *mpFd;
};
#endif
#ifdef FILTE_MANAGE_TEST
CFileManage::CFileManage()
{
mpFd = NULL;
}
CFileManage::~CFileManage()
{
CloseFile();
mpFd = NULL;
}
int CFileManage::OpenFile(void)
{
int ret = 0;
struct dirent *dp = NULL;
char *pChr = NULL;
mode_t mode = 0;
uint16_t fileID = 0;
char fileName[50];
DIR *pDir = NULL;
if (mpFd != NULL)
{
log_print(LOG_LEVEL_ERROR, "Param err!\n");
return FILEMANAGE_ERR_INVALID_PARAM;
}
ret = access(FILEMANAGE_PATH, F_OK);
if(ret != 0)
{
mode = umask(0);
mkdir(FILEMANAGE_PATH, 0777);
umask(mode);
sleep(1);
}
pDir = opendir(FILEMANAGE_PATH);
if (pDir == NULL)
{
log_print(LOG_LEVEL_ERROR, "opendir Err!%s\n", strerror(errno));
return FILEMANAGE_ERR_NULL_POINTER;
}
sprintf(fileName, FILEMANAGE_FILE_HEAD);
while(1)
{
dp = readdir(pDir);
if (dp == NULL)
{
break;
}
pChr = strstr(dp->d_name, fileName);
if ((pChr == NULL) || (pChr != dp->d_name))
{
continue;
}
pChr = pChr + strlen(fileName);
if (atoi(pChr) >= fileID)
{
fileID = atoi(pChr);
}
}
fileID++;
sprintf(fileName, "" FILEMANAGE_PATH "" FILEMANAGE_FILE_HEAD "%d", fileID);
mpFd = fopen(fileName, "wb+");
if (mpFd == NULL)
{
log_print(LOG_LEVEL_ERROR, "fopen Err!%s\n", strerror(errno));
return FILEMANAGE_ERR_OPEN_FILE_FAILE;
}
return FILEMANAGE_ERR_OK;
}
int CFileManage::OpenFile(char const *pName)
{
int ret = 0;
mode_t mode = 0;
char fileName[50];
if ((pName == NULL) || (mpFd != NULL))
{
log_print(LOG_LEVEL_ERROR, "Param err!\n");
return FILEMANAGE_ERR_INVALID_PARAM;
}
ret = access(FILEMANAGE_PATH, F_OK);
if(ret != 0)
{
mode = umask(0);
mkdir(FILEMANAGE_PATH, 0777);
umask(mode);
sleep(1);
}
sprintf(fileName, "" FILEMANAGE_PATH "" FILEMANAGE_FILE_HEAD "%s", pName);
mpFd = fopen(fileName, "wb+");
if (mpFd == NULL)
{
log_print(LOG_LEVEL_ERROR, "fopen Err!%s\n", strerror(errno));
return FILEMANAGE_ERR_OPEN_FILE_FAILE;
}
log_print(LOG_LEVEL_INFO, "fopen OK! path:%s\n", fileName);
return FILEMANAGE_ERR_OK;
}
void CFileManage::CloseFile(void)
{
if (mpFd != NULL)
{
fclose(mpFd);
}
return;
}
int CFileManage::Write(void *pIn, uint32_t size, bool bUser, uint32_t offset)
{
size_t ret = 0;
if ((pIn == NULL) || (size == 0) || (mpFd == NULL))
{
log_print(LOG_LEVEL_ERROR, "Param err!\n");
return FILEMANAGE_ERR_INVALID_PARAM;
}
if (bUser == true)
{
fseek(mpFd, offset, SEEK_SET);
}
ret = fwrite(pIn, 1, size, mpFd);
if (ret != size)
{
log_print(LOG_LEVEL_ERROR, "Err!%s\n", strerror(errno));
return FILEMANAGE_ERR_PROCESS_FAILED;
}
fflush(mpFd);
if (bUser == true)
{
fseek(mpFd, 0, SEEK_END);
}
return FILEMANAGE_ERR_OK;
}
int CFileManage::Read(void *pOut, uint32_t size, bool bUser, uint32_t offset)
{
size_t ret = 0;
if ((pOut == NULL) || (size == 0) || (mpFd == NULL))
{
log_print(LOG_LEVEL_ERROR, "Param err!\n");
return FILEMANAGE_ERR_INVALID_PARAM;
}
if (bUser == true)
{
fseek(mpFd, offset, SEEK_SET);
}
ret = fread(pOut, 1, size, mpFd);
if (ret != size)
{
log_print(LOG_LEVEL_ERROR, "Err!%s\n", strerror(errno));
return FILEMANAGE_ERR_PROCESS_FAILED;
}
return FILEMANAGE_ERR_OK;
}
int CFileManage::WavUpdateHead(int sampleRate, int bitWidth, int chanNum, int totalSize)
{
WAV_DATA_HEAD pcm2wavHEAD = {
0};
int err = FILEMANAGE_ERR_OK;
memcpy(pcm2wavHEAD.riffType, "RIFF", strlen("RIFF"));
memcpy(pcm2wavHEAD.wavType, "WAVE", strlen("WAVE"));
pcm2wavHEAD.riffSize = 36 + totalSize;
pcm2wavHEAD.sampleRate = sampleRate;
pcm2wavHEAD.bitsPerSample = bitWidth;
memcpy(pcm2wavHEAD.formatType, "fmt ", strlen("fmt "));
pcm2wavHEAD.formatSize = 16;
pcm2wavHEAD.numChannels = chanNum;
pcm2wavHEAD.blockAlign = 4;
pcm2wavHEAD.compressionCode = 1;
pcm2wavHEAD.bytesPerSecond = sampleRate * bitWidth / 8u * chanNum;
memcpy(pcm2wavHEAD.dataType, "data", strlen("data"));
pcm2wavHEAD.dataSize = totalSize;
err = Write(&pcm2wavHEAD, sizeof(pcm2wavHEAD), true, 0);
if (err != FILEMANAGE_ERR_OK)
{
log_print(LOG_LEVEL_ERROR, "Err!%s\n", strerror(errno));
return FILEMANAGE_ERR_PROCESS_FAILED;
}
return err;
}
#endif