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

📄 recorder.c

📁 Actions ucOS-II mp3方案源码,可以做参考
💻 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 + -