<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Try using an event hook on state hange instead of a state handler.<div>Or, if you don't&nbsp;need&nbsp;access&nbsp;to&nbsp;the&nbsp;session&nbsp;once its hung up, use a plain event handler.</div><div><br></div><div>One thing you need to know about threads is that FS spaws its own thread per call. You can do your own stuff in as many threads as you want as long as you don't touch the media itself. Look at the source of api commands in mod_commands and you'll see how they interact with active calls.</div><div><div><br><div apple-content-edited="true"> <span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><span class="Apple-style-span" style="font-size: 12px; "><div>Mathieu Rene</div><div>Avant-Garde Solutions Inc</div><div>Office: + 1 (514) 664-1044 x100</div><div>Cell: +1 (514) 664-1044 x200</div><div><a href="mailto:mrene@avgs.ca">mrene@avgs.ca</a></div><div><br></div><div><br></div></span></div></div></span><br class="Apple-interchange-newline"> </div><br><div><div>Am 14-Jul-09 um 11:47 AM schrieb Kevin Snow:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div> <font face="Verdana, Helvetica, Arial"><span style="font-size:12.0px">Thanks for your help on this, Iím getting closer but still have something wrong. <br> <br> I changed the code to use the bridge function you mentioned. It does seem to work a little better as the multithreaded bridge sometimes had audio glitches that this method doesnít<br> </span></font><font size="2"><font face="Monaco, Courier New"><span style="font-size:10.0px"><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const char* sessionUUID = switch_core_session_get_uuid(session);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const char* peerSessionUUID = switch_core_session_get_uuid(peer_session);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch_status_t status = switch_ivr_uuid_bridge(sessionUUID, peerSessionUUID);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "bridge_common - Bridge complete (%d)\n",(int)status);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int addHandlerOK = switch_channel_add_state_handler( switch_core_session_get_channel(peer_session), &amp;bridge_common_state_handlers);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "+++++++++++++++++++++++++++++++++++++++++++++++++ ADDED HANDLER OK %d\n",addHandlerOK);<br> </span></font></font><font face="Verdana, Helvetica, Arial"><span style="font-size:12.0px"><br> This bridges fine and the call is working. The switch_ivr_uuid_bridge function returns immediately where the other blocked. Iím adding the handler back in and switch_channel_add_state_handler is returning a 1, which I seems OK. <br> </span></font><font size="2"><font face="Monaco, Courier New"><span style="font-size:10.0px"><br> &nbsp;&nbsp;&nbsp;&nbsp;static switch_status_t my_hangup(switch_core_session_t *session)<br> &nbsp;&nbsp;&nbsp;&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "======================= HANGUP CALLED ============================\n");<br> &nbsp;&nbsp;&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return SWITCH_STATUS_SUCCESS;<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;static const switch_state_handler_table_t <br> &nbsp;&nbsp;&nbsp;&nbsp;bridge_common_state_handlers =<br> &nbsp;&nbsp;&nbsp;&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*.on_init */ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*.on_routing */ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*.on_execute */ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*.on_hangup */ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_hangup,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*.on_exchange_media */ NULL,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*.on_soft_execute */ &nbsp;&nbsp;NULL<br> &nbsp;&nbsp;&nbsp;&nbsp;};<br> </span></font></font><font face="Verdana, Helvetica, Arial"><span style="font-size:12.0px"><br> Not sure why but when the peer_session leg is hung up my_hangup routine is not called. <br> <br> One thing I should mention is that Iím originating these legs and bridging on a thread that I started. I believe that is somehow part of the problem. The situation I have is that a handset is picked up. I collect the digits dialed, when this is complete Iím creating a thread (this thread above) and having it create a leg to the number dialed and another known endpoint. Iím doing it on another thread because I want that handset to be able to hang up but leave this call in place. &nbsp;I am getting my hangup called on the handset (itís not this above handler, itís a different one I didnít show you). If I leave the new thread out of this and just bridge the handset to the dialed number, I do get hangup called for both.<br> <br> Clearly, there is something Iím not understanding and have wrong here.<br> <br> Any ideas?<br> <br> Thanks in advance.<br> <br> Kevin<br> <br> <br> <br> <br> <br> <br> On 7/13/09 3:59 PM, "Mathieu Rene" &lt;<a href="mailto:mrene_lists@avgs.ca">mrene_lists@avgs.ca</a>&gt; wrote:<br> <br> </span></font><blockquote type="cite"><font face="Verdana, Helvetica, Arial"><span style="font-size:12.0px">On another note, switch_ivr_uuid_bridge() will flush the state handler table for both legs. You need to set them back after. <br> Note that event hooks aren't removed, so you can use switch_core_event_hook_add_state_change() (look in mod_limit for an example) to get a callback on state change.<br> <br> &nbsp;<br> Mathieu Rene<br> Avant-Garde Solutions Inc<br> Office: + 1 (514) 664-1044 x100<br> Cell: +1 (514) 664-1044 x200<br> <a href="mailto:mrene@avgs.ca">mrene@avgs.ca</a><br> <br> <br> <br> &nbsp;<br> <br> On 13-Jul-09, at 6:20 PM, Kevin Snow wrote:<br> <br> </span></font><blockquote type="cite"><font face="Verdana, Helvetica, Arial"><span style="font-size:12.0px"> Hi,<br> &nbsp;<br> &nbsp;In my module (written in C) I spin up a session using the recipe you gave me a few weeks ago. I then use switch_ivr_originate twice to establish two endpoints and bridge them using switch_ivr_multi_threaded_bridge. I inherited some of this code, but I think itís using the multithreaded bridge to be able to pass a DTMF callback. <br> &nbsp;<br> &nbsp;In any case, the above is working fine. My problem comes in when one of the ends hangsup, itís not exiting the bridge function. Itís like the calls are still bridged (because I think they are). Running ďshow channelsĒ, does in fact, show the two legs sitting there. Using the ďhupallĒ command, does hang them up, handlers called and my world then shutsdown. <br> &nbsp;<br> &nbsp;Iím not sure what I have wrong here. Is there something special I need to do to detect when an endpoint hangup? <br> &nbsp;<br> &nbsp;Thanks<br> &nbsp;<br> &nbsp;Kevin <br> &nbsp;&nbsp;_______________________________________________<br> Freeswitch-dev mailing list<br> <a href="mailto:Freeswitch-dev@lists.freeswitch.org">Freeswitch-dev@lists.freeswitch.org</a><br> <a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev">http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev</a><br> UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-dev">http://lists.freeswitch.org/mailman/options/freeswitch-dev</a><br> <a href="http://www.freeswitch.org">http://www.freeswitch.org</a><br> </span></font></blockquote><font face="Verdana, Helvetica, Arial"><span style="font-size:12.0px"><br> <br> <hr align="CENTER" size="3" width="95%"></span></font><font size="2"><font face="Monaco, Courier New"><span style="font-size:10.0px">_______________________________________________<br> Freeswitch-dev mailing list<br> <a href="mailto:Freeswitch-dev@lists.freeswitch.org">Freeswitch-dev@lists.freeswitch.org</a><br> <a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev">http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev</a><br> UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-dev">http://lists.freeswitch.org/mailman/options/freeswitch-dev</a><br> <a href="http://www.freeswitch.org">http://www.freeswitch.org</a><br> </span></font></font></blockquote><font size="2"><font face="Monaco, Courier New"><span style="font-size:10.0px"><br> </span></font></font> </div>  _______________________________________________<br>Freeswitch-dev mailing list<br><a href="mailto:Freeswitch-dev@lists.freeswitch.org">Freeswitch-dev@lists.freeswitch.org</a><br>http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev<br>UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-dev<br>http://www.freeswitch.org<br></blockquote></div><br></div></div></body></html>