John Todd
2003-Apr-20 16:17 UTC
[Asterisk-Users] Macros not working as expected with extension "h" in some circumstances
I have a question on how to handle the "h" routines. I have noticed that if the call is hung up by the side that originated the call, the "h" routine is not extendable via a macro, or at least I have been unable to do it. My tests have included only SIP->SIP calls. If the originating side hangs up first: The macro is called from "exten => h,1,Macro(CloseRecording)" - the call process will jump to the first priority in the macro, execute it, and stop and return out of the macro. This is not the desired effect. If the destination side hangs up first: The macro is called from "exten => h,1,Macro(CloseRecording)" and runs through all six steps of the macro, and exits normally. I went so far as to move my macro code into the "h" extension within the context (in other words, not use a macro) and it works fine. Only when calling a macro does it appear that the "h" routine gets confused. To make a question out of this: Why does it appear that I cannot use macros from within the "h" extension if the originating side hangs up first in a SIP->SIP call? JT from extensions.conf: [intern-post] ; Make sure that if we are recording the channel, we properly clean up the ; recorded files. exten => h,1,Macro(record-cleanup) ; Include operator context include => operator . . . (all extensions in this context are includes other than "h") [macro-record-cleanup] ; If we have recorded a call, it is to our advantage to change the ; format of the call from a two-file system (blah-in.wav blah-out.wav) ; into a single file that contains both legs of the call, and then ; compress the call into some reasonably small filesize using gsm ; compression. This routine should be called out of the "h" priority ; in a context. If the call was not recorded, this macro will ; not cause any harm, so calling it on each hangup isn't a problem. ; ; First, did we record this call? If ${CALLFILENAME} is zero, then ; we can be fairly certain that this call wasn't recorded, so just ; jump to the end of this macro and return out of routine. ; exten => s,1,SetVar(MONITORDIR=/var/spool/asterisk/monitor) exten => s,2,GotoIf($[${CALLFILENAME} = 0]?s|6) ; ; This part of the routine mixes the in and out .wav files into one .wav, and then ; cleans up the original files (removes them) ; exten => s,3,System(/usr/local/bin/wmix ${CALLFILENAME}-in.wav ${CALLFILENAME}-out.wav > ${CALLFILENAME}) exten => s,4,System(/bin/rm ${MONITORDIR}/${CALLFILENAME}-in.wav ${MONITORDIR}/${CALLFILENAME}-out.wav) ; ; This part of the routine compresses the .wav files into a .gsm file for ; better storage (about 1/5 the size of a .wav file). Use "untoast" to restore ; to normal wav file format. (toast and untoast are fairly standard on Linux systems) ; exten => s,5,System(/usr/bin/toast -F ${CALLFILENAME}) ; ; End of routine, return to calling point (note: NoOp required for GotoIf at priority 1) exten => s,6,NoOp Output when the originating side ends the call first (unexpectedly stops at priority 1 in macro): (normal call setup and progress not shown - I show everything after hangup) *CLI> DEBUG[30737]: File rtp.c, Line 739 (ast_rtp_raw_write): Difference is 10888, ms is 1381 DEBUG[30737]: File channel.c, Line 2015 (ast_channel_bridge): Didn't get a frame from channel: SIP/2203-751b DEBUG[30737]: File channel.c, Line 2083 (ast_channel_bridge): Bridge stops bridging channels SIP/2203-751b and SIP/2205-12f1 == Spawn extension (intern-post, 2205, 1) exited non-zero on 'SIP/2203-751b' -- Executing Macro("SIP/2203-751b", "record-cleanup") in new stack -- Executing SetVar("SIP/2203-751b", "MONITORDIR=/var/spool/asterisk/monitor") in new stack DEBUG[30737]: File app_macro.c, Line 166 (macro_exec): Extension s, priority 1 returned normally even though call was hung up DEBUG[7176]: File chan_sip.c, Line 503 (__sip_ack): Stopping retransmission on '15125295754753e9727742e77c3d1c51@10.0.1.10' of Request 103: Found *CLI> Output when destination side ends the call first (this works as it should): (normal call setup and progress not shown - I show everything after hangup) *CLI> DEBUG[31761]: File channel.c, Line 2015 (ast_channel_bridge): Didn't get a frame from channel: SIP/2205-75be DEBUG[31761]: File channel.c, Line 2083 (ast_channel_bridge): Bridge stops bridging channels SIP/2203-fcac and SIP/2205-75be == Spawn extension (intern-post, 2205, 1) exited non-zero on 'SIP/2203-fcac' -- Executing Macro("SIP/2203-fcac", "record-cleanup") in new stack -- Executing SetVar("SIP/2203-fcac", "MONITORDIR=/var/spool/asterisk/monitor") in new stack -- Executing GotoIf("SIP/2203-fcac", "0?s|6") in new stack WARNING[31761]: File pbx.c, Line 4190 (pbx_builtin_gotoif): Not taking any branch -- Executing System("SIP/2203-fcac", "/usr/local/bin/wmix 20030420-184036-2203-2205-in.wav 20030420-184036-2203-2205-out.wav > 20030420-184036-2203-2205") in new stack -- Executing System("SIP/2203-fcac", "/bin/rm /var/spool/asterisk/monitor/20030420-184036-2203-2205-in.wav /var/spool/asterisk/monitor/20030420-184036-2203-2205-out.wav") in new stack -- Executing System("SIP/2203-fcac", "/usr/bin/toast -F 20030420-184036-2203-2205") in new stack -- Executing NoOp("SIP/2203-fcac", "") in new stack DEBUG[7176]: File chan_sip.c, Line 503 (__sip_ack): Stopping retransmission on '947298470@10.0.1.6' of Request 102: Found *CLI>
Martin Pycko
2003-Apr-21 07:33 UTC
[Asterisk-Users] Macros not working as expected with extension "h" in some circumstances
> To make a question out of this: Why does it appear that I cannot use macros from within the "h" extension if the originating side hangs up first in a SIP->SIP call?Because you call GotoIf in the unproper way. The syntax is GotoIf, Condition?jump_if_condition_1:jump_if_condition_0 Notice ":" not "|" In your example you have the condition for _1_, it's s|6 jumping straight to NoOp .... Martin> > JT > > > > from extensions.conf: > > [intern-post] > > ; Make sure that if we are recording the channel, we properly clean up the > ; recorded files. > exten => h,1,Macro(record-cleanup) > > ; Include operator context > include => operator > . > . > . > (all extensions in this context are includes other than "h") > > > > [macro-record-cleanup] > ; If we have recorded a call, it is to our advantage to change the > ; format of the call from a two-file system (blah-in.wav blah-out.wav) > ; into a single file that contains both legs of the call, and then > ; compress the call into some reasonably small filesize using gsm > ; compression. This routine should be called out of the "h" priority > ; in a context. If the call was not recorded, this macro will > ; not cause any harm, so calling it on each hangup isn't a problem. > ; > ; First, did we record this call? If ${CALLFILENAME} is zero, then > ; we can be fairly certain that this call wasn't recorded, so just > ; jump to the end of this macro and return out of routine. > ; > exten => s,1,SetVar(MONITORDIR=/var/spool/asterisk/monitor) > exten => s,2,GotoIf($[${CALLFILENAME} = 0]?s|6) > ; > ; This part of the routine mixes the in and out .wav files into one .wav, and then > ; cleans up the original files (removes them) > ; > exten => s,3,System(/usr/local/bin/wmix ${CALLFILENAME}-in.wav ${CALLFILENAME}-out.wav > ${CALLFILENAME}) > exten => s,4,System(/bin/rm ${MONITORDIR}/${CALLFILENAME}-in.wav ${MONITORDIR}/${CALLFILENAME}-out.wav) > ; > ; This part of the routine compresses the .wav files into a .gsm file for > ; better storage (about 1/5 the size of a .wav file). Use "untoast" to restore > ; to normal wav file format. (toast and untoast are fairly standard on Linux systems) > ; > exten => s,5,System(/usr/bin/toast -F ${CALLFILENAME}) > ; > ; End of routine, return to calling point (note: NoOp required for GotoIf at priority 1) > exten => s,6,NoOp > > > > > Output when the originating side ends the call first (unexpectedly stops at priority 1 in macro): > > (normal call setup and progress not shown - I show everything after hangup) > > *CLI> DEBUG[30737]: File rtp.c, Line 739 (ast_rtp_raw_write): Difference is 10888, ms is 1381 > DEBUG[30737]: File channel.c, Line 2015 (ast_channel_bridge): Didn't get a frame from channel: SIP/2203-751b > DEBUG[30737]: File channel.c, Line 2083 (ast_channel_bridge): Bridge stops bridging channels SIP/2203-751b and SIP/2205-12f1 > == Spawn extension (intern-post, 2205, 1) exited non-zero on 'SIP/2203-751b' > -- Executing Macro("SIP/2203-751b", "record-cleanup") in new stack > -- Executing SetVar("SIP/2203-751b", "MONITORDIR=/var/spool/asterisk/monitor") in new stack > DEBUG[30737]: File app_macro.c, Line 166 (macro_exec): Extension s, priority 1 returned normally even though call was hung up > DEBUG[7176]: File chan_sip.c, Line 503 (__sip_ack): Stopping retransmission on '15125295754753e9727742e77c3d1c51@10.0.1.10' of Request 103: Found > > *CLI> > > > > Output when destination side ends the call first (this works as it should): > > (normal call setup and progress not shown - I show everything after hangup) > > *CLI> DEBUG[31761]: File channel.c, Line 2015 (ast_channel_bridge): Didn't get a frame from channel: SIP/2205-75be > DEBUG[31761]: File channel.c, Line 2083 (ast_channel_bridge): Bridge stops bridging channels SIP/2203-fcac and SIP/2205-75be > == Spawn extension (intern-post, 2205, 1) exited non-zero on 'SIP/2203-fcac' > -- Executing Macro("SIP/2203-fcac", "record-cleanup") in new stack > -- Executing SetVar("SIP/2203-fcac", "MONITORDIR=/var/spool/asterisk/monitor") in new stack > -- Executing GotoIf("SIP/2203-fcac", "0?s|6") in new stack > WARNING[31761]: File pbx.c, Line 4190 (pbx_builtin_gotoif): Not taking any branch > -- Executing System("SIP/2203-fcac", "/usr/local/bin/wmix 20030420-184036-2203-2205-in.wav 20030420-184036-2203-2205-out.wav > 20030420-184036-2203-2205") in new stack > -- Executing System("SIP/2203-fcac", "/bin/rm /var/spool/asterisk/monitor/20030420-184036-2203-2205-in.wav /var/spool/asterisk/monitor/20030420-184036-2203-2205-out.wav") in new stack > -- Executing System("SIP/2203-fcac", "/usr/bin/toast -F 20030420-184036-2203-2205") in new stack > -- Executing NoOp("SIP/2203-fcac", "") in new stack > DEBUG[7176]: File chan_sip.c, Line 503 (__sip_ack): Stopping retransmission on '947298470@10.0.1.6' of Request 102: Found > > *CLI> > > > > > _______________________________________________ > Asterisk-Users mailing list > Asterisk-Users@lists.digium.com > http://lists.digium.com/mailman/listinfo/asterisk-users >