1. 代码部分
Freeswitch构建一个新的模块时,必须实现load函数,如下:
SWITCH_MODULE_LOAD_FUNCTION(mod_example_load);
该load函数的简单实现如下:
SWITCH_MODULE_LOAD_FUNCTION(mod_example_load)
{
/* connect my internal structure to the blank pointer passed to me */
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Hello World!\n");
/* indicate that the module should continue to be loaded */
return SWITCH_STATUS_SUCCESS;
}
在mod_example_load中对可以当前模块进行一些必要的初始化操作,如资源分配等。
除了load函数外,还可可以选择性的实现shutdown和runtime函数,如下:
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_example_shutdown);
SWITCH_MODULE_RUNTIME_FUNCTION(mod_example_runtime);
其中shutdown主要是在当前模块卸载时对占用的资源进行释放;runtime可以作为当前模块功能实现的主要入口,比如实现一个event_loop。简单实现如下所示:
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_example_shutdown);
{
return SWITCH_STATUS_SUCCESS;
}
SWITCH_MODULE_RUNTIME_FUNCTION(mod_example_runtime);
{
while(looping)
{
switch_yield(1000);
}
return SWITCH_STATUS_TERM;
}
在当前模块加载时,会通过如下方式在core中初始化当前模块三个函数的对应的指针,并在后续进行调用。
SWITCH_MODULE_DEFINITION(mod_example, mod_example_load, mod_example_shutdown, mod_example_runtime);
2. 编译部分
新增一个模块后,除了在本地路径下新增Makefile.am还需要修改以下几处:
(1) 根目录下configure.ac
需要添加src/mod/applications/mod_m_modules/Makefile,否则会报如下编译错误
requires no space between "-L" and "-shared"
(2) 根目录下的modules.conf
需要添加applications/mod_m_modules
(3) build下的modules.conf.in
需要添加applications/mod_m_modules
(4) conf/autoload_configs下的modules.conf.xml
需要添加
<load module="mod_m_modules"/>