FreeSWTICH中自定义命令的添加
本文将介绍如何在 FreeSWITCH 中开发自己的命令。本文需要在FreeSWTICH在vs中添加一个测试模块作为基础知识。
环境
环境名
版本
WIN
WIN10
FS
1.10.0
VS
vs2017
FreeSWITCH 模块基础知识关于模块的定义、生命周期的开启与结束都在以下所示的定义中:
12345SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xx_shutdown);SWITCH_MODULE_LOAD_FUNCTION(mod_xx_load);SWITCH_MODULE_RUNTIME_FUNCTION(mod_xx_runtime);SWITCH_MODULE_DEFINITION(mod_xx, mod_xx_load, mod_xx_shutdown, mod_xx_runtime);
此行我们着重关注模块的启动,因为我们将要在里面放置我们需要添加的命令。那我们直接开始上代码把!
添加一个命令在 SWITCH_MODULE_LOAD_FUNCTION中添加指向处理命令的 mod_name_function 并告知 ...
WebRTC 在 Win 中源代码编译
本文主要讲解本人在 win 中编译 WebRTC 的过程中所遇到的问题与思考。
gclient“工欲善其事,必先利其器”。那么我们必须先对这个工具有一定的认知。
为什么需要 gclientgclient 是谷歌开发的一款跨平台 git 仓库管理平台。
为什么要有这个呢?因为像这种大项目,被拆分成很多个子项目,子项目分别进行研发,这样的好处就是能够复用大量代码,方便多人开发(每个团队只负责一个项目),每个子项目都有版本规划。
那么集成代码的时候怎么办呢?难道要开发人员记得每个项目的版本号吗?比如:我们需要 webrtc M87,里面分成很多子项目,每个子项目都有对应的版本号,如果版本号错了可能存在接口兼容问题。
通过上诉问题,我们就知道 gclient 的作用了。本质就是方便集成所有的仓库的内容
gclient是如何运行gclient 将多个仓库组成一个 solution(解决方案)进行管理。这个解决方案用 .gclient 文件进行描述,其中描述了需要拉取那个解决方案,可以通过gclient conf创建文件。例如:我们要拉取 webrtc 这个解决方案,就在里面配置 webrtc 的 ...
webrtc源码解析-音频调用流程
本文主要记录下我阅读 webrtc 时候的其中关于从音频启动 voice-engine 到通过创建 source 获取到数据的整个流程,至于如何通过 source 传输 rtp 有待后续阅读分析。
本人阅读的代码在 window 端,因而可能更关于 window 的实现
create adm整个过程主要是创建 adm (audio device manager) 的过程,这里通过创建获取到了 window 的音频采集能力
123456789101112api/create_peerconnection_factory.cc:70 CreateModularPeerConnectionFactorypc/peer_connection_factory.cc:71 PeerConnectionFactory::Create Createpc/peer_connection_factory.cc:85 ConnectionContext::Create Createpc/connection_context.cc:126 ChannelManager ...
win中有用的命令
win 测试内网中所有连接设备1for /l %i in (1,1,255) do ping -n 1 -w 60 192.168.1.%i | find "回复" >> pingall.txt
FreeSWTICH在vs中添加一个测试模块
本文主要记录如何在 vs2017 中添加一个模块,并编译运行。然后,测试 event 内容
环境
环境名
版本
WIN
WIN10
FS
1.10.0
VS
vs2017
添加一个模块手动添加各种参数
在 vs2017 的资源管理中,选择一个文件夹,添加一个 c++ -> dll 项目,添加完成后删除多余的内容。
添加引用,直接在项目处添加引用,选择项目中的引用 FreeswitchCoreLib
增加库文件,选择 项目-> 属性 -> c/c++ -> 所有选项 -> 附加包含目录 增加项目解决方案的 lib 即可,目录内容为$(SolutionDir)\src\include
修改预处理器。在 fs 项目中,通过 vs 添加的项目默认为导入,我们需要在 项目->属性->c/c++->预编译头->预处理器定义 中添加MOD_EXPORTS,将项目标识为导出。源代码如下所示:
1234567891011121314// 我们在使用 SWITCH_MODULE_DEFINITION 时会被扩展为带有 SWI ...
C与FS中内存分配简析
本文将会讲解C标准库中内存分配在不同平台的不同实现方式,以及fs对标准的一个工具化封装。主要是对fs的内存分配有一个简单的认识。
C中的内存分配C中的内存分配主要有以下三个方法。此处只是对其做简单的介绍,我发现一篇文章写得很好,可以阅读calloc、malloc、realloc函数的区别及用法!一文
malloc:其原型为void *malloc(unsigned int num_bytes),其中此处的num_bytes不是Bytes,所以需要将c语言中的基础类型sizeof求值
calloc:其原型为void *calloc(size_t n, size_t size),这个本质还是malloc进行分配,分配完后并进行了初始化。可以看引用中malloc和calloc的差别一文
realloc:其原型为void *realloc(void *ptr, size_t new_Size),就是对空间进行扩充。扩充过程中如果比较大,那么会重新开辟空间并将原来空间内容拷贝过去,并将以前的空间释放。此处的大以系统为准,在以前的地址申请,如果能够申请那么大就直接返回以前的地址。
注意: ...
freeswitch中开发列出所有模块命令
本文章主要是对本人在fs中开发一个命令的时候的一些随想。主要记录一些遇到的问题与一些简答的想法,不具有体系性,望与共勉!
环境
环境名
版本
WIN
WIN10
FS
1.10.0
VS
vs2017
vs中编译代码开发一个模块命令后,需要重新build。
自言自语:点击调试好像没法重新加载代码,重新build很慢,是否有其它方法?只是一个模块,应该是编译这一个模块就可以塞?
干,vs2017中生成里面有重新生成修改的模块。-_-||
用到的函数
switch_xml_open_cfg(const char *file_path, switch_xml_t *node, switch_event_t *params)
这个函数内部调用switch_xml_locate,看其中内容可以发现要求传入文件的名字即可。先就讲到这里,细节后面再说
file_path:需要指定文件的名字,不包括路径。例如: “modules.conf”
node: 声明一个switch_xml_t即可
params: 直接传输NULL
switch_xml_child(switch_ ...
Linux下的Socket编程(一)
Linux环境下的Socket开发,主要讲解socket编程的简单认识以及所需要依赖的库。最后形成一个简单的测试用例
Socket编程认识在Linux环境下,任何内容(驱动,硬件,网络)都被认为是文件。在此种语境下,我们可以像操作文件一样操作Linux中的任何内容。
Linux下文件操作要素
Linux下文件操作首先需要获取到一个关于文件的id(int)。通过此id你就可以对文件进行读与写操作。程序的主要任务就是对数据的读与写。(程序的本质是数据与算法)
Socket操作要素
意思讲解:Socket的意思是“插座”,就是你的程序作为“插头”,插到插座上,只要你们的协议相同那么就可以进行通信。
Socket作为一个特殊的文件,同样会返回一个id(int)用于对其进行操作。
Socket编程涉及函数关于Socket编程的几个函数如socket、bind、connect、listen、accept都位于<sys/socket.h>中
socket函数socket函数用于创建套接字,其原型为:
1int socket(int af, int type, int prot ...
C中的函数
本文主要着重函数的概念,以及在声明、调用上面进行讲解。其中会额外讲解变量的作用范围,其主要也是着眼于函数内。
函数的概念
数学:数学中的函数是指一个数集按照一个指定的法则映射到另一个数集中,其中的法则被称为函数关系式或函数
程序:是指传入输入数据按照一定的规则运算后输出一个有意义的数据,其中我们将一定的运算规则就称为函数。
tips:其中关于函数的理解是本人个人总结,如有错误,还请指导。
函数的声明在C语言中,任何函数的使用必须首先进行声明,否则进行调用。其中max对其进行了声明,声明形式为return_type function_name( parameter list );
12345678910111213141516#include<stdio.h>//声明的形式int main(){ int a=1,b=2; int max(int a,int b); int maxVar = max(a,b); printf("%d",maxVar); return 1;}int max(int a,i ...
C中数组知识回顾
主要回顾C语言中关于数组的定义以及初始化。基础知识如数组用[],初始化值用{}将不会着重讲解。
一维数组一维数组的定义与初始化是二维以及多维的基础。其中重点主要在初始化中。
一维数组的定义1234567891011/** * 一、一维数组,数组的定义,数组的引用,数组的初始化**///1、数组的定义与数组的引用int arr1[10],i;for(i=0;i<sizeof(arr1)/sizeof(int);i++){ printf("arr1 %d ,",arr1[i]);}printf("\n");
一维数组的初始化一维数组的初始化主要有以下三个特点以及一个注意点。特点主要围绕初始化时是否指定数组的长度
初始化指定长度的数组,如果初始化数组不够,全部用零自动填充
初始化一个未指定长度的数组。那么编译器会自动生成{}数字相同的长度
如果指定了长度的数组都初始化为零。可以使用{0}或者{相同长度的零}
注意:c语言的数组不支持动态数字,即必须从初始化开始时都固定,不同通过scanf这一 ...