From 306b25c2af392e680807a65ff0a998033115bd64 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Fri, 14 Apr 2023 11:58:30 +0300 Subject: [PATCH] Added 'Audio Delay' Audio Setting --- .../com/tutpro/baresip/AudioActivity.kt | 26 ++++++++ .../com/tutpro/baresip/BaresipService.kt | 1 + .../main/kotlin/com/tutpro/baresip/Config.kt | 4 ++ .../kotlin/com/tutpro/baresip/MainActivity.kt | 66 +++++++++---------- app/src/main/res/layout/activity_audio.xml | 30 +++++++++ app/src/main/res/layout/activity_config.xml | 2 +- app/src/main/res/values-fi/strings.xml | 4 ++ app/src/main/res/values/strings.xml | 4 ++ 8 files changed, 101 insertions(+), 36 deletions(-) diff --git a/app/src/main/kotlin/com/tutpro/baresip/AudioActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/AudioActivity.kt index a303425f..bbada35f 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/AudioActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/AudioActivity.kt @@ -18,6 +18,7 @@ class AudioActivity : AppCompatActivity() { private lateinit var opusBitRate: EditText private lateinit var opusPacketLoss: EditText private lateinit var aec: CheckBox + private lateinit var audioDelay: EditText private var save = false private var reload = false @@ -26,6 +27,7 @@ class AudioActivity : AppCompatActivity() { private var oldOpusBitrate = "" private var oldOpusPacketLoss = "" private var oldAec = false + private var oldAudioDelay = BaresipService.audioDelay.toString() private val audioModules = listOf("opus", "amr", "g722", "g7221", "g726", "g729", "g711") private val onBackPressedCallback = object : OnBackPressedCallback(true) { @@ -121,6 +123,9 @@ class AudioActivity : AppCompatActivity() { oldAec = aecCv.contains("webrtc_aecm.so") aec.isChecked = oldAec + audioDelay = binding.AudioDelay + audioDelay.setText(oldAudioDelay) + bindTitles() onBackPressedDispatcher.addCallback(this, onBackPressedCallback) @@ -219,6 +224,19 @@ class AudioActivity : AppCompatActivity() { save = true } + val audioDelay = audioDelay.text.toString().trim() + if (audioDelay != oldAudioDelay) { + if (!checkAudioDelay(audioDelay)) { + Utils.alertView(this, getString(R.string.notice), + String.format(getString(R.string.invalid_audio_delay), audioDelay)) + return false + } + Config.removeVariable("audio_delay") + Config.addLine("audio_delay $audioDelay") + BaresipService.audioDelay = audioDelay.toLong() + save = true + } + if (save) Config.save() if (reload) Api.reload_config() @@ -265,6 +283,10 @@ class AudioActivity : AppCompatActivity() { Utils.alertView(this, getString(R.string.aec), getString(R.string.aec_help)) } + binding.AudioDelayTitle.setOnClickListener { + Utils.alertView(this, getString(R.string.audio_delay), + getString(R.string.audio_delay_help)) + } } private fun checkOpusBitRate(opusBitRate: String): Boolean { @@ -277,4 +299,8 @@ class AudioActivity : AppCompatActivity() { return (number >= 0) && (number <= 100) } + private fun checkAudioDelay(audioDelay: String): Boolean { + val number = audioDelay.toIntOrNull() ?: return false + return (number >= 100) && (number <= 3000) + } } diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index 5b9b477c..ed687540 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -1474,6 +1474,7 @@ class BaresipService: Service() { var isConfigInitialized = false var libraryLoaded = false var callVolume = 0 + var audioDelay = if (VERSION.SDK_INT < 31) 1500L else 100L var dynDns = false var filesPath = "" var pName = "" diff --git a/app/src/main/kotlin/com/tutpro/baresip/Config.kt b/app/src/main/kotlin/com/tutpro/baresip/Config.kt index 147469bc..ddd95735 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Config.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Config.kt @@ -75,6 +75,10 @@ object Config { BaresipService.callVolume = variable("call_volume")[0].toInt() } + if (config.contains("audio_delay")) { + BaresipService.audioDelay = variable("audio_delay")[0].toLong() + } + if (config.contains("net_af")) BaresipService.addressFamily = variable("net_af")[0] diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt index 66712fa8..37b106b9 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt @@ -1886,45 +1886,27 @@ class MainActivity : AppCompatActivity() { hangupButton.visibility = View.VISIBLE hangupButton.isEnabled = true if (Build.VERSION.SDK_INT < 31) { + Log.d(TAG, "Setting audio mode to MODE_IN_COMMUNICATION") am.mode = AudioManager.MODE_IN_COMMUNICATION - callRunnable = Runnable { - callRunnable = null - if (!call(ua, uri)) { - callButton.visibility = View.VISIBLE - callButton.isEnabled = true - hangupButton.visibility = View.INVISIBLE - hangupButton.isEnabled = false - } - } - callHandler.postDelayed(callRunnable!!, 1500) + runCall(ua, uri) } else { - audioModeChangedListener = AudioManager.OnModeChangedListener { mode -> - if (mode == AudioManager.MODE_IN_COMMUNICATION) { - Log.d(TAG, "Audio mode changed to MODE_IN_COMMUNICATION using " + - "device ${am.communicationDevice!!.type}") - if (audioModeChangedListener != null) { - am.removeOnModeChangedListener(audioModeChangedListener!!) - audioModeChangedListener = null - } - if (!call(ua, uri)) { - callButton.visibility = View.VISIBLE - callButton.isEnabled = true - hangupButton.visibility = View.INVISIBLE - hangupButton.isEnabled = false - } - } else { - Log.d(TAG, "Audio mode changed to mode ${am.mode} using " + - "device ${am.communicationDevice!!.type}") - } - } if (am.mode == AudioManager.MODE_IN_COMMUNICATION) { - if (!call(ua, uri)) { - callButton.visibility = View.VISIBLE - callButton.isEnabled = true - hangupButton.visibility = View.INVISIBLE - hangupButton.isEnabled = false - } + runCall(ua, uri) } else { + audioModeChangedListener = AudioManager.OnModeChangedListener { mode -> + if (mode == AudioManager.MODE_IN_COMMUNICATION) { + Log.d(TAG, "Audio mode changed to MODE_IN_COMMUNICATION using " + + "device ${am.communicationDevice!!.type}") + if (audioModeChangedListener != null) { + am.removeOnModeChangedListener(audioModeChangedListener!!) + audioModeChangedListener = null + } + runCall(ua, uri) + } else { + Log.d(TAG, "Audio mode changed to mode ${am.mode} using " + + "device ${am.communicationDevice!!.type}") + } + } am.addOnModeChangedListener(mainExecutor, audioModeChangedListener!!) Log.d(TAG, "Setting audio mode to MODE_IN_COMMUNICATION") am.mode = AudioManager.MODE_IN_COMMUNICATION @@ -1939,6 +1921,20 @@ class MainActivity : AppCompatActivity() { } } + private fun runCall(ua: UserAgent, uri: String) { + callRunnable = Runnable { + callRunnable = null + if (!call(ua, uri)) { + am.mode = AudioManager.MODE_NORMAL + callButton.visibility = View.VISIBLE + callButton.isEnabled = true + hangupButton.visibility = View.INVISIBLE + hangupButton.isEnabled = false + } + } + callHandler.postDelayed(callRunnable!!, BaresipService.audioDelay) + } + private fun showCall(ua: UserAgent, showCall: Call? = null) { val call = showCall ?: ua.currentCall() if (call == null) { diff --git a/app/src/main/res/layout/activity_audio.xml b/app/src/main/res/layout/activity_audio.xml index 2c5d68ee..2cda463a 100644 --- a/app/src/main/res/layout/activity_audio.xml +++ b/app/src/main/res/layout/activity_audio.xml @@ -146,6 +146,36 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_config.xml b/app/src/main/res/layout/activity_config.xml index cc08e9ee..5e40dc1c 100644 --- a/app/src/main/res/layout/activity_config.xml +++ b/app/src/main/res/layout/activity_config.xml @@ -232,7 +232,7 @@ android:id="@+id/AudioSettingsTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginBottom="12dp" + android:layout_marginBottom="18dp" android:textSize="18sp" android:textStyle="bold" android:text="@string/audio_settings" > diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 30d514b0..f9a552ad 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -377,6 +377,10 @@ ei ole käytössä. Virheellinen Opus-koodekin bittinopeus Virheellinen Opus-koodekin odotettu pakettihäviö + Audioviive + Audion odotusviive (millisekunneissa) soitetun puhelun alkaessa. + Aseta korkeampi arvo, jos et kuule vastaajan ääntä heti, kun puhelu alkaa. + Virheellinen audioviive \'%1$s\'. Sallittu arvo on välillä 100–3000. Oletus äänen voimakkuus Jos valittu, puhelun äänen voimakkuus asteikolla 1–10. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bd5d7e56..286a0199 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -354,6 +354,10 @@ 0 Invalid Opus bitrate Invalid Opus Packet Loss Percentage + Audio Delay + Time (in milliseconds) to wait audio from callee when call is established. + Set to a higher value if you miss audio from callee at the beginning of the call. + Invalid Audio Delay \'%1$s\'. Valid values are from 100 to 3000. Default Call Volume If set, default call audio volume at scale 1–10. Dark Theme