示范了通过调用liblinphone拨打电话的过程,原程序
$ gcc -o call linphone-call.c -llinphone.dll -lmediastreamer.dll
PS:
http://mirror.yongbok.net/nongnu/linphone/docs/liblinphone/group__basic__call__tutorials.html
代码中增加了接听部分
/*
* linphone-call.c
* liblinphone拨打示例
* */
#include "linphone/linphonecore.h"
#include <signal.h>
static bool_t running=TRUE;
static void stop(int signum){
running=FALSE;
}
/*
* 定义回调函数,用于获取拨打电话过程状态通知
*/
static void call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *msg){
printf("call state: %s\n",msg);
switch(cstate){
case LinphoneCallIncomingReceived:
printf("comes a new incoming call! Accept(y/n):");
char s = getchar();
if(s == 'y')
{
printf("accept\n");
linphone_core_accept_call(lc, call); //接听电话
}
else {
printf("refuse\n");
linphone_core_terminate_call(lc, call);
}
break;
default:
printf("Unhandled notification %i\n",cstate);
}
}
/*
* 主函数
*/
int main(int argc, char *argv[]){
LinphoneCoreVTable vtable={0};
LinphoneCore *lc;
LinphoneCall *call=NULL;
const char *dest=NULL;
/* 命令行参数目的地址,如sip:name@192.168.1.1*/
if (argc>1){
dest=argv[1];
}
signal(SIGINT,stop); //获取Ctrl-C信号,以结束程序
/* 1.用回调函数表LinphoneCoreVTable,实例化一个LinphoneCore对像。
* LinphoneCoreVTable中所有项都是可选的,这里仅仅设置了call_state_changed,用于获取拨打时的状态通知。
*/
vtable.call_state_changed=call_state_changed;
lc=linphone_core_new(&vtable,NULL,NULL,NULL);
/*
* 2.拨打电话
* */
if (dest){
call=linphone_core_invite(lc,dest);
if (call==NULL){
printf("Could not place call to %s\n",dest);
goto end;
}else printf("Call to %s is in progress...",dest);
//linphone_call_ref(call); //增加call的引用计数,
}
/*
* 3.接收通知的主循环,调用linphone_core_iterate函数完成后台处理工作
*/
while(running){
linphone_core_iterate(lc);
ms_usleep(50000);
printf("TT");
}
/*
* 4.接收到Ctrl-C,挂断所有通话
* */
if(linphone_core_in_call(lc))
{
linphone_core_terminate_all_calls(lc);
}
#if 0
if (call && linphone_call_get_state(call)!=LinphoneCallEnd){
/* terminate the call */
printf("Terminating the call...\n");
linphone_core_terminate_call(lc,call); /*挂断*/
/*at this stage we don't need the call object */
linphone_call_unref(call);
}
#endif
end:
printf("Shutting down...\n");
/*
* 5.释放资源,销毁LinphoneCore对象
* */
linphone_core_destroy(lc);
printf("Exited\n");
return 0;
}
在mingw中编译,使用下面的命令$ gcc -o call linphone-call.c -llinphone.dll -lmediastreamer.dll
测试 在另一个ip上开启一个linphone客户端
拨打:
$ call sip:192.168.9.81
ortp-warning-./share/sounds/linphone/rings/oldphone.wav does not exist
Unhandled notification 2
Call to sip:192.168.9.81 is in progress...ortp-warning-cannot set noise gate mod
e to [0] because no volume send
Unhandled notification 3
ortp-warning-Failed to open ./share/sounds/linphone/ringback.wav
It is now ringing remotely !
接听:
Administrator@liangguangwei /e
$ call
ortp-warning-./share/sounds/linphone/rings/oldphone.wav does not exist
ortp-warning- searching for already_a_call_with_remote_address.
ortp-warning-Failed to open ./share/sounds/linphone/rings/oldphone.wav
call state: Incoming call
comes a new incoming call! Accept(y/n):yPS:
程序中似乎存在一个问题,第一次接听正常,挂断后就死锁了,无法再次接听,不清楚是什么原因!
本文档详细介绍了使用 liblinphone 库如何实现电话拨打和接听功能。在实际测试中,发现在首次成功接听电话并挂断后,会出现死锁问题,导致无法进行第二次接听。这个问题有待进一步排查和解决。
3177

被折叠的 条评论
为什么被折叠?



