}
break;
case FTDM_SIGEVENT_SIGSTATUS_CHANGED:
- {
- ftdm_signaling_status_t *sigstatus = (ftdm_signaling_status_t*)(sigmsg->raw_data);
+ {
+ ftdm_signaling_status_t sigstatus = sigmsg->raw_data ? *((ftdm_signaling_status_t*)(sigmsg->raw_data)) : sigmsg->sigstatus;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%d:%d signalling changed to :%s\n",
- spanid, chanid, ftdm_signaling_status2str(*sigstatus));
+ spanid, chanid, ftdm_signaling_status2str(sigstatus));
}
break;
default:
switch (sigmsg->event_id) {
case FTDM_SIGEVENT_SIGSTATUS_CHANGED:
- if (*((ftdm_signaling_status_t*)(sigmsg->raw_data)) == FTDM_SIG_STATE_UP) {
- ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
- } else {
- ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
+ {
+ ftdm_signaling_status_t sigstatus = ftdm_test_flag(span, FTDM_SPAN_USE_SIGNALS_QUEUE) ? sigmsg->sigstatus : *((ftdm_signaling_status_t*)(sigmsg->raw_data));
+ if (sigstatus == FTDM_SIG_STATE_UP) {
+ ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
+ } else {
+ ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
+ }
}
break;
ftdm_channel_unlock(ftdmchan);
}
- /* Check if there are any timers to process */
while ((sngisdn_event = ftdm_queue_dequeue(signal_data->event_queue))) {
ftdm_sangoma_isdn_process_stack_event(span, sngisdn_event);
ftdm_safe_free(sngisdn_event);
- }
+ }
+ ftdm_span_trigger_signals(span);
break;
case FTDM_TIMEOUT:
/* twiddle */
span->set_channel_sig_status = ftdm_sangoma_isdn_set_sig_status;
span->state_map = &sangoma_isdn_state_map;
ftdm_set_flag(span, FTDM_SPAN_USE_CHAN_QUEUE);
+ ftdm_set_flag(span, FTDM_SPAN_USE_SIGNALS_QUEUE);
if (span->trunk_type == FTDM_TRUNK_BRI_PTMP ||
span->trunk_type == FTDM_TRUNK_BRI) {
sig.span_id = ftdmchan->span_id;
sig.channel = ftdmchan;
sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
- sig.raw_data = &status;
+ sig.sigstatus = status;
ftdm_span_send_signal(ftdmchan->span, &sig);
return;
}