凌阳61板学习之七语音播放.docx
- 文档编号:1173632
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:21
- 大小:19.30KB
凌阳61板学习之七语音播放.docx
《凌阳61板学习之七语音播放.docx》由会员分享,可在线阅读,更多相关《凌阳61板学习之七语音播放.docx(21页珍藏版)》请在冰点文库上搜索。
凌阳61板学习之七语音播放
语音播放
一、语音播放接口函数
1.【API格式】voidSACM_A2000_Initial(intInit_Index)
【功能说明】SACM_A2000语音播放之前的初始化。
【参数】Init_Index=0表示手动方式;Init_Index=1则表示自动方式。
【返回值】无
【备注】该函数用于对定时器、中断和DAC等的初始化。
2.【API格式】voidSACM_A2000_ServiceLoop(void)
【功能说明】从资源中获取SACM_A2000语音资料,并将其填入译码队列中。
【参数】无。
【返回值】无。
3.【API格式】voidSACM_A2000_Play(intSpeech_Index,intChannel,intRamp_Set);
【功能说明】播放资源中SACM_A2000语音或乐曲。
【参数】Speech_Index:
表示语音索引号。
Channel:
1.通过DAC1通道播放;2.通过DAC2通道播放;3.通过DAC1和DAC2双通道播放。
Ramp_Set:
0.禁止音量增/减调节;1.仅允许音量增调节;
2.仅允许音量减调节;3.允许音量增/减调节。
4.【API格式】unsignedintSACM_A2000_Status(void);
【功能说明】获取SACM_A2000语音播放的状态。
【参数】无。
【返回值】当R1的bit0=0,表示语音播放结束;bit0=1,表示语音在播放中。
5.【API格式】unsignedintSP_GetCh(void);
【功能说明】获取按键值。
【参数】来自key.asm文件。
【返回值】按键值
6.【API格式】voidSystem_ServiceLoop(void);
【功能说明】键盘扫描与按键去抖。
【参数】来自key.asm文件。
【返回值】无
7.【API格式】voidSystem_Initial(void);
【功能说明】键盘初始化
【参数】来自key.asm文件。
【返回值】无
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(路径如下)。
C:
\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"
#include"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
.publicT_SACM_A2000_SpeechTable
T_SACM_A2000_SpeechTable:
.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。
#include"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
(1)
{while(SACM_A2000_Status()&0x01)
SACM_A2000_ServiceLoop();//获取语音数据并将其填入解码队列
SACM_A2000_Play(iSpeech_index,DAC1,Ramp_UpDn_On);
//定义语音索引号、播放通道、允许音量增/减调节
}
}
}
//文件名称:
isr.asm
//实现功能:
采用FIQ_TMA(8K)中断实现语音数据队列的填充
.includea2000.inc//包含A2000语音库函数的声明
.INCLUDEhardware.inc
.TEXT
.public_FIQ
F_Get_Resource:
_FIQ:
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;
testr1,[P_INT_Ctrl];
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:
[P_INT_Clear]=r1;
popr1,r5from[sp];
reti;
//文件名:
ResourceTable
//EndTable
.PUBLICT_SACM_A2000_SpeechTable
T_SACM_A2000_SpeechTable:
.DW_RES_A32_16K_A20_SA
例3:
键控语音自动播放
//文件名称:
main.c
//实现功能:
利用A2000格式键控语音播放
#include"a2000.h"
#include"spce061a.h"
#defineDAC11
#defineDAC22
#defineRamp_UpDn_Off0
#defineRamp_UpDn_On3
#defineManual0
#defineAuto1
#defineFull1
#defineEmpty2
intmain()
{intiKey=0;//初始化键值
intiSpeechIndex=0;//初始化语音播放序号
intiMode;//语音播放模式,1,自动模式,0,手动模式
iMode=Auto;
if(iMode==Auto)
{System_Initial();
SACM_A2000_Initial(iMode);
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
break;
case0x04:
SACM_A2000_Pause();//暂停语音播放,来自sacmv25.lib
break;
default:
break;
}
System_ServiceLoop();//键盘扫描,来自key.asm
SACM_A2000_ServiceLoop();//获取语音数据并将其填入解码队列
}
}
}
//文件名称:
isr.asm
//实现功能:
采用FIQ_TMA(8K)中断实现语音数据队列的填充
.includea2000.inc//包含A2000语音库函数的声明
.INCLUDEhardware.inc
.TEXT
.public_FIQ
F_Get_Resource:
_FIQ:
pushr1,r5to[sp];
r1=C_FIQ_TMA;
testr1,[P_INT_Ctrl];
jneL_FIQ_TimerA;//TimerAFIQ入口
r1=C_FIQ_TMB;
testr1,[P_INT_Ctrl];
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:
[P_INT_Clear]=r1;
popr1,r5from[sp];
reti;
//文件名:
ResourceTable
//EndTable
.PUBLICT_SACM_A2000_SpeechTable
T_SACM_A2000_SpeechTable:
.DW_RES_A32_16K_A20_SA
例4:
A2000手动语音循环播放。
//文件名称:
main.c
//实现功能:
利用A2000格式手动语音循环播放
#include"a2000.h"
#defineSPEECH_11
#defineDAC11
#defineDAC22
#defineRamp_UpDn_Off0
#defineRamp_UpDn_On3
#defineManual0
#defineAuto1
#defineFull1
#defineEmpty2
externRES_A32_16K_A20_SA;
externRES_A32_16K_A20_EA;
intmain()
{intiMode;
intiAddr;
intiRet;
iMode=Manual;
iAddr=RES_A32_16K_A20_SA;//送入语音队列的首址
if(iMode==Manual)//采用非自动方式播放
{SACM_A2000_Initial(iMode);//非自动方式播放的初始化
SACM_A2000_InitDecoder(DAC1);//开始对A2000的语音数据以非自动方式解码
while
(1)
{if(SACM_A2000_TestQueue()!
=Full)//测试并获取语音队列的状态
{iRet=SP_GetResource(iAddr);//从资源文件里获取一个字型语音数据
SACM_A2000_FillQueue(iRet);
//获取语音编码数据并填入语音队列等候解码
iAddr++;
}
if(iAddr SACM_A2000_Decoder(); //获取资源并进行解码,再通过中断服务子程序送入DAC通道播放。 Else {SACM_A2000_InitDecoder(DAC1); //否则,开始对A2000的语音数据以非自动方式解码。 iAddr=RES_A32_16K_A20_SA;//送入语音队列的首址 } } } } //文件名称: isr.asm //实现功能: 采用FIQ_TMA(8K)中断实现语音数据队列的填充 .includea2000.inc//包含A2000语音库函数的声明 .INCLUDEhardware.inc .TEXT .public_FIQ F_Get_Resource: _FIQ: 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; testr1,[P_INT_Ctrl]; 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: [P_INT_Clear]=r1; popr1,r5from[sp]; reti; *例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 #include"spce061a.h" #include"s480.h" intmain() { 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; while (1) { *P_Watchdog_Clear=0x0001; ikey=*P_IOA_Data; ikey^=0x00ff; ikey=ikey&0x00ff; switch(ikey) { case0x0000: i=0;break; case0x0001: i=1;break; case0x0002: i=2;break; case0x0004: i=3;break; case0x0008: i=4;break; case0x0010: i=5;break; case0x0020: i=6;break; case0x0040: i=7;break; case0x0080: i=8;break; default: i=0;break; } if(i! =0) { *P_IOB_Data=ikey|0x4000; SACM_S480_Initial (1); SACM_S480_Play(i-1,3,3); while((SACM_S480_Status()&0x0001)! =0) { SACM_S480_ServiceLoop(); *P_Watchdog_Clear=0x0001; } SACM_S480_Stop(); } } } //文件名: ISR.asm .includes480.inc//包含A2000语音库函数的声明 .INCLUDEhardware.inc .TEXT .public_FIQ F_Get_Resource: _FIQ: pushr1,r5to[sp]; r1=C_FIQ_TMA; testr1,[P_INT_Ctrl]; jneL_FIQ_TimerA;//TimerAFIQ入口 r1=C_FIQ_TMB; testr1,[P_INT_Ctrl]; 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_S480//填充语音队列 R1=C_FIQ_TMA [P_INT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 凌阳 61 学习 语音 播放