From a6528cff2e0e9254b966ceebd6e063136f480fea Mon Sep 17 00:00:00 2001
From: Yalu Zhang <yalu.zhang@iopsys.eu>
Date: Tue, 26 Nov 2024 09:47:12 +0000
Subject: [PATCH] Set sub-channel state correctly when event RELEASE is
 received from voicemngr

Set both sub-channels' state to ONHOOK if the current state is AWAITHOOK or CALLENDED.
---
 src/channels/chan_voicemngr.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/channels/chan_voicemngr.c b/src/channels/chan_voicemngr.c
index 5cb946f..25024c1 100644
--- a/src/channels/chan_voicemngr.c
+++ b/src/channels/chan_voicemngr.c
@@ -3035,8 +3035,20 @@ static void handle_dect_event(struct chan_voicemngr_subchannel *sub, struct chan
 		}
 	} else if (event == EVENT_RELEASE) {
 		ast_log(LOG_NOTICE, "EVENT_RELEASE detected for phone line %d\n", sub->parent->line_id);
-		if (sub->channel_state == AWAITONHOOK && sub_peer->channel_state == ONHOOK) {
+
+		// Delete timer
+		if (sub->congestion_timer_id != -1) {
+			if(ast_sched_del(sched, sub->congestion_timer_id)){
+				ast_log(LOG_WARNING, "Failed to remove scheduled congestion tone timer\n");
+			}
+			sub->congestion_timer_id = -1;
+		}
+
+		// Update state
+		if (sub->channel_state == AWAITONHOOK && (sub_peer->channel_state == ONHOOK || sub_peer->channel_state == CALLENDED)) {
 			chan_voicemngr_close_connection(sub);
+			sub->channel_state = ONHOOK;
+			sub_peer->channel_state = ONHOOK;
 		} else 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);
-- 
GitLab