【FreeSwitch模块开发指南】创建一个自定义mod

在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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值