美文网首页
【FreeSwitch模块开发指南】创建一个自定义mod

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

作者: 安安爸Chris | 来源:发表于2018-09-25 20:17 被阅读0次

    在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模块了。完成了这个也算是万里长征的第一步了。

    相关文章

      网友评论

          本文标题:【FreeSwitch模块开发指南】创建一个自定义mod

          本文链接:https://www.haomeiwen.com/subject/pczloftx.html