FreeSWITCH添加自定义endpoint

打印 上一主题 下一主题

主题 878|帖子 878|积分 2636

操作系统 :CentOS 7.6_x64     FreeSWITCH版本 :1.10.9 日常开发过程中会遇到需要扩展FreeSWITCH对接其它系统的情况,这里记录下编写FreeSWITCH自定义endpoint的过程。一、模块定义函数

使用FreeSWITCH自带的框架来定义模块函数,函数指针及参数列表定义如下(src/include/switch_types.h)
  1. #define SWITCH_MODULE_LOAD_ARGS (switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool)
  2. #define SWITCH_MODULE_RUNTIME_ARGS (void)
  3. #define SWITCH_MODULE_SHUTDOWN_ARGS (void)
  4. typedef switch_status_t (*switch_module_load_t) SWITCH_MODULE_LOAD_ARGS;
  5. typedef switch_status_t (*switch_module_runtime_t) SWITCH_MODULE_RUNTIME_ARGS;
  6. typedef switch_status_t (*switch_module_shutdown_t) SWITCH_MODULE_SHUTDOWN_ARGS;
  7. #define SWITCH_MODULE_LOAD_FUNCTION(name) switch_status_t name SWITCH_MODULE_LOAD_ARGS
  8. #define SWITCH_MODULE_RUNTIME_FUNCTION(name) switch_status_t name SWITCH_MODULE_RUNTIME_ARGS
  9. #define SWITCH_MODULE_SHUTDOWN_FUNCTION(name) switch_status_t name SWITCH_MODULE_SHUTDOWN_ARGS
复制代码
 1、模块加载

SWITCH_MODULE_LOAD_FUNCTION模块加载函数,负责系统启动时或运行时加载模块,可以进行配置读取及资源初始化。2、模块卸载

SWITCH_MODULE_SHUTDOWN_FUNCTION模块卸载函数,负载模块卸载及相关资源回收。3、模块运行时

SWITCH_MODULE_RUNTIME_FUNCTION模块运行时函数,可以启动线程处理请求,监听socket等。4、模块定义

SWITCH_MODULE_DEFINITION相关代码:
  1. typedef struct switch_loadable_module_function_table {
  2. <section name="configuration" description="Various Configuration">
  3.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  4. </section>int switch_api_version;
  5. <section name="configuration" description="Various Configuration">
  6.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  7. </section>switch_module_load_t load;
  8. <section name="configuration" description="Various Configuration">
  9.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  10. </section>switch_module_shutdown_t shutdown;
  11. <section name="configuration" description="Various Configuration">
  12.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  13. </section>switch_module_runtime_t runtime;
  14. <section name="configuration" description="Various Configuration">
  15.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  16. </section>switch_module_flag_t flags;
  17. } switch_loadable_module_function_table_t;
  18. #define SWITCH_MODULE_DEFINITION_EX(name, load, shutdown, runtime, flags)<section name="configuration" description="Various Configuration">
  19.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  20. </section><section name="configuration" description="Various Configuration">
  21.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  22. </section><section name="configuration" description="Various Configuration">
  23.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  24. </section><section name="configuration" description="Various Configuration">
  25.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  26. </section>   \
  27. static const char modname[] =  #name ;<section name="configuration" description="Various Configuration">
  28.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  29. </section><section name="configuration" description="Various Configuration">
  30.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  31. </section><section name="configuration" description="Various Configuration">
  32.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  33. </section><section name="configuration" description="Various Configuration">
  34.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  35. </section><section name="configuration" description="Various Configuration">
  36.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  37. </section><section name="configuration" description="Various Configuration">
  38.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  39. </section><section name="configuration" description="Various Configuration">
  40.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  41. </section><section name="configuration" description="Various Configuration">
  42.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  43. </section><section name="configuration" description="Various Configuration">
  44.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  45. </section><section name="configuration" description="Various Configuration">
  46.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  47. </section><section name="configuration" description="Various Configuration">
  48.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  49. </section><section name="configuration" description="Various Configuration">
  50.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  51. </section><section name="configuration" description="Various Configuration">
  52.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  53. </section>  \
  54. SWITCH_MOD_DECLARE_DATA switch_loadable_module_function_table_t name##_module_interface = { \
  55. <section name="configuration" description="Various Configuration">
  56.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  57. </section>SWITCH_API_VERSION,<section name="configuration" description="Various Configuration">
  58.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  59. </section><section name="configuration" description="Various Configuration">
  60.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  61. </section><section name="configuration" description="Various Configuration">
  62.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  63. </section><section name="configuration" description="Various Configuration">
  64.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  65. </section><section name="configuration" description="Various Configuration">
  66.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  67. </section><section name="configuration" description="Various Configuration">
  68.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  69. </section><section name="configuration" description="Various Configuration">
  70.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  71. </section><section name="configuration" description="Various Configuration">
  72.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  73. </section><section name="configuration" description="Various Configuration">
  74.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  75. </section><section name="configuration" description="Various Configuration">
  76.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  77. </section><section name="configuration" description="Various Configuration">
  78.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  79. </section><section name="configuration" description="Various Configuration">
  80.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  81. </section><section name="configuration" description="Various Configuration">
  82.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  83. </section><section name="configuration" description="Various Configuration">
  84.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  85. </section><section name="configuration" description="Various Configuration">
  86.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  87. </section><section name="configuration" description="Various Configuration">
  88.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  89. </section><section name="configuration" description="Various Configuration">
  90.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  91. </section> \
  92. <section name="configuration" description="Various Configuration">
  93.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  94. </section>load,<section name="configuration" description="Various Configuration">
  95.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  96. </section><section name="configuration" description="Various Configuration">
  97.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  98. </section><section name="configuration" description="Various Configuration">
  99.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  100. </section><section name="configuration" description="Various Configuration">
  101.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  102. </section><section name="configuration" description="Various Configuration">
  103.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  104. </section><section name="configuration" description="Various Configuration">
  105.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  106. </section><section name="configuration" description="Various Configuration">
  107.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  108. </section><section name="configuration" description="Various Configuration">
  109.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  110. </section><section name="configuration" description="Various Configuration">
  111.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  112. </section><section name="configuration" description="Various Configuration">
  113.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  114. </section><section name="configuration" description="Various Configuration">
  115.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  116. </section><section name="configuration" description="Various Configuration">
  117.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  118. </section><section name="configuration" description="Various Configuration">
  119.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  120. </section><section name="configuration" description="Various Configuration">
  121.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  122. </section><section name="configuration" description="Various Configuration">
  123.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  124. </section><section name="configuration" description="Various Configuration">
  125.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  126. </section><section name="configuration" description="Various Configuration">
  127.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  128. </section><section name="configuration" description="Various Configuration">
  129.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  130. </section><section name="configuration" description="Various Configuration">
  131.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  132. </section><section name="configuration" description="Various Configuration">
  133.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  134. </section>   \
  135. <section name="configuration" description="Various Configuration">
  136.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  137. </section>shutdown,<section name="configuration" description="Various Configuration">
  138.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  139. </section><section name="configuration" description="Various Configuration">
  140.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  141. </section><section name="configuration" description="Various Configuration">
  142.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  143. </section><section name="configuration" description="Various Configuration">
  144.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  145. </section><section name="configuration" description="Various Configuration">
  146.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  147. </section><section name="configuration" description="Various Configuration">
  148.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  149. </section><section name="configuration" description="Various Configuration">
  150.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  151. </section><section name="configuration" description="Various Configuration">
  152.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  153. </section><section name="configuration" description="Various Configuration">
  154.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  155. </section><section name="configuration" description="Various Configuration">
  156.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  157. </section><section name="configuration" description="Various Configuration">
  158.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  159. </section><section name="configuration" description="Various Configuration">
  160.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  161. </section><section name="configuration" description="Various Configuration">
  162.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  163. </section><section name="configuration" description="Various Configuration">
  164.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  165. </section><section name="configuration" description="Various Configuration">
  166.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  167. </section><section name="configuration" description="Various Configuration">
  168.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  169. </section><section name="configuration" description="Various Configuration">
  170.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  171. </section><section name="configuration" description="Various Configuration">
  172.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  173. </section><section name="configuration" description="Various Configuration">
  174.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  175. </section>   \
  176. <section name="configuration" description="Various Configuration">
  177.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  178. </section>runtime,<section name="configuration" description="Various Configuration">
  179.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  180. </section><section name="configuration" description="Various Configuration">
  181.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  182. </section><section name="configuration" description="Various Configuration">
  183.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  184. </section><section name="configuration" description="Various Configuration">
  185.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  186. </section><section name="configuration" description="Various Configuration">
  187.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  188. </section><section name="configuration" description="Various Configuration">
  189.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  190. </section><section name="configuration" description="Various Configuration">
  191.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  192. </section><section name="configuration" description="Various Configuration">
  193.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  194. </section><section name="configuration" description="Various Configuration">
  195.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  196. </section><section name="configuration" description="Various Configuration">
  197.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  198. </section><section name="configuration" description="Various Configuration">
  199.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  200. </section><section name="configuration" description="Various Configuration">
  201.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  202. </section><section name="configuration" description="Various Configuration">
  203.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  204. </section><section name="configuration" description="Various Configuration">
  205.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  206. </section><section name="configuration" description="Various Configuration">
  207.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  208. </section><section name="configuration" description="Various Configuration">
  209.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  210. </section><section name="configuration" description="Various Configuration">
  211.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  212. </section><section name="configuration" description="Various Configuration">
  213.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  214. </section><section name="configuration" description="Various Configuration">
  215.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  216. </section><section name="configuration" description="Various Configuration">
  217.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  218. </section>\
  219. <section name="configuration" description="Various Configuration">
  220.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  221. </section>flags<section name="configuration" description="Various Configuration">
  222.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  223. </section><section name="configuration" description="Various Configuration">
  224.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  225. </section><section name="configuration" description="Various Configuration">
  226.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  227. </section><section name="configuration" description="Various Configuration">
  228.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  229. </section><section name="configuration" description="Various Configuration">
  230.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  231. </section><section name="configuration" description="Various Configuration">
  232.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  233. </section><section name="configuration" description="Various Configuration">
  234.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  235. </section><section name="configuration" description="Various Configuration">
  236.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  237. </section><section name="configuration" description="Various Configuration">
  238.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  239. </section><section name="configuration" description="Various Configuration">
  240.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  241. </section><section name="configuration" description="Various Configuration">
  242.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  243. </section><section name="configuration" description="Various Configuration">
  244.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  245. </section><section name="configuration" description="Various Configuration">
  246.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  247. </section><section name="configuration" description="Various Configuration">
  248.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  249. </section><section name="configuration" description="Various Configuration">
  250.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  251. </section><section name="configuration" description="Various Configuration">
  252.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  253. </section><section name="configuration" description="Various Configuration">
  254.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  255. </section><section name="configuration" description="Various Configuration">
  256.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  257. </section><section name="configuration" description="Various Configuration">
  258.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  259. </section><section name="configuration" description="Various Configuration">
  260.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  261. </section>   \
  262. }
  263. #define SWITCH_MODULE_DEFINITION(name, load, shutdown, runtime)<section name="configuration" description="Various Configuration">
  264.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  265. </section><section name="configuration" description="Various Configuration">
  266.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  267. </section><section name="configuration" description="Various Configuration">
  268.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  269. </section><section name="configuration" description="Various Configuration">
  270.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  271. </section><section name="configuration" description="Various Configuration">
  272.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  273. </section><section name="configuration" description="Various Configuration">
  274.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  275. </section><section name="configuration" description="Various Configuration">
  276.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  277. </section> \
  278. <section name="configuration" description="Various Configuration">
  279.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  280. </section><section name="configuration" description="Various Configuration">
  281.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  282. </section>SWITCH_MODULE_DEFINITION_EX(name, load, shutdown, runtime, SMODF_NONE) 
复制代码
二、模块加载流程

FreeSWITCH使用 switch_loadable_module_load_module 或 switch_loadable_module_load_module_ex 进行模块加载,具体实现逻辑可以在 switch_loadable_module.c 中查看,这里做下简单介绍。 1、模块加载函数

通过 switch_loadable_module_load_module 函数加载模块,函数调用链如下:
  1. switch_loadable_module_load_module
  2. <section name="configuration" description="Various Configuration">
  3.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  4. </section><section name="configuration" description="Various Configuration">
  5.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  6. </section>=> switch_loadable_module_load_module_ex  
  7. <section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section><section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section>=> switch_loadable_module_load_file
  12. <section name="configuration" description="Various Configuration">
  13.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  14. </section><section name="configuration" description="Various Configuration">
  15.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  16. </section><section name="configuration" description="Various Configuration">
  17.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  18. </section>=> switch_loadable_module_process
  19. <section name="configuration" description="Various Configuration">
  20.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  21. </section><section name="configuration" description="Various Configuration">
  22.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  23. </section><section name="configuration" description="Various Configuration">
  24.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  25. </section>=> switch_core_launch_thread  =>  switch_loadable_module_exec
复制代码
通过 switch_dso_data_sym 根据定义的 XXX_module_interface 从动态库里面获取回调函数指针,使用 switch_loadable_module_function_table_t 数据结构进行回调函数绑定。switch_dso_data_sym 函数实现如下(src/switch_dso.c):
  1. void *switch_dso_data_sym(switch_dso_lib_t lib, const char *sym, char **err)
  2. {
  3. <section name="configuration" description="Various Configuration">
  4.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  5. </section>void *addr = dlsym(lib, sym);
  6. <section name="configuration" description="Various Configuration">
  7.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  8. </section>if (!addr) {
  9. <section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section><section name="configuration" description="Various Configuration">
  12.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  13. </section>char *err_str = NULL;
  14. <section name="configuration" description="Various Configuration">
  15.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  16. </section><section name="configuration" description="Various Configuration">
  17.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  18. </section>dlerror();
  19. <section name="configuration" description="Various Configuration">
  20.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  21. </section><section name="configuration" description="Various Configuration">
  22.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  23. </section>if (!(addr = dlsym(lib, sym))) {
  24. <section name="configuration" description="Various Configuration">
  25.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  26. </section><section name="configuration" description="Various Configuration">
  27.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  28. </section><section name="configuration" description="Various Configuration">
  29.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  30. </section>err_str = (char *)dlerror();
  31. <section name="configuration" description="Various Configuration">
  32.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  33. </section><section name="configuration" description="Various Configuration">
  34.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  35. </section>}
  36. <section name="configuration" description="Various Configuration">
  37.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  38. </section><section name="configuration" description="Various Configuration">
  39.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  40. </section>if (err_str) {
  41. <section name="configuration" description="Various Configuration">
  42.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  43. </section><section name="configuration" description="Various Configuration">
  44.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  45. </section><section name="configuration" description="Various Configuration">
  46.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  47. </section>*err = strdup(err_str);
  48. <section name="configuration" description="Various Configuration">
  49.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  50. </section><section name="configuration" description="Various Configuration">
  51.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  52. </section>}
  53. <section name="configuration" description="Various Configuration">
  54.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  55. </section>}
  56. <section name="configuration" description="Various Configuration">
  57.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  58. </section>return addr;
  59. }
复制代码
switch_loadable_module_exec函数:
  1. static void *SWITCH_THREAD_FUNC switch_loadable_module_exec(switch_thread_t *thread, void *obj)
  2. {
  3. <section name="configuration" description="Various Configuration">
  4.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  5. </section>switch_status_t status = SWITCH_STATUS_SUCCESS;
  6. <section name="configuration" description="Various Configuration">
  7.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  8. </section>switch_core_thread_session_t *ts = obj;
  9. <section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section>switch_loadable_module_t *module = ts->objs[0];
  12. <section name="configuration" description="Various Configuration">
  13.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  14. </section>int restarts;
  15. <section name="configuration" description="Various Configuration">
  16.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  17. </section>switch_assert(thread != NULL);
  18. <section name="configuration" description="Various Configuration">
  19.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  20. </section>switch_assert(module != NULL);
  21. <section name="configuration" description="Various Configuration">
  22.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  23. </section>for (restarts = 0; status != SWITCH_STATUS_TERM && !module->shutting_down; restarts++) {
  24. <section name="configuration" description="Various Configuration">
  25.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  26. </section><section name="configuration" description="Various Configuration">
  27.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  28. </section>status = module->switch_module_runtime();
  29. <section name="configuration" description="Various Configuration">
  30.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  31. </section>}
  32. <section name="configuration" description="Various Configuration">
  33.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  34. </section>switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Thread ended for %s\n", module->module_interface->module_name);
  35. <section name="configuration" description="Various Configuration">
  36.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  37. </section>if (ts->pool) {
  38. <section name="configuration" description="Various Configuration">
  39.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  40. </section><section name="configuration" description="Various Configuration">
  41.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  42. </section>switch_memory_pool_t *pool = ts->pool;
  43. <section name="configuration" description="Various Configuration">
  44.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  45. </section><section name="configuration" description="Various Configuration">
  46.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  47. </section>switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Destroying Pool for %s\n", module->module_interface->module_name);
  48. <section name="configuration" description="Various Configuration">
  49.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  50. </section><section name="configuration" description="Various Configuration">
  51.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  52. </section>switch_core_destroy_memory_pool(&pool);
  53. <section name="configuration" description="Various Configuration">
  54.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  55. </section>}
  56. <section name="configuration" description="Various Configuration">
  57.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  58. </section>switch_thread_exit(thread, 0);
  59. <section name="configuration" description="Various Configuration">
  60.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  61. </section>return NULL;
  62. }
复制代码
switch_loadable_module_exec 函数为独立线程中运行,模块运行时通过 module->switch_module_runtime() 触发。2、FreeSWITCH启动时加载模块

1)整体结构
 函数调用链如下:
  1. main
  2. <section name="configuration" description="Various Configuration">
  3.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  4. </section>=> switch_core_init_and_modload
  5. <section name="configuration" description="Various Configuration">
  6.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  7. </section><section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section>=> switch_core_init
  10. <section name="configuration" description="Various Configuration">
  11.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  12. </section><section name="configuration" description="Various Configuration">
  13.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  14. </section>=> switch_loadable_module_init => switch_loadable_module_load_module
复制代码
main函数在switch.c中实现。  2)加载顺序先加载系统核心模块:
  1. switch_loadable_module_load_module_ex("", "CORE_SOFTTIMER_MODULE", SWITCH_FALSE, SWITCH_FALSE, &err, SWITCH_LOADABLE_MODULE_TYPE_COMMON, event_hash);
  2. switch_loadable_module_load_module_ex("", "CORE_PCM_MODULE", SWITCH_FALSE, SWITCH_FALSE, &err, SWITCH_LOADABLE_MODULE_TYPE_COMMON, event_hash);
  3. switch_loadable_module_load_module_ex("", "CORE_SPEEX_MODULE", SWITCH_FALSE, SWITCH_FALSE, &err, SWITCH_LOADABLE_MODULE_TYPE_COMMON, event_hash);
复制代码
使用 switch_xml_open_cfg 函数(src/switch_xml.c中定义)先后加载以下文件中定义的模块:pre_load_modules.confmodules.confpost_load_modules.conf具体格式参考 conf/autoload_configs/modules.conf.xml 3)xml加载过程 函数调用链如下:
  1. main => switch_core_init_and_modload
  2. <section name="configuration" description="Various Configuration">
  3.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  4. </section><section name="configuration" description="Various Configuration">
  5.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  6. </section>=> switch_core_init
  7. <section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section><section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section><section name="configuration" description="Various Configuration">
  12.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  13. </section>=> switch_xml_init
  14. <section name="configuration" description="Various Configuration">
  15.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  16. </section><section name="configuration" description="Various Configuration">
  17.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  18. </section><section name="configuration" description="Various Configuration">
  19.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  20. </section><section name="configuration" description="Various Configuration">
  21.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  22. </section>=> switch_xml_open_root => XML_OPEN_ROOT_FUNCTION
复制代码
其中 SWITCH_GLOBAL_filenames 变量定义如下(main => switch_core_set_globals):
  1. if (!SWITCH_GLOBAL_filenames.conf_name && (SWITCH_GLOBAL_filenames.conf_name = (char *) malloc(BUFSIZE))) {
  2. <section name="configuration" description="Various Configuration">
  3.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  4. </section><section name="configuration" description="Various Configuration">
  5.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  6. </section>switch_snprintf(SWITCH_GLOBAL_filenames.conf_name, BUFSIZE, "%s", "freeswitch.xml");
  7. }
复制代码
XML_OPEN_ROOT_FUNCTION实现如下(src/switch_xml.c):
  1. static switch_xml_open_root_function_t XML_OPEN_ROOT_FUNCTION = (switch_xml_open_root_function_t)__switch_xml_open_root;
  2. SWITCH_DECLARE_NONSTD(switch_xml_t) __switch_xml_open_root(uint8_t reload, const char **err, void *user_data)
  3. {
  4. <section name="configuration" description="Various Configuration">
  5.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  6. </section>char path_buf[1024];
  7. <section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section>uint8_t errcnt = 0;
  10. <section name="configuration" description="Various Configuration">
  11.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  12. </section>switch_xml_t new_main, r = NULL;
  13. <section name="configuration" description="Various Configuration">
  14.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  15. </section>if (MAIN_XML_ROOT) {
  16. <section name="configuration" description="Various Configuration">
  17.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  18. </section><section name="configuration" description="Various Configuration">
  19.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  20. </section>if (!reload) {
  21. <section name="configuration" description="Various Configuration">
  22.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  23. </section><section name="configuration" description="Various Configuration">
  24.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  25. </section><section name="configuration" description="Various Configuration">
  26.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  27. </section>r = switch_xml_root();
  28. <section name="configuration" description="Various Configuration">
  29.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  30. </section><section name="configuration" description="Various Configuration">
  31.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  32. </section><section name="configuration" description="Various Configuration">
  33.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  34. </section>goto done;
  35. <section name="configuration" description="Various Configuration">
  36.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  37. </section><section name="configuration" description="Various Configuration">
  38.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  39. </section>}
  40. <section name="configuration" description="Various Configuration">
  41.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  42. </section>}
  43. <section name="configuration" description="Various Configuration">
  44.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  45. </section>switch_snprintf(path_buf, sizeof(path_buf), "%s%s%s", SWITCH_GLOBAL_dirs.conf_dir, SWITCH_PATH_SEPARATOR, SWITCH_GLOBAL_filenames.conf_name);
  46. <section name="configuration" description="Various Configuration">
  47.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  48. </section>if ((new_main = switch_xml_parse_file(path_buf))) {
  49. <section name="configuration" description="Various Configuration">
  50.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  51. </section><section name="configuration" description="Various Configuration">
  52.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  53. </section>*err = switch_xml_error(new_main);
  54. <section name="configuration" description="Various Configuration">
  55.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  56. </section><section name="configuration" description="Various Configuration">
  57.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  58. </section>switch_copy_string(not_so_threadsafe_error_buffer, *err, sizeof(not_so_threadsafe_error_buffer));
  59. <section name="configuration" description="Various Configuration">
  60.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  61. </section><section name="configuration" description="Various Configuration">
  62.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  63. </section>*err = not_so_threadsafe_error_buffer;
  64. <section name="configuration" description="Various Configuration">
  65.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  66. </section><section name="configuration" description="Various Configuration">
  67.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  68. </section>if (!zstr(*err)) {
  69. <section name="configuration" description="Various Configuration">
  70.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  71. </section><section name="configuration" description="Various Configuration">
  72.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  73. </section><section name="configuration" description="Various Configuration">
  74.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  75. </section>switch_xml_free(new_main);
  76. <section name="configuration" description="Various Configuration">
  77.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  78. </section><section name="configuration" description="Various Configuration">
  79.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  80. </section><section name="configuration" description="Various Configuration">
  81.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  82. </section>new_main = NULL;
  83. <section name="configuration" description="Various Configuration">
  84.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  85. </section><section name="configuration" description="Various Configuration">
  86.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  87. </section><section name="configuration" description="Various Configuration">
  88.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  89. </section>errcnt++;
  90. <section name="configuration" description="Various Configuration">
  91.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  92. </section><section name="configuration" description="Various Configuration">
  93.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  94. </section>} else {
  95. <section name="configuration" description="Various Configuration">
  96.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  97. </section><section name="configuration" description="Various Configuration">
  98.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  99. </section><section name="configuration" description="Various Configuration">
  100.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  101. </section>*err = "Success";
  102. <section name="configuration" description="Various Configuration">
  103.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  104. </section><section name="configuration" description="Various Configuration">
  105.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  106. </section><section name="configuration" description="Various Configuration">
  107.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  108. </section>switch_xml_set_root(new_main);
  109. <section name="configuration" description="Various Configuration">
  110.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  111. </section><section name="configuration" description="Various Configuration">
  112.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  113. </section>}
  114. <section name="configuration" description="Various Configuration">
  115.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  116. </section>} else {
  117. <section name="configuration" description="Various Configuration">
  118.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  119. </section><section name="configuration" description="Various Configuration">
  120.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  121. </section>*err = "Cannot Open log directory or XML Root!";
  122. <section name="configuration" description="Various Configuration">
  123.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  124. </section><section name="configuration" description="Various Configuration">
  125.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  126. </section>errcnt++;
  127. <section name="configuration" description="Various Configuration">
  128.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  129. </section>}
  130. <section name="configuration" description="Various Configuration">
  131.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  132. </section>if (errcnt == 0) {
  133. <section name="configuration" description="Various Configuration">
  134.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  135. </section><section name="configuration" description="Various Configuration">
  136.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  137. </section>r = switch_xml_root();
  138. <section name="configuration" description="Various Configuration">
  139.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  140. </section>}
  141. done:
  142. <section name="configuration" description="Various Configuration">
  143.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  144. </section>return r;
  145. }
复制代码
freeswitch.xml 为xml文件的总入口,配置的有加载各个模块的数据:
  1. <section name="configuration" description="Various Configuration">
  2.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  3. </section>
复制代码
3、控制台动态加载

在fs_cli中可以使用load及reload加载模块,具体流程如下:
  1. fs_cli => load ... => SWITCH_STANDARD_API(load_function) => switch_loadable_module_load_module fs_cli => reload ... => SWITCH_STANDARD_API(reload_function) => switch_loadable_module_unload_module<section name="configuration" description="Various Configuration">
  2.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  3. </section><section name="configuration" description="Various Configuration">
  4.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  5. </section><section name="configuration" description="Various Configuration">
  6.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  7. </section><section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section><section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section><section name="configuration" description="Various Configuration">
  12.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  13. </section><section name="configuration" description="Various Configuration">
  14.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  15. </section><section name="configuration" description="Various Configuration">
  16.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  17. </section><section name="configuration" description="Various Configuration">
  18.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  19. </section><section name="configuration" description="Various Configuration">
  20.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  21. </section><section name="configuration" description="Various Configuration">
  22.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  23. </section><section name="configuration" description="Various Configuration">
  24.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  25. </section><section name="configuration" description="Various Configuration">
  26.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  27. </section><section name="configuration" description="Various Configuration">
  28.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  29. </section><section name="configuration" description="Various Configuration">
  30.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  31. </section>  => switch_loadable_module_load_module
复制代码
三、关键数据结构

1、switch_loadable_module_t

作用:用于定义模块信息。结构体定义:
  1. struct switch_loadable_module {<section name="configuration" description="Various Configuration">
  2.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  3. </section>char *key;<section name="configuration" description="Various Configuration">
  4.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  5. </section>char *filename;<section name="configuration" description="Various Configuration">
  6.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  7. </section>int perm;<section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section>switch_loadable_module_interface_t *module_interface;<section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section>switch_dso_lib_t lib;<section name="configuration" description="Various Configuration">
  12.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  13. </section>switch_module_load_t switch_module_load;<section name="configuration" description="Various Configuration">
  14.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  15. </section>switch_module_runtime_t switch_module_runtime;<section name="configuration" description="Various Configuration">
  16.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  17. </section>switch_module_shutdown_t switch_module_shutdown;<section name="configuration" description="Various Configuration">
  18.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  19. </section>switch_memory_pool_t *pool;<section name="configuration" description="Various Configuration">
  20.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  21. </section>switch_status_t status;<section name="configuration" description="Various Configuration">
  22.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  23. </section>switch_thread_t *thread;<section name="configuration" description="Various Configuration">
  24.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  25. </section>switch_bool_t shutting_down;<section name="configuration" description="Various Configuration">
  26.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  27. </section>switch_loadable_module_type_t type;};typedef struct switch_loadable_module switch_loadable_module_t;
复制代码
字段解释:key =》 模块文件名称filename => 模块文件路径(动态库路径)perm =》 定义模块是否允许被卸载module_interface =》 模块接口(由switch_module_load函数赋值)lib =》 动态库句柄(dlopen函数返回)switch_module_load =》 模块加载函数switch_module_runtime =》 模块运行时函数switch_module_shutdown =》 模块关闭(卸载)函数pool =》 模块内存池status =》 switch_module_shutdown 函数的返回值shutting_down => 模块是否关闭2、switch_loadable_module_interface

作用: 模块接口(入口)结构体定义:
  1. struct switch_loadable_module_interface {<section name="configuration" description="Various Configuration">
  2.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  3. </section>/*! the name of the module */<section name="configuration" description="Various Configuration">
  4.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  5. </section>const char *module_name;<section name="configuration" description="Various Configuration">
  6.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  7. </section>/*! the table of endpoints the module has implemented */<section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section>switch_endpoint_interface_t *endpoint_interface;<section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section>/*! the table of timers the module has implemented */<section name="configuration" description="Various Configuration">
  12.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  13. </section>switch_timer_interface_t *timer_interface;<section name="configuration" description="Various Configuration">
  14.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  15. </section>/*! the table of dialplans the module has implemented */<section name="configuration" description="Various Configuration">
  16.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  17. </section>switch_dialplan_interface_t *dialplan_interface;<section name="configuration" description="Various Configuration">
  18.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  19. </section>/*! the table of codecs the module has implemented */<section name="configuration" description="Various Configuration">
  20.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  21. </section>switch_codec_interface_t *codec_interface;<section name="configuration" description="Various Configuration">
  22.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  23. </section>/*! the table of applications the module has implemented */<section name="configuration" description="Various Configuration">
  24.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  25. </section>switch_application_interface_t *application_interface;<section name="configuration" description="Various Configuration">
  26.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  27. </section>/*! the table of chat applications the module has implemented */<section name="configuration" description="Various Configuration">
  28.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  29. </section>switch_chat_application_interface_t *chat_application_interface;<section name="configuration" description="Various Configuration">
  30.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  31. </section>/*! the table of api functions the module has implemented */<section name="configuration" description="Various Configuration">
  32.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  33. </section>switch_api_interface_t *api_interface;<section name="configuration" description="Various Configuration">
  34.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  35. </section>/*! the table of json api functions the module has implemented */<section name="configuration" description="Various Configuration">
  36.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  37. </section>switch_json_api_interface_t *json_api_interface;<section name="configuration" description="Various Configuration">
  38.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  39. </section>/*! the table of file formats the module has implemented */<section name="configuration" description="Various Configuration">
  40.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  41. </section>switch_file_interface_t *file_interface;<section name="configuration" description="Various Configuration">
  42.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  43. </section>/*! the table of speech interfaces the module has implemented */<section name="configuration" description="Various Configuration">
  44.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  45. </section>switch_speech_interface_t *speech_interface;<section name="configuration" description="Various Configuration">
  46.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  47. </section>/*! the table of directory interfaces the module has implemented */<section name="configuration" description="Various Configuration">
  48.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  49. </section>switch_directory_interface_t *directory_interface;<section name="configuration" description="Various Configuration">
  50.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  51. </section>/*! the table of chat interfaces the module has implemented */<section name="configuration" description="Various Configuration">
  52.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  53. </section>switch_chat_interface_t *chat_interface;<section name="configuration" description="Various Configuration">
  54.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  55. </section>/*! the table of say interfaces the module has implemented */<section name="configuration" description="Various Configuration">
  56.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  57. </section>switch_say_interface_t *say_interface;<section name="configuration" description="Various Configuration">
  58.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  59. </section>/*! the table of asr interfaces the module has implemented */<section name="configuration" description="Various Configuration">
  60.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  61. </section>switch_asr_interface_t *asr_interface;<section name="configuration" description="Various Configuration">
  62.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  63. </section>/*! the table of management interfaces the module has implemented */<section name="configuration" description="Various Configuration">
  64.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  65. </section>switch_management_interface_t *management_interface;<section name="configuration" description="Various Configuration">
  66.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  67. </section>/*! the table of limit interfaces the module has implemented */<section name="configuration" description="Various Configuration">
  68.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  69. </section>switch_limit_interface_t *limit_interface;<section name="configuration" description="Various Configuration">
  70.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  71. </section>/*! the table of database interfaces the module has implemented */<section name="configuration" description="Various Configuration">
  72.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  73. </section>switch_database_interface_t *database_interface;<section name="configuration" description="Various Configuration">
  74.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  75. </section>switch_thread_rwlock_t *rwlock;<section name="configuration" description="Various Configuration">
  76.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  77. </section>int refs;<section name="configuration" description="Various Configuration">
  78.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  79. </section>switch_memory_pool_t *pool;};typedef struct switch_loadable_module_interface switch_loadable_module_interface_t;
复制代码
字段解释:module_name => 模块的名称endpoint_interface => 模块endpoint的具体实现timer_interface => 模块timer的具体实现dialplan_interface => 模块dialplan的具体实现codec_interface => 模块编解码的具体实现application_interface => 模块提供的app工具的具体实现chat_application_interface => 模块提供的文本聊天app工具的具体实现api_interface => 模块提供的api具体实现json_api_interface => 模块提供的json格式api的具体实现file_interface => 模块支持的文件格式的具体实现(比如mp4、mkv等文件格式)speech_interface => 模块使用的speech接口实现directory_interface => 模块使用的directory接口实现chat_interface => 模块使用的chat接口实现say_interface => 模块使用的say接口实现asr_interface => 模块使用的asr接口实现management_interface => 模块使用的管理接口实现limit_interface => 模块使用的limit接口实现database_interface => 模块使用的limit接口实现rwlock => 模块使用的锁refs => 模块锁的计数器pool =》 模块内存池使用 switch_loadable_module_create_module_interface 来创建 switch_loadable_module_interface_t 实例。
  1. SWITCH_DECLARE(switch_loadable_module_interface_t *) switch_loadable_module_create_module_interface(switch_memory_pool_t *pool, const char *name){<section name="configuration" description="Various Configuration">
  2.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  3. </section>switch_loadable_module_interface_t *mod;<section name="configuration" description="Various Configuration">
  4.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  5. </section>mod = switch_core_alloc(pool, sizeof(switch_loadable_module_interface_t));<section name="configuration" description="Various Configuration">
  6.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  7. </section>switch_assert(mod != NULL);<section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section>mod->pool = pool;<section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section>mod->module_name = switch_core_strdup(mod->pool, name);<section name="configuration" description="Various Configuration">
  12.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  13. </section>switch_thread_rwlock_create(&mod->rwlock, mod->pool);<section name="configuration" description="Various Configuration">
  14.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  15. </section>return mod;}
复制代码
使用 switch_loadable_module_create_interface 来创建模块里面的子接口,示例如下:
  1. *module_interface = switch_loadable_module_create_module_interface(pool, modname);
  2. rtc_endpoint_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_ENDPOINT_INTERFACE);
  3. rtc_endpoint_interface->interface_name = "rtc";
  4. rtc_endpoint_interface->io_routines = &rtc_io_routines;
  5. rtc_endpoint_interface->state_handler = &rtc_event_handlers;
  6. rtc_endpoint_interface->recover_callback = rtc_recover_callback;
复制代码
具体实现如下:
  1. SWITCH_DECLARE(void *) switch_loadable_module_create_interface(switch_loadable_module_interface_t *mod, switch_module_interface_name_t iname){<section name="configuration" description="Various Configuration">
  2.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  3. </section>switch (iname) {<section name="configuration" description="Various Configuration">
  4.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  5. </section>case SWITCH_ENDPOINT_INTERFACE:<section name="configuration" description="Various Configuration">
  6.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  7. </section><section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section>ALLOC_INTERFACE(endpoint)<section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section>case SWITCH_TIMER_INTERFACE:<section name="configuration" description="Various Configuration">
  12.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  13. </section><section name="configuration" description="Various Configuration">
  14.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  15. </section>ALLOC_INTERFACE(timer)<section name="configuration" description="Various Configuration">
  16.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  17. </section>case SWITCH_DIALPLAN_INTERFACE:<section name="configuration" description="Various Configuration">
  18.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  19. </section><section name="configuration" description="Various Configuration">
  20.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  21. </section>ALLOC_INTERFACE(dialplan)<section name="configuration" description="Various Configuration">
  22.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  23. </section>case SWITCH_CODEC_INTERFACE:<section name="configuration" description="Various Configuration">
  24.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  25. </section><section name="configuration" description="Various Configuration">
  26.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  27. </section>ALLOC_INTERFACE(codec)<section name="configuration" description="Various Configuration">
  28.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  29. </section>case SWITCH_APPLICATION_INTERFACE:<section name="configuration" description="Various Configuration">
  30.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  31. </section><section name="configuration" description="Various Configuration">
  32.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  33. </section>ALLOC_INTERFACE(application)<section name="configuration" description="Various Configuration">
  34.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  35. </section>case SWITCH_CHAT_APPLICATION_INTERFACE:<section name="configuration" description="Various Configuration">
  36.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  37. </section><section name="configuration" description="Various Configuration">
  38.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  39. </section>ALLOC_INTERFACE(chat_application)<section name="configuration" description="Various Configuration">
  40.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  41. </section>case SWITCH_API_INTERFACE:<section name="configuration" description="Various Configuration">
  42.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  43. </section><section name="configuration" description="Various Configuration">
  44.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  45. </section>ALLOC_INTERFACE(api)<section name="configuration" description="Various Configuration">
  46.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  47. </section>case SWITCH_JSON_API_INTERFACE:<section name="configuration" description="Various Configuration">
  48.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  49. </section><section name="configuration" description="Various Configuration">
  50.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  51. </section>ALLOC_INTERFACE(json_api)<section name="configuration" description="Various Configuration">
  52.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  53. </section>case SWITCH_FILE_INTERFACE:<section name="configuration" description="Various Configuration">
  54.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  55. </section><section name="configuration" description="Various Configuration">
  56.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  57. </section>ALLOC_INTERFACE(file)<section name="configuration" description="Various Configuration">
  58.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  59. </section>case SWITCH_SPEECH_INTERFACE:<section name="configuration" description="Various Configuration">
  60.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  61. </section><section name="configuration" description="Various Configuration">
  62.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  63. </section>ALLOC_INTERFACE(speech)<section name="configuration" description="Various Configuration">
  64.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  65. </section>case SWITCH_DIRECTORY_INTERFACE:<section name="configuration" description="Various Configuration">
  66.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  67. </section><section name="configuration" description="Various Configuration">
  68.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  69. </section>ALLOC_INTERFACE(directory)<section name="configuration" description="Various Configuration">
  70.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  71. </section>case SWITCH_CHAT_INTERFACE:<section name="configuration" description="Various Configuration">
  72.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  73. </section><section name="configuration" description="Various Configuration">
  74.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  75. </section>ALLOC_INTERFACE(chat)<section name="configuration" description="Various Configuration">
  76.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  77. </section>case SWITCH_SAY_INTERFACE:<section name="configuration" description="Various Configuration">
  78.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  79. </section><section name="configuration" description="Various Configuration">
  80.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  81. </section>ALLOC_INTERFACE(say)<section name="configuration" description="Various Configuration">
  82.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  83. </section>case SWITCH_ASR_INTERFACE:<section name="configuration" description="Various Configuration">
  84.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  85. </section><section name="configuration" description="Various Configuration">
  86.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  87. </section>ALLOC_INTERFACE(asr)<section name="configuration" description="Various Configuration">
  88.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  89. </section>case SWITCH_MANAGEMENT_INTERFACE:<section name="configuration" description="Various Configuration">
  90.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  91. </section><section name="configuration" description="Various Configuration">
  92.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  93. </section>ALLOC_INTERFACE(management)<section name="configuration" description="Various Configuration">
  94.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  95. </section>case SWITCH_LIMIT_INTERFACE:<section name="configuration" description="Various Configuration">
  96.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  97. </section><section name="configuration" description="Various Configuration">
  98.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  99. </section>ALLOC_INTERFACE(limit)<section name="configuration" description="Various Configuration">
  100.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  101. </section>case SWITCH_DATABASE_INTERFACE:<section name="configuration" description="Various Configuration">
  102.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  103. </section><section name="configuration" description="Various Configuration">
  104.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  105. </section>ALLOC_INTERFACE(database)<section name="configuration" description="Various Configuration">
  106.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  107. </section>default:<section name="configuration" description="Various Configuration">
  108.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  109. </section><section name="configuration" description="Various Configuration">
  110.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  111. </section>switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid Module Type!\n");<section name="configuration" description="Various Configuration">
  112.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  113. </section><section name="configuration" description="Various Configuration">
  114.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  115. </section>return NULL;<section name="configuration" description="Various Configuration">
  116.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  117. </section>}}
复制代码
3、switch_endpoint_interface_t

作用:endpoint的入口结构体定义:
  1. struct switch_endpoint_interface {<section name="configuration" description="Various Configuration">
  2.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  3. </section>/*! the interface's name */<section name="configuration" description="Various Configuration">
  4.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  5. </section>const char *interface_name;<section name="configuration" description="Various Configuration">
  6.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  7. </section>/*! channel abstraction methods */<section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section>switch_io_routines_t *io_routines;<section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section>/*! state machine methods */<section name="configuration" description="Various Configuration">
  12.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  13. </section>switch_state_handler_table_t *state_handler;<section name="configuration" description="Various Configuration">
  14.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  15. </section>/*! private information */<section name="configuration" description="Various Configuration">
  16.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  17. </section>void *private_info;<section name="configuration" description="Various Configuration">
  18.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  19. </section>switch_thread_rwlock_t *rwlock;<section name="configuration" description="Various Configuration">
  20.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  21. </section>int refs;<section name="configuration" description="Various Configuration">
  22.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  23. </section>switch_mutex_t *reflock;<section name="configuration" description="Various Configuration">
  24.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  25. </section>/* parent */<section name="configuration" description="Various Configuration">
  26.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  27. </section>switch_loadable_module_interface_t *parent;<section name="configuration" description="Various Configuration">
  28.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  29. </section>/* to facilitate linking */<section name="configuration" description="Various Configuration">
  30.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  31. </section>struct switch_endpoint_interface *next;<section name="configuration" description="Various Configuration">
  32.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  33. </section>switch_core_recover_callback_t recover_callback;};typedef struct switch_endpoint_interface switch_endpoint_interface_t;
复制代码
字段解释:interface_name => endpoint名称,比如:"rtc"io_routines => endpoint对应的io操作回调函数state_handler => endpoint对应的事件处理回调函数private_info => endpoint私有参数配置(比如编码格式、采样率等)rwlock => endpoint锁refs => endpoint锁的引用次数reflock => endpoint引用锁parent => endpoint所属模块next => next指针recover_callback => endpoint对应的recover回调函数4、switch_io_routines

作用:存储io操作的回调函数结构体定义:
  1. struct switch_io_routines {<section name="configuration" description="Various Configuration">
  2.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  3. </section>/*! creates an outgoing session from given session, caller profile */<section name="configuration" description="Various Configuration">
  4.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  5. </section>switch_io_outgoing_channel_t outgoing_channel;<section name="configuration" description="Various Configuration">
  6.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  7. </section>/*! read a frame from a session */<section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section>switch_io_read_frame_t read_frame;<section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section>/*! write a frame to a session */<section name="configuration" description="Various Configuration">
  12.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  13. </section>switch_io_write_frame_t write_frame;<section name="configuration" description="Various Configuration">
  14.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  15. </section>/*! send a kill signal to the session's channel */<section name="configuration" description="Various Configuration">
  16.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  17. </section>switch_io_kill_channel_t kill_channel;<section name="configuration" description="Various Configuration">
  18.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  19. </section>/*! send a string of DTMF digits to a session's channel */<section name="configuration" description="Various Configuration">
  20.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  21. </section>switch_io_send_dtmf_t send_dtmf;<section name="configuration" description="Various Configuration">
  22.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  23. </section>/*! receive a message from another session */<section name="configuration" description="Various Configuration">
  24.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  25. </section>switch_io_receive_message_t receive_message;<section name="configuration" description="Various Configuration">
  26.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  27. </section>/*! queue a message for another session */<section name="configuration" description="Various Configuration">
  28.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  29. </section>switch_io_receive_event_t receive_event;<section name="configuration" description="Various Configuration">
  30.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  31. </section>/*! change a sessions channel state */<section name="configuration" description="Various Configuration">
  32.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  33. </section>switch_io_state_change_t state_change;<section name="configuration" description="Various Configuration">
  34.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  35. </section>/*! read a video frame from a session */<section name="configuration" description="Various Configuration">
  36.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  37. </section>switch_io_read_video_frame_t read_video_frame;<section name="configuration" description="Various Configuration">
  38.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  39. </section>/*! write a video frame to a session */<section name="configuration" description="Various Configuration">
  40.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  41. </section>switch_io_write_video_frame_t write_video_frame;<section name="configuration" description="Various Configuration">
  42.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  43. </section>/*! read a video frame from a session */<section name="configuration" description="Various Configuration">
  44.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  45. </section>switch_io_read_text_frame_t read_text_frame;<section name="configuration" description="Various Configuration">
  46.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  47. </section>/*! write a video frame to a session */<section name="configuration" description="Various Configuration">
  48.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  49. </section>switch_io_write_text_frame_t write_text_frame;<section name="configuration" description="Various Configuration">
  50.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  51. </section>/*! change a sessions channel run state */<section name="configuration" description="Various Configuration">
  52.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  53. </section>switch_io_state_run_t state_run;<section name="configuration" description="Various Configuration">
  54.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  55. </section>/*! get sessions jitterbuffer */<section name="configuration" description="Various Configuration">
  56.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  57. </section>switch_io_get_jb_t get_jb;<section name="configuration" description="Various Configuration">
  58.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  59. </section>void *padding[10];};typedef struct switch_io_routines switch_io_routines_t;
复制代码
字段解释:outgoing_channel => 创建外呼channel的回调函数read_frame => 读session音频数据的回调函数write_frame => 写session音频数据的回调函数kill_channel => kill信号处理函数,用于处理channel接收的kill信号send_dtmf => send dtmf操作的回调函数,用于处理channel接收的DTMF字符串receive_message => 处理channel消息的回调函数,用于处理其它channel发来的消息receive_event => 发送channel消息的回调函数,用于向目标session发送自定义事件(比如rtc session、rtmp session等)state_change => channel状态修改的回调函数read_video_frame => 读session视频数据的回调函数write_video_frame => 写session视频数据的回调函数read_text_frame => 读session文本数据的回调函数write_text_frame => 写session文本数据的回调函数state_run => 改变session的运行状态,目前没见到有endpoint使用过get_jb => 获取session的jitter_buffer5、switch_state_handler_table_t

作用:用于存储状态机的回调函数。定义如下:
  1. struct switch_state_handler_table {<section name="configuration" description="Various Configuration">
  2.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  3. </section>/*! executed when the state changes to init */<section name="configuration" description="Various Configuration">
  4.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  5. </section>switch_state_handler_t on_init;<section name="configuration" description="Various Configuration">
  6.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  7. </section>/*! executed when the state changes to routing */<section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section>switch_state_handler_t on_routing;<section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section>/*! executed when the state changes to execute */<section name="configuration" description="Various Configuration">
  12.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  13. </section>switch_state_handler_t on_execute;<section name="configuration" description="Various Configuration">
  14.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  15. </section>/*! executed when the state changes to hangup */<section name="configuration" description="Various Configuration">
  16.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  17. </section>switch_state_handler_t on_hangup;<section name="configuration" description="Various Configuration">
  18.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  19. </section>/*! executed when the state changes to exchange_media */<section name="configuration" description="Various Configuration">
  20.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  21. </section>switch_state_handler_t on_exchange_media;<section name="configuration" description="Various Configuration">
  22.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  23. </section>/*! executed when the state changes to soft_execute */<section name="configuration" description="Various Configuration">
  24.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  25. </section>switch_state_handler_t on_soft_execute;<section name="configuration" description="Various Configuration">
  26.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  27. </section>/*! executed when the state changes to consume_media */<section name="configuration" description="Various Configuration">
  28.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  29. </section>switch_state_handler_t on_consume_media;<section name="configuration" description="Various Configuration">
  30.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  31. </section>/*! executed when the state changes to hibernate */<section name="configuration" description="Various Configuration">
  32.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  33. </section>switch_state_handler_t on_hibernate;<section name="configuration" description="Various Configuration">
  34.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  35. </section>/*! executed when the state changes to reset */<section name="configuration" description="Various Configuration">
  36.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  37. </section>switch_state_handler_t on_reset;<section name="configuration" description="Various Configuration">
  38.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  39. </section>/*! executed when the state changes to park */<section name="configuration" description="Various Configuration">
  40.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  41. </section>switch_state_handler_t on_park;<section name="configuration" description="Various Configuration">
  42.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  43. </section>/*! executed when the state changes to reporting */<section name="configuration" description="Various Configuration">
  44.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  45. </section>switch_state_handler_t on_reporting;<section name="configuration" description="Various Configuration">
  46.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  47. </section>/*! executed when the state changes to destroy */<section name="configuration" description="Various Configuration">
  48.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  49. </section>switch_state_handler_t on_destroy;<section name="configuration" description="Various Configuration">
  50.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  51. </section>int flags;<section name="configuration" description="Various Configuration">
  52.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  53. </section>void *padding[10];};typedef struct switch_state_handler_table switch_state_handler_table_t;
复制代码
参数解释:on_init => channel进入 CS_INIT 状态的回调函数on_routing => channel进入 CS_ROUTING 状态的回调函数on_execute => channel进入 CS_EXECUTE 状态的回调函数,用于执行操作on_hangup => channel进入 CS_HANGUP 状态的回调函数on_exchange_media => channel进入 CS_EXCHANGE_MEDIA 状态的回调函数on_soft_execute => channel进入 CS_SOFT_EXECUTE 状态的回调函数,用于从其它channel接收或发送数据on_consume_media => channel进入 CS_CONSUME_MEDIA 状态的回调函数,on_hibernate => channel进入 CS_HIBERNATE 状态的回调函数,sleep操作on_reset => channel进入 CS_RESET 状态的回调函数on_park => channel进入 CS_PARK 状态的回调函数on_reporting => channel进入 CS_REPORTING 状态的回调函数on_destroy => channel进入 CS_DESTROY 状态的回调函数switch_core_state_machine.c中使用 STATE_MACRO 触发,部分触发代码如下:
  1. case CS_ROUTING:<section name="configuration" description="Various Configuration">
  2.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  3. </section>/* Look for a dialplan and find something to do */<section name="configuration" description="Various Configuration">
  4.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  5. </section>STATE_MACRO(routing, "ROUTING");<section name="configuration" description="Various Configuration">
  6.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  7. </section>break;case CS_RESET:<section name="configuration" description="Various Configuration">
  8.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  9. </section><section name="configuration" description="Various Configuration">
  10.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  11. </section>/* Reset */<section name="configuration" description="Various Configuration">
  12.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  13. </section>STATE_MACRO(reset, "RESET");<section name="configuration" description="Various Configuration">
  14.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  15. </section>break;<section name="configuration" description="Various Configuration">
  16.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  17. </section>/* These other states are intended for prolonged durations so we do not signal lock for them */case CS_EXECUTE:<section name="configuration" description="Various Configuration">
  18.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  19. </section>/* Execute an Operation */<section name="configuration" description="Various Configuration">
  20.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  21. </section>STATE_MACRO(execute, "EXECUTE");<section name="configuration" description="Various Configuration">
  22.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  23. </section>break;case CS_EXCHANGE_MEDIA:<section name="configuration" description="Various Configuration">
  24.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  25. </section>/* loop all data back to source */<section name="configuration" description="Various Configuration">
  26.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  27. </section>STATE_MACRO(exchange_media, "EXCHANGE_MEDIA");<section name="configuration" description="Various Configuration">
  28.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  29. </section>break;case CS_SOFT_EXECUTE:<section name="configuration" description="Various Configuration">
  30.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  31. </section>/* send/recieve data to/from another channel */<section name="configuration" description="Various Configuration">
  32.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  33. </section>STATE_MACRO(soft_execute, "SOFT_EXECUTE");<section name="configuration" description="Various Configuration">
  34.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  35. </section>break;case CS_PARK:<section name="configuration" description="Various Configuration">
  36.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  37. </section><section name="configuration" description="Various Configuration">
  38.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  39. </section>/* wait in limbo */<section name="configuration" description="Various Configuration">
  40.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  41. </section>STATE_MACRO(park, "PARK");<section name="configuration" description="Various Configuration">
  42.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  43. </section>break;case CS_CONSUME_MEDIA:<section name="configuration" description="Various Configuration">
  44.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  45. </section>/* wait in limbo */<section name="configuration" description="Various Configuration">
  46.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  47. </section>STATE_MACRO(consume_media, "CONSUME_MEDIA");<section name="configuration" description="Various Configuration">
  48.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  49. </section>break;case CS_HIBERNATE:<section name="configuration" description="Various Configuration">
  50.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  51. </section>/* sleep */<section name="configuration" description="Various Configuration">
  52.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  53. </section>STATE_MACRO(hibernate, "HIBERNATE");<section name="configuration" description="Various Configuration">
  54.     <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  55. </section>break;
复制代码
四、模块编写示例 

1、编写c风格的endpoint模块

仿照mod_rtc模块编写,核心文件只有两个:mod_rtc.cMakefile.am 1)复制mod_artc目录cp mod_rtc mod_ctest -r
 2)修改文件名
mv mod_rtc.c mod_ctest.c 3)修改文件内容,将rtc关键字替换成ctest

 4)修改编译选项
文件: freeswitch-1.10.9.-release/configure.ac仿照rtc模块,添加ctest模块内容:src/mod/endpoints/mod_ctest/Makefile
 
5)开启模块编译文件:freeswitch-1.10.9.-release/modules.conf仿照rtc模块,添加ctest模块编译:endpoints/mod_ctest
 
6)生成Makefile./rebootstrap.sh && ./configure
 7)安装模块
在 freeswitch-1.10.9.-release 根目录(或mod_ctest目录)执行如下指令:make && make install
 8)加载模块
文件:conf/autoload_configs/modules.conf.xml添加如下内容: 9)模块测试控制台加载测试:reload mod_ctest
c风格endpoint模块编译及运行效果视频:
关注微信公众号(聊聊博文,文末可扫码)后回复 2023052801 获取。 
2、编写c++风格的endpoint模块

仿照mod_h323模块编写,目录结构、编译等参考c风格endpoint模块编写部分。加载效果如下:
c++风格endpoint模块编译及运行效果视频:
关注微信公众号(聊聊博文,文末可扫码)后回复 2023052802 获取。 
五、资源下载

本文涉及源码和文件,可以从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230528 获取。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表