[Freeswitch-users] Issues with using avmd from python script

Michael Collins msc at freeswitch.org
Sat Jul 27 04:34:33 MSD 2013


I don't know Python but if it works like other languages then when an event
comes in the input callback is called:

def input_callback(session, what, obj):

    if (what == "dtmf"):
        consoleLog("info", what + " from callback " + obj.digit + "\n")
        return
    elif (what == "event" and session.getVariable('avmd_detect') == "TRUE"):
        consoleLog("info", "Voicemail Detected\n")


The "what" tells you the type of input. In this case you test for
what=="dtmf" (for when the user presses a dtmf key) and for what=="event"
for when an event comes in. In your specific case you check for an event
and to see if the variable avmd_detect is true. If so then you are assuming
that this is the mod_avmd event that it's detected a beep. (This is not the
optimal method because you can actually check the event headers to make
sure it's the correct event. I'll leave that as a research project for you.)

Again, I'm not a Python guy so if someone else could verify my logic/syntax
that would be good. Under the elif you have a consoleLog function call.
After that line you could put all your code for handling the voicemail.
Keep in mind that avmd is non-block, i.e. you aren't forced to sleep while
detecting the beep. You could be playing a message or whatnot. As soon as
the avmd detects a beep it will send the event and the inputcallback will
be called and in your case the elif block will get executed. In that block
of code you could stop the playback of your sound file and then initiate a
new playback. (I'm assuming that you want to play a message after the
beep?) Something like this:

def input_callback(session, what, obj):

    if (what == "dtmf"):
        consoleLog("info", what + " from callback " + obj.digit + "\n")
        return
    elif (what == "event" and session.getVariable('avmd_detect') == "TRUE"):
        session.execute("avmd", "stop")
        consoleLog("info", "Voicemail Detected\n")
        session.execute("speak", "flite|kal|'Hi this is '")

    return "TRUE"

def handler(session, args):

    session.answer()
   # session.setVariable("hangup_after_bridge", "false")
     callback = session.setInputCallback("input_callback")
    session.execute("avmd", "start")
    consoleLog("info", "AVMD start\n")
    session.execute("sleep", "18000") # this could be a playback
    consoleLog("info", "AVMD status %s\n" % session.getVariable('avmd_
detect'))
    session.execute("avmd", "stop")
    consoleLog("info", "AVMD stop\n")
    session.setHangupHook(hangup_hook)
    session.hangup() #hangup the call


I don't think it's any more complicated than that.

I highly recommend that you read up in the wiki and in the new FreeSWITCH
book about events. Also, the FreeSWITCH Cookbook has good information about
events. (Full disclosure: I'm co-author of both of those books). Also,
don't be afraid of checking out all the Lua examples. Lua is easy to read
if you're familiar with any scripting language and you can borrow ideas
from existing scripts.

Start by trying to understand
setInputCallback<https://wiki.freeswitch.org/index.php?title=Special%3ASearch&search=setInputCallback>and
go from there.

Hope this helps,
MC


On Fri, Jul 26, 2013 at 2:46 PM, raj singh <rajictdialer at gmail.com> wrote:

> Can you please tell how callback works, my understanding is that it
> handles user input, not sure how it works when we are trying to catch
> voicemails?
>
> Thanks
>
>
> On Fri, Jul 26, 2013 at 1:25 PM, Michael Collins <msc at freeswitch.org>wrote:
>
>> I would do your "voicemail" stuff in the callback where you detect that
>> the avmd detected true. I would also put the avmd_stop app in that code
>> block.
>> -MC
>>
>>
>> On Thu, Jul 25, 2013 at 7:33 PM, Raghu <srraghu45 at gmail.com> wrote:
>>
>>> Thanks for checking it Michael. I thought i was trying execute 'speak'
>>> when AVMD detects a beep as below, but may be i am missing something.
>>> Please review the code and let me know if i am missing anything:
>>>
>>> from freeswitch import *
>>>
>>> # WARNING: known bugs with hangup hooks, use with extreme caution
>>> def hangup_hook(session, what):
>>>   %s!!\n\n" % what)
>>>     return
>>>
>>> def input_callback(session, what, obj):
>>>
>>>     if (what == "dtmf"):
>>>         consoleLog("info", what + " from callback " + obj.digit + "\n")
>>>         return
>>>     elif (what == "event" and session.getVariable('avmd_detect') ==
>>> "TRUE"):
>>>         consoleLog("info", "Voicemail Detected\n")
>>>
>>>     return "TRUE"
>>>
>>> def handler(session, args):
>>>
>>>     session.answer()
>>>    # session.setVariable("hangup_after_bridge", "false")
>>>      callback = session.setInputCallback("input_callback")
>>>     session.execute("avmd", "start")
>>>     consoleLog("info", "AVMD start\n")
>>>     session.execute("sleep", "18000")
>>>     consoleLog("info", "AVMD status %s\n" %
>>> session.getVariable('avmd_detect'))
>>>
>>>     if session.getVariable('avmd_detect'):
>>>          consoleLog("info", "Beep Detected\n")
>>>          session.execute("speak", "flite|kal|'Hi this is '")
>>>          session.execute("avmd", "stop")
>>>
>>>     session.execute("speak", "flite|kal|'Hi this is '")
>>>     consoleLog("info","callback returned   %s!!\n\n" % callback)
>>>     session.execute("avmd", "stop")
>>>     consoleLog("info", "AVMD stop\n")
>>>     session.setHangupHook(hangup_hook)
>>>     session.hangup() #hangup the call
>>>
>>> Appreciate it!
>>>
>>>
>>>
-- 
Michael S Collins
Twitter: @mercutioviz
http://www.FreeSWITCH.org
http://www.ClueCon.com
http://www.OSTAG.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-users/attachments/20130726/b6064a12/attachment-0001.html 


Join us at ClueCon 2011 Aug 9-11, 2011
More information about the FreeSWITCH-users mailing list