FT_DECLARE(void) ftdm_ack_indication(ftdm_channel_t *fchan, ftdm_channel_indication_t indication, ftdm_status_t status)
{
ftdm_sigmsg_t msg;
+
+ if (!ftdm_test_flag(fchan, FTDM_CHANNEL_IND_ACK_PENDING)) {
+ return;
+ }
+
ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Acknowledging indication %s in state %s (rc = %d)\n",
ftdm_channel_indication2str(indication), ftdm_channel_state2str(fchan->state), status);
ftdm_clear_flag(fchan, FTDM_CHANNEL_IND_ACK_PENDING);
}
ftdmchan->indication = indication;
- ftdm_set_flag(ftdmchan, FTDM_CHANNEL_IND_ACK_PENDING);
+ if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NONBLOCK)) {
+ ftdm_set_flag(ftdmchan, FTDM_CHANNEL_IND_ACK_PENDING);
+ }
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
ftdm_log_chan(ftdmchan, FTDM_LOG_WARNING, "Cannot indicate %s in outgoing channel in state %s\n",
ftdm_set_flag(fchan, FTDM_CHANNEL_MEDIA);
}
- /* if there is a pending ack for an indication
- * MAINTENANCE WARNING: we're assuming an indication performed
- * via state change will involve a single state change
- */
- if (ftdm_test_flag(fchan, FTDM_CHANNEL_IND_ACK_PENDING)) {
- ftdm_ack_indication(fchan, fchan->indication, FTDM_SUCCESS);
- }
+ /* MAINTENANCE WARNING
+ * we're assuming an indication performed
+ * via state change will involve a single state change */
+ ftdm_ack_indication(fchan, fchan->indication, FTDM_SUCCESS);
hindex = (fchan->hindex == 0) ? (ftdm_array_len(fchan->history) - 1) : (fchan->hindex - 1);