计算机应用
Computer Applications
1999年 第19卷 第7期  Vol.19 No.7 1999



基于事件驱动状态机的多线语音应用程序设计
刘宝旨

　　摘　要　本文介绍了事件驱动状态机的工作原理，在此基础上，给出了一种多线语音应用程序设计方案。
　　关键词　计算机电话集成，状态机，多任务函数
　　
MULTI-LINE SPEECH APPLICATION PROGRAM DESIGN
BASED ON THE EVENT-DRIVEN STATE MACHINE

Liu Baozhi
Computer Center, Shandong Jining Medical College, Shandong*Jining 272113
　　Abstract　This article introduces the work principle of the event-driven state machine. Based on it, this article gives a kind of means about the multi-line speech application program design.
　　Keywords　Computer telephone integrate, State machine, Multi-task function

1　引言
　　进入九十年代,计算机声讯服务迅速发展，计算机电话集成（CTI）［1］技术应运而生。在我国,计算机声讯服务系统的研究分为两类［2］：一类是以硬件为主的计算机电话语音卡的开发和研制;另一类是以软件为主的高级开发平台及应用程序的研究。本文介绍的一种声讯服务系统的实现方法则属于第二类。

2　状态机
　　在声讯系统中，常采用有限状态机模式［3］来实现各种功能。状态机是一个事件驱动的程序模型，其处理条件和相关动作的逻辑都被定义在一个表中，该表描述了应用程序中所有可能的处理状态及驱使应用程序从一个状态转到另一状态的事件。
2.1　状态及其类型
　　状态是有限状态机在某一时刻的状况，它是由状态表给出的。系统给出与功能相适应的完整的状态图，它与事件表一起，使系统得以运转。
　　在有限状态机中，每一个状态有两种过程：一种CURRENT状态过程，准备状态正常工作的环境和条件，并将evtcode 返回给主控函数，完成状态转移等。另一种NEXT状态过程，执行该状态对应函数，实现语音处理功能，并将errcode 返回给主控函数。其形式化描述如下：　　
struct state
{
int process();/*状态处理器函数、状态转移*/
int next();
/*完成初始化（RWB重新赋值）、基本语音操作处理*/
}

　　状态类型分为:语音处理状态(比如放音、录音、访问数据库等)、信令状态(对应系统处于收发信令的状态，如摘机、挂机等)及其它状态 (如空闲状态)。
　　用户可根据应用系统功能的扩展随时向有限自动状态机增加状态，如：语音信箱、传真信箱、设置密码访问权限等。
2.2　事件及其类型
　　事件是系统的外部输入信号或内部驱动信号。事件类型有：
　　自然事件：系统运行中自然发生的事件。例如，语音播放结束，摘机/挂机完成等引起的事件。
　　程序事件：描述程序执行过程中执行结束返回的状态，以利于系统进行异常处理、状态跳转等功能。例如：有效/无效的访问，关键码达到最大录音时间等。
　　中断事件：键盘中断事件、通信设备中断事件等。
　　用户自定义事件：用户根据需要自己定义的事件。可由函数putevt()将用户自定义事件加入到事件队列中来完成。　　
3　多线语音应用程序设计原理
3.1　事件队列、事件表
　　事件队列用来识别和响应同时在多个通道上发生的行为。它就象一个管道,多个来源的事件流进同一管道。事件队列为每一个事件提供一个独特的位置，同时还保存最近发生事件的历史记录，从而允许应用程序处理同时发生在多个通道上的事件。
　　事件队列的操作基于FIFO。当应用程序使用gtevtblk()函数从事件队列中读一个事件时，最早的事件从事件队列中移出并且被置入事件块EVTBLK。EVTBLK是一个数据结构，它用来保存一个来自于事件队列的事件。
　　事件队列记录了来自于驱动程序的事件。应用程序通过设备类型、板号、事件发生的通道号来识别事件，并通过调用gtevtblk()函数以及时的方式连续地服务于事件队列。快速地处理事件以便应用程序对用户的输入保持响应是很重要的。
　　事件表给出了系统可能发生的各种事件，从而保证了整个状态机正常、连续、稳定地运行。
3.2　状态转移表
　　状态的转移是由相关事件驱动的。在状态转移表中，每一个状态都规定了其基于的事件发生后状态机转向的另一个状态，如果发生的事件与第一状态不存在逻辑关系，状态转移表的下一个状态将统一被看作一固定的错误状态来处理。状态转移表举例如下：
　　current state　　　　event　　　　　　　　next state
　　Play Message　　　Rings Received　　　　　Error
　　　　　　　　　　Off-hook Completed　　　Error
　　　　　　　　　　Line Disconnect　　　　　Go On-hook
　　　　　　　　　　End of File on Play　　　　Line Idle
　　　　　　　　　　...　　　　　　　　　　...
　　
3.3　多任务函数
　　多任务函数及其实现:多线语音应用程序能同时在多通道上执行任务，其执行并发操作的能力是由语音软件的多任务函数实现的。当多任务函数被调用时，他会返回控制权给程序以便在从执行函数到完成的这段时间里，应用程序能同时执行其它操作 ，比如，开始执行一个其它通道的函数。多任务函数一般在通道级上执行，比如自动拨号、语音播放等，它不影响系统中的其它通道。
　　多数多任务函数在通道上执行耗时较长的输入/输出操作，这正是语音软件将控制权返回给调用程序执行其它操作的原因。然而，当控制权返回给应用程序时，应用程序必须阻止另一个函数在同一个正在执行操作的通道上操作。
　　多任务函数具有以下特点：当一个多任务函数在一个通道上操作时，通道忙；当没有多任务函数在通道上操作时，通道闲。如果你试图在忙通道上执行一个多任务函数将发生E—MTACT错误。一旦当前多任务函数结束，你才可以在这个通道上执行下一个多任务函数。
　　识别和响应多任务函数：多线语音应用程序能够响应同时发生在多个通道上的行为。通道代表一串事件，它允许应用程序识别和响应通道上发生的特殊事件。事件提供关于函数的进展和完成的反馈，指明其它通道行为的发生。一般情况下，事件常被称为结束事件，因为大部分事件表示操作结束。
　　总之，多任务函数实现了多进程处理。多任务操作一旦在软件中发出一道指令，该任务立即提交给语音卡，由其在后台完成该任务，同时，程序控制权已转回应用软件的下一语句。简单地说，就是将播放这样耗时长的操作放在后台，由语音卡完成。而前台仅仅完成界面输入、多任务函数的调用以及一些必须独占CPU但耗时极短的单任务的执行。
3.4　状态机逻辑流程图
　　状态机逻辑流程图是状态转移表的图形表示，一般地,它分为事件驱动、当前状态和下一个状态三大处理模块。图示如下:　　


图1
　　在系统中，每一个通道定义一个状态机。大多数情况下，所有的通道将有同样的状态逻辑，并且所有的通道可以复制一样的状态机结构。应用程序使用状态机来管理每一个通道的程序流。
　　实际执行的程序流主要由表中的数据而不是程序的逻辑决定的，这反映了事件驱动的原理。
　　通道状态机的建立步骤：
　　为每一个通道列出所有可能的状态；
　　列出所有可能的改变通道状态的事件；
　　创建一个状态转换表，该表为每一个状态定义了基于当前发生的事件的下一个状态；
　　利用状态转换表，设计处理事件的程序流程。
3.5　状态机的扩充性
　　事件驱动的状态机具有良好的开放性,根据用户的要求可对其增加相应的状态,以完成功能扩展。对于增加的某个状态,应根据状态机的事件将其加入状态转移表中，其具体状态处理仍然要分为当前状态和下一个状态, 并给出对应状态的状态出口处理。以密码设置为例介绍状态增加后的转移流程图如下：
　　状态处理描述：
curent—state:　　　　　　next—state:
ST—OFFHK：
　Return(ST—promt3);
ST—promt3:　　　　　　ST—promt3:
　Return(ST—digits3);　　　Play();提示输入密码
ST—promt4:　　　　　　ST—promt4:
　Return(ST—digits4);　　　Play();提示再输入一遍密码，确认；
ST—promt5:　　　　　　ST—promt5:
　　　　　　　　　　　　Play();提示密码设置完毕；
ST—digits3:　　　　　　ST—digits3:
　Return(ST—promt4);　　　输入密码
ST—digits4:　　　　　　ST—digits4:
　比较判断：
　比较正确-Return(ST—prompt5);　　　　　　输入确认密码
　比较不正确-Return(ST—prompt3)
　执行流程如下：
　　　　　　　ST—prompt2［C］->ST—prompt3［N］;
　　　　　　　ST—prompt3［C］->ST—digits3［N］;
　　　　　　　ST—digits3［C］->ST—prompt4［N］;
　　　　　　　ST—prompt4［C］->ST—digits4［N］;
　　　　　　　ST—digits4［C］->ST—prompt5［N］
　　　　　　　ST—prompt3［N］
　　
4　结束语
　　利用上述设计方法,我们开发出一个综合性的医疗信息声讯系统，该系统除了具备一般的声音录制和回放功能外，利用状态机的扩充性，通过增加状态，使用户可以通过电话访问文本信息，通过电话查询数据库等。如果接入互联网，经过适当的改进，可以实现电话访问电子邮件的功能。
　　刘宝旨　讲师，硕士。研究方向：计算机网络、多媒体技术。
　　作者单位：刘宝旨（山东济宁医学院计算机中心　山东．济宁 272113）
参考文献
［1］　王晶如,等.计算机电话综合系统的构成与应用.现代电信科技, 1997；(7)
［2］　张延平.电话语音系统的集成和设计.世界电信，1997；(2)
［3］　Voice software reference for MS-DOS.Dialogic Corporation, 1995 
　　收稿日期:1999-01-07(修改稿)
