From 5488b99c1af4a0eef4c1dea9af99db5c30b9fc69 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Fri, 22 Sep 2023 12:24:25 +0300 Subject: [PATCH 1/3] Work on adding support for account 100rel configuration --- app/src/main/cpp/baresip.c | 13 +++++++++ .../main/kotlin/com/tutpro/baresip/Account.kt | 10 +++++-- .../com/tutpro/baresip/AccountActivity.kt | 27 +++++++++++++++--- app/src/main/kotlin/com/tutpro/baresip/Api.kt | 5 ++++ app/src/main/res/layout/activity_account.xml | 28 ++++++++++++++++++- app/src/main/res/values/strings.xml | 2 ++ 6 files changed, 78 insertions(+), 7 deletions(-) diff --git a/app/src/main/cpp/baresip.c b/app/src/main/cpp/baresip.c index a56a721c..7265f5cc 100644 --- a/app/src/main/cpp/baresip.c +++ b/app/src/main/cpp/baresip.c @@ -981,6 +981,19 @@ JNIEXPORT jint JNICALL Java_com_tutpro_baresip_Api_account_1set_1rtcp_1mux( return account_set_rtcp_mux((struct account *)acc, value); } +JNIEXPORT jint JNICALL Java_com_tutpro_baresip_Api_account_1rel100_1mode( + JNIEnv *env, jobject thiz, jlong acc) +{ + return account_rel100_mode((struct account *)acc); +} + +JNIEXPORT jint JNICALL Java_com_tutpro_baresip_Api_account_1set_1rel100_1mode( + JNIEnv *env, jobject thiz, jlong acc, jint jMode) +{ + const uint32_t mode = (uint32_t)jMode; + return account_set_rel100_mode((struct account *)acc, mode); +} + JNIEXPORT jint JNICALL Java_com_tutpro_baresip_Api_account_1dtmfmode( JNIEnv *env, jobject thiz, jlong acc) { diff --git a/app/src/main/kotlin/com/tutpro/baresip/Account.kt b/app/src/main/kotlin/com/tutpro/baresip/Account.kt index ba1fee5c..c374b489 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Account.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Account.kt @@ -25,6 +25,7 @@ class Account(val accp: Long) { var configuredRegInt = REGISTRATION_INTERVAL var mediaEnc = Api.account_mediaenc(accp) var rtcpMux = Api.account_rtcp_mux(accp) + var rel100Mode = Api.account_rel100_mode(accp) var dtmfMode = Api.account_dtmfmode(accp) var answerMode = Api.account_answermode(accp) var autoRedirect = Api.account_sip_autoredirect(accp) @@ -123,7 +124,12 @@ class Account(val accp: Long) { if (mediaEnc != "") res += ";mediaenc=${mediaEnc}" if (rtcpMux) - res += ";rtcp_mux=yes" + res += ";rtcp_mux=yes" + + res += if (rel100Mode == Api.REL100_ENABLED) + ";100rel=yes" + else + ";100rel=no" res = if (vmUri == "") "$res;mwi=no" @@ -136,7 +142,7 @@ class Account(val accp: Long) { if (autoRedirect) res += ";sip_autoredirect=yes" - res += ";ptime=20;regint=${regint};regq=0.5;pubint=0;call_transfer=yes;100rel=no" + res += ";ptime=20;regint=${regint};regq=0.5;pubint=0;call_transfer=yes" var extra = "" diff --git a/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt index df00af78..0fe4f4c2 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt @@ -45,6 +45,7 @@ class AccountActivity : AppCompatActivity() { private lateinit var mediaEnc: String private lateinit var mediaEncSpinner: Spinner private lateinit var rtcpCheck: CheckBox + private lateinit var rel100Check: CheckBox private var dtmfMode = Api.DTMFMODE_RTP_EVENT private lateinit var dtmfModeSpinner: Spinner private var answerMode = Api.ANSWERMODE_MANUAL @@ -95,6 +96,7 @@ class AccountActivity : AppCompatActivity() { stunPass = binding.StunPass mediaEncSpinner = binding.mediaEncSpinner rtcpCheck = binding.RtcpMux + rel100Check = binding.Rel100 dtmfModeSpinner = binding.dtmfModeSpinner answerModeSpinner = binding.answerModeSpinner redirectModeSpinner = binding.redirectModeSpinner @@ -191,7 +193,12 @@ class AccountActivity : AppCompatActivity() { if (text.isNotEmpty()) acc.stunServer = text "rtcp-mux" -> - acc.rtcpMux = text == "yes" + it cacc.rtcpMux = text == "yes" + "100rel-mode" -> + acc.rel100Mode = if (text == "yes") + Api.REL100_ENABLED + else + Api.REL100_DISABLED "dtmf-mode" -> if (text in arrayOf("rtp-event", "sip-info")) { acc.dtmfMode = if (text == "rtp-event") @@ -307,6 +314,8 @@ class AccountActivity : AppCompatActivity() { rtcpCheck.isChecked = acc.rtcpMux + rel100Check.isChecked = acc.rel100Mode == Api.REL100_ENABLED + dtmfMode = acc.dtmfMode val dtmfModeKeys = arrayListOf(Api.DTMFMODE_RTP_EVENT, Api.DTMFMODE_SIP_INFO) val dtmfModeVals = arrayListOf(getString(R.string.dtmf_inband), getString(R.string.dtmf_info)) @@ -620,6 +629,16 @@ class AccountActivity : AppCompatActivity() { Log.e(TAG, "Setting of account_rtc_mux failed") } + if (rel100Check.isChecked != (acc.rel100Mode == Api.REL100_ENABLED)) { + val mode = if (rel100Check.isChecked) Api.REL100_ENABLED else Api.REL100_DISABLED + if (Api.account_set_rel100_mode(acc.accp, mode) == 0) { + acc.rel100Mode = Api.account_rel100_mode(acc.accp) + Log.d(TAG, "New rel100Mode is ${acc.rel100Mode}") + } else { + Log.e(TAG, "Setting of account_rel100Mode failed") + } + } + if (dtmfMode != acc.dtmfMode) { if (Api.account_set_dtmfmode(acc.accp, dtmfMode) == 0) { acc.dtmfMode = Api.account_dtmfmode(acc.accp) @@ -799,10 +818,10 @@ class AccountActivity : AppCompatActivity() { getString(R.string.media_encryption_help) ) } - binding.RtcpMuxTitle.setOnClickListener { + binding.Rel100Title.setOnClickListener { Utils.alertView( - this, getString(R.string.rtcp_mux), - getString(R.string.rtcp_mux_help) + this, getString(R.string.rel_100), + getString(R.string.rel_100_help) ) } binding.DtmfModeTitle.setOnClickListener { diff --git a/app/src/main/kotlin/com/tutpro/baresip/Api.kt b/app/src/main/kotlin/com/tutpro/baresip/Api.kt index fec2944f..5207af16 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Api.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Api.kt @@ -8,6 +8,9 @@ object Api { const val ANSWERMODE_AUTO = 2 const val DTMFMODE_RTP_EVENT = 0 const val DTMFMODE_SIP_INFO = 1 + const val REL100_DISABLED = 0 + const val REL100_ENABLED = 1 + // const cal REL100_REQUIRED = 2 const val SDP_INACTIVE = 0 const val SDP_RECVONLY = 1 @@ -48,6 +51,8 @@ object Api { external fun account_set_answermode(acc: Long, mode: Int): Int external fun account_sip_autoredirect(acc: Long): Boolean external fun account_set_sip_autoredirect(acc: Long, allow: Boolean) + external fun account_rel100_mode(acc: Long): Int + external fun account_set_rel100_mode(acc: Long, mode: Int): Int external fun account_rtcp_mux(acc: Long): Boolean external fun account_set_rtcp_mux(acc: Long, value: Boolean): Int external fun account_dtmfmode(acc: Long): Int diff --git a/app/src/main/res/layout/activity_account.xml b/app/src/main/res/layout/activity_account.xml index 73715109..70a39ac3 100644 --- a/app/src/main/res/layout/activity_account.xml +++ b/app/src/main/res/layout/activity_account.xml @@ -336,11 +336,37 @@ + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d6dbd761..a914faae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -170,6 +170,8 @@ If checked, offer to use IPv6 media protocol (if available) when media protocol of peer cannot be automatically determined. RTCP Multiplexing If checked, RTP and RTCP packets are multiplexed on a single port (RFC 5761). + Reliable Provisional Responses + If checked, indicate support for reliable provisional responses. DTMF Mode Selects how DTMF tones 0–9, #, *, and A-D are sent. In-band RTP Events From 75f26b9d38c00e02a25bcb29bb9c597cd0eb8124 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Sat, 23 Sep 2023 09:18:10 +0300 Subject: [PATCH 2/3] Removed garbage characters --- app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt index 0fe4f4c2..e5918bc8 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt @@ -193,7 +193,7 @@ class AccountActivity : AppCompatActivity() { if (text.isNotEmpty()) acc.stunServer = text "rtcp-mux" -> - it cacc.rtcpMux = text == "yes" + acc.rtcpMux = text == "yes" "100rel-mode" -> acc.rel100Mode = if (text == "yes") Api.REL100_ENABLED @@ -633,6 +633,7 @@ class AccountActivity : AppCompatActivity() { val mode = if (rel100Check.isChecked) Api.REL100_ENABLED else Api.REL100_DISABLED if (Api.account_set_rel100_mode(acc.accp, mode) == 0) { acc.rel100Mode = Api.account_rel100_mode(acc.accp) + Api.ua_update_account(ua.uap) Log.d(TAG, "New rel100Mode is ${acc.rel100Mode}") } else { Log.e(TAG, "Setting of account_rel100Mode failed") From 0129bb1277ae1ab981b15d51a7ec80b7e161d7d7 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Sat, 23 Sep 2023 09:30:41 +0300 Subject: [PATCH 3/3] Added and improved rel100 strings --- app/src/main/res/values-fi/strings.xml | 3 +++ app/src/main/res/values/strings.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index fb2f9643..e6530582 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -178,6 +178,9 @@ Jos merkitty, RTP- and RTCP-paketit multipleksataan samaan porttiin (RFC 5761). + Luotettavat alustavat vastaukset + Jos merkitty, kutsussa ilmoitetaan luotettavien alustavien vastausten + tukemisesta (RFC 3262). DTMF-moodi Valitsee tavan, miten DTMF-merkit 0–9, #, * ja A-D lähetetään. RTP diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a914faae..ba1e466a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -171,7 +171,7 @@ RTCP Multiplexing If checked, RTP and RTCP packets are multiplexed on a single port (RFC 5761). Reliable Provisional Responses - If checked, indicate support for reliable provisional responses. + If checked, indicate support for reliable provisional responses (RFC 3262). DTMF Mode Selects how DTMF tones 0–9, #, *, and A-D are sent. In-band RTP Events