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

📄 mrecord.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 3 页
字号:
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 + -