From 5790828546dd8b26550890ea46a976a33097371d Mon Sep 17 00:00:00 2001 From: Grzegorz Sluja <grzegorz.sluja@iopsys.eu> Date: Tue, 21 Jun 2022 12:11:18 +0000 Subject: [PATCH] Return to the first call without playing any tones on DECT handset when the second call ends --- channels/chan_brcm.c | 11 +++++------ res/res_pjsip_session.c | 16 ++++++++-------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/channels/chan_brcm.c b/channels/chan_brcm.c index 829b280ecc..6f9e6af8da 100644 --- a/channels/chan_brcm.c +++ b/channels/chan_brcm.c @@ -660,10 +660,11 @@ static int brcm_indicate(struct ast_channel *ast, int condition, const void *dat const struct ast_control_pvt_cause_code *cause_code = data; int ast_cause = cause_code->ast_cause; ast_debug(2, "AST_CONTROL_PVT_CAUSE_CODE = %d, chan_name = %s\n", ast_cause, cause_code->chan_name); - switch (ast_cause) { case AST_CAUSE_NO_USER_RESPONSE: case AST_CAUSE_NO_ANSWER: + case AST_CAUSE_CALL_REJECTED: + endpt_signal(sub->parent->line_id, "ringback", "off", NULL); if (ast_channel_state(ast) != AST_STATE_UP) { endpt_signal(sub->parent->line_id, "congestion", "on", NULL); strncpy(sub->parent->extensionCallStatus, "Disconnected", CALL_STATUS_MAX_LEN); @@ -675,20 +676,18 @@ static int brcm_indicate(struct ast_channel *ast, int condition, const void *dat // This is just fine. break; case AST_CAUSE_USER_BUSY: + endpt_signal(sub->parent->line_id, "ringback", "off", NULL); if (ast_channel_state(ast) != AST_STATE_UP) { /* XXX We should play a busy tone here!! */ sub->channel_state = CALLENDED; - strncpy(sub->parent->extensionCallStatus, "Disconnected", CALL_STATUS_MAX_LEN); endpt_signal(sub->parent->line_id, "busy", "on", NULL); + strncpy(sub->parent->extensionCallStatus, "Disconnected", CALL_STATUS_MAX_LEN); break; } res = -1; case AST_CAUSE_NETWORK_OUT_OF_ORDER: brcm_stop_dialtone(sub->parent); // stop any dialtone exist if disconnection happened due to network/server break; - case AST_CAUSE_CALL_REJECTED: - endpt_signal(sub->parent->line_id, "ringback", "off", NULL); - break; default: ast_debug(1, "Don't know how to handle cause code %d\n", ast_cause); break; @@ -2327,7 +2326,7 @@ static void handle_dect_event(struct brcm_subchannel *sub, struct brcm_subchanne if (sub->channel_state == INCALL && sub_peer->channel_state != CALLWAITING) { ast_log(LOG_ERROR, "Hanging up call\n"); ast_queue_control(owner, AST_CONTROL_HANGUP); - } else if (sub->channel_state == RINGBACK && sub_peer->channel_state == ONHOLD) { + } else if ((sub->channel_state == RINGBACK || sub->channel_state == CALLENDED) && sub_peer->channel_state == ONHOLD) { endpt_signal(sub->parent->line_id, "ringback", "off", NULL); ast_queue_control(owner, AST_CONTROL_HANGUP); brcm_unmute_connection(sub_peer); diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index dbee72c850..ad83ca0927 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -65,7 +65,7 @@ #define DEFAULT_MAX_SESSION 4 static int max_sessions_per_line = DEFAULT_MAX_SESSION_PER_LINE; static int max_sessions = DEFAULT_MAX_SESSION; -static int session_count = 0; // current number of active sessions +static int current_session_count = 0; // current number of active sessions /* Some forward declarations */ static void handle_session_begin(struct ast_sip_session *session); @@ -3389,8 +3389,8 @@ struct ast_sip_session *ast_sip_session_create_outgoing(struct ast_sip_endpoint if (endpoint_snapshot && endpoint_snapshot->num_channels >= max_sessions_per_line) { ast_log(LOG_WARNING, "Max call per line limit exceeded [%d/%d]\n", endpoint_snapshot->num_channels, max_sessions_per_line); SCOPE_EXIT_RTN_VALUE(NULL, "Max call per line limit exceeded\n"); - } else if (session_count >= max_sessions) { - ast_log(LOG_WARNING, "Max call limit exceeded [%d/%d]\n", session_count, max_sessions); + } else if (current_session_count >= max_sessions) { + ast_log(LOG_WARNING, "Max call limit exceeded [%d/%d]\n", current_session_count, max_sessions); SCOPE_EXIT_RTN_VALUE(NULL, "Max call limit exceeded\n"); } @@ -3492,7 +3492,7 @@ struct ast_sip_session *ast_sip_session_create_outgoing(struct ast_sip_endpoint /* Avoid unnecessary ref manipulation to return a session */ ret_session = session; session = NULL; - session_count++; + current_session_count++; SCOPE_EXIT_RTN_VALUE(ret_session); } @@ -3575,7 +3575,7 @@ void ast_sip_session_terminate(struct ast_sip_session *session, int response) } break; } - session_count--; + current_session_count--; SCOPE_EXIT_RTN(); } @@ -4133,8 +4133,8 @@ static void handle_new_invite_request(pjsip_rx_data *rdata) pjsip_inv_terminate(inv_session, 486, PJ_FALSE); } SCOPE_EXIT_RTN("Max call per line limit exceeded\n"); - } else if (session_count >= max_sessions) { - ast_log(LOG_WARNING, "Max call limit exceeded [%d/%d]\n", session_count, max_sessions); + } else if (current_session_count >= max_sessions) { + ast_log(LOG_WARNING, "Max call limit exceeded [%d/%d]\n", current_session_count, max_sessions); /* Dialog's lock and reference are removed in new_invite_initial_answer */ if (!new_invite_initial_answer(inv_session, rdata, 486, 486, PJ_FALSE)) { /* Terminate the session if it wasn't done in the answer */ @@ -4198,7 +4198,7 @@ static void handle_new_invite_request(pjsip_rx_data *rdata) * be done before this. */ pjsip_dlg_dec_lock(inv_session->dlg); - session_count++; + current_session_count++; SCOPE_EXIT("Request: %s Session: %s\n", req_uri, ast_sip_session_get_name(session)); ao2_ref(session, -1); } -- GitLab