今天我们来看一下如何给Freeswitch新增一个APP。
假设我们要新增一个播放语音文件的APP(Freeswitch已经有该能力,这里只为做演示)
步骤1. 添加一个处理函数
使用宏SWITCH_STANDARD_APP定义你添加的函数。
SWITCH_STANDARD_APP
#define SYNTAX_PLAYBACK "<path> <offset>"
SWITCH_STANDARD_APP(playback_function) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "**playback_function**\n");
int argc;
char *argv[2] = { 0 };
char *mydata;
if (!zstr(data) && (mydata = switch_core_session_strdup(session, data))) {
if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0])))) >= 1) {
switch_input_args_t args = {0};
switch_file_handle_t fh = {0};
uint offset = switch_atoui(argv[1]);
fh.offset_pos = offset;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "playback file path:%s, offset:%d", argv[0], offset);
switch_ivr_play_file(session, &fh, argv[0], &args);
}
}
}
这个函数的功能就是调用freeswitch自身的播放语音接口函数,逻辑很简单。
这里注意到几点:
- App函数是自带session的,Api中是没有的
- App函数中没有stream用于控制台输出的流;Api中是有的
- App函数不需要返回值;Api中是有的
第二步. 在LOAD_FUNCTION中添加该函数
SWITCH_MODULE_LOAD_FUNCTION(mod_eric_load) {
// .......
switch_application_interface_t *app_interface;
SWITCH_ADD_APP(app_interface, "my_playback", "playback", "playback", playback_function, SYNTAX_PLAYBACK, SAF_NONE);
return SWITCH_STATUS_SUCCESS;
}
好,到此新增APP就写好了。编译打包,然后我们在freeswitch上试一下吧。
加载
ok,从日志上可以看到,我们的新的App添加进入了。
我们来试一下
不能像Api一样调用
不能像Api一样调用,直接在控制台上使用直接报错。 这也是App和Api的区别之一。那么我们该怎么试用呢?
一般两种方式,
- 通过拨号计划
- 通过lua脚本
用拨号计划测试
使用拨号计划需要配置一个软终端用于测试,我这里使用的是Zoiper5.
这是一款收费软件,不过也可以限制功能免费使用。 使用Zoiper5注册到我们的Freeswitch上。
下面是定义好的拨号计划
<extension name="mydemo">
<condition field="destination_number" expression="^411$">
<action application="answer"/>
<action application="sleep" data="1000"/>
<action application="my_playback" data="sample/ms_8k_8bit.wav 6"/>
<action application="sleep" data="1000"/>
<action application="hangup"/>
</condition>
</extension>
在zoiper上拨打411,触发该拨号计划,可以听到语音声音。这个App添加成功!