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