From b3cb2ff413303118819aba8be49c398b9f01f353 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Wed, 14 Jan 2026 03:36:11 +0200 Subject: [PATCH] Load mixminus module on-demand and add calls to conference dynamically --- .../kotlin/com/tutpro/baresip/BaresipService.kt | 2 ++ app/src/main/kotlin/com/tutpro/baresip/Call.kt | 1 + .../main/kotlin/com/tutpro/baresip/MainScreen.kt | 15 ++++++++++++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index f98de8ac..41e39cd5 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -1104,6 +1104,8 @@ class BaresipService: Service() { call.onHoldCall = null } call.remove() + if (call.conferenceCall && ua.calls().isEmpty()) + Api.module_unload("mixminus") val reason = ev[1] val tone = ev[2] if (tone == "busy") { diff --git a/app/src/main/kotlin/com/tutpro/baresip/Call.kt b/app/src/main/kotlin/com/tutpro/baresip/Call.kt index 16cd7d33..4518f661 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Call.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Call.kt @@ -11,6 +11,7 @@ class Call(val callp: Long, val ua: UserAgent, val peerUri: String, val dir: Str var onhold = false var held = false + var terminated = false var conferenceCall = false var onHoldCall: Call? = null var newCall: Call? = null diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainScreen.kt b/app/src/main/kotlin/com/tutpro/baresip/MainScreen.kt index fce888fb..7bd7b5ca 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MainScreen.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MainScreen.kt @@ -1478,9 +1478,12 @@ private fun CallRow( IconButton( modifier = Modifier.size(48.dp), onClick = { - abandonAudioFocus(ctx) - Log.d(TAG, "AoR ${call.ua.account.aor} hanging up call ${call.callp} with ${call.callUri.value}") - Api.ua_hangup(call.ua.uap, call.callp, 487, "Request Terminated") + if (!call.terminated) { + call.terminated = true + abandonAudioFocus(ctx) + Log.d(TAG, "AoR ${call.ua.account.aor} hanging up call ${call.callp} with ${call.callUri.value}") + Api.ua_hangup(call.ua.uap, call.callp, 487, "Request Terminated") + } } ) { Icon( @@ -2067,6 +2070,8 @@ private fun call( onHoldCall: Call? = null ): Call? { spinToAor(viewModel, ua.account.aor) + if (conferenceCall && ua.calls().isEmpty()) + Api.module_load("mixminus") val callp = ua.callAlloc(0L, Api.VIDMODE_OFF) return if (callp != 0L) { Log.d(TAG, "Adding outgoing call ${ua.uap}/$callp/$uri") @@ -2090,6 +2095,8 @@ private fun call( } } else { Log.w(TAG, "callAlloc for ${ua.uap} to $uri failed") + if (conferenceCall && ua.calls().isEmpty()) + Api.module_unload("mixminus") null } } @@ -2318,6 +2325,8 @@ fun handleServiceEvent(ctx: Context, viewModel: ViewModel, event: String, params val call = Call.ofCallp(callp) if (call != null) { call.dtmfText.value = "" + if (call.conferenceCall) + Api.cmd_exec("conference") } showCall(ctx, viewModel, ua, call) }