📄 speech.c
字号:
//========================================================
// 文件名称: Speech.c
// 功能描述: busbroadcast.spj工程播放语音的文件
// 维护记录: 2005-12-07 v1.0
//========================================================
#include "spce061a.h"
#include "S480.h"
#include "a2000.h"
#include "spr4096_user.h"
#include "key.h"
#define BASE_START_ADDRESS 0x0012
#define BASE_END_ADDRESS 0x0016
#define S480_HEAD 0x0030
//========================================================
// 语法格式: void Delay(unsigned int uitime)
// 实现功能: 延时
// 参数: 延时时间
// 返回值: 无
//========================================================
void Delay(unsigned int uitime)
{
while(uitime > 0)
{
uitime--;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
}
}
//========================================================
// 语法格式: void PlaySnd_S480(unsigned int SndIndex,unsigned int DAC_Channal)
// 实现功能: S480放音函数
// 参数: SndIndex:语音放音序号
// DAC_Channal:选择DA通道
// 返回值: 无
//========================================================
void PlaySnd_S480(unsigned int SndIndex,unsigned int DAC_Channal)
{
unsigned int uiStatus; //语音播放状态
unsigned int uiRet; //语音资源数据
unsigned int uiKey; //键盘值
unsigned long ulCon_AddrHighest;
unsigned long ulCon_AddrHigh;
unsigned long ulCon_AddrLow;
unsigned long ulCon_AddrLowest;
unsigned long ulCon_StartAddr; //语音地址
unsigned long ulCon_EndAddr;
ulCon_AddrHighest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12); //第一个播放文件地址
ulCon_AddrHighest = ulCon_AddrHighest << 24;
ulCon_AddrHigh = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12 + 1);
ulCon_AddrHigh = ulCon_AddrHigh << 16;
ulCon_AddrLow = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12 + 2);
ulCon_AddrLow = ulCon_AddrLow << 8;
ulCon_AddrLowest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12 + 3);
ulCon_StartAddr = ulCon_AddrHighest | ulCon_AddrHigh
| ulCon_AddrLow | ulCon_AddrLowest;
ulCon_StartAddr = ulCon_StartAddr + S480_HEAD; //如果有文件头,将文件头去掉
ulCon_AddrHighest = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12);
ulCon_AddrHighest = ulCon_AddrHighest << 24;
ulCon_AddrHigh = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12 + 1);
ulCon_AddrHigh = ulCon_AddrHigh << 16;
ulCon_AddrLow = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12 + 2);
ulCon_AddrLow = ulCon_AddrLow << 8;
ulCon_AddrLowest = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12 + 3);
ulCon_EndAddr = ulCon_AddrHighest | ulCon_AddrHigh
| ulCon_AddrLow | ulCon_AddrLowest;
ulCon_EndAddr += 0x005f; //结束地址,加入余量将声音播完整
SACM_S480_Initial(0);
SACM_S480_InitQueue();
SACM_S480_InitDecoder(DAC_Channal);
uiStatus = 1;
while(uiStatus)
{
while(SACM_S480_TestQueue() != 1)
{
if(ulCon_StartAddr >= ulCon_EndAddr)
{
uiStatus = 0;
break;
}
uiRet = SP_SIOReadAWord(ulCon_StartAddr);
SACM_S480_FillQueue(uiRet);
ulCon_StartAddr++;
ulCon_StartAddr++;
}
if(uiStatus)
{
SACM_S480_Decoder();
}
else
{
SACM_S480_Stop();
}
uiKey = Key_Get();
if(uiKey != 0)
{
uiStatus = 0;
SACM_S480_Stop();
}
*(unsigned int *)0x7012 = 0x0001;
}
}
//========================================================
// 语法格式: void NextStation(unsigned int Num)
// 实现功能: 语音提示下一站
// 参数: SndIndex:语音放音序号
// 返回值: 无
//========================================================
void NextStation(unsigned int Num)
{
PlaySnd_S480(16,3); //下一站
if((Num == 16)||(Num == 0))
{
PlaySnd_S480(20,3); //终点站
}
Delay(0xffff); //延时,语句间的停顿
PlaySnd_S480(Num + 25,3); //站名
Delay(0xffff);
PlaySnd_S480(17,3); //请下车的乘客带好物品
}
//========================================================
// 语法格式: void ComingStation(unsigned int uiNum)
// 实现功能: 语音提示下一站
// 参数: SndIndex:语音放音序号
// 返回值: 无
//========================================================
void ComingStation(unsigned int uiNum)
{
PlaySnd_S480(69,3);
Delay(0xffff);
PlaySnd_S480(18,3);
Delay(0xffff);
PlaySnd_S480(uiNum + 25,3);
PlaySnd_S480(19,3);
Delay(0xffff);
if((uiNum == 16)||(uiNum == 0))
{
PlaySnd_S480(21,3); //再见
}
}
//========================================================
// 语法格式: void PlaySnd_A2000(unsigned int SndIndex,unsigned int DAC_Channal)
// 实现功能: A2000放音函数
// 参数: SndIndex:语音放音序号
// DAC_Channal:选择DA通道
// 返回值: 无
//========================================================
void PlaySnd_A2000(unsigned int SndIndex,unsigned int DAC_Channal)
{
unsigned int uiStatus; // 语音播放状态
unsigned int uiRet; // 存储语音资源
unsigned long ulCon_AddrHighest; // 语音资源的最高字节地址
unsigned long ulCon_AddrHigh; // 语音资源的高字节地址
unsigned long ulCon_AddrLow; // 语音资源的低字节地址
unsigned long ulCon_AddrLowest; // 语音资源的最低字节地址
unsigned long ulCon_EndAddr; // 语音资源的末地址
unsigned long ulCon_StartAddr;
unsigned int uiKey;
ulCon_AddrHighest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12); // 第一个播放文件地址
ulCon_AddrHighest = ulCon_AddrHighest << 24;
ulCon_AddrHigh = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+1);
ulCon_AddrHigh = ulCon_AddrHigh << 16;
ulCon_AddrLow = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+2);
ulCon_AddrLow = ulCon_AddrLow << 8;
ulCon_AddrLowest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+3);
ulCon_StartAddr = ulCon_AddrHighest | ulCon_AddrHigh // 开始地址
| ulCon_AddrLow | ulCon_AddrLowest;
ulCon_AddrHighest = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12);
ulCon_AddrHighest = ulCon_AddrHighest << 24;
ulCon_AddrHigh = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12+1);
ulCon_AddrHigh = ulCon_AddrHigh << 16;
ulCon_AddrLow = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12+2);
ulCon_AddrLow = ulCon_AddrLow << 8;
ulCon_AddrLowest = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12+3);
ulCon_EndAddr = ulCon_AddrHighest | ulCon_AddrHigh // 结束地址
| ulCon_AddrLow | ulCon_AddrLowest;
SACM_A2000_Initial(0); //初始化放音
SACM_A2000_InitQueue(); //初始化队列
SACM_A2000_InitDecoder(DAC_Channal); //初始化解码
uiStatus = 1; //初始化放音状态
while(uiStatus)
{
while(SACM_A2000_TestQueue() != 1) //解码队列是否为空
{
if(ulCon_StartAddr >= ulCon_EndAddr) //文件结束?
{
uiStatus = 0; //如果文件结束,结束放音
break;
}
uiRet = SP_SIOReadAWord(ulCon_StartAddr);//取得语音资源
SACM_A2000_FillQueue(uiRet); //填充解码队列
ulCon_StartAddr++; //移动资源指针
ulCon_StartAddr++;
}
if(uiStatus) //解码
{
SACM_A2000_Decoder();
}
else //停止放音
{
SACM_A2000_Stop();
}
uiKey = Key_Get();
if(uiKey != 0)
uiStatus = 0;
*(unsigned int *)0x7012 = 0x0001;
}
}
//========================================================
// 语法格式: void Broadcast(unsigned int Num)
// 实现功能: 播放公交车整体线路
// 参数: 公交线路,本例只有一条
// 返回值: 无
//========================================================
void Broadcast(unsigned int Num)
{
if(Num == 52)
{
PlaySnd_S480(22,3); //欢迎乘坐52路公共汽车,本车沿途停靠
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(25,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(26,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(27,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(28,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(29,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(30,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(31,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(32,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(33,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(34,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(35,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(36,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(37,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(38,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(39,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(40,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(41,3);
Delay(0xffff);
Delay(0xffff);
Delay(0xffff);
PlaySnd_S480(23,3);
PlaySnd_S480(24,3);
PlaySnd_S480(67,3);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -