凌阳61板学习之七语音播放Word文件下载.docx
- 文档编号:1405112
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:21
- 大小:19.30KB
凌阳61板学习之七语音播放Word文件下载.docx
《凌阳61板学习之七语音播放Word文件下载.docx》由会员分享,可在线阅读,更多相关《凌阳61板学习之七语音播放Word文件下载.docx(21页珍藏版)》请在冰点文库上搜索。
【功能说明】获取按键值。
【参数】来自key.asm文件。
【返回值】按键值
6.【API格式】voidSystem_ServiceLoop(void);
【功能说明】键盘扫描与按键去抖。
7.【API格式】voidSystem_Initial(void);
【功能说明】键盘初始化
【返回值】无
8.【API格式】voidSACM_A2000_InitDecode(intChannel);
【功能说明】开始对SACM_A2000语音资料以非自动方式(编程控制)进行译码。
【参数】Channel=1,2,3;
分别表示使用DAC1、DAC2信道以及DAC1和DAC2双通道。
9.【API格式】voidSACM_A2000_Decode(void);
【功能说明】从语音队列里获取的SACM_A2000语音资料,并进行译码,然后通过中断服务子程序将其送入DAC信道播放。
【备注】用户仅能通过非自动方式对语音资料进行译码。
10.【API格式】voidSACM_A2000_FillQueue(unsignedintencoded-data);
【功能说明】将从用户存储区里获取SACM_A2000语音编码资料,然后将其填入语音队列中等候译码处理。
【参数】encoded-data为语音编码资料。
11.【API格式】unsignedintSACM_A2000_TestQueue(void);
【功能说明】获取语音队列的状态。
【返回值】R1=0,1,2;
分别表示语音队列不空不满,语音队列满及语音队列空。
【备注】用户仅能通过非自动方式测试语音队列状态。
12.【API格式】unsignedintSP_GetResource(intAddr)
【功能说明】获取语音语音资源数据
【参数】Addr语音资源相对应的地址
【返回值】语音资源数据
二、创建语音播放工程
1.创建工程(如:
F:
\CODE\SOUND)
2.复制语音支持文件和语音资源文件到工程所在的文件夹
支持文件:
hardware.inc、hardware.asm、sacmv26e.lib(路径如下)。
C:
\programfile\sunplus\unSpIDECommon\Example\SPCE061A\include及library
语音资源文件:
如d1.24k、ww.24k(路径如下)。
C:
\programfile\sunplus\unSpIDECommon\Example\SPCE061A\example\VoiceExa
\ex1_A2000_Auto\voice\
头文件:
a2000.h、a2000.inc(路径如下)。
\programfile\sunplus\unSpIDECommon\Example\SPCE061A\include
3.将复制的支持文件和语音资源文件添加到工程中
①Project→AddtoProject→Files→hardware.asm和hardware.inc
②Project→AddtoProject→Resource→d1.24k和ww.24k
③Project→setting→link→librarymodules→sacmv26e.lib
4.在Resource.asm中添加语音资源索引表
//EndTable
.publicT_SACM_A2000_SpeechTable
T_SACM_A2000_SpeechTable:
.dw_RES_ww_24k_SA
.dw_RES_d1_24k_SA
5.编写语音播放程序
三、举例
例1:
A2000自动语音播放
//文件名:
A2000_1.c
#include"
spce061a.h"
a2000.h"
voidPlaysnd(intsndindex,intDAC_channel)
{
SACM_A2000_Initial
(1);
SACM_A2000_Play(sndindex,DAC_channel,3);
while((SACM_A2000_Status()&
0x0001)!
=0)
{
SACM_A2000_ServiceLoop();
*P_Watchdog_Clear=0x0001;
}
SACM_A2000_Stop();
}
main()
while
(1)
Playsnd(0,3);
Playsnd(1,3);
ISR.asm
.includehardware.inc
.includea2000.inc
.externalF_FIQ_Service_SACM_A2000
.public_FIQ
.text
_FIQ:
pushr1,r4to[SP]
r1=0x2000
[P_INT_Clear]=r1
callF_FIQ_Service_SACM_A2000
popr1,r4from[SP]
reti
Resouece.asm
//EndTable
.dw_RES_WW_24K_SA
.dw_RES_D1_24K_SA
例2:
A2000自动语音循环播放。
//文件名称:
main.c
//实现功能:
利用A2000格式自动语音循环播放
//涉及的库和文件:
SACMV25.lib;
hardware.asm;
isr.asm;
A2000.inc;
A2000.h。
#defineDAC11
#defineDAC22
#defineRamp_UpDn_Off0
#defineRamp_UpDn_On3
#defineManual0
#defineAuto1
#defineFull1
#defineEmpty2
intmain()
{intiSpeech_index=0;
intiMode;
iMode=Auto;
if(iMode==Auto)//采用自动方式播放
{
SACM_A2000_Initial(iMode);
//自动方式播放初始化
SACM_A2000_Play(iSpeech_index,DAC1,Ramp_UpDn_On);
//定义语音索引号、播放通道、允许音量增/减调节
{while(SACM_A2000_Status()&
0x01)
//获取语音数据并将其填入解码队列
}
}
isr.asm
采用FIQ_TMA(8K)中断实现语音数据队列的填充
.includea2000.inc//包含A2000语音库函数的声明
.INCLUDEhardware.inc
.TEXT
F_Get_Resource:
pushr1,r5to[sp];
r1=0x0001;
[P_Watchdog_Clear]=r1;
r1=C_FIQ_TMA;
testr1,[P_INT_Ctrl];
jneL_FIQ_TimerA;
//TimerAFIQ入口
r1=C_FIQ_TMB;
jneL_FIQ_TimerB;
L_FIQ_PWM:
//PWMFIQ入口
r1=C_FIQ_PWM;
[P_INT_Clear]=r1;
popr1,r5from[sp];
reti;
L_FIQ_TimerA:
CALLF_FIQ_Service_SACM_A2000//填充语音队列
R1=C_FIQ_TMA
[P_INT_Clear]=R1
POPR1,R5from[SP]
reti
L_FIQ_TimerB:
reti;
//文件名:
ResourceTable
.PUBLICT_SACM_A2000_SpeechTable
.DW_RES_A32_16K_A20_SA
例3:
键控语音自动播放
利用A2000格式键控语音播放
{intiKey=0;
//初始化键值
intiSpeechIndex=0;
//初始化语音播放序号
//语音播放模式,1,自动模式,0,手动模式
if(iMode==Auto)
{System_Initial();
SACM_A2000_Play(iSpeechIndex,DAC1+DAC2,Ramp_UpDn_On);
while
(1)
{iKey=SP_GetCh();
//取键值,来自key.asm
switch(iKey)
{case0x00:
break;
case0x01:
SACM_A2000_Play(iSpeechIndex,DAC1+DAC2,Ramp_UpDn_On);
//语音播放,来自sacmv25.lib
break;
case0x02:
SACM_A2000_Stop();
//停止语音播放,来自sacmv25.lib
case0x04:
SACM_A2000_Pause();
//暂停语音播放,来自sacmv25.lib
default:
}
System_ServiceLoop();
//键盘扫描,来自key.asm
SACM_A2000_ServiceLoop();
//获取语音数据并将其填入解码队列
}
}
例4:
A2000手动语音循环播放。
利用A2000格式手动语音循环播放
#defineSPEECH_11
externRES_A32_16K_A20_SA;
externRES_A32_16K_A20_EA;
{intiMode;
intiAddr;
intiRet;
iMode=Manual;
iAddr=RES_A32_16K_A20_SA;
//送入语音队列的首址
if(iMode==Manual)//采用非自动方式播放
{SACM_A2000_Initial(iMode);
//非自动方式播放的初始化
SACM_A2000_InitDecoder(DAC1);
//开始对A2000的语音数据以非自动方式解码
{if(SACM_A2000_TestQueue()!
=Full)//测试并获取语音队列的状态
{iRet=SP_GetResource(iAddr);
//从资源文件里获取一个字型语音数据
SACM_A2000_FillQueue(iRet);
//获取语音编码数据并填入语音队列等候解码
iAddr++;
}
if(iAddr<
RES_A32_16K_A20_EA)//如果该段语音未播完,即未到达末地址时
SACM_A2000_Decoder();
//获取资源并进行解码,再通过中断服务子程序送入DAC通道播放。
Else
{SACM_A2000_InitDecoder(DAC1);
//否则,开始对A2000的语音数据以非自动方式解码。
iAddr=RES_A32_16K_A20_SA;
r1=0x0001;
*例5:
S480语音自动播放:
每按下一个按键,相应的LED灯点亮,同时语音播报对应的数字(1~8)。
硬件连接:
IOA0~7接按键;
IOB0~7接SEG排针;
IOB8~15接DIG排针。
包含文件:
hardware.asm、hardware.inc、ISR.asm(中断服务程序)、Resource.asm(添加播放序列表)、sacmv26e.lib(语音库)、1.72k~8.72k(语音资源)。
a2000_2.c
s480.h"
inti=0;
intikey=0x0000;
*P_IOA_Dir=0x0000;
*P_IOA_Attrib=0x0000;
*P_IOA_Data=0x00ff;
*P_IOB_Dir=0x40ff;
*P_IOB_Attrib=0x40ff;
*P_IOB_Data=0x4000;
ikey=*P_IOA_Data;
ikey^=0x00ff;
ikey=ikey&
0x00ff;
switch(ikey)
{
case0x0000:
i=0;
break;
case0x0001:
i=1;
case0x0002:
i=2;
case0x0004:
i=3;
case0x0008:
i=4;
case0x0010:
i=5;
case0x0020:
i=6;
case0x0040:
i=7;
case0x0080:
i=8;
default:
if(i!
=0)
*P_IOB_Data=ikey|0x4000;
SACM_S480_Initial
(1);
SACM_S480_Play(i-1,3,3);
while((SACM_S480_Status()&
SACM_S480_ServiceLoop();
*P_Watchdog_Clear=0x0001;
SACM_S480_Stop();
.includes480.inc//包含A2000语音库函数的声明
CALLF_FIQ_Service_SACM_S480//填充语音队列
[P_INT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 凌阳 61 学习 语音 播放