第七章语音播放语音播放一、语音播放接口函数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\include3.将复制的支持文件和语音资源文件添加到工程中①Project→AddtoProject→Files→hardware.asm和hardware.inc②Project→AddtoProject→Resource→d1.24k和ww.24k③Project→setting→link→librarymodules→sacmv26e.lib4.在Resource.asm中添加语音资源索引表//EndTable.publicT_SACM_A2000_SpeechTableT_SACM_A2000_SpeechTable:.dw_RES_ww_24k_SA.dw_RES_d1_24k_SA5.编写语音播放程序三、举例例1:A2000自动语音播放//文件名:A2000_1.c#includespce061a.h#includea2000.hvoidPlaysnd(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]=r1callF_FIQ_Service_SACM_A2000popr1,r4from[SP]reti//文件名:Resouece.asm//EndTable.publicT_SACM_A2000_SpeechTableT_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。#includea2000.h#defineDAC11#defineDAC22#defineRamp_UpDn_Off0#defineRamp_UpDn_On3#defineManual0#defineAuto1#defineFull1#defineEmpty2intmain(){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_FIQF_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]=R1POPR1,R5from[SP]retiL_FIQ_TimerB:[P_INT_Clear]=r1;popr1,r5from[sp];reti;//文件名:ResourceTable//EndTable.PUBLICT_SACM_A2000_SpeechTableT_SACM_A2000_SpeechTable:.DW_RES_A32_16K_A20_SA例3:键控语音自动播放//文件名称:main.c//实现功能:利用A2000格式键控语音播放#includea2000.h#includespce061a.h#defineDAC11#defineDAC22#defineRamp_UpDn_Off0#defineRamp_UpDn_On3#defineManual0#defineAuto1#defineFull1#defineEmpty2intmain(){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.asmswitch(iKey){case0x00:break;case0x01:SACM_A2000_Play(iSpeechIndex,DAC1+DAC2,Ramp_UpDn_On);//语音播放,来自sacmv25.libbreak;case0x02:SACM_A2000_Stop();//停止语音播放,来自sacmv25.libbreak;case0x04:SACM_A2000_Pause();//暂停语音播放,来自sacmv25.libbreak;default:break;}System_ServiceLoop();//键盘扫描,来自key.asmSACM_A2000_ServiceLoop();//获取语音数据并将其填入解码队列}}}//文件名称:isr.asm//实现功能:采用FIQ_TMA(8K)中断实现语音数据队列的填充.includea2000.inc//包含A2000语音库函数的声明.INCLUDEhardware.inc.TEXT.public_FIQF_Get_Resource:_FIQ:pushr1,r5to[sp];r1=C_FIQ_TMA;testr1,