📄 recorder.c
字号:
/****************************************************************
** *
** FILE : Recorder.C *
** *
** By : Cyb 2006.11.29 *
****************************************************************/
#include "includes.h"
#include "errcode.h"
#include "errtask.h"
#include "message.h"
#include "tools.h"
#include "public.h"
#include "timetask.h"
#include "sensor.h"
#include "uart_drv.h"
#include "recorder.h"
#include "audio.h"
#include "portdrv.h"
#include "hardware.h"
/*
********************************************************************************
* 录音过程描述:可以有两种办法启动录音,第一种是通过录音菜单激活,另一种是录音板将
* REC_CON引脚拉低3秒以上。录音启动后,录音板通过REC_INT引脚的负脉冲控制语音段录音,
* 相邻两个负脉冲之间为一语音段。如检测到段停止脉冲后,在15秒内未收到新的录音脉冲,
* 则认为本次录音结束。车台通过快闪绿色指示灯指示录音启动。
********************************************************************************
*/
/*
********************************************************************************
* define config parameters
********************************************************************************
*/
#define PERIOD_MONITOR1 SECOND, 15 /* 如果收到段停止脉冲后,在15秒内未收到录音脉冲,则认为本次录音结束 */
#define PERIOD_MONITOR2 SECOND, 120 /* 每一段语音段的时间不得超过2分钟 */
#define PERIOD_MONITOR3 MINUTE, 3 /* 启动录音后,如3分钟内未检测到录音信号,则终止录音 */
#define _RUN 0x01 /* 表示处于录音状态 */
#define _REC 0x02 /* 表示正在录音中 */
#define LEDPARA_INDICATE1 PORT_LEDGREEN, 15, 1, 1, 0
#define LEDPARA_INDICATE2 PORT_LEDGREEN, 2, 1, 1, 0
/*
********************************************************************************
* define module variants
********************************************************************************
*/
static INT8U status, ct;
static TMR_TSK *monitortmr;
static void MonitorTmrProc(void)
{
StopTmr(monitortmr);
if (status & _RUN) {
status &= ~(_RUN | _REC);
StopAudioOP();
#if DEBUG_UARTNo_RECORD <= 1
PrintFromUART(DEBUG_UARTNo_RECORD, "长时间无录音信号,退出录音!\n");
#endif
if (ct > 0)
{
RecPara.recnum = ct;
StorePubPara(RECPARA_);
}
}
}
static void PrepareRecorder(void)
{
ct = 0;
status |= _RUN;
status &= ~_REC;
StopTmr(monitortmr);
PrepareRecordAudio(); /* 通知底层语音芯片进入录音准备 */
}
static void StartRecorder(void)
{
if (status & _RUN) {
ct++;
status |= _REC;
RecordNextAudio(); /* 开始录音 */
StartFlashPort(LEDPARA_INDICATE2); /* 绿色指示灯急闪指示 */
StartTmr(monitortmr, PERIOD_MONITOR2);
}
}
static void StopRecorder(void)
{
if (status & _RUN)
{
status &= ~_REC;
StopAudioOP(); /* 停止录音 */
StartTmr(monitortmr, PERIOD_MONITOR1);
}
}
void ExitRecorder(void)
{
PrintFromUART(1, "录音结束!\n");
}
static void InitProc(void)
{
#if USEIRQ2 >1
PIO_GetIntStatus(0); /* 清除中断标志 */
PIO_EnableInt(PORT_RECINT); /* 使能录音中断 */
#else
AIC_Int_Enable(AT91C_ID_IRQ2);
#endif
PrepareRecorder();
StartFlashPort(LEDPARA_INDICATE1); /* 绿色指示灯急闪指示 */
StartTmr(monitortmr, PERIOD_MONITOR3);
}
static void CreateRecorder(void)
{
InitProc();
}
void ActivateRecorder(void)
{
#if DEBUG_UARTNo_RECORD <=1
PrintFromUART(DEBUG_UARTNo_RECORD, "录音准备!\n");
#endif
CreateRecorder();
}
void IntToRecorder(void) /* 中断信号开始录音*/
{
if (status & _RUN)
{
if (status & _REC)
{
StopRecorder();
#if DEBUG_UARTNo_RECORD <=1
PrintFromUART(DEBUG_UARTNo_RECORD, "\n段");
SendFromUART_HEX(DEBUG_UARTNo_RECORD,ct);
PrintFromUART(DEBUG_UARTNo_RECORD, "完成\n");
#endif
}
else
{
#if DEBUG_UARTNo_RECORD <=1
PrintFromUART(DEBUG_UARTNo_RECORD, "\n开始录音....");
#endif
StartRecorder();
}
}
}
void InitRecorder(void)
{
status = 0;
#if USEIRQ2 >1
PIO_DisableInt(PORT_RECINT); /* 禁止录音中断 */
#else
AIC_Int_Disable(AT91C_ID_IRQ2);
#endif
monitortmr = CreateTimer(MonitorTmrProc,0);
}
#if USEIRQ2 >1
void InitRECInt(void)
{
INT32U mode;
INT32U mask;
mode = PIO_MODE_INPUT | PIO_MODE_FILTER_ON | PIO_MODE_INPUT_IRQ_ON;
mask = PORT_RECINT;
InitPIO_Int(mask,mode);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -