📄 mrecord.c
字号:
Name: REC_GetMpegMode(void)
Desc: ////
Param:
Return:
Global:
Note:
Author: fsh
Log:
******************************************************/
unsigned char REC_GetMpegMode(void)
{
return gMpegMode;
}
/*****************************************************
Name: REC_SetMpegMode(void)
Desc: ////
Param:
Return:
Global:
Note:
Author: fsh
Log:
******************************************************/
void REC_SetMpegMode(unsigned char ucNewMpegMode)
{
gMpegMode = ucNewMpegMode;
}
volatile unsigned char DMABufferEmpty = 1;
void AudioInputBufSwitch(void)
{
#ifdef BOARD
short* InputtBuf;
InputtBuf = &AudioIOBuf.PCMBuf[AudioIOBuf.gAudioOutBufIndex*AUDIO_OUT_BUF_LEN];
DmaTransmit(AUDIO_DMACHANNEL,
(UINT32)RegI2s_RXR,
(UINT32)InputtBuf,
(UINT32)AudioIOBuf.lPCMLength,
(UINT32)DmaI2sRecordCopy,
(DMACallBack)Audio_RecISR);
DMABufferEmpty = 0;
if (++AudioIOBuf.gAudioOutBufIndex >= AUDIO_OUT_BUF_NUM)
AudioIOBuf.gAudioOutBufIndex = 0;
#endif
}
void Audio_RecISR(void)
{
#ifdef BOARD
DMABufferEmpty = 1; /* buffer 空 */
if (REC_Flag == RECORD_BEING)
{
AudioInputBufSwitch();
RockOSSendMsg(MBAUDIO, AS_ISRAU_TSRecDMAIntInd, (void*)NULL);
}
#endif
}
void Audio_RecordPause(void)
{
#ifdef BOARD
I2sStop();
HDMA_Stop(0);
#endif
}
void Audio_RecordResume(void)
{
#ifdef BOARD
I2sStart(I2S_Start_Rx);
AudioInputBufSwitch();
#endif
}
/*****************************************************
Name: REC_StartRecord(void)
Desc: Start Record
Param:
Return:
Global:
Note:
Author: fsh
Log:
******************************************************/
extern WINDOW* WIN_MAIN;
extern WINDOW* WIN_BOX;
extern unsigned char WriteFileSign;
extern char RecFileNameLong[];
extern MY_FILE *gFileHandleOfRecord;
#if ROCK_CAMERA
int DVREC_Prepare(void)
{
unsigned long ulSampleRate;
pCurDvAudioOutputBuf = &RecordWriteBuf[0];
curDvAudioOutputBufLen = 0;
RecordWriteIndex = 0;
SendFirstBufSign = 0;
SendSecondBufSign = 0;
DMABufferEmpty = 1;
MenuRecMode = ADPCM_DVREC_SETTING_65;
REC_SetRecordVariable();
CreateDvTrack();
CodecMode = ENCODING;
AudioIOBuf.gAudioOutBufIndex=0;
AudioIOBuf.gAudioDecoderIndex=AUDIO_OUT_BUF_NUM-1;
memset(AudioIOBuf.PCMBuf,0,AUDIO_OUT_BUF_NUM*AUDIO_OUT_BUF_LEN*2);
CodecGetSampleRate(&ulSampleRate);
Codec_SetSampleRate(ulSampleRate);
CodecGetCaptureBuffer(&AudioIOBuf.EncBufL,&AudioIOBuf.EncBufR,(long*)&AudioIOBuf.lPCMLength);//获取到需要输入到PCM编码的BUFFER中
Codec_SetMode(Codec_MICAdc);//Codec_MICAdc);
I2sStart(I2S_Start_Rx);
REC_Flag = RECORD_BEING;
AudioInputBufSwitch();
return TRUE;
}
int DVRECEncodeProcess(unsigned long *dvtime)
{
unsigned long ulTime;
int i;
short *EncPcmBuff;
short * pLeft, *pRight;
if (AudioIOBuf.gAudioOutBufIndex==AudioIOBuf.gAudioDecoderIndex)
return 0;
EncPcmBuff=&AudioIOBuf.PCMBuf[AudioIOBuf.gAudioDecoderIndex*AUDIO_OUT_BUF_LEN];
AudioIOBuf.gAudioDecoderIndex++;
if (AudioIOBuf.gAudioDecoderIndex>=AUDIO_OUT_BUF_NUM)
AudioIOBuf.gAudioDecoderIndex = 0;
#if 0
for (i=0;i<AudioIOBuf.lPCMLength;i++)
{
AudioIOBuf.EncBufL[i]=EncPcmBuff[2*i];
AudioIOBuf.EncBufR[i]=EncPcmBuff[2*i+1];
}
#else
pLeft = AudioIOBuf.EncBufL;
pRight = AudioIOBuf.EncBufR;
i = AudioIOBuf.lPCMLength;
while (i--)
{
*pLeft++ = *EncPcmBuff++;
*pRight++ = *EncPcmBuff++;
}
#endif
if (CodecDvEncode() == 0)
{
REC_RecordStop();
CurrRecordTime = 0;
return 2;
}
else
{
CodecGetStoreTime(dvtime);
if (SendFirstBufSign)
{
RockOSSendMsg( MBDISP, AS_GUVI_DVAudioWrite, &RecordWriteBuf[0]);
SendFirstBufSign=0;
}
else if (SendSecondBufSign)
{
RockOSSendMsg( MBDISP, AS_GUVI_DVAudioWrite, &RecordWriteBuf[REC_WRITE_BUF_LEN]);
SendSecondBufSign=0;
}
}
return 1;
}
int DVRecEnd(void )
{
I2sStop();
HDMA_Stop(0);
return 1;
}
#endif
unsigned char REC_Prepare(void)
{
int RetVal;
CurrRecordTime = 0;
FreeSize = 0;
RemainTime = 0;
TotalSize = 0;
REC_Flag = RECORD_PREPARE;
REC_Error_Flag = 0;
REC_SaveFlag = 0;
RecordWriteIndex = 0;
SendFirstBufSign = 0;
SendSecondBufSign = 0;
DMABufferEmpty = 1;
REC_SetRecordVariable(); //根据菜单的选择处理,初始化相关变量
REC_GetRemainTime(1); /* 获得磁盘总容量 */
if (RemainTime <= 0)
{
RockOSSendMsg(MBGUI, AS_GUAU_RecErro, (void*)(RECORD_DISKFULL | (RECORD_DISKFULL_CREATE << 16))); /* 磁盘空间满提示 */
return FALSE;
}
#ifdef BOARD
RetVal = CreateTrack();
if (RetVal == 0)
{
RockOSSendMsg(MBGUI, AS_GUAU_RecErro, (void*)RECORD_FILECREATE_ERRO); /* 磁盘空间满提示 */ /* 文件创建失败提示 */
return FALSE;
}
#endif
RockOSSendMsg(MBGUI, AS_GUAU_RecUpData, NULL);
return TRUE;
}
extern unsigned char ADPCM_Hdr[];
unsigned char REC_StartRecord(void)
{
int RetVal;
unsigned char ucRecInput;
unsigned long ulSampleRate;
#ifdef BOARD
if (WriteFileSign)
{
gFileHandleOfRecord = (MY_FILE *)RKFSFileOpen(RecFileNameLong, "wb");
if (!gFileHandleOfRecord)
{
RockOSSendMsg(MBGUI, AS_GUAU_RecErro, (void*)RECORD_FILECREATE_ERRO);
return FALSE;
}
WriteFileSign = 0;
}
// RockOSSendMsg( MBDISP, AS_GUAU_RECORDWRITEHEAD, NULL);
if (90 != FS_fwrite(&ADPCM_Hdr[0], 1, 90, gFileHandleOfRecord))
return FALSE;
//--------------------------------------------------------------------------
CodecMode = ENCODING;
AudioIOBuf.gAudioOutBufIndex = 0;
AudioIOBuf.gAudioDecoderIndex = AUDIO_OUT_BUF_NUM - 1;
memset(AudioIOBuf.PCMBuf, 0, AUDIO_OUT_BUF_NUM*AUDIO_OUT_BUF_LEN*2);
CodecGetSampleRate(&ulSampleRate);
Codec_SetSampleRate(ulSampleRate);
CodecGetCaptureBuffer(&AudioIOBuf.EncBufL, &AudioIOBuf.EncBufR, (long*)&AudioIOBuf.lPCMLength);//获取到需要输入到PCM编码的BUFFER中
ucRecInput = REC_GetCurrRecInput();
if (ucRecInput == VOICE_REC)
{
PMU_EnterModule(PMU_RECORDADPCM);
Codec_SetMode(Codec_MICAdc);//Codec_MICAdc);
}
else if (ucRecInput == LINEIN_REC)
{
PMU_EnterModule(PMU_RECORDMP3);
Codec_SetMode(Codec_LineADC);
}
else if (ucRecInput == FM_REC)
{
PMU_EnterModule(PMU_RECORDADPCM);
Codec_SetMode(Codec_FMADC);
}
I2sStart(I2S_Start_Rx);
AudioInputBufSwitch();
return TRUE;
#endif
}
/*****************************************************
Name: REC_RecordStop(void)
Desc: Stop Record
Param:
Return:
Global:
Note:
Author: fsh
Log:
******************************************************/
void REC_RecordStop(void)
{
//一些硬件控制处理
if (RemainTime > CurrRecordTime)
RemainTime -= CurrRecordTime;
else
RemainTime = 0;
}
/*****************************************************
Name: ModeRecordInit(void)
Desc: ???
Param:
Return:
Global:
Note:
Author: fsh
Log:
******************************************************/
int ModeRecordInit(void)
{
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////
/*****************************************************
Name: EncodeProcess(void)
Desc: Recording
Param:
Return:
Global:
Note:
Author: fsh
Log:
******************************************************/
//short DownPcm[1024*512];
//int DownNum=0;
extern BOOL Buf1Full;
unsigned long EncodeTime;
int EncodeProcess(void)
{
#if 1
#ifdef BOARD
unsigned long ulTime;
short i;
short *EncPcmBuff;
if (AudioIOBuf.gAudioOutBufIndex == AudioIOBuf.gAudioDecoderIndex)
return 0;
EncPcmBuff = &AudioIOBuf.PCMBuf[AudioIOBuf.gAudioDecoderIndex*AUDIO_OUT_BUF_LEN];
AudioIOBuf.gAudioDecoderIndex++;
if (AudioIOBuf.gAudioDecoderIndex >= AUDIO_OUT_BUF_NUM)
AudioIOBuf.gAudioDecoderIndex = 0;
for (i = 0;i < AudioIOBuf.lPCMLength;i++)
{
AudioIOBuf.EncBufL[i] = EncPcmBuff[2*i];
AudioIOBuf.EncBufR[i] = EncPcmBuff[2*i+1]; /* 如果转换后MP3双声道有问题 */
}
//-----------------------------------------------------
//return 1;
if (CodecEncode() == 0)
{
REC_RecordStop();
CurrRecordTime = 0;
return -1;
}
else
{
#if 1
if (REC_Flag == RECORD_BEING)
{
#ifdef MP3_ENC_INCLUDE
CodecGetTime(&ulTime);
#endif
#if defined(ADPCM_ENC_INCLUDE)||defined(PCM_ENC_INCLUDE)
CodecGetStoreTime(&ulTime);
EncodeTime = ulTime / 1000;
if (ulTime % 1000)
EncodeTime ++;
#endif
if ((unsigned long)(EncodeTime) != CurrRecordTime)
{
CurrRecordTime = (unsigned long)(EncodeTime);
RockOSSendMsg(MBGUI, AS_GUAU_RecUpData, NULL);
}
if (SendFirstBufSign)
{
//RockOSSendMsg( MBDISP, AS_GUAU_RECORDWRITE, &RecordWriteBuf[0]);
//RockOSSendMsg( MBGUI, AS_GUAU_RECORDWRITE, &RecordWriteBuf[0]);
RockOSSendMsg(MBDISP, AS_GUAU_RECORDWRITE, &RecordWriteBuf[0]);
SendFirstBufSign = 0;
}
else if (SendSecondBufSign)
{
//RockOSSendMsg( MBDISP, AS_GUAU_RECORDWRITE, &RecordWriteBuf[REC_WRITE_BUF_LEN]);
//RockOSSendMsg( MBGUI, AS_GUAU_RECORDWRITE, &RecordWriteBuf[REC_WRITE_BUF_LEN]);
RockOSSendMsg(MBDISP, AS_GUAU_RECORDWRITE, &RecordWriteBuf[REC_WRITE_BUF_LEN]);
SendSecondBufSign = 0;
}
if ((long)(RemainTime - CurrRecordTime) <= 0)
{
REC_RecordStop();
REC_Flag = RECORD_ERROR;
RockOSSendMsg(MBGUI, AS_GUAU_RecErro, (void*)(RECORD_DISKFULL | (RECORD_DISKFULL_BEING << 16))); /* 磁盘空间满提示 */
return -1;
}
}
#endif
}
return 1;
#endif
#endif
}
////////////////////////////////////////////////////////////////////////////////////////////
/*****************************************************
Name: REC_SetRecordVariable(void)
Desc: Select a kind of encoding .//pcm,adpcm,mp3...
Param:
Return:
Global:
Note:
Author: fsh
Log:
******************************************************/
void REC_SetRecordVariable(void)
{
switch (MenuRecMode)
{
#ifdef PCM_ENC_INCLUDE
case PCM_REC_SETTING_128:
gBitrate = 128;
gSamplingFreq = 8000; // 44.1KHz
gMpegMode = 1; //
gChannel = 1; // mono
thePresentCodec = 1;
break;
case PCM_REC_SETTING_177:
gBitrate = 177;
gSamplingFreq = 11025; // 32KHz
gMpegMode = 1; //
gChannel = 1; // stereo
thePresentCodec = 1;
break;
case PCM_REC_SETTING_256:
gBitrate = 256;
gSamplingFreq = 8000; // 44.1KHz
gMpegMode = 1; //
gChannel = 2; // mono
thePresentCodec = 1;
break;
case PCM_REC_SETTING_356:
gBitrate = 356;
gSamplingFreq = 11025; // 32KHz
gMpegMode = 1; //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -