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