📄 dvr_updown.c
字号:
// =========================================
// 文件名称:DVR_UPDOWN.c
// 功能描述:DVR程序,包括录、放音程序;语音数据的上传、下载
// 库文件: sacmv26e.lib
// 维护记录:modified by liuxue v1.0 2007-03-16
// =========================================
#include "SPCE061A.h"
#include "dvr.h"
#include "4096.h"
#include "D12_Driver.h"
#include "System.h"
// =========================================
// 函数:void Dvr(void)
// 描述:录放音处理
// 参数:无
// 返回:无
// =========================================
void Dvr(void)
{
static unsigned long ulAddr;
unsigned int uiRet;
switch(uiKey)
{
case KEY_NO:
break;
case KEY_REC:
if(uiStatus == RECORD)
{
SACM_DVR_Stop();
}
uiStatus = RECORD;
SP_SIOMassErase();
SACM_DVR_Initial(0); // 手动录音
SACM_DVR_InitQueue(); // 初始化队列
SACM_DVR_InitEncoder(1);// 初始化编码器
ulAddr = START_ADDR;
SpeechFileLength = 0;
break;
case KEY_STOP:
switch(uiStatus)
{
case RECORD:
SACM_DVR_Stop(); // 编码
while(SACM_DVR_TestQueue() != EMPTY) // 录音语音队列是否为空
{
uiRet = SACM_DVR_FetchQueue(); // 从录音队列中取语音资源
SP_SIOSendAWord(ulAddr, uiRet); // 写到FLASH中
ulAddr+=2; // 地址变量加2
SpeechFileLength += 2;
}
break;
case PLAY:
SACM_DVR_Stop();
break;
default:
SACM_DVR_Stop();
break;
}
uiStatus = STOP;
break;
case KEY_PLAY:
SACM_DVR_Stop();
if(uiStatus == RECORD)
{
while(SACM_DVR_TestQueue() != EMPTY)
{
uiRet = SACM_DVR_FetchQueue(); // 从录音队列中取语音资源
SP_SIOSendAWord(ulAddr, uiRet); // 写到FLASH中
ulAddr += 2; // 地址变量加2
SpeechFileLength += 2;
}
}
uiStatus = PLAY;
ulAddr = START_ADDR;
SACM_DVR_InitQueue();
while(SACM_DVR_TestQueue() != FULL)
{
uiRet = SP_SIOReadAWord(ulAddr); // 读FLASH取语音资源
SACM_DVR_FillQueue(uiRet); // 填充语音队列
ulAddr += 2;
if(ulAddr > START_ADDR+SpeechFileLength)
break;
}
SACM_DVR_InitDecoder(3);
break;
default:
break;
}
switch(uiStatus)
{
case RECORD:
SACM_DVR_Encoder();
if(ulAddr < END_ADDR)
{
if(SACM_DVR_TestQueue() != EMPTY)
{
uiRet = SACM_DVR_FetchQueue();
SP_SIOSendAWord(ulAddr, uiRet); // 写到FLASH中
ulAddr += 2;
SpeechFileLength += 2;
}
}
else
{
SACM_DVR_Stop();
while(SACM_DVR_TestQueue() != EMPTY)
{
uiRet = SACM_DVR_FetchQueue();
SP_SIOSendAWord(ulAddr, uiRet); // 写到FLASH中
ulAddr += 2;
SpeechFileLength += 2;
}
uiStatus = STOP;
}
break;
case PLAY:
if(SACM_DVR_TestQueue() != FULL)
{
uiRet = SP_SIOReadAWord(ulAddr); // 读FLASH取语音资源
SACM_DVR_FillQueue(uiRet);
ulAddr += 2;
}
if(SACM_DVR_Status()&0x01)
SACM_DVR_Decoder();
else
{
SACM_DVR_Stop();
uiStatus = STOP;
}
break;
case STOP:
default:
SACM_DVR_Stop();
break;
}
*P_Watchdog_Clear = 0x01;
}
// =========================================
// 函数:void UpLoad(void)
// 描述:每中断一次就调用一次,从FLASH中读取语音数据,并写入D12芯片
// 参数:无
// 返回:无
// =========================================
void UpLoad(void)
{
unsigned int Ret;
unsigned int i = 0;
unsigned int Block = 64;
Leave_Len = SpeechFileLength - (Addr_UpLoad-START_ADDR); // Leave_Len值为偶数
if(Leave_Len <= 64)
{
Block = (unsigned int)Leave_Len;
}
while(i < Block)
{
Ret = SP_SIOReadAWord(Addr_UpLoad);
MainEpBuf[i++] = (Ret & 0x00ff);
Ret >>= 8;
MainEpBuf[i++] = Ret;
Addr_UpLoad += 2;
}
if(Leave_Len > 64)
{
D12_WriteEndpoint(5, 64, MainEpBuf);
}
else
{
D12_WriteEndpoint(5, Block, MainEpBuf);
G_UpLoad_Flag = 0; // over
}
}
// =========================================
// 函数:void DownLoad(void)
// 描述:每中断一次就调用一次,存储PC机下载的数据
// 参数:无
// 返回:无
// =========================================
void DownLoad(void)
{
unsigned int Block = 64;
unsigned int i, TempWord;
Leave_Len = SpeechFileLength - (Addr_UpLoad-START_ADDR);
if(Leave_Len>64)
{
D12_ReadEndpointAndClrD12Int(4, 64, MainEpBuf);
}
else
{
Block = Leave_Len;
D12_ReadEndpointAndClrD12Int(4, Block, MainEpBuf);
}
for(i = 0; i < Block; i += 2 )
{
TempWord = MainEpBuf[i+1] << 8;
TempWord += MainEpBuf[i];
SP_SIOSendAWord(Addr_UpLoad, TempWord);
Addr_UpLoad += 2;
}
if(Block<64)
{
G_UpLoad_Flag = 0; // over
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -