]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: support for SIGEVENT_RING
authorDavid Yat Sin <dyatsin@sangoma.com>
Wed, 15 Dec 2010 16:45:50 +0000 (11:45 -0500)
committerDavid Yat Sin <dyatsin@sangoma.com>
Wed, 15 Dec 2010 16:45:50 +0000 (11:45 -0500)
libs/freetdm/mod_freetdm/mod_freetdm.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
libs/freetdm/src/include/freetdm.h

index 26b84636caafa8082f64093e56750a2f5cb8c293..d8f98f1c612960e5049c15e22ae18a6074e45700 100755 (executable)
@@ -2167,6 +2167,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
                }
                break;
        case FTDM_SIGEVENT_PROGRESS:
+       case FTDM_SIGEVENT_RINGING:
                {
                        if ((session = ftdm_channel_get_session(sigmsg->channel, 0))) {
                                channel = switch_core_session_get_channel(session);
index f8867d5fcf6a869f2e6ffb7f963a770348309117..48ddddce6b8e0ae72bf562e45691dc6afe4a9940 100644 (file)
@@ -215,7 +215,7 @@ ftdm_state_map_t sangoma_isdn_state_map = {
                ZSM_UNACCEPTABLE,
                {FTDM_CHANNEL_STATE_DIALING, FTDM_END},
                {FTDM_CHANNEL_STATE_TERMINATING, FTDM_CHANNEL_STATE_HANGUP,
-                FTDM_CHANNEL_STATE_PROCEED, FTDM_CHANNEL_STATE_PROGRESS, FTDM_CHANNEL_STATE_PROGRESS_MEDIA, FTDM_CHANNEL_STATE_UP,
+                FTDM_CHANNEL_STATE_PROCEED, FTDM_CHANNEL_STATE_RINGING, FTDM_CHANNEL_STATE_PROGRESS, FTDM_CHANNEL_STATE_PROGRESS_MEDIA, FTDM_CHANNEL_STATE_UP,
                 FTDM_CHANNEL_STATE_DOWN, FTDM_END}
        },
        {
@@ -223,14 +223,20 @@ ftdm_state_map_t sangoma_isdn_state_map = {
                ZSM_UNACCEPTABLE,
                {FTDM_CHANNEL_STATE_PROCEED, FTDM_END},
                {FTDM_CHANNEL_STATE_TERMINATING, FTDM_CHANNEL_STATE_HANGUP,
-                FTDM_CHANNEL_STATE_PROGRESS, FTDM_CHANNEL_STATE_PROGRESS_MEDIA, FTDM_CHANNEL_STATE_UP, FTDM_END},
-               },
+                FTDM_CHANNEL_STATE_RINGING, FTDM_CHANNEL_STATE_PROGRESS, FTDM_CHANNEL_STATE_PROGRESS_MEDIA, FTDM_CHANNEL_STATE_UP, FTDM_END},
+       },
        {
                ZSD_OUTBOUND,
                ZSM_UNACCEPTABLE,
                {FTDM_CHANNEL_STATE_PROGRESS, FTDM_END},
                {FTDM_CHANNEL_STATE_TERMINATING, FTDM_CHANNEL_STATE_HANGUP, FTDM_CHANNEL_STATE_PROGRESS_MEDIA, FTDM_CHANNEL_STATE_UP, FTDM_END},
        },
+       {
+               ZSD_OUTBOUND,
+               ZSM_UNACCEPTABLE,
+               {FTDM_CHANNEL_STATE_RINGING, FTDM_END},
+               {FTDM_CHANNEL_STATE_TERMINATING, FTDM_CHANNEL_STATE_HANGUP, FTDM_CHANNEL_STATE_PROGRESS_MEDIA, FTDM_CHANNEL_STATE_UP, FTDM_END},
+       },
        {
                ZSD_OUTBOUND,
                ZSM_UNACCEPTABLE,
@@ -692,8 +698,17 @@ static void ftdm_sangoma_isdn_process_state_change(ftdm_channel_t *ftdmchan)
                break;
        case FTDM_CHANNEL_STATE_RINGING:
                {
-                       ftdm_sngisdn_progind_t prog_ind = {SNGISDN_PROGIND_LOC_USER, SNGISDN_PROGIND_DESCR_NETE_ISDN};
-                       sngisdn_snd_alert(ftdmchan, prog_ind);
+                       if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
+                               /* OUTBOUND...so we were told by the line of this so notify the user */
+                               sigev.event_id = FTDM_SIGEVENT_RINGING;
+                               ftdm_span_send_signal(ftdmchan->span, &sigev);
+                               if (sngisdn_test_flag(sngisdn_info, FLAG_MEDIA_READY)) {
+                                       ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
+                               }
+                       } else {
+                               ftdm_sngisdn_progind_t prog_ind = {SNGISDN_PROGIND_LOC_USER, SNGISDN_PROGIND_DESCR_NETE_ISDN};
+                               sngisdn_snd_alert(ftdmchan, prog_ind);
+                       }
                }
                break;
        case FTDM_CHANNEL_STATE_PROGRESS:
index 4662d4e9bbb4eabfd6bad45cbae354eb4a538b71..0c6c1c6eefe92c59bbc39c085287ab5429d94043 100644 (file)
@@ -101,9 +101,11 @@ typedef enum {
        FLAG_GLARE              = (1 << 6),
        FLAG_DELAYED_REL        = (1 << 7),
        FLAG_SENT_PROCEED       = (1 << 8),
-       FLAG_SEND_DISC                  = (1 << 9),
+       FLAG_SEND_DISC                  = (1 << 9),     
        /* Used for BRI only, flag is set after we request line CONNECTED */
-       FLAG_ACTIVATING                 = (1 << 10), 
+       FLAG_ACTIVATING                 = (1 << 10),
+       /* Used when we receive an ALERT msg + inband tones ready */
+       FLAG_MEDIA_READY                = (1 << 11),
 } sngisdn_flag_t;
 
 
index bdd371704dc00fc4c00fcc1008e94fd9d5870ba2..7e9e360c6daba3cedf46796cbab2c875d837760e 100644 (file)
@@ -278,6 +278,7 @@ void sngisdn_process_con_cfm (sngisdn_event_data_t *sngisdn_event)
        if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
                switch(ftdmchan->state) {
                        case FTDM_CHANNEL_STATE_PROCEED:
+                       case FTDM_CHANNEL_STATE_RINGING:
                        case FTDM_CHANNEL_STATE_PROGRESS:
                        case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
                        case FTDM_CHANNEL_STATE_DIALING:
@@ -364,21 +365,38 @@ void sngisdn_process_cnst_ind (sngisdn_event_data_t *sngisdn_event)
                                ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
                                goto sngisdn_process_cnst_ind_end;
                        }
-                       
+
                        switch(ftdmchan->state) {
                                case FTDM_CHANNEL_STATE_DIALING:
                                case FTDM_CHANNEL_STATE_PROCEED:
-                                       if (cnStEvnt->progInd.eh.pres && cnStEvnt->progInd.progDesc.val == IN_PD_IBAVAIL) {
-                                               ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
-                                       } else  if (evntType == MI_CALLPROC) {
-                                               ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_PROCEED);
-                                       } else {
-                                               ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
-                                       }
-                                       break;
                                case FTDM_CHANNEL_STATE_PROGRESS:
+                               case FTDM_CHANNEL_STATE_RINGING:
                                        if (cnStEvnt->progInd.eh.pres && cnStEvnt->progInd.progDesc.val == IN_PD_IBAVAIL) {
-                                               ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
+                                               sngisdn_set_flag(sngisdn_info, FLAG_MEDIA_READY);
+                                       }
+                                       switch (evntType) {
+                                               case MI_CALLPROC:
+                                                       if (ftdmchan->state == FTDM_CHANNEL_STATE_DIALING) {
+                                                               ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_PROCEED);
+                                                       }
+                                                       break;
+                                               case MI_ALERTING:
+                                                       if (ftdmchan->state == FTDM_CHANNEL_STATE_PROCEED) {
+                                                               ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RINGING);
+                                                       }
+                                                       break;
+                                               case MI_PROGRESS:
+                                                       if (sngisdn_test_flag(sngisdn_info, FLAG_MEDIA_READY)) {
+                                                               
+                                                               ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
+                                                       } else if (ftdmchan->state != FTDM_CHANNEL_STATE_PROGRESS) {
+                                                                                                                               
+                                                               ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
+                                                       }
+                                                       break;
+                                               default:
+                                                       /* We should never reach this section !*/
+                                                       ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Don't know how to handle this event %d\n", evntType);
                                        }
                                        break;
                                case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
index a3cddadb819f6386eb24fa965dfa4d89349052ca..f8f69abc71c381efbf045883580587d21141abc4 100644 (file)
@@ -314,7 +314,8 @@ typedef enum {
        FTDM_SIGEVENT_RELEASED, /*!< Channel is completely released and available */
        FTDM_SIGEVENT_UP, /*!< Outgoing call has been answered */
        FTDM_SIGEVENT_FLASH, /*!< Flash event  (typically on-hook/off-hook for analog devices) */
-       FTDM_SIGEVENT_PROCEED, /*!< Outgoing call got a response */
+       FTDM_SIGEVENT_PROCEED, /*!< Outgoing call got a response */
+       FTDM_SIGEVENT_RINGING, /*!< Remote side is in ringing state */
        FTDM_SIGEVENT_PROGRESS, /*!< Outgoing call is making progress */
        FTDM_SIGEVENT_PROGRESS_MEDIA, /*!< Outgoing call is making progress and there is media available */
        FTDM_SIGEVENT_ALARM_TRAP, /*!< Hardware alarm ON */
@@ -327,7 +328,7 @@ typedef enum {
        FTDM_SIGEVENT_FACILITY, /* !< In call facility event */
        FTDM_SIGEVENT_INVALID
 } ftdm_signal_event_t;
-#define SIGNAL_STRINGS "START", "STOP", "RELEASED", "UP", "FLASH", "PROCEED", "PROGRESS", \
+#define SIGNAL_STRINGS "START", "STOP", "RELEASED", "UP", "FLASH", "PROCEED", "RINGING", "PROGRESS", \
                "PROGRESS_MEDIA", "ALARM_TRAP", "ALARM_CLEAR", \
                "COLLECTED_DIGIT", "ADD_CALL", "RESTART", "SIGSTATUS_CHANGED", "COLLISION", "MSG", "INVALID"