1.监听函数:eavesdrop
lua脚本中调用监听:
local cmd = "originate loopback/3333 &eavesdrop("..uuid..")"
api:executeString(cmd)
2、监听变量设置
参考C代码:mod_dptools.c 875行
const char *require_group = switch_channel_get_variable(channel, "eavesdrop_require_group");
const char *enable_dtmf = switch_channel_get_variable(channel, "eavesdrop_enable_dtmf");
const char *bridge_aleg = switch_channel_get_variable(channel, "eavesdrop_bridge_aleg");
const char *bridge_bleg = switch_channel_get_variable(channel, "eavesdrop_bridge_bleg");
const char *whisper_aleg = switch_channel_get_variable(channel, "eavesdrop_whisper_aleg");
const char *whisper_bleg = switch_channel_get_variable(channel, "eavesdrop_whisper_bleg");
从代码中可以看出设置eavesdrop_bridge_aleg和eavesdrop_bridge_bleg来决定监听a通道还是b通道,freeswitch默认是同时监听双向通话的语音。
3、监听功能实现代码理解
mod_dptools.c 根据设置的的变量设置通道的标记位。
if (switch_true(bridge_bleg)) {
flags |= ED_BRIDGE_WRITE;
}
但是这获取到的bridge_bleg变量指针为空。
所以下面代码也不起作用,具体原因还要进一步研究。
问题已经定位:loopback方式设置通道变量失败,采用下面的方法设置成功
originate loopback/lp123456 'set:eavesdrop_bridge_aleg=true,eavesdrop:1234567890' inline
switch_ivr_async.c
if (flags & ED_BRIDGE_WRITE) {
write_flags = SMBF_WRITE_STREAM | SMBF_WRITE_REPLACE;
}
4、解决办法:屏蔽switch_ivr_async.c 2103行的代码重新编译,实现只监听通道中输入的声音,不监听对通道的放音。
status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);