diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_modem.c b/src/mod/applications/mod_spandsp/mod_spandsp_modem.c index 97c27cd48e..e996dadcf7 100644 --- a/src/mod/applications/mod_spandsp/mod_spandsp_modem.c +++ b/src/mod/applications/mod_spandsp/mod_spandsp_modem.c @@ -1053,32 +1053,36 @@ static int control_handler(modem_t *modem, const char *num, int op) case AT_MODEM_CONTROL_ONHOOK: case AT_MODEM_CONTROL_HANGUP: { - int set_state = 1; + if (modem_get_state(modem) != MODEM_STATE_RINGING) { + int set_state = 1; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "Modem %s [%s] - Hanging up\n", modem->devlink, modem_state2name(modem_get_state(modem))); + switch_clear_flag(modem, MODEM_FLAG_XOFF); + wake_modem_thread(modem); + - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "Modem %s [%s] - Hanging up\n", modem->devlink, modem_state2name(modem_get_state(modem))); - switch_clear_flag(modem, MODEM_FLAG_XOFF); - wake_modem_thread(modem); + modem_set_state(modem, MODEM_STATE_HANGUP); + - modem_set_state(modem, MODEM_STATE_HANGUP); - - if (!zstr(modem->uuid_str)) { - switch_core_session_t *session; - - if ((session = switch_core_session_force_locate(modem->uuid_str))) { - switch_channel_t *channel = switch_core_session_get_channel(session); - - if (switch_channel_up(channel) && - (switch_channel_test_flag(channel, CF_ANSWERED) || switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_INBOUND)) { - switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); - set_state = 0; + if (!zstr(modem->uuid_str)) { + switch_core_session_t *session; + + if ((session = switch_core_session_force_locate(modem->uuid_str))) { + switch_channel_t *channel = switch_core_session_get_channel(session); + + if (switch_channel_up(channel)) { + switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); + set_state = 0; + } + switch_core_session_rwunlock(session); } - switch_core_session_rwunlock(session); } - } + - if (set_state) { - modem_set_state(modem, MODEM_STATE_ONHOOK); + if (set_state) { + modem_set_state(modem, MODEM_STATE_ONHOOK); + } } } break;