📄 recorder.c
字号:
//#ifdef __RECORD_
#include "Recorder.h"
#include "device.h"
#include "my_os_q.h"
#include "task_cfg.h"
#include "drv_disk.h"
#include "fifo.h"
//#include "Recorder_api.h"
void __Recorder_Exceptions(recorder_t *g_recorder_vars, int errtype);
int Recorder_CheckFileName(recorder_t *g_recorder_vars);
void Recorder_InitContrlParm(recorder_t *g_recorder_vars);
bool RecorderDetect();
void _GetFileName(recorder_t *g_recorder_vars);
void _GetRestTime(recorder_t *g_recorder_vars);
unsigned long _GetDiskFreeSize(recorder_t *g_recorder_vars);
int CheckRecInfo(recorder_t *g_recorder_vars);
BYTE RecFileNo = 0;
void RecorderEngine()
{
int result;
INT8U err;
recorder_t g_recorder_vars;
msg_t QStart_In[10];
msg_t QStart_Out[10];
char recDataBuffer[513];
char recADBuffer[1728]; //144*3*2*2
msg_t msg;
msg_t msg_send;
memset(&g_recorder_vars, 0x00, sizeof(recorder_t));
Recorder_InitContrlParm( &g_recorder_vars );
g_recorder_vars.infomation.FifoCntNo = api_open(2, 0x00, 0x0500000);
//api_SetSelMode(g_music_vars.infomation.FifoCntNo, 1, 1);
g_recorder_vars.rec_bitstream.bit_stream = recDataBuffer;
g_recorder_vars.rec_bitstream.pcm_stream = recADBuffer;
CheckRecInfo(&g_recorder_vars);
_GetFileName(&g_recorder_vars);
_GetRestTime(&g_recorder_vars);
Recorder_In = MYOSQCreate(QStart_In, 10);
if( Recorder_Out == 0 )
{
Recorder_Out = MYOSQCreate(QStart_Out, 10);
}
OSSetTaskOwnPtr( (unsigned int *)&g_recorder_vars, RECORDER_ENGINE_ID);
output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
Music_Recode_Open(&g_recorder_vars.rec_bitstream, Recorder_In);
do
{
MYOSQPend(Recorder_In,&msg, 0);
switch(msg.type)
{
case MS_SetInfo:
CheckRecInfo(&g_recorder_vars);
_GetFileName(&g_recorder_vars);
g_recorder_vars.recorder_info.status = record_stop;
msg_send.type = MS_RECORDER;
msg_send.msg.data[0] = MS_GetInfo;
MYOSQPost(Recorder_Out,&msg_send);
break;
// 开始录音或继续录音
case MS_Play:
if(g_recorder_vars.recorder_info.status <= record_stop)
{
char filename[78];
strcpy(filename,g_recorder_vars.infomation.recorder_dir);
strcat(filename,g_recorder_vars.infomation.recorder_filename);
result = api_OpenFile(g_recorder_vars.infomation.FifoCntNo,filename);
if( result < 0)
{
__Recorder_Exceptions(&g_recorder_vars,MS_Recorder_FSErr);
break;
}
g_recorder_vars.infomation.fileflag = TRUE;
Music_Recode_Play(&g_recorder_vars.rec_control_info);
g_recorder_vars.recorder_info.status = record_recording;
}
/*
else if(g_recorder_vars.recorder_info.status == record_wait)
{ //开始录音
if( Music_Recode_Play(&g_recorder_vars.rec_control_info) != TRUE)
{
result = MS_Recorder_DSPErr;
__Recorder_Exceptions(&g_recorder_vars,result);
}
g_recorder_vars.recorder_info.status = record_recording;
}
*/
else if(g_recorder_vars.recorder_info.status == record_pause)// 继续录音
{
g_recorder_vars.recorder_info.status = record_recording;
Music_Recode_Continue();
}
else if(g_recorder_vars.recorder_info.status == record_recording) //暂停录音
{
g_recorder_vars.recorder_info.status = record_pause;
Music_Recode_Pause();
}
else
{
__Recorder_Exceptions(&g_recorder_vars,MS_Recorder_StatusErr);
}
break;
case MS_Stop:
g_recorder_vars.lastOp = MS_Stop;
Music_Recode_stopplay();
break;
case MS_Write:
if(msg.msg.data[0] == 1)
api_WriteFile(g_recorder_vars.infomation.FifoCntNo, g_recorder_vars.rec_bitstream.bit_stream, 512);
else if(msg.msg.data[0] == 2)
{
api_SeekFile(g_recorder_vars.infomation.FifoCntNo, SEEK_SET, 0);
api_WriteFile(g_recorder_vars.infomation.FifoCntNo, g_recorder_vars.rec_bitstream.bit_stream, 512);
}
rec_api_DspToBitstream();
break;
case MS_DSPExit:
if(g_recorder_vars.infomation.fileflag == TRUE)
{
api_CloseFile(g_recorder_vars.infomation.FifoCntNo);
g_recorder_vars.infomation.fileflag == FALSE;
}
if(g_recorder_vars.lastOp == MS_END)
{
g_recorder_vars.recorder_info.status = record_exit;
g_recorder_vars.lastOp = 0;
break;
}
g_recorder_vars.recorder_info.status = record_stop;
RecFileNo ++;
_GetFileName(&g_recorder_vars);
_GetRestTime(&g_recorder_vars);
msg_send.type = MS_RECORDER;
msg_send.msg.data[0] = MS_DSPExit;
MYOSQPost(Recorder_Out,&msg_send);
break;
case MS_DSP_Err:
g_recorder_vars.recorder_info.status = record_err;
if(g_recorder_vars.infomation.fileflag == TRUE)
{
api_CloseFile(g_recorder_vars.infomation.FifoCntNo);
g_recorder_vars.infomation.fileflag == FALSE;
}
break;
case MS_GetTime:
Get_CurrentTime(&g_recorder_vars.recorder_info.current_time);
msg_send.type = MS_RECORDER;
msg_send.msg.data[0] = MS_RedrawInfo;
MYOSQPost(Recorder_Out,&msg_send);
break;
/*
case MS_SETGAIN:// 设置 输入音量的增益
case MS_SETVOR:// 设置 分曲模式
case MS_RECODEMODE:// 设置录音模式
case MS_SETSOURCE:// 设置 resource_t
case MS_SETAUDIOFMT: // 设置 audio_format_t
case MS_GETAUDIOFMT: // 获取 audio_format_t
break;
*/
case MS_END:
if(g_recorder_vars.recorder_info.status >= record_pause)
{
Music_Recode_stopplay();
g_recorder_vars.lastOp = MS_END;
break;
}
else if(g_recorder_vars.recorder_info.status >= record_wait)
{
if(g_recorder_vars.infomation.fileflag == TRUE)
{
api_CloseFile(g_recorder_vars.infomation.FifoCntNo);
g_recorder_vars.infomation.fileflag == FALSE;
}
}
g_recorder_vars.recorder_info.status = record_exit;
break;
default:
__Recorder_Exceptions(&g_recorder_vars,MS_Recorder_UndefineErr);
}
}while(g_recorder_vars.recorder_info.status != record_exit);
if( !Music_Recode_Close())
__Recorder_Exceptions(&g_recorder_vars,MS_Recorder_ReleaseErr);
if(g_recorder_vars.infomation.fileflag == TRUE)
{
api_CloseFile(g_recorder_vars.infomation.FifoCntNo);
g_recorder_vars.infomation.fileflag == FALSE;
}
api_close(g_recorder_vars.infomation.FifoCntNo);
OS_ENTER_CRITICAL();
Recorder_In = MYOSQDel(Recorder_In, OS_DEL_ALWAYS, &err);
Recorder_Out = MYOSQDel(Recorder_Out, OS_DEL_ALWAYS, &err);
Recorder_In = 0;
Recorder_Out = 0;
OS_EXIT_CRITICAL();
while(1)
{
output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
OSTaskDel(OS_PRIO_SELF);
}
}
void __Recorder_Exceptions(recorder_t *g_recorder_vars, int errtype)
{
msg_t msg_send;
msg_send.type = MS_RECORDER;
msg_send.msg.data[0] = errtype;
MYOSQPost(Recorder_Out,&msg_send);
}
void Recorder_InitContrlParm(recorder_t *g_recorder_vars)
{
g_recorder_vars->rec_control_info.source.source_mic = 1;
g_recorder_vars->rec_control_info.rec_type = REC_MP3;
g_recorder_vars->rec_control_info.FsIndex =_FS_8K;
g_recorder_vars->rec_control_info.BTIndex = _BT_32K;
g_recorder_vars->rec_control_info.EncodeMode = STEREO;
g_recorder_vars->rec_control_info.ChannelNum = DUAL_CH;
g_recorder_vars->rec_control_info.gain = DB_0P0;
g_recorder_vars->recorder_info.status = record_stop;
g_recorder_vars->infomation.recorder_dir[0] = '\\';
}
int CheckRecInfo(recorder_t *g_recorder_vars)
{
if( g_recorder_vars->rec_control_info.source.source_dac != 1 \
|| g_recorder_vars->rec_control_info.source.source_fm != 1 \
|| g_recorder_vars->rec_control_info.source.source_linein != 1 \
|| g_recorder_vars->rec_control_info.source.source_mic != 1)
g_recorder_vars->rec_control_info.source.source_mic = 1;
if( g_recorder_vars->rec_control_info.FsIndex > _FS_96K)
g_recorder_vars->rec_control_info.FsIndex = _FS_8K;
if( g_recorder_vars->rec_control_info.BTIndex > _BT_320K)
g_recorder_vars->rec_control_info.BTIndex = _BT_8K;
if( g_recorder_vars->rec_control_info.EncodeMode > NOISE)
g_recorder_vars->rec_control_info.EncodeMode = DUALCHANNEL;
if( g_recorder_vars->rec_control_info.ChannelNum != SINGLE_CH)
g_recorder_vars->rec_control_info.ChannelNum = DUAL_CH;
if( g_recorder_vars->rec_control_info.gain > DB_3P0)
g_recorder_vars->rec_control_info.gain = DB_N7P5;
}
void _GetFileName(recorder_t *g_recorder_vars)
{
int result;
FS_FILE *fp;
char filename[78];
FS_DIR *dirent;
if( (dirent = FS_OpenDir(g_recorder_vars->infomation.recorder_dir)) == NULL)
{
g_recorder_vars->infomation.recorder_dir[0] = '\\';
g_recorder_vars->infomation.recorder_dir[1] = 0;
}
else
FS_CloseDir(dirent);
g_recorder_vars->infomation.recorder_filename[0] = 'R';
g_recorder_vars->infomation.recorder_filename[1] = 'E';
g_recorder_vars->infomation.recorder_filename[2] = 'C';
g_recorder_vars->infomation.recorder_filename[3] = ( RecFileNo / 100 ) + '0';
g_recorder_vars->infomation.recorder_filename[4] = ( RecFileNo % 100 / 10 ) + '0';
g_recorder_vars->infomation.recorder_filename[5] = ( RecFileNo % 10 ) + '0';
g_recorder_vars->infomation.recorder_filename[6] = '.';
switch(g_recorder_vars->rec_control_info.rec_type)
{
case REC_ADPCM:
case REC_WAV:
g_recorder_vars->infomation.recorder_filename[7] = 'W';
g_recorder_vars->infomation.recorder_filename[8] = 'A';
g_recorder_vars->infomation.recorder_filename[9] = 'V';
break;
case REC_MP3:
g_recorder_vars->infomation.recorder_filename[7] = 'M';
g_recorder_vars->infomation.recorder_filename[8] = 'P';
g_recorder_vars->infomation.recorder_filename[9] = '3';
break;
case REC_AG8:
default:
g_recorder_vars->infomation.recorder_filename[7] = 'A';
g_recorder_vars->infomation.recorder_filename[8] = 'C';
g_recorder_vars->infomation.recorder_filename[9] = 'T';
break;
}
g_recorder_vars->infomation.recorder_filename[10] = 0;
for(;;)
{
strcpy(filename,g_recorder_vars->infomation.recorder_dir);
strcat(filename,g_recorder_vars->infomation.recorder_filename);
if( (fp = FS_FOpen(filename, "rb")) == NULL)
break;
FS_FClose(fp);
RecFileNo ++;
g_recorder_vars->infomation.recorder_filename[3] = ( RecFileNo / 100 ) + '0';
g_recorder_vars->infomation.recorder_filename[4] = ( RecFileNo % 100 / 10 ) + '0';
g_recorder_vars->infomation.recorder_filename[5] = ( RecFileNo % 10 ) + '0';
}
}
void _GetRestTime(recorder_t *g_recorder_vars)
{
unsigned long free_size;
free_size = _GetDiskFreeSize(g_recorder_vars);
free_size = (free_size << 3) / g_recorder_vars->rec_control_info.BTIndex;
g_recorder_vars->restTime.hour = free_size / 3600;
free_size = free_size % 3600;
g_recorder_vars->restTime.minute = free_size / 60;
g_recorder_vars->restTime.second = free_size % 60;
}
unsigned long _GetDiskFreeSize(recorder_t *g_recorder_vars)
{
//return FS_GetSpace( pDevInfo[RecordTaskVars->recorder_vars->device_no].devname, 1 );
return (*pDevInfo).devvolume - (*pDevInfo).devvolOffset;
}//RecordTaskVars->recorder_vars->device_no
//#endif /*__RECORD_*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -