1. 程式人生 > >FreeSWITCH模組載入

FreeSWITCH模組載入

一、模組介面            FreeSWITCH的大部分功能是通過載入外部的模組來實現的。模組通過一個數據結構向外部暴露了自己的介面。該資料結構定義如下:typedef struct switch_loadable_module_function_table {       int switch_api_version;       switch_module_load_t load;       switch_module_shutdown_t shutdown;       switch_module_runtime_t runtime;       switch_module_flag_t flags;} switch_loadable_module_function_table_t;    模組被成功載入後,會搜尋這個資料結構的變數,從其中獲取到匯出的函式。這個變數名由如下方式組成:          模組名 + _module_interface

二、sofia模組

     以mod_sofia為例描述模組的載入過程。根據規則mod_sofia模組的介面變數名為:mod_sofia_module_interface。在動態載入mod_sofia.so庫後,查詢mod_sofia_module_interface變數,其中的load函式指標必須指向一個有效的函式,否則載入模組將失敗。隨後,呼叫load函式,對於mod_sofia模組來說,最終呼叫的是mod_sofia.c中的mod_sofia_load函式。       在成功呼叫函式mod_sofia_load後,將獲取到一個型別為switch_loadable_module_interface_t的變數module_interface,該資料型別定義如下:struct switch_loadable_module_interface {const char *module_name;switch_endpoint_interface_t *endpoint_interface;switch_timer_interface_t *timer_interface;switch_dialplan_interface_t *dialplan_interface;switch_codec_interface_t *codec_interface;switch_application_interface_t *application_interface;switch_chat_application_interface_t *chat_application_interface;switch_api_interface_t *api_interface;switch_json_api_interface_t *json_api_interface;switch_file_interface_t *file_interface;switch_speech_interface_t *speech_interface;switch_directory_interface_t *directory_interface;switch_chat_interface_t *chat_interface;switch_say_interface_t *say_interface;switch_asr_interface_t *asr_interface;switch_management_interface_t *management_interface;switch_limit_interface_t *limit_interface;switch_thread_rwlock_t *rwlock;int refs;switch_memory_pool_t *pool;};    動態庫mod_sofia.so載入成功後,會把最終的結果整理為一個結構,供上層使用,該資料結構定義如下:
struct switch_loadable_module {char *key;char *filename;int perm;switch_loadable_module_interface_t *module_interface;switch_dso_lib_t lib;switch_module_load_t switch_module_load;switch_module_runtime_t switch_module_runtime;switch_module_shutdown_t switch_module_shutdown;switch_memory_pool_t *pool;switch_status_t status;switch_thread_t *thread;switch_bool_t shutting_down;};
      其中最重要的成員是來自變數mod_sofia_module_interface的三個函式switch_module_load、switch_module_runtime、switch_module_shutdown,以及通過load函式獲取的介面module_interface。       mod_sofia模組中只匯出了mod_sofia_load、 mod_sofia_shutdown兩個函式,switch_module_runtime未實現。在mod_sofia.c中,使用巨集SWITCH_MODULE_DEFINITION定義了結構變數mod_sofia_module_interface供so檔案匯出

相關推薦

FreeSWITCH模組載入

一、模組介面            FreeSWITCH的大部分功能是通過載入外部的模組來實現的。模組通過一個數據結構向外部暴露了自己的介面。該資料結構定義如下:typedef struct switch_loadable_module_function_table {   

FreeSwitch 的初始化及其模組載入過程

 FS 主函式main() Freeswitch的主函式是在檔案switch.c中定義的,該檔案的260行是整個程式的入口,主函式主要完成的功能是包括,命令列解析,初始化apr庫,構建全域性記憶體池,模組載入和初始化核心元件。 初始化apr庫是由apr_initial

讓LINUX核心模組載入Windows下驅動

最近一段時間以來,幾乎每一臺行動式計算機都內建了無線功能,但是它們中有很多並不支援Linux。因此,除非這些計算機設定了雙啟動,這樣做LINUX使用者也未必可以使用無線網絡卡,儘管如此,除非Windows正在執行,否則這些便攜計算機可能依然無法連線到無線網路。   最近一段時間以來,幾乎每一臺行

es6 模組載入

  比較一下預設輸出和正常輸出 // 第一組 export default function crc32() { // 輸出 // ... } import crc32 from 'crc32'; // 輸入 // 第二組 export function crc32() {

RequireJS 是一個JavaScript模組載入

RequireJS 是一個JavaScript模組載入器。它非常適合在瀏覽器中使用, 它非常適合在瀏覽器中使用,但它也可以用在其他指令碼環境, 就像 Rhino and Node. 使用RequireJS載入模組化指令碼將提高程式碼的載入速度和質量。 IE 6+ .......... 相容 ✔Fi

nodejs 模組載入順序

nodejs 模組載入順序 一、當引入模組的形式是 require('lt') 時(1)、先找當前資料夾下的node_modules資料夾下的lt資料夾下的package.json 檔案指定的main欄位檔案路徑。## 如果第一種情況沒有找到(2)、找當前資料夾下的node_modules資料夾下的lt.j

DRBD模組載入失敗

modprobe drbd [[email protected] ~]# modprobe drbdmodprobe: FATAL: Module drbd not found. 解決辦法:一般是系統預設的核心並不支援此模組,所以要更新核心 檢視核心版本:[[email protec

opencv-python(十三):DNN模組載入caffe訓練好的SSD模型

    opencv越來越強大了,可以直接對訓練好的caffe、tensorflow等框架訓練好的模型進行載入,進而完成識別、檢測等任務。     opencv載入caffe訓練好的模型,採用readNetFromCaffe(arg1,arg2),第一個引數對應定義模型結構

讀懂CommonJS的模組載入

叨叨一會CommonJS Common這個英文單詞的意思,相信大家都認識,我記得有一個片語common knowledge是常識的意思,那麼CommonJS是不是也是類似於常識性的,大家都理解的意思呢?很明顯不是,這個常識一點都不常識。我最初認為commonJS是一個開源的JS庫,就是那種非常方便用的庫,裡面

OBS視訊資料輸出流程(模組載入,編碼,推流)詳細說明

宣告:本文章內容僅代表個人觀點,不能保證完全的正確性,僅供參考! 先上個自己畫的圖,結合流程圖和文字解釋,理解起來會更快些 1、視訊輸出初始化 程式執行時,初始化OBS,視訊相關的初始化是再mainWindow中進行的 OBSApp::OBSInit() ->

ECMA Script 6_模組載入方案 ES6 Module 模組語法_import_export

1. 模組載入方案 commonJS 背景: 歷史上,JavaScript 一直沒有模組(module)體系, 無法將一個大程式拆分成互相依賴的小檔案,再用簡單的方法拼裝起來。 其他語言都有這項功能:  Ruby 的require Python 的import 甚至就連 CSS 都有

【web名詞】模板引擎,js框架, js模組載入器區別

供學習記錄,可能有錯誤。 模板引擎 controller請求,後端怎麼傳資料,前端怎麼獲取。 比如:japidview, rythm。 以japidview為例。後端controller繼承JapidController,render資料,前端@args獲取,

NodeJS中的模組載入機制

1) 模組的型別 odeJS模組分為兩類,一類是核心模組,一類是檔案模組。 1,核心模組就是NodeJS標準中提供的模組,如fs、http、net、vm等,官方提供的模組,編譯成了二進位制程式碼,直接可以通過require獲取核心模組,核心模組具有最高的載入優先順序,如果

Webpack自動化模組載入及構建#2

上一篇文章中,筆者對webpack這個當下比較流行的模組載入器兼打包工具做了一些簡單的介紹和筆者目前的使用場景,說句題外話,在這裡,筆者並不想以一種什麼一個小時,一週精通webpack的視角去撰寫這樣一種工具該如何運用自如,我也木有把這個工具玩明白,不過筆者更多的想以自己當下正在使用這個工具的感

Webpack自動化模組載入及構建#1

曾經筆者剛覺得會用Chrome Dev Tool這種裝逼技能的時候(也就是F12),就喜歡隨便看看不同站點的原始碼(其實也就是想摳摳圖下來),然後裝逼似的感慨一句: 哇塞,前端好JB煩啊 慢慢地,當筆者接觸新的專案的時候,逐漸接觸到了前端的

nginx的redis模組載入

redis模組介紹 redis2-nginx-module 可以實現 Nginx 以非阻塞方式直接防問遠方的 Redis 服務,可以啟用強大的 Redis 連線池功能,進而實現更多的連線與更快速的訪問。 安裝部署 安裝前環境:php+nginx 見 https://www.cnblogs.com/hua

Linux ipv6模組載入失敗解決

  主要檢查內容:  ipv6地址是否存在    ifconfig |grep inet6    沒有預設inet6地址      ipv6模組是否存在    # modinfo -n ipv6  &

驅動模組載入、解除安裝遇到的問題總結

1、rmmod: chdir(/lib/modules): No such file or directory 解決方法1.建立 /lib/modules/$(uname -r) 空目錄就行了 2.使

[Python模組學習]使用linecache模組載入和快取檔案內容

linecache模組 接觸到linecache這個模組是因為前兩天讀attrs原始碼的時候看到內部程式碼引用了這個模組來模擬一個假檔案,帶著一臉疑問順便讀了一下這個模組的原始碼,發現其實也就那麼回事兒,程式碼不多,在這總結一下。 linecache模組可以

VS2010打不開VS2012 .NET MVC 工程,及開啟後部分模組載入不正確的解決辦法

首先,如果sln開啟不正確,用(notepad++)開啟sln 比如 VS2010的前兩行為: Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 VS2008的前