在FS上创建一个mod,是一个简单又复杂的工作。
为什么说简单呢?基于FS良好的系统架构,只需要实现几个接口,你就可以轻轻松松实现一个mod
为什么说复杂呢?要实现功能强大的mod,你需要详细了解FS原理才可以。
今天我们就来先从简单的入手。
如上所述,要实现一个mod,实现如下几个接口即可。这几个函数都定义了宏。几个名字顾名思义。
看懂了这几个宏的定义以及实现,就很容易创建一个新的mod。下面来一个一个看一下吧。
SWITCH_MODULE_LOAD_FUNCTION(name) //定义load函数,加载时运行
SWITCH_MODULE_SHUTDOWN_FUNCTION(name) // 定义shutdown函数,关闭时运行
SWITCH_MODULE_RUNTIME_FUNCTION(name)// 定义runtime函数
SWITCH_MODULE_DEFINITION//申明函数,用来申请前面三者
先简单看一下几个主要函数定义:(定义在switch.h中)
宏SWITCH_MODULE_LOAD_FUNCTION
// switch_module_load_t为一个函数指针
#define SWITCH_MODULE_LOAD_ARGS (switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool)
typedef switch_status_t (*switch_module_load_t) SWITCH_MODULE_LOAD_ARGS;
// 通过SWITCH_MODULE_LOAD_FUNCTION定义的name,
// 说白了就是一个函数签名为
// switch_status_t(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool)的函数
#define SWITCH_MODULE_LOAD_FUNCTION(name) switch_status_t name SWITCH_MODULE_LOAD_ARGS
宏SWITCH_MODULE_SHUTDOWN_FUNCTION
// switch_module_shutdown_t为一个函数指针
#define SWITCH_MODULE_SHUTDOWN_ARGS (void)
typedef switch_status_t (*switch_module_shutdown_t) SWITCH_MODULE_SHUTDOWN_ARGS;
// 通过SWITCH_MODULE_SHUTDOWN_FUNCTION定义的name,
// 是一个函数签名为 switch_status_t(void)的函数
#define SWITCH_MODULE_SHUTDOWN_FUNCTION(name) switch_status_t name SWITCH_MODULE_SHUTDOWN_ARGS
宏SWITCH_MODULE_RUNTIME_FUNCTION
#define SWITCH_MODULE_RUNTIME_ARGS (void)
typedef switch_status_t (*switch_module_runtime_t) SWITCH_MODULE_RUNTIME_ARGS;
// 通过SWITCH_MODULE_RUNTIME_FUNCTION定义的name,
// 是一个函数签名为 switch_module_runtime_t(void)的函数
#define SWITCH_MODULE_RUNTIME_FUNCTION(name) switch_status_t name SWITCH_MODULE_RUNTIME_ARGS
宏SWITCH_MODULE_DEFINITION
typedef enum {
SMODF_NONE = 0,
SMODF_GLOBAL_SYMBOLS = (1 << 0)
} switch_module_flag_enum_t;
// 实际上调用的是SWITCH_MODULE_DEFINITION_EX
#define SWITCH_MODULE_DEFINITION(name, load, shutdown, runtime) \
SWITCH_MODULE_DEFINITION_EX(name, load, shutdown, runtime, SMODF_NONE)
SWITCH_MODULE_DEFINITION_EX定义如下
// 函数表,实际上还是申明上面三个函数
typedef struct switch_loadable_module_function_table {
int switch_api_version;
switch_module_load_t load;
switch_module_shutdown_t shutdown;
switch_module_runtime_t runtime;
switch_module_flag_t flags;
} switch_loadable_module_function_table_t;
#define SWITCH_MODULE_DEFINITION_EX(name, load, shutdown, runtime, flags) \
static const char modname[] = #name ; // 定义了mod name,在其他函数中可以直接使用 \
SWITCH_MOD_DECLARE_DATA switch_loadable_module_function_table_t name##_module_interface = { \
SWITCH_API_VERSION, \
load, \
shutdown, \
runtime, \
flags \
}
一个简单的例子
SWITCH_MODULE_RUNTIME_FUNCTION不是必须的,这里以最简单为原则,实现一个mod。
#include <switch.h>
SWITCH_MODULE_LOAD_FUNCTION(mod_eric_load);
//SWITCH_MODULE_RUNTIME_FUNCTION(mod_eric_runtime);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_eric_shutdown);
extern "C"
{
// Actually it explains as followings:
// static const char modname[] = "mod_eric";
// SWITCH_MOD_DECLARE_DATA switch_loadable_module_function_table_t mod_eric_module_interface ={
// SWITCH_API_VERSION,
// mod_eric_load,
// mod_eric_shutdown,
// mod_eric_runtime(NULL),
// SMODF_NONE
// }
SWITCH_MODULE_DEFINITION(mod_eric, mod_eric_load, mod_eric_shutdown, NULL);
}
// Actually it explains as followings:
// switch_status_t mod_eric_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool)
SWITCH_MODULE_LOAD_FUNCTION(mod_eric_load) {
// init module interface
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
return SWITCH_STATUS_SUCCESS;
}
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_eric_shutdown)
{
return SWITCH_STATUS_SUCCESS;
}
看一下加载与卸载功能
加载eric.PNG
卸载eric.PNG
好啦。尽管它什么功能也没有,但是它就是一个完整的FS模块了。完成了这个也算是万里长征的第一步了。
作者:安安爸Chris
链接:https://www.jianshu.com/p/ca6fcb832f57
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。