<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[Freeswitch-trunk][17433] </title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<div id="header">FreeSWITCH Subversion</div>
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://fisheye.freeswitch.org/changelog/FreeSWITCH?cs=17433">17433</a></dd>
<dt>Author</dt> <dd>moy</dd>
<dt>Date</dt> <dd>2010-04-28 17:17:49 -0500 (Wed, 28 Apr 2010)</dd>
</dl>

<h3>Log Message</h3>
<pre>freetdm: completion of compilation with initial reworked API</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#freeswitchtrunklibsfreetdmmod_freetdmmod_freetdmc">freeswitch/trunk/libs/freetdm/mod_freetdm/mod_freetdm.c</a></li>
<li><a href="#freeswitchtrunklibsfreetdmsrcftdm_ioc">freeswitch/trunk/libs/freetdm/src/ftdm_io.c</a></li>
<li><a href="#freeswitchtrunklibsfreetdmsrcincludefreetdmh">freeswitch/trunk/libs/freetdm/src/include/freetdm.h</a></li>
<li><a href="#freeswitchtrunklibsfreetdmsrcincludeprivateftdm_coreh">freeswitch/trunk/libs/freetdm/src/include/private/ftdm_core.h</a></li>
<li><a href="#freeswitchtrunklibsfreetdmsrcincludeprivateftdm_typesh">freeswitch/trunk/libs/freetdm/src/include/private/ftdm_types.h</a></li>
<li><a href="#freeswitchtrunklibsfreetdmsrctestanalogc">freeswitch/trunk/libs/freetdm/src/testanalog.c</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="freeswitchtrunklibsfreetdmmod_freetdmmod_freetdmc"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/libs/freetdm/mod_freetdm/mod_freetdm.c (17432 => 17433)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/freetdm/mod_freetdm/mod_freetdm.c        2010-04-28 22:17:49 UTC (rev 17432)
+++ freeswitch/trunk/libs/freetdm/mod_freetdm/mod_freetdm.c        2010-04-28 22:17:49 UTC (rev 17433)
</span><span class="lines">@@ -4,10 +4,10 @@
</span><span class="cx">  *
</span><span class="cx">  * Version: MPL 1.1
</span><span class="cx">  *
</span><del>- * The contents of this file are subject to the Mftilla Public License Version
</del><ins>+ * The contents of this file are subject to the Mozilla Public License Version
</ins><span class="cx">  * 1.1 (the &quot;License&quot;); you may not use this file except in compliance with
</span><span class="cx">  * the License. You may obtain a copy of the License at
</span><del>- * http://www.mftilla.org/MPL/
</del><ins>+ * http://www.mozilla.org/MPL/
</ins><span class="cx">  *
</span><span class="cx">  * Software distributed under the License is distributed on an &quot;AS IS&quot; basis,
</span><span class="cx">  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
</span><span class="lines">@@ -138,14 +138,11 @@
</span><span class="cx"> static switch_core_session_t *ftdm_channel_get_session(ftdm_channel_t *channel, int32_t id)
</span><span class="cx"> {
</span><span class="cx">         switch_core_session_t *session = NULL;
</span><ins>+        const char *token = ftdm_channel_get_token(channel, id);
</ins><span class="cx"> 
</span><del>-        if (id &gt; FTDM_MAX_TOKENS) {
-                return NULL;
-        }
-
-        if (!zstr(channel-&gt;tokens[id])) {
-                if (!(session = switch_core_session_locate(channel-&gt;tokens[id]))) {
-                        ftdm_channel_clear_token(channel, channel-&gt;tokens[id]);
</del><ins>+        if (!zstr(token)) {
+                if (!(session = switch_core_session_locate(token))) {
+                        ftdm_channel_clear_token(channel, token);
</ins><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -154,14 +151,7 @@
</span><span class="cx"> 
</span><span class="cx"> static const char *ftdm_channel_get_uuid(ftdm_channel_t *channel, int32_t id)
</span><span class="cx"> {
</span><del>-        if (id &gt; FTDM_MAX_TOKENS) {
-                return NULL;
-        }
-
-        if (!zstr(channel-&gt;tokens[id])) {
-                return channel-&gt;tokens[id];
-        }
-        return NULL;
</del><ins>+        return ftdm_channel_get_token(channel, id);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void stop_hold(switch_core_session_t *session_a, const char *uuid)
</span><span class="lines">@@ -195,19 +185,20 @@
</span><span class="cx"> {
</span><span class="cx">         switch_core_session_t *session;
</span><span class="cx">         switch_channel_t *channel, *channel_a;
</span><ins>+        int32_t spanid = 0;
</ins><span class="cx"> 
</span><span class="cx">         if (!uuid) {
</span><span class="cx">                 return;
</span><span class="cx">         }
</span><span class="cx">         
</span><del>-        
</del><ins>+        spanid = ftdm_channel_get_span_id(ftdmchan);        
</ins><span class="cx">         if ((session = switch_core_session_locate(uuid))) {
</span><span class="cx">                 channel = switch_core_session_get_channel(session);
</span><span class="cx">                 if (zstr(stream)) {
</span><span class="cx">                         if (!strcasecmp(globals.hold_music, &quot;indicate_hold&quot;)) {
</span><span class="cx">                                 stream = &quot;indicate_hold&quot;;
</span><span class="cx">                         }
</span><del>-                        if (!strcasecmp(SPAN_CONFIG[ftdmchan-&gt;span-&gt;span_id].hold_music, &quot;indicate_hold&quot;)) {
</del><ins>+                        if (!strcasecmp(SPAN_CONFIG[spanid].hold_music, &quot;indicate_hold&quot;)) {
</ins><span class="cx">                                 stream = &quot;indicate_hold&quot;;
</span><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="lines">@@ -217,7 +208,7 @@
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 if (zstr(stream)) {
</span><del>-                        stream = SPAN_CONFIG[ftdmchan-&gt;span-&gt;span_id].hold_music;
</del><ins>+                        stream = SPAN_CONFIG[spanid].hold_music;
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 if (zstr(stream)) {
</span><span class="lines">@@ -250,9 +241,10 @@
</span><span class="cx">         switch_core_session_t *session;
</span><span class="cx">         switch_channel_t *channel;
</span><span class="cx">         private_t *tech_pvt;
</span><ins>+        int32_t tokencnt = ftdm_channel_get_token_count(ftdmchan);
</ins><span class="cx">         
</span><span class="cx"> 
</span><del>-        for (i = 0; i &lt; ftdmchan-&gt;token_count; i++) {
</del><ins>+        for (i = 0; i &lt; tokencnt; i++) {
</ins><span class="cx">                 if ((session = ftdm_channel_get_session(ftdmchan, i))) {
</span><span class="cx">                         const char *buuid;
</span><span class="cx">                         tech_pvt = switch_core_session_get_private(session);
</span><span class="lines">@@ -260,7 +252,7 @@
</span><span class="cx">                         buuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
</span><span class="cx"> 
</span><span class="cx">                         
</span><del>-                        if (ftdmchan-&gt;token_count == 1 &amp;&amp; flash) {
</del><ins>+                        if (tokencnt  == 1 &amp;&amp; flash) {
</ins><span class="cx">                                 if (switch_test_flag(tech_pvt, TFLAG_HOLD)) {
</span><span class="cx">                                         stop_hold(session, buuid);
</span><span class="cx">                                         switch_clear_flag_locked(tech_pvt, TFLAG_HOLD);
</span><span class="lines">@@ -460,6 +452,8 @@
</span><span class="cx"> {
</span><span class="cx">         switch_channel_t *channel = NULL;
</span><span class="cx">         private_t *tech_pvt = NULL;
</span><ins>+        ftdm_chan_type_t chantype;
+        uint32_t tokencnt;
</ins><span class="cx"> 
</span><span class="cx">         channel = switch_core_session_get_channel(session);
</span><span class="cx">         assert(channel != NULL);
</span><span class="lines">@@ -472,28 +466,31 @@
</span><span class="cx">         } 
</span><span class="cx"> 
</span><span class="cx">         ftdm_channel_clear_token(tech_pvt-&gt;ftdmchan, switch_core_session_get_uuid(session));
</span><del>-        
-        switch (tech_pvt-&gt;ftdmchan-&gt;type) {
</del><ins>+
+        chantype = ftdm_channel_get_type(tech_pvt-&gt;ftdmchan);        
+        switch (chantype) {
</ins><span class="cx">         case FTDM_CHAN_TYPE_FXO:
</span><span class="cx">         case FTDM_CHAN_TYPE_EM:
</span><span class="cx">         case FTDM_CHAN_TYPE_CAS:
</span><span class="cx">                 {
</span><del>-                        ftdm_set_state_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
</del><ins>+                        ftdm_channel_call_hangup(tech_pvt-&gt;ftdmchan);
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         case FTDM_CHAN_TYPE_FXS:
</span><span class="cx">                 {
</span><del>-                        if (tech_pvt-&gt;ftdmchan-&gt;state != FTDM_CHANNEL_STATE_BUSY &amp;&amp; tech_pvt-&gt;ftdmchan-&gt;state != FTDM_CHANNEL_STATE_DOWN) {
-                                if (tech_pvt-&gt;ftdmchan-&gt;token_count) {
</del><ins>+                        if (!ftdm_channel_call_check_busy(tech_pvt-&gt;ftdmchan) &amp;&amp; !ftdm_channel_call_check_done(tech_pvt-&gt;ftdmchan)) {
+                                tokencnt = ftdm_channel_get_token_count(tech_pvt-&gt;ftdmchan);
+                                if (tokencnt) {
</ins><span class="cx">                                         cycle_foreground(tech_pvt-&gt;ftdmchan, 0, NULL);
</span><span class="cx">                                 } else {
</span><del>-                                        ftdm_set_state_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
</del><ins>+                                        ftdm_channel_call_hangup(tech_pvt-&gt;ftdmchan);
</ins><span class="cx">                                 }
</span><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         case FTDM_CHAN_TYPE_B:
</span><span class="cx">                 {
</span><ins>+#if 0
</ins><span class="cx">                         if (tech_pvt-&gt;ftdmchan-&gt;state != FTDM_CHANNEL_STATE_DOWN) {
</span><span class="cx">                                 if (tech_pvt-&gt;ftdmchan-&gt;state != FTDM_CHANNEL_STATE_TERMINATING) {
</span><span class="cx">                                         tech_pvt-&gt;ftdmchan-&gt;caller_data.hangup_cause = switch_channel_get_cause_q850(channel);
</span><span class="lines">@@ -503,11 +500,18 @@
</span><span class="cx">                                 }
</span><span class="cx">                                 ftdm_set_state_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
</span><span class="cx">                         }
</span><ins>+#else
+                        ftdm_call_cause_t hcause = switch_channel_get_cause_q850(channel);
+                        if (hcause  &lt; 1 || hcause &gt; 127) {
+                                hcause = FTDM_CAUSE_DESTINATION_OUT_OF_ORDER;
+                        }
+                        ftdm_channel_call_hangup_with_cause(tech_pvt-&gt;ftdmchan, hcause);
+#endif
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         default: 
</span><span class="cx">                 {
</span><del>-                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;Unhandled channel type %d for channel %s\n&quot;, tech_pvt-&gt;ftdmchan-&gt;type,
</del><ins>+                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;Unhandled channel type %d for channel %s\n&quot;, chantype,
</ins><span class="cx">                     switch_channel_get_name(channel));
</span><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="lines">@@ -611,7 +615,7 @@
</span><span class="cx">         /* Digium Cards sometimes timeout several times in a row here. 
</span><span class="cx">            Yes, we support digium cards, ain't we nice.......
</span><span class="cx">            6 double length intervals should compensate */
</span><del>-        chunk = tech_pvt-&gt;ftdmchan-&gt;effective_interval * 2;
</del><ins>+        chunk = ftdm_channel_get_io_interval(tech_pvt-&gt;ftdmchan) * 2;
</ins><span class="cx">         total_to = chunk * 6;
</span><span class="cx"> 
</span><span class="cx">  top:
</span><span class="lines">@@ -626,12 +630,12 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (switch_test_flag(tech_pvt, TFLAG_HOLD) || do_break) {
</span><del>-                switch_yield(tech_pvt-&gt;ftdmchan-&gt;effective_interval * 1000);
-                tech_pvt-&gt;cng_frame.datalen = tech_pvt-&gt;ftdmchan-&gt;packet_len;
</del><ins>+                switch_yield(ftdm_channel_get_io_interval(tech_pvt-&gt;ftdmchan) * 1000);
+                tech_pvt-&gt;cng_frame.datalen = ftdm_channel_get_io_packet_len(tech_pvt-&gt;ftdmchan);
</ins><span class="cx">                 tech_pvt-&gt;cng_frame.samples = tech_pvt-&gt;cng_frame.datalen;
</span><span class="cx">                 tech_pvt-&gt;cng_frame.flags = SFF_CNG;
</span><span class="cx">                 *frame = &amp;tech_pvt-&gt;cng_frame;
</span><del>-                if (tech_pvt-&gt;ftdmchan-&gt;effective_codec == FTDM_CODEC_SLIN) {
</del><ins>+                if (ftdm_channel_get_codec(tech_pvt-&gt;ftdmchan) == FTDM_CODEC_SLIN) {
</ins><span class="cx">                         tech_pvt-&gt;cng_frame.samples /= 2;
</span><span class="cx">                 }
</span><span class="cx">                 return SWITCH_STATUS_SUCCESS;
</span><span class="lines">@@ -672,7 +676,7 @@
</span><span class="cx">         tech_pvt-&gt;read_frame.datalen = (uint32_t)len;
</span><span class="cx">         tech_pvt-&gt;read_frame.samples = tech_pvt-&gt;read_frame.datalen;
</span><span class="cx"> 
</span><del>-        if (tech_pvt-&gt;ftdmchan-&gt;effective_codec == FTDM_CODEC_SLIN) {
</del><ins>+        if (ftdm_channel_get_codec(tech_pvt-&gt;ftdmchan) == FTDM_CODEC_SLIN) {
</ins><span class="cx">                 tech_pvt-&gt;read_frame.samples /= 2;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -738,7 +742,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">         wflags = FTDM_WRITE;        
</span><del>-        status = ftdm_channel_wait(tech_pvt-&gt;ftdmchan, &amp;wflags, tech_pvt-&gt;ftdmchan-&gt;effective_interval * 10);
</del><ins>+        status = ftdm_channel_wait(tech_pvt-&gt;ftdmchan, &amp;wflags, ftdm_channel_get_io_interval(tech_pvt-&gt;ftdmchan) * 10);
</ins><span class="cx">         
</span><span class="cx">         if (!(wflags &amp; FTDM_WRITE)) {
</span><span class="cx">                 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;Dropping frame! (write not ready)\n&quot;);
</span><span class="lines">@@ -768,6 +772,7 @@
</span><span class="cx"> {
</span><span class="cx">         switch_channel_t *channel;
</span><span class="cx">         private_t *tech_pvt;
</span><ins>+        uint32_t phy_id;
</ins><span class="cx"> 
</span><span class="cx">         channel = switch_core_session_get_channel(session);
</span><span class="cx">         assert(channel != NULL);
</span><span class="lines">@@ -779,22 +784,31 @@
</span><span class="cx">         switch_channel_hangup(channel, SWITCH_CAUSE_LOSE_RACE);
</span><span class="cx">         return SWITCH_STATUS_FALSE;
</span><span class="cx">     }
</span><del>-        
-        ftdm_log(FTDM_LOG_DEBUG, &quot;Got Freeswitch message in R2 channel %d [%d]\n&quot;, tech_pvt-&gt;ftdmchan-&gt;physical_chan_id, 
-            msg-&gt;message_id);
</del><span class="cx"> 
</span><ins>+        phy_id = ftdm_channel_get_ph_id(tech_pvt-&gt;ftdmchan);        
+        ftdm_log(FTDM_LOG_DEBUG, &quot;Got Freeswitch message in R2 channel %d [%d]\n&quot;, phy_id, msg-&gt;message_id);
+
+        if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
+                return SWITCH_STATUS_SUCCESS;
+        }
+
</ins><span class="cx">         switch (msg-&gt;message_id) {
</span><span class="cx">         case SWITCH_MESSAGE_INDICATE_RINGING:
</span><span class="cx">                 {
</span><ins>+#if 0
</ins><span class="cx">                         if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
</span><span class="cx">                                 ftdm_set_flag_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_PROGRESS);
</span><span class="cx">                         } else {
</span><span class="cx">                                 ftdm_set_state_locked_wait(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
</span><span class="cx">                         }
</span><ins>+#else
+                        ftdm_channel_call_indicate(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_INDICATE_PROGRESS);
+#endif
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         case SWITCH_MESSAGE_INDICATE_PROGRESS:
</span><span class="cx">                 {
</span><ins>+#if 0
</ins><span class="cx">                         if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
</span><span class="cx">                                 ftdm_set_flag_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_PROGRESS);
</span><span class="cx">                                 ftdm_set_flag_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_MEDIA);
</span><span class="lines">@@ -802,24 +816,14 @@
</span><span class="cx">                                 ftdm_set_state_locked_wait(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
</span><span class="cx">                                 ftdm_set_state_locked_wait(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
</span><span class="cx">                         }
</span><ins>+#else
+                        ftdm_channel_call_indicate(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_INDICATE_PROGRESS_MEDIA);
+#endif
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         case SWITCH_MESSAGE_INDICATE_ANSWER:
</span><span class="cx">                 {
</span><del>-                        if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
-                                ftdm_set_flag_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_ANSWERED);
-                        } else {
-                                /* lets make the ftmod_r2 module life easier by moving thru each
-                 * state waiting for completion, clumsy, but does the job
-                                 */
-                                if (tech_pvt-&gt;ftdmchan-&gt;state &lt; FTDM_CHANNEL_STATE_PROGRESS) {
-                                        ftdm_set_state_locked_wait(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
-                                }
-                                if (tech_pvt-&gt;ftdmchan-&gt;state &lt; FTDM_CHANNEL_STATE_PROGRESS_MEDIA) {
-                                        ftdm_set_state_locked_wait(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
-                                }
-                                ftdm_set_state_locked_wait(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_UP);
-                        }
</del><ins>+                        ftdm_channel_call_answer(tech_pvt-&gt;ftdmchan);
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         default:
</span><span class="lines">@@ -845,23 +849,31 @@
</span><span class="cx">         return SWITCH_STATUS_FALSE;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-        if (tech_pvt-&gt;ftdmchan-&gt;state == FTDM_CHANNEL_STATE_TERMINATING) {
-                ftdm_mutex_unlock(tech_pvt-&gt;ftdmchan-&gt;mutex);        
</del><ins>+        if (ftdm_channel_call_check_hangup(tech_pvt-&gt;ftdmchan)) {
</ins><span class="cx">                 return SWITCH_STATUS_SUCCESS;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
+                return SWITCH_STATUS_SUCCESS;
+        }
+
</ins><span class="cx">         switch (msg-&gt;message_id) {
</span><span class="cx">         case SWITCH_MESSAGE_INDICATE_RINGING:
</span><span class="cx">                 {
</span><ins>+#if 0
</ins><span class="cx">                         if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
</span><span class="cx">                                 ftdm_set_flag(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_PROGRESS);
</span><span class="cx">                         } else {
</span><span class="cx">                                 ftdm_set_state_wait(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
</span><span class="cx">                         }
</span><ins>+#else
+                        ftdm_channel_call_indicate(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_INDICATE_PROGRESS);
+#endif
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         case SWITCH_MESSAGE_INDICATE_PROGRESS:
</span><span class="cx">                 {
</span><ins>+#if 0
</ins><span class="cx">                         if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
</span><span class="cx">                                 ftdm_set_flag(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_PROGRESS);
</span><span class="cx">                                 ftdm_set_flag(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_MEDIA);
</span><span class="lines">@@ -875,10 +887,14 @@
</span><span class="cx">                                 }
</span><span class="cx">                                 ftdm_set_state_wait(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
</span><span class="cx">                         }
</span><ins>+#else
+                        ftdm_channel_call_indicate(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_INDICATE_PROGRESS_MEDIA);
+#endif
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         case SWITCH_MESSAGE_INDICATE_ANSWER:
</span><span class="cx">                 {
</span><ins>+#if 0
</ins><span class="cx">                         if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
</span><span class="cx">                                 ftdm_set_flag(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_ANSWERED);
</span><span class="cx">                         } else {
</span><span class="lines">@@ -894,6 +910,9 @@
</span><span class="cx">                                 }
</span><span class="cx">                                 ftdm_set_state_wait(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_UP);
</span><span class="cx">                         }
</span><ins>+#else
+                        ftdm_channel_call_answer(tech_pvt-&gt;ftdmchan);
+#endif
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         default:
</span><span class="lines">@@ -919,9 +938,14 @@
</span><span class="cx">         return SWITCH_STATUS_FALSE;
</span><span class="cx">     }
</span><span class="cx">         
</span><ins>+        if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
+                return SWITCH_STATUS_SUCCESS;
+        }
+
</ins><span class="cx">         switch (msg-&gt;message_id) {
</span><span class="cx">         case SWITCH_MESSAGE_INDICATE_PROGRESS:
</span><span class="cx">         case SWITCH_MESSAGE_INDICATE_ANSWER:
</span><ins>+#if 0
</ins><span class="cx">                 if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
</span><span class="cx">                         ftdm_set_flag_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_ANSWERED);
</span><span class="cx">                         ftdm_set_flag_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_PROGRESS);
</span><span class="lines">@@ -929,6 +953,9 @@
</span><span class="cx">                 } else {
</span><span class="cx">                         ftdm_set_state_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_UP);
</span><span class="cx">                 }
</span><ins>+#else
+                ftdm_channel_call_answer(tech_pvt-&gt;ftdmchan);
+#endif
</ins><span class="cx">                 break;
</span><span class="cx">         default:
</span><span class="cx">                 break;
</span><span class="lines">@@ -952,10 +979,15 @@
</span><span class="cx">         switch_channel_hangup(channel, SWITCH_CAUSE_LOSE_RACE);
</span><span class="cx">         return SWITCH_STATUS_FALSE;
</span><span class="cx">     }
</span><ins>+
+        if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
+                return SWITCH_STATUS_SUCCESS;
+        }
</ins><span class="cx">         
</span><span class="cx">         switch (msg-&gt;message_id) {
</span><span class="cx">         case SWITCH_MESSAGE_INDICATE_PROGRESS:
</span><span class="cx">         case SWITCH_MESSAGE_INDICATE_ANSWER:
</span><ins>+#if 0
</ins><span class="cx">                 if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
</span><span class="cx">                         ftdm_set_flag_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_ANSWERED);
</span><span class="cx">                         ftdm_set_flag_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_PROGRESS);
</span><span class="lines">@@ -963,17 +995,22 @@
</span><span class="cx">                         ftdm_set_state_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_UP);
</span><span class="cx">                         switch_channel_mark_answered(channel);
</span><span class="cx">                 }
</span><ins>+#else
+                ftdm_channel_call_answer(tech_pvt-&gt;ftdmchan);
+                switch_channel_mark_answered(channel);
+#endif
</ins><span class="cx">                 break;
</span><span class="cx">         case SWITCH_MESSAGE_INDICATE_RINGING:
</span><del>-                if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
-                        
-                        if (!switch_channel_test_flag(channel, CF_ANSWERED) &amp;&amp; 
-                                !switch_channel_test_flag(channel, CF_EARLY_MEDIA) &amp;&amp;
-                                !switch_channel_test_flag(channel, CF_RING_READY)
-                                ) {
</del><ins>+                if (!switch_channel_test_flag(channel, CF_ANSWERED) &amp;&amp; 
+                        !switch_channel_test_flag(channel, CF_EARLY_MEDIA) &amp;&amp;
+                        !switch_channel_test_flag(channel, CF_RING_READY)
+                        ) {
+#if 0
</ins><span class="cx">                                 ftdm_set_state_locked(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_STATE_RING);
</span><ins>+#else
+                                ftdm_channel_call_indicate(tech_pvt-&gt;ftdmchan, FTDM_CHANNEL_INDICATE_RING);
+#endif
</ins><span class="cx">                                 switch_channel_mark_ring_ready(channel);
</span><del>-                        }
</del><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         default:
</span><span class="lines">@@ -1006,12 +1043,9 @@
</span><span class="cx">         return SWITCH_STATUS_FALSE;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-        ftdm_mutex_lock(ftdmchan-&gt;mutex);        
-
</del><span class="cx">         if (!tech_pvt-&gt;ftdmchan) {
</span><span class="cx">                 switch_channel_hangup(channel, SWITCH_CAUSE_LOSE_RACE);
</span><del>-                status = SWITCH_STATUS_FALSE;
-                goto end;
</del><ins>+                return SWITCH_STATUS_FALSE;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         switch (msg-&gt;message_id) {
</span><span class="lines">@@ -1035,7 +1069,7 @@
</span><span class="cx">                 break;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        switch (tech_pvt-&gt;ftdmchan-&gt;type) {
</del><ins>+        switch (ftdm_channel_get_type(tech_pvt-&gt;ftdmchan)) {
</ins><span class="cx">         case FTDM_CHAN_TYPE_FXS:
</span><span class="cx">         case FTDM_CHAN_TYPE_EM:
</span><span class="cx">                 status = channel_receive_message_fxs(session, msg);
</span><span class="lines">@@ -1054,10 +1088,6 @@
</span><span class="cx">                 break;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>- end:
-
-        ftdm_mutex_unlock(ftdmchan-&gt;mutex);        
-
</del><span class="cx">         return status;
</span><span class="cx"> 
</span><span class="cx"> }
</span><span class="lines">@@ -1098,7 +1128,7 @@
</span><span class="cx"> 
</span><span class="cx">         const char *dest = NULL;
</span><span class="cx">         char *data = NULL;
</span><del>-        int span_id = -1, group_id = -1,chan_id = 0;
</del><ins>+        int span_id = -1, group_id = -1, chan_id = 0;
</ins><span class="cx">         ftdm_channel_t *ftdmchan = NULL;
</span><span class="cx">         switch_call_cause_t cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
</span><span class="cx">         char name[128];
</span><span class="lines">@@ -1169,7 +1199,7 @@
</span><span class="cx">                 ftdm_span_t *span;
</span><span class="cx">                 ftdm_status_t zstatus = ftdm_span_find_by_name(span_name, &amp;span);
</span><span class="cx">                 if (zstatus == FTDM_SUCCESS &amp;&amp; span) {
</span><del>-                        span_id = span-&gt;span_id;
</del><ins>+                        span_id = ftdm_span_get_id(span);
</ins><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1178,7 +1208,7 @@
</span><span class="cx">                 ftdm_group_t *group;
</span><span class="cx">                 ftdm_status_t zstatus = ftdm_group_find_by_name(span_name, &amp;group);
</span><span class="cx">                 if (zstatus == FTDM_SUCCESS &amp;&amp; group) {
</span><del>-                        group_id = group-&gt;group_id;
</del><ins>+                        group_id = ftdm_group_get_id(group);
</ins><span class="cx">                 } else {
</span><span class="cx">                         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Missing ftdm span or group: %s\n&quot;, span_name);
</span><span class="cx">                         return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
</span><span class="lines">@@ -1275,12 +1305,12 @@
</span><span class="cx">                         goto fail;
</span><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                snprintf(name, sizeof(name), &quot;FreeTDM/%u:%u/%s&quot;, ftdmchan-&gt;span_id, ftdmchan-&gt;chan_id, dest);
</del><ins>+                snprintf(name, sizeof(name), &quot;FreeTDM/%u:%u/%s&quot;, ftdm_channel_get_span_id(ftdmchan), ftdm_channel_get_id(ftdmchan), dest);
</ins><span class="cx">                 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;Connect outbound channel %s\n&quot;, name);
</span><span class="cx">                 switch_channel_set_name(channel, name);
</span><del>-                switch_channel_set_variable(channel, &quot;freetdm_span_name&quot;, ftdmchan-&gt;span-&gt;name);
-                switch_channel_set_variable_printf(channel, &quot;freetdm_span_number&quot;, &quot;%d&quot;, ftdmchan-&gt;span_id);        
-                switch_channel_set_variable_printf(channel, &quot;freetdm_chan_number&quot;, &quot;%d&quot;, ftdmchan-&gt;chan_id);
</del><ins>+                switch_channel_set_variable(channel, &quot;freetdm_span_name&quot;, ftdm_channel_get_span_name(ftdmchan));
+                switch_channel_set_variable_printf(channel, &quot;freetdm_span_number&quot;, &quot;%d&quot;, ftdm_channel_get_span_id(ftdmchan));
+                switch_channel_set_variable_printf(channel, &quot;freetdm_chan_number&quot;, &quot;%d&quot;, ftdm_channel_get_id(ftdmchan));
</ins><span class="cx">                 ftdm_channel_set_caller_data(ftdmchan, &amp;caller_data);
</span><span class="cx">                 caller_profile = switch_caller_profile_clone(*new_session, outbound_profile);
</span><span class="cx">                 caller_profile-&gt;destination_number = switch_core_strdup(caller_profile-&gt;pool, switch_str_nil(dest_num));
</span><span class="lines">@@ -1291,14 +1321,14 @@
</span><span class="cx">                 
</span><span class="cx">                 switch_channel_set_flag(channel, CF_OUTBOUND);
</span><span class="cx">                 switch_channel_set_state(channel, CS_INIT);
</span><del>-                if (ftdm_channel_add_token(ftdmchan, switch_core_session_get_uuid(*new_session), ftdmchan-&gt;token_count) != FTDM_SUCCESS) {
</del><ins>+                if (ftdm_channel_add_token(ftdmchan, switch_core_session_get_uuid(*new_session), ftdm_channel_get_token_count(ftdmchan)) != FTDM_SUCCESS) {
</ins><span class="cx">                         switch_core_session_destroy(new_session);
</span><span class="cx">                         cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
</span><span class="cx">             goto fail;
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-                if (ftdm_channel_outgoing_call(ftdmchan) != FTDM_SUCCESS) {
</del><ins>+                if (ftdm_channel_call_place(ftdmchan) != FTDM_SUCCESS) {
</ins><span class="cx">                         if (tech_pvt-&gt;read_codec.implementation) {
</span><span class="cx">                                 switch_core_codec_destroy(&amp;tech_pvt-&gt;read_codec);
</span><span class="cx">                         }
</span><span class="lines">@@ -1331,9 +1361,14 @@
</span><span class="cx">         switch_core_session_t *session = NULL;
</span><span class="cx">         private_t *tech_pvt = NULL;
</span><span class="cx">         switch_channel_t *channel = NULL;
</span><ins>+        uint32_t spanid, chanid;
</ins><span class="cx">         char name[128];
</span><ins>+        ftdm_caller_data_t *channel_caller_data = sigmsg-&gt;raw_data;
</ins><span class="cx">         
</span><span class="cx">         *sp = NULL;
</span><ins>+
+        spanid = ftdm_channel_get_span_id(sigmsg-&gt;channel);
+        chanid = ftdm_channel_get_span_id(sigmsg-&gt;channel);
</ins><span class="cx">         
</span><span class="cx">         if (!(session = switch_core_session_request(freetdm_endpoint_interface, SWITCH_CALL_DIRECTION_INBOUND, NULL))) {
</span><span class="cx">                 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, &quot;Initilization Error!\n&quot;);
</span><span class="lines">@@ -1350,61 +1385,61 @@
</span><span class="cx">                 switch_core_session_destroy(&amp;session);
</span><span class="cx">                 return FTDM_FAIL;
</span><span class="cx">         }
</span><ins>+
+        channel_caller_data-&gt;collected[0] = '\0';
</ins><span class="cx">         
</span><del>-        *sigmsg-&gt;channel-&gt;caller_data.collected = '\0';
-        
-        if (zstr(sigmsg-&gt;channel-&gt;caller_data.cid_name)) {
-                switch_set_string(sigmsg-&gt;channel-&gt;caller_data.cid_name, sigmsg-&gt;channel-&gt;chan_name);
</del><ins>+        if (zstr(channel_caller_data-&gt;cid_name)) {
+                switch_set_string(channel_caller_data-&gt;cid_name, ftdm_channel_get_name(sigmsg-&gt;channel));
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (zstr(sigmsg-&gt;channel-&gt;caller_data.cid_num.digits)) {
-                if (!zstr(sigmsg-&gt;channel-&gt;caller_data.ani.digits)) {
-                        switch_set_string(sigmsg-&gt;channel-&gt;caller_data.cid_num.digits, sigmsg-&gt;channel-&gt;caller_data.ani.digits);
</del><ins>+        if (zstr(channel_caller_data-&gt;cid_num.digits)) {
+                if (!zstr(channel_caller_data-&gt;ani.digits)) {
+                        switch_set_string(channel_caller_data-&gt;cid_num.digits, channel_caller_data-&gt;ani.digits);
</ins><span class="cx">                 } else {
</span><del>-                        switch_set_string(sigmsg-&gt;channel-&gt;caller_data.cid_num.digits, sigmsg-&gt;channel-&gt;chan_number);
</del><ins>+                        switch_set_string(channel_caller_data-&gt;cid_num.digits, ftdm_channel_get_number(sigmsg-&gt;channel));
</ins><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         tech_pvt-&gt;caller_profile = switch_caller_profile_new(switch_core_session_get_pool(session),
</span><span class="cx">                                                                                                                  &quot;FreeTDM&quot;,
</span><del>-                                                                                                                 SPAN_CONFIG[sigmsg-&gt;channel-&gt;span_id].dialplan,
-                                                                                                                 sigmsg-&gt;channel-&gt;caller_data.cid_name,
-                                                                                                                 sigmsg-&gt;channel-&gt;caller_data.cid_num.digits,
</del><ins>+                                                                                                                 SPAN_CONFIG[spanid].dialplan,
+                                                                                                                 channel_caller_data-&gt;cid_name,
+                                                                                                                 channel_caller_data-&gt;cid_num.digits,
</ins><span class="cx">                                                                                                                  NULL,
</span><del>-                                                                                                                 sigmsg-&gt;channel-&gt;caller_data.ani.digits,
-                                                                                                                 sigmsg-&gt;channel-&gt;caller_data.aniII,
-                                                                                                                 sigmsg-&gt;channel-&gt;caller_data.rdnis.digits,
-                                                                                                                 (char *) modname,
-                                                                                                                 SPAN_CONFIG[sigmsg-&gt;channel-&gt;span_id].context,
-                                                                                                                 sigmsg-&gt;channel-&gt;caller_data.dnis.digits);
</del><ins>+                                                                                                                 channel_caller_data-&gt;ani.digits,
+                                                                                                                 channel_caller_data-&gt;aniII,
+                                                                                                                 channel_caller_data-&gt;rdnis.digits,
+                                                                                                                 (char *)modname,
+                                                                                                                 SPAN_CONFIG[spanid].context,
+                                                                                                                 channel_caller_data-&gt;dnis.digits);
</ins><span class="cx"> 
</span><span class="cx">         assert(tech_pvt-&gt;caller_profile != NULL);
</span><span class="cx"> 
</span><del>-        if (sigmsg-&gt;channel-&gt;caller_data.screen == 1 || sigmsg-&gt;channel-&gt;caller_data.screen == 3) {
</del><ins>+        if (channel_caller_data-&gt;screen == 1 || channel_caller_data-&gt;screen == 3) {
</ins><span class="cx">                 switch_set_flag(tech_pvt-&gt;caller_profile, SWITCH_CPF_SCREEN);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        tech_pvt-&gt;caller_profile-&gt;caller_ton = sigmsg-&gt;channel-&gt;caller_data.cid_num.type;
-        tech_pvt-&gt;caller_profile-&gt;caller_numplan = sigmsg-&gt;channel-&gt;caller_data.cid_num.plan;
-        tech_pvt-&gt;caller_profile-&gt;ani_ton = sigmsg-&gt;channel-&gt;caller_data.ani.type;
-        tech_pvt-&gt;caller_profile-&gt;ani_numplan = sigmsg-&gt;channel-&gt;caller_data.ani.plan;
-        tech_pvt-&gt;caller_profile-&gt;destination_number_ton = sigmsg-&gt;channel-&gt;caller_data.dnis.type;
-        tech_pvt-&gt;caller_profile-&gt;destination_number_numplan = sigmsg-&gt;channel-&gt;caller_data.dnis.plan;
-        tech_pvt-&gt;caller_profile-&gt;rdnis_ton = sigmsg-&gt;channel-&gt;caller_data.rdnis.type;
-        tech_pvt-&gt;caller_profile-&gt;rdnis_numplan = sigmsg-&gt;channel-&gt;caller_data.rdnis.plan;
</del><ins>+        tech_pvt-&gt;caller_profile-&gt;caller_ton = channel_caller_data-&gt;cid_num.type;
+        tech_pvt-&gt;caller_profile-&gt;caller_numplan = channel_caller_data-&gt;cid_num.plan;
+        tech_pvt-&gt;caller_profile-&gt;ani_ton = channel_caller_data-&gt;ani.type;
+        tech_pvt-&gt;caller_profile-&gt;ani_numplan = channel_caller_data-&gt;ani.plan;
+        tech_pvt-&gt;caller_profile-&gt;destination_number_ton = channel_caller_data-&gt;dnis.type;
+        tech_pvt-&gt;caller_profile-&gt;destination_number_numplan = channel_caller_data-&gt;dnis.plan;
+        tech_pvt-&gt;caller_profile-&gt;rdnis_ton = channel_caller_data-&gt;rdnis.type;
+        tech_pvt-&gt;caller_profile-&gt;rdnis_numplan = channel_caller_data-&gt;rdnis.plan;
</ins><span class="cx"> 
</span><del>-        if (sigmsg-&gt;channel-&gt;caller_data.pres) {
</del><ins>+        if (channel_caller_data-&gt;pres) {
</ins><span class="cx">                 switch_set_flag(tech_pvt-&gt;caller_profile, SWITCH_CPF_HIDE_NAME | SWITCH_CPF_HIDE_NUMBER);
</span><span class="cx">         }
</span><span class="cx">         
</span><del>-        snprintf(name, sizeof(name), &quot;FreeTDM/%u:%u/%s&quot;, sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id, tech_pvt-&gt;caller_profile-&gt;destination_number);
</del><ins>+        snprintf(name, sizeof(name), &quot;FreeTDM/%u:%u/%s&quot;, spanid, chanid, tech_pvt-&gt;caller_profile-&gt;destination_number);
</ins><span class="cx">         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;Connect inbound channel %s\n&quot;, name);
</span><span class="cx">         switch_channel_set_name(channel, name);
</span><span class="cx">         switch_channel_set_caller_profile(channel, tech_pvt-&gt;caller_profile);
</span><span class="cx"> 
</span><del>-        switch_channel_set_variable(channel, &quot;freetdm_span_name&quot;, sigmsg-&gt;channel-&gt;span-&gt;name);
-        switch_channel_set_variable_printf(channel, &quot;freetdm_span_number&quot;, &quot;%d&quot;, sigmsg-&gt;channel-&gt;span_id);        
-        switch_channel_set_variable_printf(channel, &quot;freetdm_chan_number&quot;, &quot;%d&quot;, sigmsg-&gt;channel-&gt;chan_id);
</del><ins>+        switch_channel_set_variable(channel, &quot;freetdm_span_name&quot;, ftdm_channel_get_span_name(sigmsg-&gt;channel));
+        switch_channel_set_variable_printf(channel, &quot;freetdm_span_number&quot;, &quot;%d&quot;, spanid);        
+        switch_channel_set_variable_printf(channel, &quot;freetdm_chan_number&quot;, &quot;%d&quot;, chanid);
</ins><span class="cx">                 
</span><span class="cx">         switch_channel_set_state(channel, CS_INIT);
</span><span class="cx">         if (switch_core_session_thread_launch(session) != SWITCH_STATUS_SUCCESS) {
</span><span class="lines">@@ -1426,13 +1461,16 @@
</span><span class="cx"> static FIO_SIGNAL_CB_FUNCTION(on_common_signal)
</span><span class="cx"> {
</span><span class="cx">         switch_event_t *event = NULL;
</span><del>-
</del><ins>+        ftdm_alarm_flag_t alarmbits = FTDM_ALARM_NONE;
+        uint32_t chanid, spanid;
+        chanid = ftdm_channel_get_id(sigmsg-&gt;channel);
+        spanid = ftdm_channel_get_span_id(sigmsg-&gt;channel);
</ins><span class="cx">         switch (sigmsg-&gt;event_id) {
</span><span class="cx"> 
</span><span class="cx">         case FTDM_SIGEVENT_ALARM_CLEAR:
</span><span class="cx">         case FTDM_SIGEVENT_ALARM_TRAP:
</span><span class="cx">                 {
</span><del>-                        if (ftdm_channel_get_alarms(sigmsg-&gt;channel) != FTDM_SUCCESS) {
</del><ins>+                        if (ftdm_channel_get_alarms(sigmsg-&gt;channel, &amp;alarmbits) != FTDM_SUCCESS) {
</ins><span class="cx">                                 ftdm_log(FTDM_LOG_ERROR, &quot;failed to retrieve alarms\n&quot;);
</span><span class="cx">                                 return FTDM_FAIL;
</span><span class="cx">                         }
</span><span class="lines">@@ -1441,10 +1479,10 @@
</span><span class="cx">                                 return FTDM_FAIL;
</span><span class="cx">                         }
</span><span class="cx">                         if (sigmsg-&gt;event_id == FTDM_SIGEVENT_ALARM_CLEAR) {
</span><del>-                                ftdm_log(FTDM_LOG_NOTICE, &quot;Alarm cleared on channel %d:%d\n&quot;, sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id);
</del><ins>+                                ftdm_log(FTDM_LOG_NOTICE, &quot;Alarm cleared on channel %d:%d\n&quot;, spanid, chanid);
</ins><span class="cx">                                 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;condition&quot;, &quot;ftdm-alarm-clear&quot;);
</span><span class="cx">                         } else {
</span><del>-                                ftdm_log(FTDM_LOG_NOTICE, &quot;Alarm raised on channel %d:%d\n&quot;, sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id);
</del><ins>+                                ftdm_log(FTDM_LOG_NOTICE, &quot;Alarm raised on channel %d:%d\n&quot;, spanid, chanid);
</ins><span class="cx">                                 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;condition&quot;, &quot;ftdm-alarm-trap&quot;);
</span><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="lines">@@ -1454,35 +1492,26 @@
</span><span class="cx">                 break;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        switch_event_add_header(event, SWITCH_STACK_BOTTOM, &quot;span-name&quot;, &quot;%s&quot;, sigmsg-&gt;channel-&gt;span-&gt;name);
-        switch_event_add_header(event, SWITCH_STACK_BOTTOM, &quot;span-number&quot;, &quot;%d&quot;, sigmsg-&gt;channel-&gt;span_id);
-        switch_event_add_header(event, SWITCH_STACK_BOTTOM, &quot;chan-number&quot;, &quot;%d&quot;, sigmsg-&gt;channel-&gt;chan_id);
</del><ins>+        switch_event_add_header(event, SWITCH_STACK_BOTTOM, &quot;span-name&quot;, &quot;%s&quot;, ftdm_channel_get_span_name(sigmsg-&gt;channel));
+        switch_event_add_header(event, SWITCH_STACK_BOTTOM, &quot;span-number&quot;, &quot;%d&quot;, ftdm_channel_get_span_id(sigmsg-&gt;channel));
+        switch_event_add_header(event, SWITCH_STACK_BOTTOM, &quot;chan-number&quot;, &quot;%d&quot;, ftdm_channel_get_id(sigmsg-&gt;channel));
</ins><span class="cx"> 
</span><del>-        if (ftdm_test_alarm_flag(sigmsg-&gt;channel, FTDM_ALARM_RECOVER)) {
-                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;alarm&quot;, &quot;recover&quot;);
</del><ins>+        if (alarmbits &amp; FTDM_ALARM_RED) {
+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;alarm&quot;, &quot;red&quot;);
</ins><span class="cx">         }
</span><del>-        if (ftdm_test_alarm_flag(sigmsg-&gt;channel, FTDM_ALARM_LOOPBACK)) {
-                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;alarm&quot;, &quot;loopback&quot;);
-        }
-        if (ftdm_test_alarm_flag(sigmsg-&gt;channel, FTDM_ALARM_YELLOW)) {
</del><ins>+        if (alarmbits &amp; FTDM_ALARM_YELLOW) {
</ins><span class="cx">                 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;alarm&quot;, &quot;yellow&quot;);
</span><span class="cx">         }
</span><del>-        if (ftdm_test_alarm_flag(sigmsg-&gt;channel, FTDM_ALARM_RED)) {
-                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;alarm&quot;, &quot;red&quot;);
</del><ins>+        if (alarmbits &amp; FTDM_ALARM_RAI) {
+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;alarm&quot;, &quot;rai&quot;);
</ins><span class="cx">         }
</span><del>-        if (ftdm_test_alarm_flag(sigmsg-&gt;channel, FTDM_ALARM_BLUE)) {
</del><ins>+        if (alarmbits &amp; FTDM_ALARM_BLUE) {
</ins><span class="cx">                 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;alarm&quot;, &quot;blue&quot;);
</span><span class="cx">         }
</span><del>-        if (ftdm_test_alarm_flag(sigmsg-&gt;channel, FTDM_ALARM_NOTOPEN)) {
-                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;alarm&quot;, &quot;notopen&quot;);
-        }
-        if (ftdm_test_alarm_flag(sigmsg-&gt;channel, FTDM_ALARM_AIS)) {
</del><ins>+        if (alarmbits &amp; FTDM_ALARM_AIS) {
</ins><span class="cx">                 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;alarm&quot;, &quot;ais&quot;);
</span><span class="cx">         }
</span><del>-        if (ftdm_test_alarm_flag(sigmsg-&gt;channel, FTDM_ALARM_RAI)) {
-                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;alarm&quot;, &quot;rai&quot;);
-        }
-        if (ftdm_test_alarm_flag(sigmsg-&gt;channel, FTDM_ALARM_GENERAL)) {
</del><ins>+        if (alarmbits &amp; FTDM_ALARM_GENERAL) {
</ins><span class="cx">                 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;alarm&quot;, &quot;general&quot;);
</span><span class="cx">         }
</span><span class="cx">         switch_event_fire(&amp;event);
</span><span class="lines">@@ -1495,9 +1524,16 @@
</span><span class="cx">         switch_core_session_t *session = NULL;
</span><span class="cx">         switch_channel_t *channel = NULL;
</span><span class="cx">         ftdm_status_t status;
</span><ins>+        uint32_t spanid;
+        uint32_t chanid;
+        ftdm_caller_data_t *callerdata;
</ins><span class="cx"> 
</span><del>-        ftdm_log(FTDM_LOG_DEBUG, &quot;got FXO sig %d:%d [%s]\n&quot;, sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id, ftdm_signal_event2str(sigmsg-&gt;event_id));
</del><ins>+        spanid = ftdm_channel_get_span_id(sigmsg-&gt;channel);
+        chanid = ftdm_channel_get_id(sigmsg-&gt;channel);
+        callerdata = sigmsg-&gt;raw_data;
</ins><span class="cx"> 
</span><ins>+        ftdm_log(FTDM_LOG_DEBUG, &quot;got FXO sig %d:%d [%s]\n&quot;, spanid, chanid, ftdm_signal_event2str(sigmsg-&gt;event_id));
+
</ins><span class="cx">     switch(sigmsg-&gt;event_id) {
</span><span class="cx"> 
</span><span class="cx">     case FTDM_SIGEVENT_PROGRESS_MEDIA:
</span><span class="lines">@@ -1517,7 +1553,7 @@
</span><span class="cx">                                 switch_set_flag_locked(tech_pvt, TFLAG_DEAD);
</span><span class="cx">                                 ftdm_channel_clear_token(sigmsg-&gt;channel, 0);
</span><span class="cx">                                 channel = switch_core_session_get_channel(session);
</span><del>-                                switch_channel_hangup(channel, sigmsg-&gt;channel-&gt;caller_data.hangup_cause);
</del><ins>+                                switch_channel_hangup(channel, callerdata-&gt;hangup_cause);
</ins><span class="cx">                                 ftdm_channel_clear_token(sigmsg-&gt;channel, switch_core_session_get_uuid(session));
</span><span class="cx">                                 switch_core_session_rwunlock(session);
</span><span class="cx">                         }
</span><span class="lines">@@ -1536,7 +1572,7 @@
</span><span class="cx">                 {
</span><span class="cx">                         status = ftdm_channel_from_event(sigmsg, &amp;session);
</span><span class="cx">                         if (status != FTDM_SUCCESS) {
</span><del>-                                ftdm_set_state_locked(sigmsg-&gt;channel, FTDM_CHANNEL_STATE_DOWN);
</del><ins>+                                ftdm_channel_call_hangup(sigmsg-&gt;channel);
</ins><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="lines">@@ -1544,7 +1580,7 @@
</span><span class="cx">         default:
</span><span class="cx">                 {
</span><span class="cx">                         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, &quot;Unhandled msg type %d for channel %d:%d\n&quot;,
</span><del>-                                                          sigmsg-&gt;event_id, sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id);
</del><ins>+                                                          sigmsg-&gt;event_id, spanid, chanid);
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx"> 
</span><span class="lines">@@ -1558,7 +1594,12 @@
</span><span class="cx">         switch_core_session_t *session = NULL;
</span><span class="cx">         switch_channel_t *channel = NULL;
</span><span class="cx">         ftdm_status_t status = FTDM_SUCCESS;
</span><ins>+        uint32_t chanid, spanid, tokencount;
</ins><span class="cx"> 
</span><ins>+        chanid = ftdm_channel_get_id(sigmsg-&gt;channel);
+        spanid = ftdm_channel_get_span_id(sigmsg-&gt;channel);
+        tokencount = ftdm_channel_get_token_count(sigmsg-&gt;channel);
+
</ins><span class="cx">     ftdm_log(FTDM_LOG_DEBUG, &quot;got FXS sig [%s]\n&quot;, ftdm_signal_event2str(sigmsg-&gt;event_id));
</span><span class="cx"> 
</span><span class="cx">     switch(sigmsg-&gt;event_id) {
</span><span class="lines">@@ -1582,10 +1623,9 @@
</span><span class="cx">                 break;
</span><span class="cx">     case FTDM_SIGEVENT_START:
</span><span class="cx">                 {
</span><del>-                        ftdm_clear_flag_locked(sigmsg-&gt;channel, FTDM_CHANNEL_HOLD);
</del><span class="cx">                         status = ftdm_channel_from_event(sigmsg, &amp;session);
</span><span class="cx">                         if (status != FTDM_SUCCESS) {
</span><del>-                                ftdm_set_state_locked(sigmsg-&gt;channel, FTDM_CHANNEL_STATE_BUSY);
</del><ins>+                                ftdm_channel_call_indicate(sigmsg-&gt;channel, FTDM_CHANNEL_INDICATE_BUSY);
</ins><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="lines">@@ -1593,15 +1633,19 @@
</span><span class="cx">                 {
</span><span class="cx">                         private_t *tech_pvt = NULL;
</span><span class="cx">                         switch_call_cause_t cause = SWITCH_CAUSE_NORMAL_CLEARING;
</span><del>-                        if (sigmsg-&gt;channel-&gt;token_count) {
</del><ins>+                        if (tokencount) {
</ins><span class="cx">                                 switch_core_session_t *session_a, *session_b, *session_t = NULL;
</span><span class="cx">                                 switch_channel_t *channel_a = NULL, *channel_b = NULL;
</span><ins>+#if 0
</ins><span class="cx">                                 int digits = !zstr(sigmsg-&gt;channel-&gt;caller_data.collected);
</span><ins>+#else
+                                int digits = 0;
+#endif
</ins><span class="cx">                                 const char *br_a_uuid = NULL, *br_b_uuid = NULL;
</span><span class="cx">                                 private_t *tech_pvt = NULL;
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-                                if ((session_a = switch_core_session_locate(sigmsg-&gt;channel-&gt;tokens[0]))) {
</del><ins>+                                if ((session_a = switch_core_session_locate(ftdm_channel_get_token(sigmsg-&gt;channel, 0)))) {
</ins><span class="cx">                                         channel_a = switch_core_session_get_channel(session_a);
</span><span class="cx">                                         br_a_uuid = switch_channel_get_variable(channel_a, SWITCH_SIGNAL_BOND_VARIABLE);
</span><span class="cx"> 
</span><span class="lines">@@ -1610,7 +1654,7 @@
</span><span class="cx">                                         switch_clear_flag_locked(tech_pvt, TFLAG_HOLD);
</span><span class="cx">                                 }
</span><span class="cx"> 
</span><del>-                                if ((session_b = switch_core_session_locate(sigmsg-&gt;channel-&gt;tokens[1]))) {
</del><ins>+                                if ((session_b = switch_core_session_locate(ftdm_channel_get_token(sigmsg-&gt;channel, 1)))) {
</ins><span class="cx">                                         channel_b = switch_core_session_get_channel(session_b);
</span><span class="cx">                                         br_b_uuid = switch_channel_get_variable(channel_b, SWITCH_SIGNAL_BOND_VARIABLE);
</span><span class="cx"> 
</span><span class="lines">@@ -1630,10 +1674,12 @@
</span><span class="cx">                                         }
</span><span class="cx">                                 }
</span><span class="cx">                                 
</span><ins>+#if 0
</ins><span class="cx">                                 if (session_t) {
</span><span class="cx">                                         switch_ivr_session_transfer(session_t, sigmsg-&gt;channel-&gt;caller_data.collected, NULL, NULL);
</span><span class="cx">                                         switch_core_session_rwunlock(session_t);
</span><span class="cx">                                 }
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">                                 if (session_a) {
</span><span class="cx">                                         switch_core_session_rwunlock(session_a);
</span><span class="lines">@@ -1666,8 +1712,7 @@
</span><span class="cx">                 break;
</span><span class="cx">     case FTDM_SIGEVENT_FLASH:
</span><span class="cx">                 {
</span><del>-
-                        if (ftdm_test_flag(sigmsg-&gt;channel, FTDM_CHANNEL_HOLD) &amp;&amp; sigmsg-&gt;channel-&gt;token_count == 1) {
</del><ins>+                        if (ftdm_channel_call_check_hold(sigmsg-&gt;channel) &amp;&amp; tokencount == 1) {
</ins><span class="cx">                                 switch_core_session_t *session;
</span><span class="cx">                                 if ((session = ftdm_channel_get_session(sigmsg-&gt;channel, 0))) {
</span><span class="cx">                                         const char *buuid;
</span><span class="lines">@@ -1677,12 +1722,13 @@
</span><span class="cx">                                         tech_pvt = switch_core_session_get_private(session);
</span><span class="cx">                                         channel = switch_core_session_get_channel(session);
</span><span class="cx">                                         buuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
</span><del>-                                        ftdm_set_state_locked(sigmsg-&gt;channel,  FTDM_CHANNEL_STATE_UP);
</del><ins>+                                        ftdm_channel_call_unhold(sigmsg-&gt;channel);
</ins><span class="cx">                                         stop_hold(session, buuid);
</span><span class="cx">                                         switch_clear_flag_locked(tech_pvt, TFLAG_HOLD);
</span><span class="cx">                                         switch_core_session_rwunlock(session);
</span><span class="cx">                                 }
</span><del>-                        } else if (sigmsg-&gt;channel-&gt;token_count == 2 &amp;&amp; (SPAN_CONFIG[sigmsg-&gt;span_id].analog_options &amp; ANALOG_OPTION_3WAY)) {
</del><ins>+#if 0
+                        } else if (tokencount == 2 &amp;&amp; (SPAN_CONFIG[sigmsg-&gt;span_id].analog_options &amp; ANALOG_OPTION_3WAY)) {
</ins><span class="cx">                                 if (ftdm_test_flag(sigmsg-&gt;channel, FTDM_CHANNEL_3WAY)) {
</span><span class="cx">                                         ftdm_clear_flag(sigmsg-&gt;channel, FTDM_CHANNEL_3WAY);
</span><span class="cx">                                         if ((session = ftdm_channel_get_session(sigmsg-&gt;channel, 1))) {
</span><span class="lines">@@ -1703,15 +1749,16 @@
</span><span class="cx">                                            || (SPAN_CONFIG[sigmsg-&gt;span_id].analog_options &amp; ANALOG_OPTION_3WAY)
</span><span class="cx">                                            ) { 
</span><span class="cx">                                 cycle_foreground(sigmsg-&gt;channel, 1, NULL);
</span><del>-                                if (sigmsg-&gt;channel-&gt;token_count == 1) {
-                                        ftdm_set_flag_locked(sigmsg-&gt;channel, FTDM_CHANNEL_HOLD);
-                                        ftdm_set_state_locked(sigmsg-&gt;channel, FTDM_CHANNEL_STATE_DIALTONE);
</del><ins>+                                if (tokencount == 1) {
+                                        ftdm_channel_call_hold(sigmsg-&gt;channel);
</ins><span class="cx">                                 }
</span><ins>+#endif
</ins><span class="cx">                         }
</span><span class="cx">                         
</span><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx"> 
</span><ins>+#if 0
</ins><span class="cx">     case FTDM_SIGEVENT_COLLECTED_DIGIT:
</span><span class="cx">                 {
</span><span class="cx">                         char *dtmf = sigmsg-&gt;raw_data;
</span><span class="lines">@@ -1750,11 +1797,12 @@
</span><span class="cx"> 
</span><span class="cx">                 }
</span><span class="cx">                 break;
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">         default:
</span><span class="cx">                 {
</span><span class="cx">                         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, &quot;Unhandled msg type %d for channel %d:%d\n&quot;,
</span><del>-                                                          sigmsg-&gt;event_id, sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id);
</del><ins>+                                                          sigmsg-&gt;event_id, spanid, chanid);
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx"> 
</span><span class="lines">@@ -1765,12 +1813,18 @@
</span><span class="cx"> 
</span><span class="cx"> static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
</span><span class="cx"> {
</span><ins>+        uint32_t phyid, chanid, spanid;
</ins><span class="cx">         switch_core_session_t *session = NULL;
</span><span class="cx">         switch_channel_t *channel = NULL;
</span><span class="cx">         ftdm_status_t status = FTDM_SUCCESS;
</span><ins>+        ftdm_caller_data_t *caller_data = sigmsg-&gt;raw_data;
</ins><span class="cx"> 
</span><del>-        ftdm_log(FTDM_LOG_DEBUG, &quot;Got R2 channel sig [%s] in channel %d\n&quot;, ftdm_signal_event2str(sigmsg-&gt;event_id), sigmsg-&gt;channel-&gt;physical_chan_id);
</del><ins>+        phyid = ftdm_channel_get_ph_id(sigmsg-&gt;channel);
+        chanid = ftdm_channel_get_id(sigmsg-&gt;channel);
+        spanid = ftdm_channel_get_span_id(sigmsg-&gt;channel);
</ins><span class="cx"> 
</span><ins>+        ftdm_log(FTDM_LOG_DEBUG, &quot;Got R2 channel sig [%s] in channel %d\n&quot;, ftdm_signal_event2str(sigmsg-&gt;event_id), phyid);
+
</ins><span class="cx">         if (on_common_signal(sigmsg) == FTDM_BREAK) {
</span><span class="cx">                 return FTDM_SUCCESS;
</span><span class="cx">         }
</span><span class="lines">@@ -1784,7 +1838,7 @@
</span><span class="cx">                                 tech_pvt = switch_core_session_get_private(session);
</span><span class="cx">                                 switch_set_flag_locked(tech_pvt, TFLAG_DEAD);
</span><span class="cx">                                 channel = switch_core_session_get_channel(session);
</span><del>-                                switch_channel_hangup(channel, sigmsg-&gt;channel-&gt;caller_data.hangup_cause);
</del><ins>+                                switch_channel_hangup(channel, caller_data-&gt;hangup_cause);
</ins><span class="cx">                                 ftdm_channel_clear_token(sigmsg-&gt;channel, switch_core_session_get_uuid(session));
</span><span class="cx">                                 switch_core_session_rwunlock(session);
</span><span class="cx">                         }
</span><span class="lines">@@ -1798,6 +1852,8 @@
</span><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx"> 
</span><ins>+#if 0
+FIXME: collected DNIS
</ins><span class="cx">                 /* on DNIS received from the R2 forward side, return status == FTDM_BREAK to stop requesting DNIS */
</span><span class="cx">                 case FTDM_SIGEVENT_COLLECTED_DIGIT: 
</span><span class="cx">                 {
</span><span class="lines">@@ -1834,6 +1890,7 @@
</span><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="cx">                 break;
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">                 case FTDM_SIGEVENT_PROGRESS:
</span><span class="cx">                 {
</span><span class="lines">@@ -1852,7 +1909,7 @@
</span><span class="cx">                                 channel = switch_core_session_get_channel(session);
</span><span class="cx">                                 switch_channel_mark_answered(channel);
</span><span class="cx">                                 if (ftdm_channel_command(sigmsg-&gt;channel, FTDM_COMMAND_ENABLE_DTMF_DETECT, &amp;tt) != FTDM_SUCCESS) {
</span><del>-                                        ftdm_log(FTDM_LOG_ERROR, &quot;Failed to enable DTMF detection in R2 channel %d:%d\n&quot;, sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id);
</del><ins>+                                        ftdm_log(FTDM_LOG_ERROR, &quot;Failed to enable DTMF detection in R2 channel %d:%d\n&quot;, spanid, chanid);
</ins><span class="cx">                                 }
</span><span class="cx">                                 switch_core_session_rwunlock(session);
</span><span class="cx">                         }
</span><span class="lines">@@ -1862,7 +1919,7 @@
</span><span class="cx">                 default:
</span><span class="cx">                 {
</span><span class="cx">                         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, &quot;Unhandled event %d from R2 for channel %d:%d\n&quot;,
</span><del>-                        sigmsg-&gt;event_id, sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id);
</del><ins>+                        sigmsg-&gt;event_id, spanid, chanid);
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         }
</span><span class="lines">@@ -1874,9 +1931,15 @@
</span><span class="cx"> {
</span><span class="cx">         switch_core_session_t *session = NULL;
</span><span class="cx">         switch_channel_t *channel = NULL;
</span><ins>+        ftdm_caller_data_t *caller_data;
+        uint32_t spanid, chanid;
</ins><span class="cx"> 
</span><span class="cx">         ftdm_log(FTDM_LOG_DEBUG, &quot;got clear channel sig [%s]\n&quot;, ftdm_signal_event2str(sigmsg-&gt;event_id));
</span><span class="cx"> 
</span><ins>+        caller_data = sigmsg-&gt;raw_data;
+        chanid = ftdm_channel_get_id(sigmsg-&gt;channel);
+        spanid = ftdm_channel_get_span_id(sigmsg-&gt;channel);
+
</ins><span class="cx">         if (on_common_signal(sigmsg) == FTDM_BREAK) {
</span><span class="cx">                 return FTDM_SUCCESS;
</span><span class="cx">         }
</span><span class="lines">@@ -1901,7 +1964,7 @@
</span><span class="cx">                                 tech_pvt = switch_core_session_get_private(session);
</span><span class="cx">                                 switch_set_flag_locked(tech_pvt, TFLAG_DEAD);
</span><span class="cx">                                 channel = switch_core_session_get_channel(session);
</span><del>-                                switch_channel_hangup(channel, sigmsg-&gt;channel-&gt;caller_data.hangup_cause);
</del><ins>+                                switch_channel_hangup(channel, caller_data-&gt;hangup_cause);
</ins><span class="cx">                                 ftdm_channel_clear_token(sigmsg-&gt;channel, switch_core_session_get_uuid(session));
</span><span class="cx">                                 switch_core_session_rwunlock(session);
</span><span class="cx">                         }
</span><span class="lines">@@ -1921,7 +1984,7 @@
</span><span class="cx">                                 const char *uuid = ftdm_channel_get_uuid(sigmsg-&gt;channel, 0);
</span><span class="cx"> 
</span><span class="cx">                                 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Session for channel %d:%d not found [UUID: %s]\n&quot;,
</span><del>-                                        sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id, (uuid) ? uuid : &quot;N/A&quot;);
</del><ins>+                                        spanid, chanid, (uuid) ? uuid : &quot;N/A&quot;);
</ins><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="cx">     case FTDM_SIGEVENT_PROGRESS_MEDIA:
</span><span class="lines">@@ -1934,7 +1997,7 @@
</span><span class="cx">                                 const char *uuid = ftdm_channel_get_uuid(sigmsg-&gt;channel, 0);
</span><span class="cx"> 
</span><span class="cx">                                 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Session for channel %d:%d not found [UUID: %s]\n&quot;,
</span><del>-                                        sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id, (uuid) ? uuid : &quot;N/A&quot;);
</del><ins>+                                        spanid, chanid, (uuid) ? uuid : &quot;N/A&quot;);
</ins><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="lines">@@ -1948,7 +2011,7 @@
</span><span class="cx">                                 const char *uuid = ftdm_channel_get_uuid(sigmsg-&gt;channel, 0);
</span><span class="cx"> 
</span><span class="cx">                                 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Session for channel %d:%d not found [UUID: %s]\n&quot;,
</span><del>-                                        sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id, (uuid) ? uuid : &quot;N/A&quot;);
</del><ins>+                                        spanid, chanid, (uuid) ? uuid : &quot;N/A&quot;);
</ins><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="lines">@@ -1962,7 +2025,7 @@
</span><span class="cx">         default:
</span><span class="cx">                 {
</span><span class="cx">                         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, &quot;Unhandled msg type %d for channel %d:%d\n&quot;,
</span><del>-                                                          sigmsg-&gt;event_id, sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id);
</del><ins>+                                                          sigmsg-&gt;event_id, spanid, chanid);
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         }
</span><span class="lines">@@ -1973,22 +2036,31 @@
</span><span class="cx"> 
</span><span class="cx"> static FIO_SIGNAL_CB_FUNCTION(on_ss7_signal)
</span><span class="cx"> {
</span><ins>+        uint32_t spanid, chanid;
</ins><span class="cx">         if (on_common_signal(sigmsg) == FTDM_BREAK) {
</span><span class="cx">                 return FTDM_SUCCESS;
</span><span class="cx">         }
</span><del>-        ftdm_log(FTDM_LOG_DEBUG, &quot;got ss7 sig %d:%d [%s]\n&quot;, sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id, ftdm_signal_event2str(sigmsg-&gt;event_id));
</del><ins>+        spanid = ftdm_channel_get_span_id(sigmsg-&gt;channel);
+        chanid = ftdm_channel_get_span_id(sigmsg-&gt;channel);
+        ftdm_log(FTDM_LOG_DEBUG, &quot;got ss7 sig %d:%d [%s]\n&quot;, spanid, chanid, ftdm_signal_event2str(sigmsg-&gt;event_id));
</ins><span class="cx">         return FTDM_SUCCESS;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static FIO_SIGNAL_CB_FUNCTION(on_analog_signal)
</span><span class="cx"> {
</span><ins>+        uint32_t spanid, chanid;
+        ftdm_chan_type_t type;
</ins><span class="cx">         switch_status_t status = SWITCH_STATUS_FALSE;
</span><span class="cx"> 
</span><ins>+        spanid = ftdm_channel_get_span_id(sigmsg-&gt;channel);
+        chanid = ftdm_channel_get_span_id(sigmsg-&gt;channel);
+        type = ftdm_channel_get_type(sigmsg-&gt;channel);
+
</ins><span class="cx">         if (on_common_signal(sigmsg) == FTDM_BREAK) {
</span><span class="cx">                 return FTDM_SUCCESS;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        switch (sigmsg-&gt;channel-&gt;type) {
</del><ins>+        switch (type) {
</ins><span class="cx">         case FTDM_CHAN_TYPE_FXO:
</span><span class="cx">         case FTDM_CHAN_TYPE_EM:
</span><span class="cx">                 {
</span><span class="lines">@@ -2003,7 +2075,7 @@
</span><span class="cx">         default: 
</span><span class="cx">                 {
</span><span class="cx">                         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, &quot;Unhandled analog channel type %d for channel %d:%d\n&quot;,
</span><del>-                                                          sigmsg-&gt;channel-&gt;type, sigmsg-&gt;channel-&gt;span_id, sigmsg-&gt;channel-&gt;chan_id);
</del><ins>+                                                          type, spanid, chanid);
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">         }
</span><span class="lines">@@ -2243,7 +2315,7 @@
</span><span class="cx">                         }
</span><span class="cx">                         
</span><span class="cx">                         if (!span_id) {
</span><del>-                                span_id = span-&gt;span_id;
</del><ins>+                                span_id = ftdm_span_get_id(span);
</ins><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         ss7confnode = get_ss7_config_node(cfg, configname);
</span><span class="lines">@@ -2276,14 +2348,14 @@
</span><span class="cx">                         if (ftdm_configure_span(&quot;ss7&quot;, span, on_ss7_signal,
</span><span class="cx">                                                                    &quot;confnode&quot;, ss7confnode,
</span><span class="cx">                                                                    &quot;parameters&quot;, spanparameters,
</span><del>-                                                                   TAG_END) != FTDM_SUCCESS) {
</del><ins>+                                                                   FTDM_TAG_END) != FTDM_SUCCESS) {
</ins><span class="cx">                                 ftdm_log(FTDM_LOG_ERROR, &quot;Error configuring ss7 FreeTDM span %d\n&quot;, span_id);
</span><span class="cx">                                 continue;
</span><span class="cx">                         }
</span><del>-                        SPAN_CONFIG[span-&gt;span_id].span = span;
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].context, context, sizeof(SPAN_CONFIG[span-&gt;span_id].context));
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].dialplan, dialplan, sizeof(SPAN_CONFIG[span-&gt;span_id].dialplan));
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].type, &quot;Sangoma (SS7)&quot;, sizeof(SPAN_CONFIG[span-&gt;span_id].type));
</del><ins>+                        SPAN_CONFIG[span_id].span = span;
+                        switch_copy_string(SPAN_CONFIG[span_id].context, context, sizeof(SPAN_CONFIG[span_id].context));
+                        switch_copy_string(SPAN_CONFIG[span_id].dialplan, dialplan, sizeof(SPAN_CONFIG[span_id].dialplan));
+                        switch_copy_string(SPAN_CONFIG[span_id].type, &quot;Sangoma (SS7)&quot;, sizeof(SPAN_CONFIG[span_id].type));
</ins><span class="cx">                         ftdm_log(FTDM_LOG_DEBUG, &quot;Configured ss7 FreeTDM span %d with config node %s\n&quot;, span_id, configname);
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="lines">@@ -2375,7 +2447,7 @@
</span><span class="cx">                         }
</span><span class="cx">                         
</span><span class="cx">                         if (!span_id) {
</span><del>-                                span_id = span-&gt;span_id;
</del><ins>+                                span_id = ftdm_span_get_id(span);
</ins><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         if (ftdm_configure_span(&quot;analog&quot;, span, on_analog_signal, 
</span><span class="lines">@@ -2384,28 +2456,28 @@
</span><span class="cx">                                                                    &quot;max_dialstr&quot;, &amp;max,
</span><span class="cx">                                                                    &quot;hotline&quot;, hotline,
</span><span class="cx">                                                                    &quot;enable_callerid&quot;, enable_callerid,
</span><del>-                                                                   TAG_END) != FTDM_SUCCESS) {
</del><ins>+                                                                   FTDM_TAG_END) != FTDM_SUCCESS) {
</ins><span class="cx">                                 ftdm_log(FTDM_LOG_ERROR, &quot;Error starting FreeTDM span %d\n&quot;, span_id);
</span><span class="cx">                                 continue;
</span><span class="cx">                         }
</span><span class="cx"> 
</span><del>-                        SPAN_CONFIG[span-&gt;span_id].span = span;
-                        switch_set_string(SPAN_CONFIG[span-&gt;span_id].context, context);
-                        switch_set_string(SPAN_CONFIG[span-&gt;span_id].dialplan, dialplan);
-                        SPAN_CONFIG[span-&gt;span_id].analog_options = analog_options | globals.analog_options;
</del><ins>+                        SPAN_CONFIG[span_id].span = span;
+                        switch_set_string(SPAN_CONFIG[span_id].context, context);
+                        switch_set_string(SPAN_CONFIG[span_id].dialplan, dialplan);
+                        SPAN_CONFIG[span_id].analog_options = analog_options | globals.analog_options;
</ins><span class="cx">                         
</span><span class="cx">                         if (dial_regex) {
</span><del>-                                switch_set_string(SPAN_CONFIG[span-&gt;span_id].dial_regex, dial_regex);
</del><ins>+                                switch_set_string(SPAN_CONFIG[span_id].dial_regex, dial_regex);
</ins><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         if (fail_dial_regex) {
</span><del>-                                switch_set_string(SPAN_CONFIG[span-&gt;span_id].fail_dial_regex, fail_dial_regex);
</del><ins>+                                switch_set_string(SPAN_CONFIG[span_id].fail_dial_regex, fail_dial_regex);
</ins><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         if (hold_music) {
</span><del>-                                switch_set_string(SPAN_CONFIG[span-&gt;span_id].hold_music, hold_music);
</del><ins>+                                switch_set_string(SPAN_CONFIG[span_id].hold_music, hold_music);
</ins><span class="cx">                         }
</span><del>-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].type, &quot;analog&quot;, sizeof(SPAN_CONFIG[span-&gt;span_id].type));
</del><ins>+                        switch_copy_string(SPAN_CONFIG[span_id].type, &quot;analog&quot;, sizeof(SPAN_CONFIG[span_id].type));
</ins><span class="cx">                         ftdm_span_start(span);
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="lines">@@ -2490,7 +2562,7 @@
</span><span class="cx">                         }
</span><span class="cx">                         
</span><span class="cx">                         if (!span_id) {
</span><del>-                                span_id = span-&gt;span_id;
</del><ins>+                                span_id = ftdm_span_get_id(span);
</ins><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -2498,28 +2570,28 @@
</span><span class="cx">                                                                    &quot;tonemap&quot;, tonegroup, 
</span><span class="cx">                                                                    &quot;digit_timeout&quot;, &amp;to,
</span><span class="cx">                                                                    &quot;max_dialstr&quot;, &amp;max,
</span><del>-                                                                   TAG_END) != FTDM_SUCCESS) {
</del><ins>+                                                                   FTDM_TAG_END) != FTDM_SUCCESS) {
</ins><span class="cx">                                 ftdm_log(FTDM_LOG_ERROR, &quot;Error starting FreeTDM span %d\n&quot;, span_id);
</span><span class="cx">                                 continue;
</span><span class="cx">                         }
</span><span class="cx"> 
</span><del>-                        SPAN_CONFIG[span-&gt;span_id].span = span;
-                        switch_set_string(SPAN_CONFIG[span-&gt;span_id].context, context);
-                        switch_set_string(SPAN_CONFIG[span-&gt;span_id].dialplan, dialplan);
-                        SPAN_CONFIG[span-&gt;span_id].analog_options = analog_options | globals.analog_options;
</del><ins>+                        SPAN_CONFIG[span_id].span = span;
+                        switch_set_string(SPAN_CONFIG[span_id].context, context);
+                        switch_set_string(SPAN_CONFIG[span_id].dialplan, dialplan);
+                        SPAN_CONFIG[span_id].analog_options = analog_options | globals.analog_options;
</ins><span class="cx">                         
</span><span class="cx">                         if (dial_regex) {
</span><del>-                                switch_set_string(SPAN_CONFIG[span-&gt;span_id].dial_regex, dial_regex);
</del><ins>+                                switch_set_string(SPAN_CONFIG[span_id].dial_regex, dial_regex);
</ins><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         if (fail_dial_regex) {
</span><del>-                                switch_set_string(SPAN_CONFIG[span-&gt;span_id].fail_dial_regex, fail_dial_regex);
</del><ins>+                                switch_set_string(SPAN_CONFIG[span_id].fail_dial_regex, fail_dial_regex);
</ins><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         if (hold_music) {
</span><del>-                                switch_set_string(SPAN_CONFIG[span-&gt;span_id].hold_music, hold_music);
</del><ins>+                                switch_set_string(SPAN_CONFIG[span_id].hold_music, hold_music);
</ins><span class="cx">                         }
</span><del>-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].type, &quot;analog_em&quot;, sizeof(SPAN_CONFIG[span-&gt;span_id].type));
</del><ins>+                        switch_copy_string(SPAN_CONFIG[span_id].type, &quot;analog_em&quot;, sizeof(SPAN_CONFIG[span_id].type));
</ins><span class="cx">                         ftdm_span_start(span);
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="lines">@@ -2603,9 +2675,9 @@
</span><span class="cx">                                 continue;
</span><span class="cx">                         }
</span><span class="cx"> 
</span><del>-                        if (!span_id) {
-                                span_id = span-&gt;span_id;
-                        }
</del><ins>+                        if (!span_id) {
+                                span_id = ftdm_span_get_id(span);
+                        }
</ins><span class="cx"> 
</span><span class="cx">                         if (!tonegroup) {
</span><span class="cx">                                 tonegroup = &quot;us&quot;;
</span><span class="lines">@@ -2619,15 +2691,16 @@
</span><span class="cx">                                                                    &quot;tonemap&quot;, tonegroup,
</span><span class="cx">                                                                    &quot;q921loglevel&quot;, q921loglevel,
</span><span class="cx">                                                                    &quot;q931loglevel&quot;, q931loglevel,
</span><del>-                                                                   TAG_END) != FTDM_SUCCESS) {
-                                ftdm_log(FTDM_LOG_ERROR, &quot;Error starting FreeTDM span %d mode: %s dialect: %s error: %s\n&quot;, span_id, mode, dialect, span-&gt;last_error);
</del><ins>+                                                                   FTDM_TAG_END) != FTDM_SUCCESS) {
+                                ftdm_log(FTDM_LOG_ERROR, &quot;Error starting FreeTDM span %d mode: %s dialect: %s error: %s\n&quot;, span_id, 
+                                                mode, dialect, ftdm_span_get_last_error(span));
</ins><span class="cx">                                 continue;
</span><span class="cx">                         }
</span><span class="cx"> 
</span><del>-                        SPAN_CONFIG[span-&gt;span_id].span = span;
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].context, context, sizeof(SPAN_CONFIG[span-&gt;span_id].context));
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].dialplan, dialplan, sizeof(SPAN_CONFIG[span-&gt;span_id].dialplan));
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].type, &quot;isdn&quot;, sizeof(SPAN_CONFIG[span-&gt;span_id].type));
</del><ins>+                        SPAN_CONFIG[span_id].span = span;
+                        switch_copy_string(SPAN_CONFIG[span_id].context, context, sizeof(SPAN_CONFIG[span_id].context));
+                        switch_copy_string(SPAN_CONFIG[span_id].dialplan, dialplan, sizeof(SPAN_CONFIG[span_id].dialplan));
+                        switch_copy_string(SPAN_CONFIG[span_id].type, &quot;isdn&quot;, sizeof(SPAN_CONFIG[span_id].type));
</ins><span class="cx"> 
</span><span class="cx">                         ftdm_span_start(span);
</span><span class="cx">                 }
</span><span class="lines">@@ -2701,7 +2774,7 @@
</span><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         if (!span_id) {
</span><del>-                                span_id = span-&gt;span_id;
</del><ins>+                                span_id = ftdm_span_get_id(span);
</ins><span class="cx">                         }
</span><span class="cx">                         
</span><span class="cx">                         
</span><span class="lines">@@ -2712,17 +2785,17 @@
</span><span class="cx">                                                                    &quot;l1&quot;, o_l1,
</span><span class="cx">                                                                    &quot;debug&quot;, o_debug,
</span><span class="cx">                                                                    &quot;opts&quot;, opts,
</span><del>-                                                                   TAG_END) != FTDM_SUCCESS) {
</del><ins>+                                                                   FTDM_TAG_END) != FTDM_SUCCESS) {
</ins><span class="cx">                                 ftdm_log(FTDM_LOG_ERROR, &quot;Error starting FreeTDM span %d node: %s switch: %s dp: %s l1: %s debug: %s error: %s\n&quot;, 
</span><span class="cx">                                                 span_id, switch_str_nil(o_node), switch_str_nil(o_switch), switch_str_nil(o_dp), switch_str_nil(o_l1), switch_str_nil(o_debug),
</span><del>-                                                span-&gt;last_error);
</del><ins>+                                                ftdm_span_get_last_error(span));
</ins><span class="cx">                                 continue;
</span><span class="cx">                         }
</span><span class="cx"> 
</span><del>-                        SPAN_CONFIG[span-&gt;span_id].span = span;
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].context, context, sizeof(SPAN_CONFIG[span-&gt;span_id].context));
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].dialplan, dialplan, sizeof(SPAN_CONFIG[span-&gt;span_id].dialplan));
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].type, &quot;isdn&quot;, sizeof(SPAN_CONFIG[span-&gt;span_id].type));
</del><ins>+                        SPAN_CONFIG[span_id].span = span;
+                        switch_copy_string(SPAN_CONFIG[span_id].context, context, sizeof(SPAN_CONFIG[span_id].context));
+                        switch_copy_string(SPAN_CONFIG[span_id].dialplan, dialplan, sizeof(SPAN_CONFIG[span_id].dialplan));
+                        switch_copy_string(SPAN_CONFIG[span_id].type, &quot;isdn&quot;, sizeof(SPAN_CONFIG[span_id].type));
</ins><span class="cx"> 
</span><span class="cx">                         ftdm_span_start(span);
</span><span class="cx">                 }
</span><span class="lines">@@ -2790,19 +2863,19 @@
</span><span class="cx">                         }
</span><span class="cx">                         
</span><span class="cx">                         if (!span_id) {
</span><del>-                                span_id = span-&gt;span_id;
</del><ins>+                                span_id = ftdm_span_get_id(span);
</ins><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         if (ftdm_configure_span_signaling(&quot;sangoma_boost&quot;, span, on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) {
</span><del>-                                ftdm_log(FTDM_LOG_ERROR, &quot;Error starting FreeTDM span %d error: %s\n&quot;, span_id, span-&gt;last_error);
</del><ins>+                                ftdm_log(FTDM_LOG_ERROR, &quot;Error starting FreeTDM span %d error: %s\n&quot;, span_id, ftdm_span_get_last_error(span));
</ins><span class="cx">                                 continue;
</span><span class="cx">                         }
</span><span class="cx"> 
</span><del>-                        SPAN_CONFIG[span-&gt;span_id].span = span;
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].context, context, sizeof(SPAN_CONFIG[span-&gt;span_id].context));
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].dialplan, dialplan, sizeof(SPAN_CONFIG[span-&gt;span_id].dialplan));
</del><ins>+                        SPAN_CONFIG[span_id].span = span;
+                        switch_copy_string(SPAN_CONFIG[span_id].context, context, sizeof(SPAN_CONFIG[span_id].context));
+                        switch_copy_string(SPAN_CONFIG[span_id].dialplan, dialplan, sizeof(SPAN_CONFIG[span_id].dialplan));
</ins><span class="cx"> 
</span><del>-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].type, &quot;Sangoma (boost)&quot;, sizeof(SPAN_CONFIG[span-&gt;span_id].type));
</del><ins>+                        switch_copy_string(SPAN_CONFIG[span_id].type, &quot;Sangoma (boost)&quot;, sizeof(SPAN_CONFIG[span_id].type));
</ins><span class="cx">                         boost_spans[boosti++] = span;
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="lines">@@ -2925,7 +2998,7 @@
</span><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         if (!span_id) {
</span><del>-                                span_id = span-&gt;span_id;
</del><ins>+                                span_id = ftdm_span_get_id(span);
</ins><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         if (ftdm_configure_span(&quot;r2&quot;, span, on_r2_signal, 
</span><span class="lines">@@ -2946,27 +3019,27 @@
</span><span class="cx">                                 &quot;call_files&quot;, call_files,
</span><span class="cx">                                 &quot;mfback_timeout&quot;, mfback_timeout,
</span><span class="cx">                                 &quot;metering_pulse_timeout&quot;, metering_pulse_timeout, 
</span><del>-                                TAG_END) != FTDM_SUCCESS) {
</del><ins>+                                FTDM_TAG_END) != FTDM_SUCCESS) {
</ins><span class="cx">                                 ftdm_log(FTDM_LOG_ERROR, &quot;Error configuring R2 FreeTDM span %d, error: %s\n&quot;, 
</span><del>-                                span_id, span-&gt;last_error);
</del><ins>+                                span_id, ftdm_span_get_last_error(span));
</ins><span class="cx">                                 continue;
</span><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         if (dial_regex) {
</span><del>-                                switch_set_string(SPAN_CONFIG[span-&gt;span_id].dial_regex, dial_regex);
</del><ins>+                                switch_set_string(SPAN_CONFIG[span_id].dial_regex, dial_regex);
</ins><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         if (fail_dial_regex) {
</span><del>-                                switch_set_string(SPAN_CONFIG[span-&gt;span_id].fail_dial_regex, fail_dial_regex);
</del><ins>+                                switch_set_string(SPAN_CONFIG[span_id].fail_dial_regex, fail_dial_regex);
</ins><span class="cx">                         }
</span><span class="cx"> 
</span><del>-                        SPAN_CONFIG[span-&gt;span_id].span = span;
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].context, context, sizeof(SPAN_CONFIG[span-&gt;span_id].context));
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].dialplan, dialplan, sizeof(SPAN_CONFIG[span-&gt;span_id].dialplan));
-                        switch_copy_string(SPAN_CONFIG[span-&gt;span_id].type, &quot;r2&quot;, sizeof(SPAN_CONFIG[span-&gt;span_id].type));
</del><ins>+                        SPAN_CONFIG[span_id].span = span;
+                        switch_copy_string(SPAN_CONFIG[span_id].context, context, sizeof(SPAN_CONFIG[span_id].context));
+                        switch_copy_string(SPAN_CONFIG[span_id].dialplan, dialplan, sizeof(SPAN_CONFIG[span_id].dialplan));
+                        switch_copy_string(SPAN_CONFIG[span_id].type, &quot;r2&quot;, sizeof(SPAN_CONFIG[span_id].type));
</ins><span class="cx"> 
</span><span class="cx">                         if (ftdm_span_start(span) == FTDM_FAIL) {
</span><del>-                                ftdm_log(FTDM_LOG_ERROR, &quot;Error starting R2 FreeTDM span %d, error: %s\n&quot;, span_id, span-&gt;last_error);
</del><ins>+                                ftdm_log(FTDM_LOG_ERROR, &quot;Error starting R2 FreeTDM span %d, error: %s\n&quot;, span_id, ftdm_span_get_last_error(span));
</ins><span class="cx">                                 continue;
</span><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="lines">@@ -2976,9 +3049,10 @@
</span><span class="cx">          * of needing all spans to be configured before starting them */
</span><span class="cx">         for ( ; i &lt; boosti; i++) {
</span><span class="cx">                 boost_span = boost_spans[i];
</span><del>-                ftdm_log(FTDM_LOG_DEBUG, &quot;Starting boost span %d\n&quot;, boost_span-&gt;span_id);
</del><ins>+                ftdm_log(FTDM_LOG_DEBUG, &quot;Starting boost span %d\n&quot;, ftdm_span_get_id(boost_span));
</ins><span class="cx">                 if (ftdm_span_start(boost_span) == FTDM_FAIL) {
</span><del>-                                ftdm_log(FTDM_LOG_ERROR, &quot;Error starting boost FreeTDM span %d, error: %s\n&quot;, boost_span-&gt;span_id, boost_span-&gt;last_error);
</del><ins>+                                ftdm_log(FTDM_LOG_ERROR, &quot;Error starting boost FreeTDM span %d, error: %s\n&quot;, 
+                                                ftdm_span_get_id(boost_span), ftdm_span_get_last_error(boost_span));
</ins><span class="cx">                                 continue;
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="lines">@@ -2989,15 +3063,37 @@
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream)
</span><span class="cx"> {
</span><ins>+        uint32_t span_id;
+        uint32_t phspan_id, phchan_id;
+        const char *chan_type;
+        const char *state;
+        const char *last_state;
+        float txgain, rxgain;
+        ftdm_alarm_flag_t alarmflag;
+        ftdm_caller_data_t *caller_data;
+        ftdm_channel_t *ftdmchan;
</ins><span class="cx">         ftdm_signaling_status_t sigstatus = FTDM_SIG_STATE_DOWN;
</span><del>-        if (chan_id &gt; span-&gt;chan_count) {
</del><ins>+
+        if (chan_id &gt; ftdm_span_get_chan_count(span)) {
</ins><span class="cx">                 return;
</span><span class="cx">         }
</span><del>-        
-        ftdm_channel_get_sig_status(span-&gt;channels[chan_id], &amp;sigstatus);
</del><ins>+
+        ftdmchan = ftdm_span_get_channel(span, chan_id);
+        span_id = ftdm_span_get_id(span);
+
+        phspan_id = ftdm_channel_get_ph_span_id(ftdmchan);
+        phchan_id = ftdm_channel_get_ph_id(ftdmchan);
+        chan_type = ftdm_chan_type2str(ftdm_channel_get_type(ftdmchan));
+        state = ftdm_channel_get_state_str(ftdmchan);
+        last_state = ftdm_channel_get_last_state_str(ftdmchan);
+        ftdm_channel_command(ftdmchan, FTDM_COMMAND_GET_RX_GAIN, &amp;rxgain);
+        ftdm_channel_command(ftdmchan, FTDM_COMMAND_GET_TX_GAIN, &amp;txgain);
+        caller_data = ftdm_channel_get_caller_data(ftdmchan);
+        ftdm_channel_get_sig_status(ftdmchan, &amp;sigstatus);
+        ftdm_channel_get_alarms(ftdmchan, &amp;alarmflag);
+
</ins><span class="cx">         stream-&gt;write_function(stream,
</span><span class="cx">                                                    &quot;span_id: %u\n&quot;
</span><span class="cx">                                                    &quot;chan_id: %u\n&quot;
</span><span class="lines">@@ -3018,35 +3114,59 @@
</span><span class="cx">                                                    &quot;dnis: %s\n&quot;
</span><span class="cx">                                                    &quot;rdnis: %s\n&quot;
</span><span class="cx">                                                    &quot;cause: %s\n\n&quot;,
</span><del>-                                                   span-&gt;channels[chan_id]-&gt;span_id,
-                                                   span-&gt;channels[chan_id]-&gt;chan_id,
-                                                   span-&gt;channels[chan_id]-&gt;physical_span_id,
-                                                   span-&gt;channels[chan_id]-&gt;physical_chan_id,
-                                                   (span-&gt;channels[chan_id]-&gt;alarm_flags) ? &quot;DOWN&quot; : &quot;UP&quot;,
-                                             ftdm_signaling_status2str(sigstatus),
-                                                   ftdm_chan_type2str(span-&gt;channels[chan_id]-&gt;type),
-                                                   ftdm_channel_state2str(span-&gt;channels[chan_id]-&gt;state),
-                                                   ftdm_channel_state2str(span-&gt;channels[chan_id]-&gt;last_state),
-                                                   span-&gt;channels[chan_id]-&gt;txgain,
-                                                   span-&gt;channels[chan_id]-&gt;rxgain,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.cid_date,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.cid_name,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.cid_num.digits,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.ani.digits,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.aniII,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.dnis.digits,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.rdnis.digits,
-                                                   switch_channel_cause2str(span-&gt;channels[chan_id]-&gt;caller_data.hangup_cause)
-                                                   );
</del><ins>+                                                   span_id,
+                                                   chan_id,
+                                                   phspan_id,
+                                                   phchan_id,
+                                                     alarmflag ? &quot;alarmed&quot; : &quot;ok&quot;,
+                                                   ftdm_signaling_status2str(sigstatus),
+                                                   chan_type,
+                                                   state,
+                                                   last_state,
+                                                   txgain,
+                                                   rxgain,
+                                                   caller_data-&gt;cid_date,
+                                                   caller_data-&gt;cid_name,
+                                                   caller_data-&gt;cid_num.digits,
+                                                   caller_data-&gt;ani.digits,
+                                                   caller_data-&gt;aniII,
+                                                   caller_data-&gt;dnis.digits,
+                                                   caller_data-&gt;rdnis.digits,
+                                                   switch_channel_cause2str(caller_data-&gt;hangup_cause));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream)
</span><span class="cx"> {
</span><ins>+        uint32_t span_id;
+        uint32_t phspan_id, phchan_id;
+        const char *chan_type;
+        const char *state;
+        const char *last_state;
+        float txgain, rxgain;
+        ftdm_caller_data_t *caller_data;
+        ftdm_channel_t *ftdmchan;
+        ftdm_alarm_flag_t alarmflag;
</ins><span class="cx">         ftdm_signaling_status_t sigstatus = FTDM_SIG_STATE_DOWN;
</span><del>-        if (chan_id &gt; span-&gt;chan_count) {
</del><ins>+
+        if (chan_id &gt; ftdm_span_get_chan_count(span)) {
</ins><span class="cx">                 return;
</span><span class="cx">         }
</span><del>-        ftdm_channel_get_sig_status(span-&gt;channels[chan_id], &amp;sigstatus);
</del><ins>+
+        ftdmchan = ftdm_span_get_channel(span, chan_id);
+        span_id = ftdm_span_get_id(span);
+
+        phspan_id = ftdm_channel_get_ph_span_id(ftdmchan);
+        phchan_id = ftdm_channel_get_ph_id(ftdmchan);
+        chan_type = ftdm_chan_type2str(ftdm_channel_get_type(ftdmchan));
+        state = ftdm_channel_get_state_str(ftdmchan);
+        last_state = ftdm_channel_get_last_state_str(ftdmchan);
+        ftdm_channel_command(ftdmchan, FTDM_COMMAND_GET_RX_GAIN, &amp;rxgain);
+        ftdm_channel_command(ftdmchan, FTDM_COMMAND_GET_TX_GAIN, &amp;txgain);
+        caller_data = ftdm_channel_get_caller_data(ftdmchan);
+        ftdm_channel_get_sig_status(ftdmchan, &amp;sigstatus);
+        ftdm_channel_get_alarms(ftdmchan, &amp;alarmflag);
+
+
</ins><span class="cx">         stream-&gt;write_function(stream,
</span><span class="cx">                                                    &quot; &lt;channel&gt;\n&quot;
</span><span class="cx">                                                    &quot;  &lt;span-id&gt;%u&lt;/span-id&gt;\n&quot;
</span><span class="lines">@@ -3069,26 +3189,25 @@
</span><span class="cx">                                                    &quot;  &lt;rdnis&gt;%s&lt;/rdnis&gt;\n&quot;
</span><span class="cx">                                                    &quot;  &lt;cause&gt;%s&lt;/cause&gt;\n&quot;
</span><span class="cx">                                                    &quot; &lt;/channel&gt;\n&quot;,
</span><del>-                                                   span-&gt;channels[chan_id]-&gt;span_id,
-                                                   span-&gt;channels[chan_id]-&gt;chan_id,
-                                                   span-&gt;channels[chan_id]-&gt;physical_span_id,
-                                                   span-&gt;channels[chan_id]-&gt;physical_chan_id,
-                                                   (span-&gt;channels[chan_id]-&gt;alarm_flags) ? &quot;DOWN&quot; : &quot;UP&quot;,
-                                             ftdm_signaling_status2str(sigstatus),
-                                                   ftdm_chan_type2str(span-&gt;channels[chan_id]-&gt;type),
-                                                   ftdm_channel_state2str(span-&gt;channels[chan_id]-&gt;state),
-                                                   ftdm_channel_state2str(span-&gt;channels[chan_id]-&gt;last_state),
-                                                   span-&gt;channels[chan_id]-&gt;txgain,
-                                                   span-&gt;channels[chan_id]-&gt;rxgain,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.cid_date,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.cid_name,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.cid_num.digits,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.ani.digits,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.aniII,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.dnis.digits,
-                                                   span-&gt;channels[chan_id]-&gt;caller_data.rdnis.digits,
-                                                   switch_channel_cause2str(span-&gt;channels[chan_id]-&gt;caller_data.hangup_cause)
-                                                   );
</del><ins>+                                                   span_id,
+                                                   chan_id,
+                                                   phspan_id,
+                                                   phchan_id,
+                                                   alarmflag ? &quot;alarmed&quot; : &quot;ok&quot;,
+                                                        ftdm_signaling_status2str(sigstatus),
+                                                   chan_type,
+                                                   state,
+                                                   last_state,
+                                                   txgain,
+                                                   rxgain,
+                                                   caller_data-&gt;cid_date,
+                                                   caller_data-&gt;cid_name,
+                                                   caller_data-&gt;cid_num.digits,
+                                                   caller_data-&gt;ani.digits,
+                                                   caller_data-&gt;aniII,
+                                                   caller_data-&gt;dnis.digits,
+                                                   caller_data-&gt;rdnis.digits,
+                                                   switch_channel_cause2str(caller_data-&gt;hangup_cause));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #define FT_SYNTAX &quot;list || dump &lt;span_id&gt; [&lt;chan_id&gt;] || q931_pcap &lt;span_id&gt; on|off [pcapfilename without suffix] || gains &lt;txgain&gt; &lt;rxgain&gt; &lt;span_id&gt; [&lt;chan_id&gt;]&quot; 
</span><span class="lines">@@ -3135,14 +3254,15 @@
</span><span class="cx">                                         stream-&gt;write_function(stream, &quot;&lt;error&gt;invalid span&lt;/error&gt;\n&quot;);
</span><span class="cx">                                 } else {
</span><span class="cx">                                         if (chan_id) {
</span><del>-                                                if(chan_id &gt; span-&gt;chan_count) {
</del><ins>+                                                if(chan_id &gt; ftdm_span_get_chan_count(span)) {
</ins><span class="cx">                                                         stream-&gt;write_function(stream, &quot;&lt;error&gt;invalid channel&lt;/error&gt;\n&quot;);
</span><span class="cx">                                                 } else {
</span><span class="cx">                                                         dump_chan_xml(span, chan_id, stream);
</span><span class="cx">                                                 }
</span><span class="cx">                                         } else {
</span><span class="cx">                                                 uint32_t j;
</span><del>-                                                for (j = 1; j &lt;= span-&gt;chan_count; j++) {
</del><ins>+                                                uint32_t ccount = ftdm_span_get_chan_count(span);
+                                                for (j = 1; j &lt;= ccount; j++) {
</ins><span class="cx">                                                         dump_chan_xml(span, j, stream);
</span><span class="cx">                                                 }
</span><span class="cx">                                                 
</span><span class="lines">@@ -3154,16 +3274,16 @@
</span><span class="cx">                                         stream-&gt;write_function(stream, &quot;-ERR invalid span\n&quot;);
</span><span class="cx">                                 } else {
</span><span class="cx">                                         if (chan_id) {
</span><del>-                                                if(chan_id &gt; span-&gt;chan_count) {
</del><ins>+                                                if(chan_id &gt; ftdm_span_get_chan_count(span)) {
</ins><span class="cx">                                                         stream-&gt;write_function(stream, &quot;-ERR invalid channel\n&quot;);
</span><span class="cx">                                                 } else {
</span><span class="cx">                                                         dump_chan(span, chan_id, stream);
</span><span class="cx">                                                 }
</span><span class="cx">                                         } else {
</span><span class="cx">                                                 uint32_t j;
</span><del>-                                                
</del><ins>+                                                uint32_t ccount = ftdm_span_get_chan_count(span);        
</ins><span class="cx">                                                 stream-&gt;write_function(stream, &quot;+OK\n&quot;);
</span><del>-                                                for (j = 1; j &lt;= span-&gt;chan_count; j++) {
</del><ins>+                                                for (j = 1; j &lt;= ccount; j++) {
</ins><span class="cx">                                                         dump_chan(span, j, stream);
</span><span class="cx">                                                 }
</span><span class="cx">                                                 
</span><span class="lines">@@ -3198,10 +3318,10 @@
</span><span class="cx">                                                                                    &quot;hold_music: %s\n&quot;
</span><span class="cx">                                                                                    &quot;analog_options %s\n&quot;,
</span><span class="cx">                                                                                    j,
</span><del>-                                                                                   SPAN_CONFIG[j].span-&gt;name,
</del><ins>+                                                                                   ftdm_span_get_name(SPAN_CONFIG[j].span),
</ins><span class="cx">                                                                                    SPAN_CONFIG[j].type,
</span><span class="cx">                                                                                    ftdm_signaling_status2str(sigstatus),
</span><del>-                                                                                   SPAN_CONFIG[j].span-&gt;chan_count,
</del><ins>+                                                                                   ftdm_span_get_chan_count(SPAN_CONFIG[j].span),
</ins><span class="cx">                                                                                    SPAN_CONFIG[j].dialplan,
</span><span class="cx">                                                                                    SPAN_CONFIG[j].context,
</span><span class="cx">                                                                                    SPAN_CONFIG[j].dial_regex,
</span><span class="lines">@@ -3222,9 +3342,9 @@
</span><span class="cx">                                                                                    &quot;hold_music: %s\n&quot;
</span><span class="cx">                                                                                    &quot;analog_options %s\n&quot;,
</span><span class="cx">                                                                                    j,
</span><del>-                                                                                   SPAN_CONFIG[j].span-&gt;name,
</del><ins>+                                                                                   ftdm_span_get_name(SPAN_CONFIG[j].span),
</ins><span class="cx">                                                                                    SPAN_CONFIG[j].type,
</span><del>-                                                                                   SPAN_CONFIG[j].span-&gt;chan_count,
</del><ins>+                                                                                   ftdm_span_get_chan_count(SPAN_CONFIG[j].span),
</ins><span class="cx">                                                                                    SPAN_CONFIG[j].dialplan,
</span><span class="cx">                                                                                    SPAN_CONFIG[j].context,
</span><span class="cx">                                                                                    SPAN_CONFIG[j].dial_regex,
</span><span class="lines">@@ -3290,14 +3410,14 @@
</span><span class="cx">                 tmp_path=switch_mprintf(&quot;%s%s%s.pcap&quot;, SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR, pcapfn);
</span><span class="cx">                 
</span><span class="cx">                 if(!strcasecmp(argv[2], &quot;on&quot;)) {
</span><del>-                        if (ftdm_configure_span(&quot;isdn&quot;, span, on_clear_channel_signal, &quot;q931topcap&quot;, 1, &quot;pcapfilename&quot;, tmp_path, TAG_END) != FTDM_SUCCESS) {
</del><ins>+                        if (ftdm_configure_span(&quot;isdn&quot;, span, on_clear_channel_signal, &quot;q931topcap&quot;, 1, &quot;pcapfilename&quot;, tmp_path, FTDM_TAG_END) != FTDM_SUCCESS) {
</ins><span class="cx">                                 ftdm_log(FTDM_LOG_WARNING, &quot;Error couldn't (re-)enable Q931-To-Pcap!\n&quot;);
</span><span class="cx">                                 goto end;
</span><span class="cx">                         } else {
</span><span class="cx">                                 stream-&gt;write_function(stream, &quot;+OK\n&quot;);
</span><span class="cx">                         }
</span><span class="cx">                 } else if(!strcasecmp(argv[2], &quot;off&quot;)) {
</span><del>-                        if (ftdm_configure_span(&quot;isdn&quot;, span, on_clear_channel_signal, &quot;q931topcap&quot;, 0, TAG_END) != FTDM_SUCCESS) {
</del><ins>+                        if (ftdm_configure_span(&quot;isdn&quot;, span, on_clear_channel_signal, &quot;q931topcap&quot;, 0, FTDM_TAG_END) != FTDM_SUCCESS) {
</ins><span class="cx">                                 ftdm_log(FTDM_LOG_ERROR, &quot;Error couldn't enable Q931-To-Pcap!\n&quot;);
</span><span class="cx">                                 goto end;
</span><span class="cx">                         } else {
</span><span class="lines">@@ -3313,6 +3433,8 @@
</span><span class="cx">                 float txgain = 0.0;
</span><span class="cx">                 float rxgain = 0.0;
</span><span class="cx">                 uint32_t chan_id = 0;
</span><ins>+                uint32_t ccount = 0;
+                ftdm_channel_t *chan;
</ins><span class="cx">                 ftdm_span_t *span = NULL;
</span><span class="cx">                 if (argc &lt; 4) {
</span><span class="cx">                         stream-&gt;write_function(stream, &quot;-ERR Usage: ft gains &lt;txgain&gt; &lt;rxgain&gt; &lt;span_id&gt; [&lt;chan_id&gt;]\n&quot;);
</span><span class="lines">@@ -3325,7 +3447,7 @@
</span><span class="cx">                 }
</span><span class="cx">                 if (argc &gt; 4) {
</span><span class="cx">                         chan_id = atoi(argv[4]);
</span><del>-                        if (chan_id &gt; span-&gt;chan_count) {
</del><ins>+                        if (chan_id &gt; ftdm_span_get_chan_count(span)) {
</ins><span class="cx">                                 stream-&gt;write_function(stream, &quot;-ERR invalid chan\n&quot;);
</span><span class="cx">                                 goto end;
</span><span class="cx">                         }
</span><span class="lines">@@ -3336,13 +3458,17 @@
</span><span class="cx">                         stream-&gt;write_function(stream, &quot;-ERR invalid gains\n&quot;);
</span><span class="cx">                         goto end;
</span><span class="cx">                 }
</span><ins>+
</ins><span class="cx">                 if (chan_id) {
</span><del>-                        ftdm_channel_command(span-&gt;channels[chan_id], FTDM_COMMAND_SET_RX_GAIN, &amp;rxgain);
-                        ftdm_channel_command(span-&gt;channels[chan_id], FTDM_COMMAND_SET_TX_GAIN, &amp;txgain);
</del><ins>+                        chan = ftdm_span_get_channel(span, chan_id);
+                        ftdm_channel_command(chan, FTDM_COMMAND_SET_RX_GAIN, &amp;rxgain);
+                        ftdm_channel_command(chan, FTDM_COMMAND_SET_TX_GAIN, &amp;txgain);
</ins><span class="cx">                 } else {
</span><del>-                        for (i = 1; i &lt; span-&gt;chan_count; i++) {
-                                ftdm_channel_command(span-&gt;channels[i], FTDM_COMMAND_SET_RX_GAIN, &amp;rxgain);
-                                ftdm_channel_command(span-&gt;channels[i], FTDM_COMMAND_SET_TX_GAIN, &amp;txgain);
</del><ins>+                        ccount = ftdm_span_get_chan_count(span);
+                        for (i = 1; i &lt; ccount; i++) {
+                                chan = ftdm_span_get_channel(span, i);
+                                ftdm_channel_command(chan, FTDM_COMMAND_SET_RX_GAIN, &amp;rxgain);
+                                ftdm_channel_command(chan, FTDM_COMMAND_SET_TX_GAIN, &amp;txgain);
</ins><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="cx">                 stream-&gt;write_function(stream, &quot;+OK gains set to Rx %f and Tx %f\n&quot;, rxgain, txgain);
</span><span class="lines">@@ -3352,7 +3478,7 @@
</span><span class="cx">                 
</span><span class="cx">                 if (rply) {
</span><span class="cx">                         stream-&gt;write_function(stream, &quot;%s&quot;, rply);
</span><del>-                        ftdm_safe_free(rply);
</del><ins>+                        free(rply);
</ins><span class="cx">                 } else {
</span><span class="cx">                         stream-&gt;write_function(stream, &quot;-ERR Usage: %s\n&quot;, FT_SYNTAX);
</span><span class="cx">                 }
</span></span></pre></div>
<a id="freeswitchtrunklibsfreetdmsrcftdm_ioc"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/libs/freetdm/src/ftdm_io.c (17432 => 17433)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/freetdm/src/ftdm_io.c        2010-04-28 22:17:49 UTC (rev 17432)
+++ freeswitch/trunk/libs/freetdm/src/ftdm_io.c        2010-04-28 22:17:49 UTC (rev 17433)
</span><span class="lines">@@ -452,28 +452,38 @@
</span><span class="cx">         return status;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-FT_DECLARE(ftdm_status_t) ftdm_channel_get_alarms(ftdm_channel_t *ftdmchan)
</del><ins>+FT_DECLARE(ftdm_status_t) ftdm_channel_get_alarms(ftdm_channel_t *ftdmchan, ftdm_alarm_flag_t *alarmbits)
</ins><span class="cx"> {
</span><span class="cx">         ftdm_status_t status = FTDM_FAIL;
</span><span class="cx"> 
</span><ins>+        ftdm_assert_return(alarmbits != NULL, FTDM_FAIL, &quot;null argument\n&quot;);
+
+        alarmbits = FTDM_ALARM_NONE;
+
+        ftdm_channel_lock(ftdmchan);
+
</ins><span class="cx">         if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_CONFIGURED)) {
</span><span class="cx">                 if (ftdmchan-&gt;span-&gt;fio-&gt;get_alarms) {
</span><span class="cx">                         if ((status = ftdmchan-&gt;span-&gt;fio-&gt;get_alarms(ftdmchan)) == FTDM_SUCCESS) {
</span><span class="cx">                                 *ftdmchan-&gt;last_error = '\0';
</span><ins>+                                *alarmbits = ftdmchan-&gt;alarm_flags;
</ins><span class="cx">                                 if (ftdm_test_alarm_flag(ftdmchan, FTDM_ALARM_RED)) {
</span><span class="cx">                                         snprintf(ftdmchan-&gt;last_error + strlen(ftdmchan-&gt;last_error), sizeof(ftdmchan-&gt;last_error) - strlen(ftdmchan-&gt;last_error), &quot;RED/&quot;);
</span><span class="cx">                                 }
</span><span class="cx">                                 if (ftdm_test_alarm_flag(ftdmchan, FTDM_ALARM_YELLOW)) {
</span><span class="cx">                                         snprintf(ftdmchan-&gt;last_error + strlen(ftdmchan-&gt;last_error), sizeof(ftdmchan-&gt;last_error) - strlen(ftdmchan-&gt;last_error), &quot;YELLOW/&quot;);
</span><span class="cx">                                 }
</span><ins>+                                if (ftdm_test_alarm_flag(ftdmchan, FTDM_ALARM_RAI)) {
+                                        snprintf(ftdmchan-&gt;last_error + strlen(ftdmchan-&gt;last_error), sizeof(ftdmchan-&gt;last_error) - strlen(ftdmchan-&gt;last_error), &quot;RAI/&quot;);
+                                }
</ins><span class="cx">                                 if (ftdm_test_alarm_flag(ftdmchan, FTDM_ALARM_BLUE)) {
</span><span class="cx">                                         snprintf(ftdmchan-&gt;last_error + strlen(ftdmchan-&gt;last_error), sizeof(ftdmchan-&gt;last_error) - strlen(ftdmchan-&gt;last_error), &quot;BLUE/&quot;);
</span><span class="cx">                                 }
</span><del>-                                if (ftdm_test_alarm_flag(ftdmchan, FTDM_ALARM_LOOPBACK)) {
-                                        snprintf(ftdmchan-&gt;last_error + strlen(ftdmchan-&gt;last_error), sizeof(ftdmchan-&gt;last_error) - strlen(ftdmchan-&gt;last_error), &quot;LOOP/&quot;);
</del><ins>+                                if (ftdm_test_alarm_flag(ftdmchan, FTDM_ALARM_AIS)) {
+                                        snprintf(ftdmchan-&gt;last_error + strlen(ftdmchan-&gt;last_error), sizeof(ftdmchan-&gt;last_error) - strlen(ftdmchan-&gt;last_error), &quot;AIS/&quot;);
</ins><span class="cx">                                 }
</span><del>-                                if (ftdm_test_alarm_flag(ftdmchan, FTDM_ALARM_RECOVER)) {
-                                        snprintf(ftdmchan-&gt;last_error + strlen(ftdmchan-&gt;last_error), sizeof(ftdmchan-&gt;last_error) - strlen(ftdmchan-&gt;last_error), &quot;RECOVER/&quot;);
</del><ins>+                                if (ftdm_test_alarm_flag(ftdmchan, FTDM_ALARM_GENERAL)) {
+                                        snprintf(ftdmchan-&gt;last_error + strlen(ftdmchan-&gt;last_error), sizeof(ftdmchan-&gt;last_error) - strlen(ftdmchan-&gt;last_error), &quot;GENERAL&quot;);
</ins><span class="cx">                                 }
</span><span class="cx">                                 *(ftdmchan-&gt;last_error + strlen(ftdmchan-&gt;last_error) - 1) = '\0';
</span><span class="cx"> 
</span><span class="lines">@@ -482,7 +492,9 @@
</span><span class="cx">                         status = FTDM_NOTIMPL;
</span><span class="cx">                 }
</span><span class="cx">         }
</span><del>-        
</del><ins>+
+        ftdm_channel_unlock(ftdmchan);        
+
</ins><span class="cx">         return status;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -990,6 +1002,58 @@
</span><span class="cx">         }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+FT_DECLARE(uint32_t) ftdm_channel_get_token_count(const ftdm_channel_t *ftdmchan)
+{
+        uint32_t count;
+        ftdm_mutex_lock(ftdmchan-&gt;mutex);
+        count = ftdmchan-&gt;token_count;
+        ftdm_mutex_unlock(ftdmchan-&gt;mutex);
+        return count;
+}
+
+FT_DECLARE(uint32_t) ftdm_channel_get_io_interval(const ftdm_channel_t *ftdmchan)
+{
+        uint32_t count;
+        ftdm_mutex_lock(ftdmchan-&gt;mutex);
+        count = ftdmchan-&gt;effective_interval;
+        ftdm_mutex_unlock(ftdmchan-&gt;mutex);
+        return count;
+}
+
+FT_DECLARE(uint32_t) ftdm_channel_get_io_packet_len(const ftdm_channel_t *ftdmchan)
+{
+        uint32_t count;
+        ftdm_mutex_lock(ftdmchan-&gt;mutex);
+        count = ftdmchan-&gt;packet_len;
+        ftdm_mutex_unlock(ftdmchan-&gt;mutex);
+        return count;
+}
+
+FT_DECLARE(uint32_t) ftdm_channel_get_type(const ftdm_channel_t *ftdmchan)
+{
+        return ftdmchan-&gt;type;
+}
+
+FT_DECLARE(ftdm_codec_t) ftdm_channel_get_codec(const ftdm_channel_t *ftdmchan)
+{
+        return ftdmchan-&gt;effective_codec;
+}
+
+FT_DECLARE(const char *) ftdm_channel_get_token(const ftdm_channel_t *ftdmchan, uint32_t tokenid)
+{
+        const char *token = NULL;
+        ftdm_mutex_lock(ftdmchan-&gt;mutex);
+
+        if (ftdmchan-&gt;token_count &lt;= tokenid) {
+                ftdm_mutex_unlock(ftdmchan-&gt;mutex);
+                return NULL;
+        }
+
+        token = ftdmchan-&gt;tokens[tokenid];
+        ftdm_mutex_unlock(ftdmchan-&gt;mutex);
+        return token;
+}
+
</ins><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_add_token(ftdm_channel_t *ftdmchan, char *token, int end)
</span><span class="cx"> {
</span><span class="cx">         ftdm_status_t status = FTDM_FAIL;
</span><span class="lines">@@ -1212,6 +1276,10 @@
</span><span class="cx">         return ok ? FTDM_SUCCESS : FTDM_FAIL;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+FT_DECLARE(uint32_t) ftdm_group_get_id(const ftdm_group_t *group)
+{
+        return group-&gt;group_id;
+}
</ins><span class="cx"> 
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_group_channel_use_count(ftdm_group_t *group, uint32_t *count)
</span><span class="cx"> {
</span><span class="lines">@@ -1607,6 +1675,16 @@
</span><span class="cx">         return ftdmchan-&gt;span_id;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+FT_DECLARE(ftdm_span_t *) ftdm_channel_get_span(const ftdm_channel_t *ftdmchan)
+{
+        return ftdmchan-&gt;span;
+}
+
+FT_DECLARE(const char *) ftdm_channel_get_span_name(const ftdm_channel_t *ftdmchan)
+{
+        return ftdmchan-&gt;span-&gt;name;
+}
+
</ins><span class="cx"> FT_DECLARE(uint32_t) ftdm_span_get_id(const ftdm_span_t *span)
</span><span class="cx"> {
</span><span class="cx">         return span-&gt;span_id;
</span><span class="lines">@@ -1617,17 +1695,126 @@
</span><span class="cx">         return span-&gt;name;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-FT_DECLARE(ftdm_bool_t) ftdm_channel_call_active(const ftdm_channel_t *ftdmchan)
</del><ins>+FT_DECLARE(const char *) ftdm_channel_get_name(const ftdm_channel_t *ftdmchan)
</ins><span class="cx"> {
</span><del>-        return (ftdmchan-&gt;state == FTDM_CHANNEL_STATE_UP) ? FTDM_TRUE : FTDM_FALSE;
</del><ins>+        return ftdmchan-&gt;chan_name;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+FT_DECLARE(const char *) ftdm_channel_get_number(const ftdm_channel_t *ftdmchan)
+{
+        return ftdmchan-&gt;chan_number;
+}
+
+FT_DECLARE(ftdm_bool_t) ftdm_channel_call_check_hold(const ftdm_channel_t *ftdmchan)
+{
+        ftdm_bool_t condition;
+        ftdm_channel_lock(ftdmchan);
+        condition = ftdm_test_flag(ftdmchan, FTDM_CHANNEL_HOLD);
+        ftdm_channel_unlock(ftdmchan);
+        return condition;
+}
+
+FT_DECLARE(ftdm_bool_t) ftdm_channel_call_check_answered(const ftdm_channel_t *ftdmchan)
+{
+        ftdm_bool_t condition = FTDM_FALSE;
+
+        ftdm_channel_lock(ftdmchan);
+        condition = (ftdmchan-&gt;state == FTDM_CHANNEL_STATE_UP) ? FTDM_TRUE : FTDM_FALSE;
+        ftdm_channel_unlock(ftdmchan);
+
+        return condition;
+}
+
+FT_DECLARE(ftdm_bool_t) ftdm_channel_call_check_busy(const ftdm_channel_t *ftdmchan)
+{
+        ftdm_bool_t condition = FTDM_FALSE;
+
+        ftdm_channel_lock(ftdmchan);
+        condition = (ftdmchan-&gt;state == FTDM_CHANNEL_STATE_BUSY) ? FTDM_TRUE : FTDM_FALSE;
+        ftdm_channel_unlock(ftdmchan);
+
+        return condition;
+}
+
+FT_DECLARE(ftdm_bool_t) ftdm_channel_call_check_hangup(const ftdm_channel_t *ftdmchan)
+{
+        ftdm_bool_t condition = FTDM_FALSE;
+
+        ftdm_channel_lock(ftdmchan);
+        condition = (ftdmchan-&gt;state == FTDM_CHANNEL_STATE_HANGUP || ftdmchan-&gt;state == FTDM_CHANNEL_STATE_TERMINATING) 
+                ? FTDM_TRUE : FTDM_FALSE;
+        ftdm_channel_unlock(ftdmchan);
+
+        return condition;
+}
+
+FT_DECLARE(ftdm_bool_t) ftdm_channel_call_check_done(const ftdm_channel_t *ftdmchan)
+{
+        ftdm_bool_t condition = FTDM_FALSE;
+
+        ftdm_channel_lock(ftdmchan);
+        condition = (ftdmchan-&gt;state == FTDM_CHANNEL_STATE_DOWN) ? FTDM_TRUE : FTDM_FALSE;
+        ftdm_channel_unlock(ftdmchan);
+
+        return condition;
+}
+
+FT_DECLARE(ftdm_status_t) ftdm_channel_call_hold(ftdm_channel_t *ftdmchan)
+{
+        ftdm_channel_lock(ftdmchan);
+        ftdm_set_flag(ftdmchan, FTDM_CHANNEL_HOLD);
+        ftdm_set_state_wait(ftdmchan, FTDM_CHANNEL_STATE_DIALTONE);
+        ftdm_channel_unlock(ftdmchan);
+        return FTDM_SUCCESS;
+}
+
+FT_DECLARE(ftdm_status_t) ftdm_channel_call_unhold(ftdm_channel_t *ftdmchan)
+{
+        ftdm_channel_lock(ftdmchan);
+        if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_HOLD)) {
+                ftdm_set_state_wait(ftdmchan, FTDM_CHANNEL_STATE_UP);
+        }
+        ftdm_channel_unlock(ftdmchan);
+        return FTDM_SUCCESS;
+}
+
</ins><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_call_answer(ftdm_channel_t *ftdmchan)
</span><span class="cx"> {
</span><del>-        ftdm_set_state_locked_wait(ftdmchan, FTDM_CHANNEL_STATE_UP);
</del><ins>+        ftdm_channel_lock(ftdmchan);
+
+        if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_ANSWERED)) {
+                return FTDM_SUCCESS;
+        }
+
+        if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
+                ftdm_set_flag(ftdmchan, FTDM_CHANNEL_ANSWERED);
+                ftdm_set_flag(ftdmchan, FTDM_CHANNEL_PROGRESS);
+                ftdm_set_flag(ftdmchan, FTDM_CHANNEL_MEDIA);
+                ftdm_channel_unlock(ftdmchan);
+                return FTDM_SUCCESS;
+        }
+
+        if (ftdmchan-&gt;state &lt; FTDM_CHANNEL_STATE_PROGRESS) {
+                ftdm_set_state_wait(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
+        }
+
+        if (ftdmchan-&gt;state &lt; FTDM_CHANNEL_STATE_PROGRESS_MEDIA) {
+                ftdm_set_state_wait(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
+        }
+
+        ftdm_set_state_wait(ftdmchan, FTDM_CHANNEL_STATE_UP);
+
+        ftdm_channel_unlock(ftdmchan);
</ins><span class="cx">         return FTDM_SUCCESS;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+FT_DECLARE(ftdm_status_t) ftdm_channel_call_hangup_with_cause(ftdm_channel_t *ftdmchan, ftdm_call_cause_t cause)
+{
+        ftdmchan-&gt;caller_data.hangup_cause = cause;
+        ftdm_set_state_locked_wait(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
+        return FTDM_SUCCESS;
+}
+
</ins><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_call_hangup(ftdm_channel_t *ftdmchan)
</span><span class="cx"> {
</span><span class="cx">         ftdm_set_state_locked_wait(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
</span><span class="lines">@@ -1639,15 +1826,101 @@
</span><span class="cx">         return ftdmchan-&gt;last_error;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+FT_DECLARE(const char *) ftdm_span_get_last_error(const ftdm_span_t *span)
+{
+        return span-&gt;last_error;
+}
+
+FT_DECLARE(ftdm_caller_data_t *) ftdm_channel_get_caller_data(ftdm_channel_t *ftdmchan)
+{
+        return &amp;ftdmchan-&gt;caller_data;
+}
+
+FT_DECLARE(const char *) ftdm_channel_get_state_str(const ftdm_channel_t *ftdmchan)
+{
+        const char *state;
+        ftdm_channel_lock(ftdmchan);
+        state = ftdm_channel_state2str(ftdmchan-&gt;state);
+        ftdm_channel_unlock(ftdmchan);
+        return state;
+}
+
+FT_DECLARE(const char *) ftdm_channel_get_last_state_str(const ftdm_channel_t *ftdmchan)
+{
+        const char *state;
+        ftdm_channel_lock(ftdmchan);
+        state = ftdm_channel_state2str(ftdmchan-&gt;last_state);
+        ftdm_channel_unlock(ftdmchan);
+        return state;
+}
+
+FT_DECLARE(ftdm_channel_t *) ftdm_span_get_channel(const ftdm_span_t *span, uint32_t chanid)
+{
+        ftdm_channel_t *chan;
+        ftdm_mutex_lock(span-&gt;mutex);
+        if (chanid == 0 || chanid &gt; span-&gt;chan_count) {
+                ftdm_mutex_unlock(span-&gt;mutex);
+                return NULL;
+        }
+        chan = span-&gt;channels[chanid];
+        ftdm_mutex_unlock(span-&gt;mutex);
+        return chan;
+}
+
+FT_DECLARE(uint32_t) ftdm_span_get_chan_count(const ftdm_span_t *span)
+{
+        uint32_t count;
+        ftdm_mutex_lock(span-&gt;mutex);
+        count = span-&gt;chan_count;
+        ftdm_mutex_unlock(span-&gt;mutex);
+        return count;
+}
+
+FT_DECLARE(uint32_t) ftdm_channel_get_ph_span_id(const ftdm_channel_t *ftdmchan)
+{
+        uint32_t id;
+        ftdm_channel_lock(ftdmchan);
+        id = ftdmchan-&gt;physical_span_id;
+        ftdm_channel_unlock(ftdmchan);
+        return id;
+}
+
</ins><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_call_indicate(ftdm_channel_t *ftdmchan, ftdm_channel_indication_t indication)
</span><span class="cx"> {
</span><span class="cx">         switch (indication) {
</span><ins>+
+        /* FIXME: ring and busy cannot be used with all signaling stacks 
+         * (particularly isdn stacks I think, we should emulate or just move to hangup with busy cause) */
</ins><span class="cx">         case FTDM_CHANNEL_INDICATE_RING:
</span><span class="cx">                 ftdm_set_state_locked_wait(ftdmchan, FTDM_CHANNEL_STATE_RING);
</span><ins>+                break;
+
+        case FTDM_CHANNEL_INDICATE_BUSY:
+                ftdm_set_state_locked_wait(ftdmchan, FTDM_CHANNEL_STATE_BUSY);
+                break;
+
</ins><span class="cx">         case FTDM_CHANNEL_INDICATE_PROGRESS:
</span><del>-                ftdm_set_state_locked_wait(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
</del><ins>+                if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
+                        ftdm_set_flag_locked(ftdmchan, FTDM_CHANNEL_PROGRESS);
+                } else {
+                        ftdm_set_state_locked_wait(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
+                }
+                break;
+
+        case FTDM_CHANNEL_INDICATE_PROGRESS_MEDIA:
+                if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
+                        ftdm_set_flag_locked(ftdmchan, FTDM_CHANNEL_PROGRESS);
+                        ftdm_set_flag_locked(ftdmchan, FTDM_CHANNEL_MEDIA);
+                } else {
+                        if (ftdmchan-&gt;state &lt; FTDM_CHANNEL_STATE_PROGRESS) {
+                                ftdm_set_state_locked_wait(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
+                        }
+                        ftdm_set_state_locked_wait(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
+                }
+                break;
+
</ins><span class="cx">         default:
</span><del>-                ftdm_log(FTDM_LOG_DEBUG, &quot;Do not know how to indicate %d\n&quot;, indication);
</del><ins>+                ftdm_log(FTDM_LOG_WARNING, &quot;Do not know how to indicate %d\n&quot;, indication);
</ins><span class="cx">                 return FTDM_FAIL;
</span><span class="cx">         }
</span><span class="cx">         return FTDM_SUCCESS;
</span><span class="lines">@@ -3762,17 +4035,41 @@
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t *sigmsg)
</span><span class="cx"> {
</span><span class="cx">         ftdm_status_t status = FTDM_FAIL;
</span><ins>+
</ins><span class="cx">         if (sigmsg-&gt;channel) {
</span><span class="cx">                 ftdm_mutex_lock(sigmsg-&gt;channel-&gt;mutex);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (sigmsg-&gt;event_id == FTDM_SIGEVENT_SIGSTATUS_CHANGED) {
</del><ins>+        /* some core things to do on special events */
+        switch (sigmsg-&gt;event_id) {
+
+        case FTDM_SIGEVENT_SIGSTATUS_CHANGED:
</ins><span class="cx">                 if (*((ftdm_signaling_status_t*)(sigmsg-&gt;raw_data)) == FTDM_SIG_STATE_UP) {
</span><span class="cx">                         ftdm_set_flag(sigmsg-&gt;channel, FTDM_CHANNEL_SIG_UP);
</span><span class="cx">                 } else {
</span><span class="cx">                         ftdm_clear_flag(sigmsg-&gt;channel, FTDM_CHANNEL_SIG_UP);
</span><span class="cx">                 }
</span><ins>+                break;
+
+        case FTDM_SIGEVENT_START:
+                sigmsg-&gt;raw_data = &amp;sigmsg-&gt;channel-&gt;caller_data;
+                /* when cleaning up the public API I added this because mod_freetdm.c on_fxs_signal was
+                 * doing it during SIGEVENT_START, but now that flags are private they can't, wonder if
+                 * is needed at all?
+                 * */
+                ftdm_clear_flag(sigmsg-&gt;channel, FTDM_CHANNEL_HOLD);
+                break;
+
+        case FTDM_SIGEVENT_STOP:
+                sigmsg-&gt;raw_data = &amp;sigmsg-&gt;channel-&gt;caller_data;
+                break;
+
+        default:
+                break;        
+
</ins><span class="cx">         }
</span><ins>+
+        /* call the user callback only if set */
</ins><span class="cx">         if (span-&gt;signal_cb) {
</span><span class="cx">                 status = span-&gt;signal_cb(sigmsg);
</span><span class="cx">         }
</span><span class="lines">@@ -3780,6 +4077,7 @@
</span><span class="cx">         if (sigmsg-&gt;channel) {
</span><span class="cx">                 ftdm_mutex_unlock(sigmsg-&gt;channel-&gt;mutex);
</span><span class="cx">         }
</span><ins>+
</ins><span class="cx">         return status;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="freeswitchtrunklibsfreetdmsrcincludefreetdmh"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/libs/freetdm/src/include/freetdm.h (17432 => 17433)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/freetdm/src/include/freetdm.h        2010-04-28 22:17:49 UTC (rev 17432)
+++ freeswitch/trunk/libs/freetdm/src/include/freetdm.h        2010-04-28 22:17:49 UTC (rev 17433)
</span><span class="lines">@@ -42,6 +42,15 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ftdm_declare.h&quot;
</span><span class="cx"> 
</span><ins>+#define FTDM_MAX_CHANNELS_PHYSICAL_SPAN 32
+#define FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN 32
+#define FTDM_MAX_CHANNELS_SPAN FTDM_MAX_CHANNELS_PHYSICAL_SPAN * FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN
+#define FTDM_MAX_SPANS_INTERFACE 128
+
+#define FTDM_MAX_CHANNELS_GROUP 1024
+#define FTDM_MAX_GROUPS_INTERFACE FTDM_MAX_SPANS_INTERFACE
+
+
</ins><span class="cx"> typedef enum {
</span><span class="cx">         FTDM_SUCCESS,
</span><span class="cx">         FTDM_FAIL,
</span><span class="lines">@@ -64,6 +73,70 @@
</span><span class="cx"> #define FTDM_MAX_NUMBER_STR_SZ 20
</span><span class="cx"> 
</span><span class="cx"> typedef enum {
</span><ins>+        FTDM_CAUSE_NONE = 0,
+        FTDM_CAUSE_UNALLOCATED = 1,
+        FTDM_CAUSE_NO_ROUTE_TRANSIT_NET = 2,
+        FTDM_CAUSE_NO_ROUTE_DESTINATION = 3,
+        FTDM_CAUSE_CHANNEL_UNACCEPTABLE = 6,
+        FTDM_CAUSE_CALL_AWARDED_DELIVERED = 7,
+        FTDM_CAUSE_NORMAL_CLEARING = 16,
+        FTDM_CAUSE_USER_BUSY = 17,
+        FTDM_CAUSE_NO_USER_RESPONSE = 18,
+        FTDM_CAUSE_NO_ANSWER = 19,
+        FTDM_CAUSE_SUBSCRIBER_ABSENT = 20,
+        FTDM_CAUSE_CALL_REJECTED = 21,
+        FTDM_CAUSE_NUMBER_CHANGED = 22,
+        FTDM_CAUSE_REDIRECTION_TO_NEW_DESTINATION = 23,
+        FTDM_CAUSE_EXCHANGE_ROUTING_ERROR = 25,
+        FTDM_CAUSE_DESTINATION_OUT_OF_ORDER = 27,
+        FTDM_CAUSE_INVALID_NUMBER_FORMAT = 28,
+        FTDM_CAUSE_FACILITY_REJECTED = 29,
+        FTDM_CAUSE_RESPONSE_TO_STATUS_ENQUIRY = 30,
+        FTDM_CAUSE_NORMAL_UNSPECIFIED = 31,
+        FTDM_CAUSE_NORMAL_CIRCUIT_CONGESTION = 34,
+        FTDM_CAUSE_NETWORK_OUT_OF_ORDER = 38,
+        FTDM_CAUSE_NORMAL_TEMPORARY_FAILURE = 41,
+        FTDM_CAUSE_SWITCH_CONGESTION = 42,
+        FTDM_CAUSE_ACCESS_INFO_DISCARDED = 43,
+        FTDM_CAUSE_REQUESTED_CHAN_UNAVAIL = 44,
+        FTDM_CAUSE_PRE_EMPTED = 45,
+        FTDM_CAUSE_FACILITY_NOT_SUBSCRIBED = 50,
+        FTDM_CAUSE_OUTGOING_CALL_BARRED = 52,
+        FTDM_CAUSE_INCOMING_CALL_BARRED = 54,
+        FTDM_CAUSE_BEARERCAPABILITY_NOTAUTH = 57,
+        FTDM_CAUSE_BEARERCAPABILITY_NOTAVAIL = 58,
+        FTDM_CAUSE_SERVICE_UNAVAILABLE = 63,
+        FTDM_CAUSE_BEARERCAPABILITY_NOTIMPL = 65,
+        FTDM_CAUSE_CHAN_NOT_IMPLEMENTED = 66,
+        FTDM_CAUSE_FACILITY_NOT_IMPLEMENTED = 69,
+        FTDM_CAUSE_SERVICE_NOT_IMPLEMENTED = 79,
+        FTDM_CAUSE_INVALID_CALL_REFERENCE = 81,
+        FTDM_CAUSE_INCOMPATIBLE_DESTINATION = 88,
+        FTDM_CAUSE_INVALID_MSG_UNSPECIFIED = 95,
+        FTDM_CAUSE_MANDATORY_IE_MISSING = 96,
+        FTDM_CAUSE_MESSAGE_TYPE_NONEXIST = 97,
+        FTDM_CAUSE_WRONG_MESSAGE = 98,
+        FTDM_CAUSE_IE_NONEXIST = 99,
+        FTDM_CAUSE_INVALID_IE_CONTENTS = 100,
+        FTDM_CAUSE_WRONG_CALL_STATE = 101,
+        FTDM_CAUSE_RECOVERY_ON_TIMER_EXPIRE = 102,
+        FTDM_CAUSE_MANDATORY_IE_LENGTH_ERROR = 103,
+        FTDM_CAUSE_PROTOCOL_ERROR = 111,
+        FTDM_CAUSE_INTERWORKING = 127,
+        FTDM_CAUSE_SUCCESS = 142,
+        FTDM_CAUSE_ORIGINATOR_CANCEL = 487,
+        FTDM_CAUSE_CRASH = 500,
+        FTDM_CAUSE_SYSTEM_SHUTDOWN = 501,
+        FTDM_CAUSE_LOSE_RACE = 502,
+        FTDM_CAUSE_MANAGER_REQUEST = 503,
+        FTDM_CAUSE_BLIND_TRANSFER = 600,
+        FTDM_CAUSE_ATTENDED_TRANSFER = 601,
+        FTDM_CAUSE_ALLOTTED_TIMEOUT = 602,
+        FTDM_CAUSE_USER_CHALLENGE = 603,
+        FTDM_CAUSE_MEDIA_TIMEOUT = 604
+} ftdm_call_cause_t;
+
+typedef enum {
</ins><span class="cx">         FTDM_TOP_DOWN,
</span><span class="cx">         FTDM_BOTTOM_UP
</span><span class="cx"> } ftdm_direction_t;
</span><span class="lines">@@ -181,6 +254,10 @@
</span><span class="cx"> } ftdm_caller_data_t;
</span><span class="cx"> 
</span><span class="cx"> typedef enum {
</span><ins>+        FTDM_TONE_DTMF = (1 &lt;&lt; 0)
+} ftdm_tone_type_t;
+
+typedef enum {
</ins><span class="cx">         FTDM_SIGEVENT_START,
</span><span class="cx">         FTDM_SIGEVENT_STOP,
</span><span class="cx">         FTDM_SIGEVENT_TRANSFER,
</span><span class="lines">@@ -427,6 +504,7 @@
</span><span class="cx">         FTDM_CHANNEL_INDICATE_RING,
</span><span class="cx">         FTDM_CHANNEL_INDICATE_PROCEED,
</span><span class="cx">         FTDM_CHANNEL_INDICATE_PROGRESS,
</span><ins>+        FTDM_CHANNEL_INDICATE_PROGRESS_MEDIA,
</ins><span class="cx">         FTDM_CHANNEL_INDICATE_BUSY,
</span><span class="cx"> } ftdm_channel_indication_t;
</span><span class="cx"> 
</span><span class="lines">@@ -435,6 +513,16 @@
</span><span class="cx">         FTDM_TRUE
</span><span class="cx"> } ftdm_bool_t;
</span><span class="cx"> 
</span><ins>+typedef enum {
+        FTDM_ALARM_NONE    = 0,
+        FTDM_ALARM_RED     = (1 &lt;&lt; 1),
+        FTDM_ALARM_YELLOW  = (1 &lt;&lt; 2),
+        FTDM_ALARM_RAI     = (1 &lt;&lt; 3),
+        FTDM_ALARM_BLUE    = (1 &lt;&lt; 4),
+        FTDM_ALARM_AIS     = (1 &lt;&lt; 5),
+        FTDM_ALARM_GENERAL = (1 &lt;&lt; 30)
+} ftdm_alarm_flag_t;
+
</ins><span class="cx"> /*! \brief Override the default queue handler */
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_global_set_queue_handler(ftdm_queue_handler_t *handler);
</span><span class="cx"> 
</span><span class="lines">@@ -442,29 +530,45 @@
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_call_place(ftdm_channel_t *ftdmchan);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_call_indicate(ftdm_channel_t *ftdmchan, ftdm_channel_indication_t indication);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_call_hangup(ftdm_channel_t *ftdmchan);
</span><del>-FT_DECLARE(ftdm_bool_t) ftdm_channel_call_active(const ftdm_channel_t *ftdmchan);
</del><ins>+FT_DECLARE(ftdm_status_t) ftdm_channel_call_hangup_with_cause(ftdm_channel_t *ftdmchan, ftdm_call_cause_t);
+FT_DECLARE(ftdm_status_t) ftdm_channel_call_hold(ftdm_channel_t *ftdmchan);
+FT_DECLARE(ftdm_status_t) ftdm_channel_call_unhold(ftdm_channel_t *ftdmchan);
+FT_DECLARE(ftdm_bool_t) ftdm_channel_call_check_answered(const ftdm_channel_t *ftdmchan);
+FT_DECLARE(ftdm_bool_t) ftdm_channel_call_check_busy(const ftdm_channel_t *ftdmchan);
+FT_DECLARE(ftdm_bool_t) ftdm_channel_call_check_hangup(const ftdm_channel_t *ftdmchan);
+FT_DECLARE(ftdm_bool_t) ftdm_channel_call_check_done(const ftdm_channel_t *ftdmchan);
+FT_DECLARE(ftdm_bool_t) ftdm_channel_call_check_hold(const ftdm_channel_t *ftdmchan);
</ins><span class="cx"> 
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_set_sig_status(ftdm_channel_t *ftdmchan, ftdm_signaling_status_t status);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_get_sig_status(ftdm_channel_t *ftdmchan, ftdm_signaling_status_t *status);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_span_set_sig_status(ftdm_span_t *span, ftdm_signaling_status_t status);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_span_get_sig_status(ftdm_span_t *span, ftdm_signaling_status_t *status);
</span><span class="cx"> 
</span><del>-FT_DECLARE(void) ftdm_channel_rotate_tokens(ftdm_channel_t *ftdmchan);
</del><span class="cx"> FT_DECLARE(void) ftdm_channel_clear_detected_tones(ftdm_channel_t *ftdmchan);
</span><span class="cx"> FT_DECLARE(void) ftdm_channel_clear_needed_tones(ftdm_channel_t *ftdmchan);
</span><span class="cx"> 
</span><del>-FT_DECLARE(const char *) ftdm_channel_get_last_error(const ftdm_channel_t *ftdmchan);
-FT_DECLARE(ftdm_status_t) ftdm_channel_get_alarms(ftdm_channel_t *ftdmchan);
</del><ins>+FT_DECLARE(void) ftdm_channel_rotate_tokens(ftdm_channel_t *ftdmchan);
</ins><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_clear_token(ftdm_channel_t *ftdmchan, const char *token);
</span><span class="cx"> FT_DECLARE(void) ftdm_channel_replace_token(ftdm_channel_t *ftdmchan, const char *old_token, const char *new_token);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_add_token(ftdm_channel_t *ftdmchan, char *token, int end);
</span><ins>+FT_DECLARE(const char *) ftdm_channel_get_token(const ftdm_channel_t *ftdmchan, uint32_t tokenid);
+FT_DECLARE(uint32_t) ftdm_channel_get_token_count(const ftdm_channel_t *ftdmchan);
</ins><span class="cx"> 
</span><ins>+FT_DECLARE(uint32_t) ftdm_channel_get_io_interval(const ftdm_channel_t *ftdmchan);
+FT_DECLARE(uint32_t) ftdm_channel_get_io_packet_len(const ftdm_channel_t *ftdmchan);
+FT_DECLARE(ftdm_codec_t) ftdm_channel_get_codec(const ftdm_channel_t *ftdmchan);
+
+FT_DECLARE(const char *) ftdm_channel_get_last_error(const ftdm_channel_t *ftdmchan);
+FT_DECLARE(ftdm_status_t) ftdm_channel_get_alarms(ftdm_channel_t *ftdmchan, ftdm_alarm_flag_t *alarmbits);
+FT_DECLARE(ftdm_chan_type_t) ftdm_channel_get_type(const ftdm_channel_t *ftdmchan);
+
</ins><span class="cx"> FT_DECLARE(ftdm_size_t) ftdm_channel_dequeue_dtmf(ftdm_channel_t *ftdmchan, char *dtmf, ftdm_size_t len);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_queue_dtmf(ftdm_channel_t *ftdmchan, const char *dtmf);
</span><span class="cx"> FT_DECLARE(void) ftdm_channel_flush_dtmf(ftdm_channel_t *ftdmchan);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_span_poll_event(ftdm_span_t *span, uint32_t ms);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_span_next_event(ftdm_span_t *span, ftdm_event_t **event);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_span_find(uint32_t id, ftdm_span_t **span);
</span><ins>+FT_DECLARE(const char *) ftdm_span_get_last_error(const ftdm_span_t *ftdmchan);
</ins><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_span_create(ftdm_io_interface_t *fio, ftdm_span_t **span, const char *name);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_span_close_all(void);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_span_add_channel(ftdm_span_t *span, ftdm_socket_t sockfd, ftdm_chan_type_t type, ftdm_channel_t **chan);
</span><span class="lines">@@ -479,6 +583,7 @@
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_open_chan(ftdm_channel_t *ftdmchan);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_span_channel_use_count(ftdm_span_t *span, uint32_t *count);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_group_channel_use_count(ftdm_group_t *group, uint32_t *count);
</span><ins>+FT_DECLARE(uint32_t) ftdm_group_get_id(const ftdm_group_t *group);
</ins><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_span(uint32_t span_id, ftdm_direction_t direction, ftdm_caller_data_t *caller_data, ftdm_channel_t **ftdmchan);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_group(uint32_t group_id, ftdm_direction_t direction, ftdm_caller_data_t *caller_data, ftdm_channel_t **ftdmchan);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_close(ftdm_channel_t **ftdmchan);
</span><span class="lines">@@ -489,8 +594,13 @@
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_add_var(ftdm_channel_t *ftdmchan, const char *var_name, const char *value);
</span><span class="cx"> FT_DECLARE(const char *) ftdm_channel_get_var(ftdm_channel_t *ftdmchan, const char *var_name);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_clear_vars(ftdm_channel_t *ftdmchan);
</span><ins>+FT_DECLARE(ftdm_span_t *) ftdm_channel_get_span(const ftdm_channel_t *ftdmchan);
</ins><span class="cx"> FT_DECLARE(uint32_t) ftdm_channel_get_span_id(const ftdm_channel_t *ftdmchan);
</span><ins>+FT_DECLARE(uint32_t) ftdm_channel_get_ph_span_id(const ftdm_channel_t *ftdmchan);
+FT_DECLARE(const char *) ftdm_channel_get_span_name(const ftdm_channel_t *ftdmchan);
</ins><span class="cx"> FT_DECLARE(uint32_t) ftdm_channel_get_id(const ftdm_channel_t *ftdmchan);
</span><ins>+FT_DECLARE(const char *) ftdm_channel_get_name(const ftdm_channel_t *ftdmchan);
+FT_DECLARE(const char *) ftdm_channel_get_number(const ftdm_channel_t *ftdmchan);
</ins><span class="cx"> FT_DECLARE(uint32_t) ftdm_channel_get_ph_id(const ftdm_channel_t *ftdmchan);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_global_init(void);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_global_configuration(void);
</span><span class="lines">@@ -500,7 +610,6 @@
</span><span class="cx"> FT_DECLARE(void) ftdm_global_set_logger(ftdm_logger_t logger);
</span><span class="cx"> FT_DECLARE(void) ftdm_global_set_default_logger(int level);
</span><span class="cx"> FT_DECLARE(ftdm_bool_t) ftdm_running(void);
</span><del>-FT_DECLARE(ftdm_status_t) ftdm_channel_init(ftdm_channel_t *ftdmchan);
</del><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_configure_span(const char *type, ftdm_span_t *span, fio_signal_cb_t sig_cb, ...);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_configure_span_signaling(const char *type, ftdm_span_t *span, fio_signal_cb_t sig_cb, ftdm_conf_parameter_t *parameters);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_span_start(ftdm_span_t *span);
</span><span class="lines">@@ -510,13 +619,24 @@
</span><span class="cx"> FT_DECLARE(uint32_t) ftdm_span_get_id(const ftdm_span_t *span);
</span><span class="cx"> FT_DECLARE(const char *) ftdm_span_get_name(const ftdm_span_t *span);
</span><span class="cx"> FT_DECLARE(char *) ftdm_api_execute(const char *type, const char *cmd);
</span><del>-FT_DECLARE(ftdm_status_t) ftdm_channel_set_caller_data(ftdm_channel_t *ftdmchan, ftdm_caller_data_t *caller_data);
</del><span class="cx"> FT_DECLARE(void) ftdm_cpu_monitor_disable(void);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_conf_node_create(const char *name, ftdm_conf_node_t **node, ftdm_conf_node_t *parent);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_conf_node_add_param(ftdm_conf_node_t *node, const char *param, const char *val);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_conf_node_destroy(ftdm_conf_node_t *node);
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char *str, ftdm_channel_config_t *chan_config, unsigned *configured);
</span><ins>+FT_DECLARE(ftdm_status_t) ftdm_channel_done(ftdm_channel_t *ftdmchan);
</ins><span class="cx"> 
</span><ins>+FT_DECLARE(ftdm_channel_t *) ftdm_span_get_channel(const ftdm_span_t *span, uint32_t chanid);
+FT_DECLARE(uint32_t) ftdm_span_get_chan_count(const ftdm_span_t *span);
+
+FT_DECLARE(ftdm_status_t) ftdm_channel_set_caller_data(ftdm_channel_t *ftdmchan, ftdm_caller_data_t *caller_data);
+FT_DECLARE(ftdm_caller_data_t *) ftdm_channel_get_caller_data(ftdm_channel_t *channel);
+FT_DECLARE(const char *) ftdm_channel_get_state_str(const ftdm_channel_t *channel);
+FT_DECLARE(const char *) ftdm_channel_get_last_state_str(const ftdm_channel_t *channel);
+
+/* TODO: try to get rid of this API */
+FT_DECLARE(ftdm_status_t) ftdm_channel_init(ftdm_channel_t *ftdmchan);
+
</ins><span class="cx"> #define FIO_CODEC_ARGS (void *data, ftdm_size_t max, ftdm_size_t *datalen)
</span><span class="cx"> #define FIO_CODEC_FUNCTION(name) FT_DECLARE_NONSTD(ftdm_status_t) name FIO_CODEC_ARGS
</span><span class="cx"> typedef ftdm_status_t (*fio_codec_t) FIO_CODEC_ARGS ;
</span></span></pre></div>
<a id="freeswitchtrunklibsfreetdmsrcincludeprivateftdm_coreh"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/libs/freetdm/src/include/private/ftdm_core.h (17432 => 17433)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/freetdm/src/include/private/ftdm_core.h        2010-04-28 22:17:49 UTC (rev 17432)
+++ freeswitch/trunk/libs/freetdm/src/include/private/ftdm_core.h        2010-04-28 22:17:49 UTC (rev 17433)
</span><span class="lines">@@ -120,14 +120,6 @@
</span><span class="cx"> extern &quot;C&quot; {
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#define FTDM_MAX_CHANNELS_PHYSICAL_SPAN 32
-#define FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN 32
-#define FTDM_MAX_CHANNELS_SPAN FTDM_MAX_CHANNELS_PHYSICAL_SPAN * FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN
-#define FTDM_MAX_SPANS_INTERFACE 128
-
-#define FTDM_MAX_CHANNELS_GROUP 1024
-#define FTDM_MAX_GROUPS_INTERFACE FTDM_MAX_SPANS_INTERFACE
-
</del><span class="cx"> #define GOTO_STATUS(label,st) status = st; goto label ;
</span><span class="cx"> 
</span><span class="cx"> #define ftdm_copy_string(x,y,z) strncpy(x, y, z - 1) 
</span><span class="lines">@@ -542,7 +534,6 @@
</span><span class="cx"> 
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_span_load_tones(ftdm_span_t *span, const char *mapname);
</span><span class="cx"> FT_DECLARE(ftdm_time_t) ftdm_current_time_in_ms(void);
</span><del>-FT_DECLARE(ftdm_status_t) ftdm_channel_done(ftdm_channel_t *ftdmchan);
</del><span class="cx"> 
</span><span class="cx"> FT_DECLARE(ftdm_status_t) ftdm_channel_use(ftdm_channel_t *ftdmchan);
</span><span class="cx"> 
</span><span class="lines">@@ -639,6 +630,9 @@
</span><span class="cx"> 
</span><span class="cx"> #define ftdm_array_len(array) sizeof(array)/sizeof(array[0])
</span><span class="cx"> 
</span><ins>+#define ftdm_channel_lock(chan) ftdm_mutex_lock(chan-&gt;mutex)
+#define ftdm_channel_unlock(chan) ftdm_mutex_unlock(chan-&gt;mutex)
+
</ins><span class="cx"> static __inline__ void ftdm_abort(void)
</span><span class="cx"> {
</span><span class="cx"> #ifdef __cplusplus
</span></span></pre></div>
<a id="freeswitchtrunklibsfreetdmsrcincludeprivateftdm_typesh"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/libs/freetdm/src/include/private/ftdm_types.h (17432 => 17433)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/freetdm/src/include/private/ftdm_types.h        2010-04-28 22:17:49 UTC (rev 17432)
+++ freeswitch/trunk/libs/freetdm/src/include/private/ftdm_types.h        2010-04-28 22:17:49 UTC (rev 17433)
</span><span class="lines">@@ -152,19 +152,6 @@
</span><span class="cx"> FTDM_STR2ENUM_P(ftdm_str2ftdm_oob_event, ftdm_oob_event2str, ftdm_oob_event_t)
</span><span class="cx"> 
</span><span class="cx"> typedef enum {
</span><del>-        FTDM_ALARM_NONE = 0,
-        FTDM_ALARM_RECOVER = (1 &lt;&lt; 0),
-        FTDM_ALARM_LOOPBACK = (1 &lt;&lt; 2),
-        FTDM_ALARM_YELLOW = (1 &lt;&lt; 3),
-        FTDM_ALARM_RED = (1 &lt;&lt; 4),
-        FTDM_ALARM_BLUE = (1 &lt;&lt; 5),
-        FTDM_ALARM_NOTOPEN = ( 1 &lt;&lt; 6),
-        FTDM_ALARM_AIS = ( 1 &lt;&lt; 7),
-        FTDM_ALARM_RAI = ( 1 &lt;&lt; 8),
-        FTDM_ALARM_GENERAL = ( 1 &lt;&lt; 30)
-} ftdm_alarm_flag_t;
-
-typedef enum {
</del><span class="cx">         FTDM_SIGTYPE_NONE,
</span><span class="cx">         FTDM_SIGTYPE_ISDN,
</span><span class="cx">         FTDM_SIGTYPE_RBS,
</span><span class="lines">@@ -175,10 +162,6 @@
</span><span class="cx"> } ftdm_signal_type_t;
</span><span class="cx"> 
</span><span class="cx"> typedef enum {
</span><del>-        FTDM_TONE_DTMF = (1 &lt;&lt; 0)
-} ftdm_tone_type_t;
-
-typedef enum {
</del><span class="cx">         FTDM_SPAN_CONFIGURED = (1 &lt;&lt; 0),
</span><span class="cx">         FTDM_SPAN_READY = (1 &lt;&lt; 1),
</span><span class="cx">         FTDM_SPAN_STATE_CHANGE = (1 &lt;&lt; 2),
</span><span class="lines">@@ -368,70 +351,6 @@
</span><span class="cx"> typedef ftdm_status_t (*ftdm_span_start_t)(ftdm_span_t *span);
</span><span class="cx"> typedef ftdm_status_t (*ftdm_span_stop_t)(ftdm_span_t *span);
</span><span class="cx"> 
</span><del>-typedef enum {
-        FTDM_CAUSE_NONE = 0,
-        FTDM_CAUSE_UNALLOCATED = 1,
-        FTDM_CAUSE_NO_ROUTE_TRANSIT_NET = 2,
-        FTDM_CAUSE_NO_ROUTE_DESTINATION = 3,
-        FTDM_CAUSE_CHANNEL_UNACCEPTABLE = 6,
-        FTDM_CAUSE_CALL_AWARDED_DELIVERED = 7,
-        FTDM_CAUSE_NORMAL_CLEARING = 16,
-        FTDM_CAUSE_USER_BUSY = 17,
-        FTDM_CAUSE_NO_USER_RESPONSE = 18,
-        FTDM_CAUSE_NO_ANSWER = 19,
-        FTDM_CAUSE_SUBSCRIBER_ABSENT = 20,
-        FTDM_CAUSE_CALL_REJECTED = 21,
-        FTDM_CAUSE_NUMBER_CHANGED = 22,
-        FTDM_CAUSE_REDIRECTION_TO_NEW_DESTINATION = 23,
-        FTDM_CAUSE_EXCHANGE_ROUTING_ERROR = 25,
-        FTDM_CAUSE_DESTINATION_OUT_OF_ORDER = 27,
-        FTDM_CAUSE_INVALID_NUMBER_FORMAT = 28,
-        FTDM_CAUSE_FACILITY_REJECTED = 29,
-        FTDM_CAUSE_RESPONSE_TO_STATUS_ENQUIRY = 30,
-        FTDM_CAUSE_NORMAL_UNSPECIFIED = 31,
-        FTDM_CAUSE_NORMAL_CIRCUIT_CONGESTION = 34,
-        FTDM_CAUSE_NETWORK_OUT_OF_ORDER = 38,
-        FTDM_CAUSE_NORMAL_TEMPORARY_FAILURE = 41,
-        FTDM_CAUSE_SWITCH_CONGESTION = 42,
-        FTDM_CAUSE_ACCESS_INFO_DISCARDED = 43,
-        FTDM_CAUSE_REQUESTED_CHAN_UNAVAIL = 44,
-        FTDM_CAUSE_PRE_EMPTED = 45,
-        FTDM_CAUSE_FACILITY_NOT_SUBSCRIBED = 50,
-        FTDM_CAUSE_OUTGOING_CALL_BARRED = 52,
-        FTDM_CAUSE_INCOMING_CALL_BARRED = 54,
-        FTDM_CAUSE_BEARERCAPABILITY_NOTAUTH = 57,
-        FTDM_CAUSE_BEARERCAPABILITY_NOTAVAIL = 58,
-        FTDM_CAUSE_SERVICE_UNAVAILABLE = 63,
-        FTDM_CAUSE_BEARERCAPABILITY_NOTIMPL = 65,
-        FTDM_CAUSE_CHAN_NOT_IMPLEMENTED = 66,
-        FTDM_CAUSE_FACILITY_NOT_IMPLEMENTED = 69,
-        FTDM_CAUSE_SERVICE_NOT_IMPLEMENTED = 79,
-        FTDM_CAUSE_INVALID_CALL_REFERENCE = 81,
-        FTDM_CAUSE_INCOMPATIBLE_DESTINATION = 88,
-        FTDM_CAUSE_INVALID_MSG_UNSPECIFIED = 95,
-        FTDM_CAUSE_MANDATORY_IE_MISSING = 96,
-        FTDM_CAUSE_MESSAGE_TYPE_NONEXIST = 97,
-        FTDM_CAUSE_WRONG_MESSAGE = 98,
-        FTDM_CAUSE_IE_NONEXIST = 99,
-        FTDM_CAUSE_INVALID_IE_CONTENTS = 100,
-        FTDM_CAUSE_WRONG_CALL_STATE = 101,
-        FTDM_CAUSE_RECOVERY_ON_TIMER_EXPIRE = 102,
-        FTDM_CAUSE_MANDATORY_IE_LENGTH_ERROR = 103,
-        FTDM_CAUSE_PROTOCOL_ERROR = 111,
-        FTDM_CAUSE_INTERWORKING = 127,
-        FTDM_CAUSE_SUCCESS = 142,
-        FTDM_CAUSE_ORIGINATOR_CANCEL = 487,
-        FTDM_CAUSE_CRASH = 500,
-        FTDM_CAUSE_SYSTEM_SHUTDOWN = 501,
-        FTDM_CAUSE_LOSE_RACE = 502,
-        FTDM_CAUSE_MANAGER_REQUEST = 503,
-        FTDM_CAUSE_BLIND_TRANSFER = 600,
-        FTDM_CAUSE_ATTENDED_TRANSFER = 601,
-        FTDM_CAUSE_ALLOTTED_TIMEOUT = 602,
-        FTDM_CAUSE_USER_CHALLENGE = 603,
-        FTDM_CAUSE_MEDIA_TIMEOUT = 604
-} ftdm_call_cause_t;
-
</del><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> }
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="freeswitchtrunklibsfreetdmsrctestanalogc"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/libs/freetdm/src/testanalog.c (17432 => 17433)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/freetdm/src/testanalog.c        2010-04-28 22:17:49 UTC (rev 17432)
+++ freeswitch/trunk/libs/freetdm/src/testanalog.c        2010-04-28 22:17:49 UTC (rev 17433)
</span><span class="lines">@@ -18,7 +18,7 @@
</span><span class="cx">         ftdm_channel_call_answer(chan);
</span><span class="cx">         ftdm_channel_command(chan, FTDM_COMMAND_SEND_DTMF, number);
</span><span class="cx"> 
</span><del>-        while (ftdm_channel_call_active(chan)) {
</del><ins>+        while (ftdm_channel_call_check_answered(chan)) {
</ins><span class="cx">                 ftdm_wait_flag_t flags = FTDM_READ;
</span><span class="cx">                 
</span><span class="cx">                 if (ftdm_channel_wait(chan, &amp;flags, -1) == FTDM_FAIL) {
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx">         
</span><del>-        if (ftdm_channel_call_active(chan)) {
</del><ins>+        if (ftdm_channel_call_check_answered(chan)) {
</ins><span class="cx">                 ftdm_channel_call_indicate(chan, FTDM_CHANNEL_INDICATE_BUSY);
</span><span class="cx">         }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>
<div id="footer">See you at ClueCon</div>

</body>
</html>