其中DSR模块是IXP421进行底层语音数据处理的模块,它主要采用由INTEL提供的DSR(DSP software release)软件库。一方面,它与上层应用程序进行通信,传递数据或响应来自上层的控制消息。另一方面,它与底层接口进行通信与控制。
编码部分负责进行编码和对从HSS到IP接口的数据分组打包,提供对G.711等音频标准的支持,并提供有增益控制功能的自动等级控制ALC单元和区分背景噪声的VAD功能。并将多个语音帧合并成一个IP分组包。对语音包以特定的帧长进行压缩编码,压缩后的语音包送入网络处理单元。网络处理单元为语音添加包头、时标和其他信息后,把数据放在可变长的数据报或分组中,然后给每个数据报附带寻址和控制信息,并通过网络发送到目的地。
相对于解码部分负责把从IP网络接收的语音分组包进行打包并转成语音数据流发送至HSS接口。类似于编码部分,解码部分也包含G.711和G.729数据处理和ALC处理单元。不同的是其包含产生适当背景噪声的CNG单元、消除由于网络丢包而造成语音信息不完整问题的PLC单元和控制从IP网络到HSS接口数据传输节奏的JitterBuffer单元。
电话信号音监测模块负责监控300~3500Hz的电话信号音,如DTMF信号等。主要是采用快速傅立叶算法FFT来进行分析和判断。电话信号音产生模块则负责产生相应的电话信号音。而网络节点是连接HSS端口与编解码等部分的程序模块,它把需要从HSS端口发送的数据放入HSS发送缓冲区,或把需要从HSS端口接收的数据放入HSS接收缓冲区内。
1.2.2 状态机的结构
为了模拟通常状态下的电话机工作流程,需要相应地建立几种不同的状态,并实现不同状态的转换。一般通话双方有空闲、拨号、发送信令、回应、建立连接和断开连接等状态,故可以定义如下几个状态值:call_idel、call_dial、call_cancel、call_invite、call_ack、call_connect、call_bye等。例如用户摘机事件发生后会有中断产生,若该路终端目前的状态为call_ack时,表明该终端用户为被动接收者,且已接收到invite信令并等待用户摘机。故此时状态转为call_connect并进行相关处理。而当该路终端目前的状态不为call_ack时,表明该终端用户为主动呼叫者,准备拨号拨打电话。此时状态转为call_dial,话筒中产生等待音,DSR模块开始等待用户拨号。当用户结束拨号后状态转为call_invite并进行相关处理。大致流程如图3所示。
为了保证状态机能在不同的状态之间转换和方便控制管理各路话音通话的信息。还需要建立一些全局数据结构:
struct call_params{
unsigned char local_num;
unsigned char remote_num;
unsigned char local_addr;
unsigned char remote_addr;
unsigned char status;
};
用于保存当前网关中各路话音的配置参数,num表示该路通话的本地号码和对端号码,addr表示该路通话对应在DSR内所使用的本地和远端网络地址,status记录本地终端在该通话中处于状态机中的状态。设备在加电启动后,需要按步骤进行一系列的初始化工作。包括一些记录状态信息的全局变量,初始化SLIC接口、DSR模块、网络接口、信令处理模块并开启所需的监控线程,等待控制状态的变化。
1.2.3 软件驱动模块
因为网络语音底层平台使用嵌入式LINUX做为其操作系统,故需要划分如图4所示的几个模块并写出相应的驱动。