Freeswitch监听功能--单向监听

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);

你可能感兴趣的:(Freeswitch监听功能--单向监听)