- Moved audio settings to its own activity.

- Added AEC Extented Filter audio setting.
This commit is contained in:
Juha Heinanen
2020-07-06 17:46:25 +03:00
parent 3facd3adee
commit 83f311f21c
8 changed files with 285 additions and 258 deletions

View File

@ -83,6 +83,12 @@
android:label="@string/configuration"
android:parentActivityName=".MainActivity" >
</activity>
<activity
android:name=".AudioActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/audio"
android:parentActivityName=".ConfigActivity" >
</activity>
<activity
android:name=".CallsActivity"
android:configChanges="orientation|keyboardHidden|screenSize"

View File

@ -47,6 +47,7 @@ opus_inbandfec yes
opus_application voip
opus_stereo no
opus_sprop_stereo no
webrtc_aec_extended_filter yes
ice_turn no
ice_nomination regular
zrtp_hash yes

View File

@ -0,0 +1,253 @@
package com.tutpro.baresip
import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.TypedValue
import android.view.Gravity
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.*
class AudioActivity : AppCompatActivity() {
internal lateinit var opusBitRate: EditText
internal lateinit var opusPacketLoss: EditText
internal lateinit var aec: CheckBox
internal lateinit var extentedFilter: CheckBox
private var save = false
private var reload = false
private var oldAudioModules = mutableMapOf<String, Boolean>()
private var oldOpusBitrate = ""
private var oldOpusPacketLoss = ""
private var oldAec = false
private var oldExtendedFilter = false
private val audioModules = listOf("opus", "amr", "ilbc", "g722", "g7221", "g726", "g711")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_audio)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
val audioModulesList = findViewById(R.id.AudioModulesList) as LinearLayout
var id = 1000
for (module in audioModules) {
val rl = RelativeLayout(this)
val rlParams = RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT)
rlParams.marginStart = 16
rl.layoutParams = rlParams
val tv = TextView(this)
tv.id = id++
val tvParams = RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT)
tvParams.addRule(RelativeLayout.ALIGN_PARENT_START)
tvParams.addRule(RelativeLayout.CENTER_VERTICAL)
tvParams.addRule(RelativeLayout.START_OF, id)
tv.layoutParams = tvParams
tv.text = "\u2022 $module"
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f)
tv.setTextColor(Color.BLACK)
rl.addView(tv)
val cb = CheckBox(this)
cb.id = id++
val cbParams = RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT)
cbParams.addRule(RelativeLayout.ALIGN_PARENT_END)
cbParams.addRule(RelativeLayout.CENTER_VERTICAL)
cb.layoutParams = cbParams
cb.gravity = Gravity.END
cb.isChecked = Config.variable("module $module.so").size > 0
oldAudioModules.put(module, cb.isChecked)
rl.addView(cb)
audioModulesList.addView(rl)
}
opusBitRate = findViewById(R.id.OpusBitRate) as EditText
val obCv = Config.variable("opus_bitrate")
oldOpusBitrate = if (obCv.size == 0) "28000" else obCv[0]
opusBitRate.setText(oldOpusBitrate)
opusPacketLoss = findViewById(R.id.OpusPacketLoss) as EditText
val oplCv = Config.variable("opus_packet_loss")
oldOpusPacketLoss = if (oplCv.size == 0) "0" else oplCv[0]
opusPacketLoss.setText(oldOpusPacketLoss)
aec = findViewById(R.id.Aec) as CheckBox
val aecCv = Config.variable("module")
oldAec = aecCv.contains("webrtc_aec.so")
aec.isChecked = oldAec
extentedFilter = findViewById(R.id.ExtendedFilter) as CheckBox
oldExtendedFilter = Config.variable("webrtc_aec_extended_filter")[0] == "yes"
extentedFilter.isChecked = oldExtendedFilter
Utils.addActivity("audio")
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
super.onCreateOptionsMenu(menu)
val inflater = menuInflater
inflater.inflate(R.menu.check_icon, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (BaresipService.activities.indexOf("audio") == -1)
return true
when (item.itemId) {
R.id.checkIcon -> {
var id = 1001
for (module in audioModules) {
val box = findViewById<CheckBox>(id++)
if (box.isChecked && !oldAudioModules[module]!!) {
if (Api.module_load("$module.so") != 0) {
Utils.alertView(this, getString(R.string.error),
"${getString(R.string.failed_to_load_module)}: $module.so")
return false
}
Config.addLine("module $module.so")
save = true
}
if (!box.isChecked && oldAudioModules[module]!!) {
Api.module_unload("$module.so")
Config.removeLine("module $module.so")
for (ua in UserAgent.uas()) ua.account.removeAudioCodecs(module)
AccountsActivity.saveAccounts()
save = true
}
id++
}
val opusBitRate = opusBitRate.text.toString().trim()
if (opusBitRate != oldOpusBitrate) {
if (!checkOpusBitRate(opusBitRate)) {
Utils.alertView(this, getString(R.string.notice),
"${getString(R.string.invalid_opus_bitrate)}: $opusBitRate.")
return false
}
Config.removeVariable("opus_bitrate")
Config.addLine("opus_bitrate $opusBitRate")
reload = true
save = true
}
val opusPacketLoss = opusPacketLoss.text.toString().trim()
if (opusPacketLoss != oldOpusPacketLoss) {
if (!checkOpusPacketLoss(opusPacketLoss)) {
Utils.alertView(this, getString(R.string.notice),
"${getString(R.string.invalid_opus_packet_loss)}: $opusPacketLoss")
return false
}
Config.removeVariable("opus_inbandfec")
Config.removeVariable("opus_packet_loss")
if (opusPacketLoss != "0") {
Config.addLine("opus_inbandfec yes")
Config.addLine("opus_packet_loss $opusPacketLoss")
}
reload = true
save = true
}
if (aec.isChecked != oldAec) {
Config.removeLine("module webrtc_aec.so")
if (aec.isChecked) {
Config.addLine("module webrtc_aec.so")
if (Api.module_load("webrtc_aec.so") != 0) {
Utils.alertView(this, getString(R.string.error),
getString(R.string.failed_to_load_module))
aec.isChecked = false
return false
}
} else {
Api.module_unload("webrtc_aec.so")
}
save = true
}
if (extentedFilter.isChecked != oldExtendedFilter) {
Config.removeVariable("webrtc_aec_extended_filter")
if (extentedFilter.isChecked)
Config.addLine("webrtc_aec_extended_filter yes")
else
Config.addLine("webrtc_aec_extended_filter no")
reload = true
save = true
}
if (save) Config.save()
if (reload) Api.reload_config()
BaresipService.activities.remove("audio")
finish()
return true
}
android.R.id.home -> {
onBackPressed()
return true
}
}
return super.onOptionsItemSelected(item)
}
override fun onBackPressed() {
BaresipService.activities.remove("audio")
finish()
super.onBackPressed()
}
fun onClick(v: View) {
when (v) {
findViewById(R.id.AudioModulesTitle) as TextView -> {
Utils.alertView(this, getString(R.string.audio_modules_title),
getString(R.string.audio_modules_help))
}
findViewById(R.id.OpusBitRateTitle) as TextView-> {
Utils.alertView(this, getString(R.string.opus_bit_rate),
getString(R.string.opus_bit_rate_help))
}
findViewById(R.id.OpusPacketLossTitle) as TextView-> {
Utils.alertView(this, getString(R.string.opus_packet_loss),
getString(R.string.opus_packet_loss_help))
}
findViewById(R.id.AecTitle) as TextView-> {
Utils.alertView(this, getString(R.string.aec),
getString(R.string.aec_help))
}
findViewById(R.id.ExtendedFilterTitle) as TextView-> {
Utils.alertView(this, getString(R.string.aec),
getString(R.string.aec_extented_filter_help))
}
}
}
private fun checkOpusBitRate(opusBitRate: String): Boolean {
val number = opusBitRate.toIntOrNull()
if (number == null) return false
return (number >= 6000) && (number <= 510000)
}
private fun checkOpusPacketLoss(opusPacketLoss: String): Boolean {
val number = opusPacketLoss.toIntOrNull()
if (number == null) return false
return (number >= 0) && (number <= 100)
}
}

View File

@ -47,6 +47,10 @@ object Config {
config = "${config}opus_sprop_stereo no\n"
}
if (!config.contains("webrtc_aec_extended_filter")) {
config = "${config}webrtc_aec_extended_filter yes\n"
}
if (!config.contains("log_level")) {
config = "${config}log_level 2\n"
Log.logLevel = Log.LogLevel.WARN

View File

@ -22,9 +22,6 @@ class ConfigActivity : AppCompatActivity() {
internal lateinit var dnsServers: EditText
internal lateinit var certificateFile: CheckBox
internal lateinit var caFile: CheckBox
internal lateinit var aec: CheckBox
internal lateinit var opusBitRate: EditText
internal lateinit var opusPacketLoss: EditText
internal lateinit var debug: CheckBox
internal lateinit var reset: CheckBox
@ -33,15 +30,10 @@ class ConfigActivity : AppCompatActivity() {
private var oldDnsServers = ""
private var oldCertificateFile = false
private var oldCAFile = false
private var oldAudioModules = mutableMapOf<String, Boolean>()
private var oldAec = false
private var oldOpusBitrate = ""
private var oldOpusPacketLoss = ""
private var oldLogLevel = ""
private var callVolume = BaresipService.callVolume
private var save = false
private var restart = false
private val audioModules = listOf("opus", "amr", "ilbc", "g722", "g7221", "g726", "g711")
private var menu: Menu? = null
private val READ_CERT_PERMISSION_CODE = 1
@ -84,52 +76,6 @@ class ConfigActivity : AppCompatActivity() {
oldCAFile = Config.variable("sip_cafile").isNotEmpty()
caFile.isChecked = oldCAFile
val audioModulesList = findViewById(R.id.AudioModulesList) as LinearLayout
var id = 1000
for (module in audioModules) {
val rl = RelativeLayout(this)
val rlParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
rlParams.marginStart = 16
rl.layoutParams = rlParams
val tv = TextView(this)
tv.id = id++
val tvParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
tvParams.addRule(RelativeLayout.ALIGN_PARENT_START)
tvParams.addRule(RelativeLayout.CENTER_VERTICAL)
tvParams.addRule(RelativeLayout.START_OF, id)
tv.layoutParams = tvParams
tv.text = "\u2022 $module"
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f)
tv.setTextColor(Color.BLACK)
rl.addView(tv)
val cb = CheckBox(this)
cb.id = id++
val cbParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
cbParams.addRule(RelativeLayout.ALIGN_PARENT_END)
cbParams.addRule(RelativeLayout.CENTER_VERTICAL)
cb.layoutParams = cbParams
cb.gravity = Gravity.END
cb.isChecked = Config.variable("module $module.so").size > 0
oldAudioModules.put(module, cb.isChecked)
rl.addView(cb)
audioModulesList.addView(rl)
}
aec = findViewById(R.id.Aec) as CheckBox
val aecCv = Config.variable("module")
oldAec = aecCv.contains("webrtc_aec.so")
aec.isChecked = oldAec
opusBitRate = findViewById(R.id.OpusBitRate) as EditText
val obCv = Config.variable("opus_bitrate")
oldOpusBitrate = if (obCv.size == 0) "28000" else obCv[0]
opusBitRate.setText(oldOpusBitrate)
opusPacketLoss = findViewById(R.id.OpusPacketLoss) as EditText
val oplCv = Config.variable("opus_packet_loss")
oldOpusPacketLoss = if (oplCv.size == 0) "0" else oplCv[0]
opusPacketLoss.setText(oldOpusPacketLoss)
val callVolSpinner = findViewById(R.id.VolumeSpinner) as Spinner
val volKeys = arrayListOf("None", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10")
val volVals = arrayListOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
@ -280,73 +226,6 @@ class ConfigActivity : AppCompatActivity() {
restart = true
}
var id = 1001
for (module in audioModules) {
val box = findViewById<CheckBox>(id++)
if (box.isChecked && !oldAudioModules[module]!!) {
if (Api.module_load("$module.so") != 0) {
Utils.alertView(this, getString(R.string.error),
"${getString(R.string.failed_to_load_module)}: $module.so")
return false
}
Config.addLine("module $module.so")
save = true
}
if (!box.isChecked && oldAudioModules[module]!!) {
Api.module_unload("$module.so")
Config.removeLine("module $module.so")
for (ua in UserAgent.uas()) ua.account.removeAudioCodecs(module)
AccountsActivity.saveAccounts()
save = true
}
id++
}
if (aec.isChecked != oldAec) {
Config.removeLine("module webrtc_aec.so")
if (aec.isChecked) {
Config.addLine("module webrtc_aec.so")
if (Api.module_load("webrtc_aec.so") != 0) {
Utils.alertView(this, getString(R.string.error),
getString(R.string.failed_to_load_module))
aec.isChecked = false
return false
}
} else {
Api.module_unload("webrtc_aec.so")
}
save = true
}
val opusBitRate = opusBitRate.text.toString().trim()
if (opusBitRate != oldOpusBitrate) {
if (!checkOpusBitRate(opusBitRate)) {
Utils.alertView(this, getString(R.string.notice),
"${getString(R.string.invalid_opus_bitrate)}: $opusBitRate.")
return false
}
Config.removeVariable("opus_bitrate")
Config.addLine("opus_bitrate $opusBitRate")
save = true
restart = true
}
val opusPacketLoss = opusPacketLoss.text.toString().trim()
if (opusPacketLoss != oldOpusPacketLoss) {
if (!checkOpusPacketLoss(opusPacketLoss)) {
Utils.alertView(this, getString(R.string.notice),
"${getString(R.string.invalid_opus_packet_loss)}: $opusPacketLoss")
return false
}
Config.removeVariable("opus_inbandfec")
Config.removeVariable("opus_packet_loss")
if (opusPacketLoss != "0") {
Config.addLine("opus_inbandfec yes")
Config.addLine("opus_packet_loss $opusPacketLoss")
}
save = true
restart = true
}
if (BaresipService.callVolume != callVolume) {
BaresipService.callVolume = callVolume
@ -447,21 +326,9 @@ class ConfigActivity : AppCompatActivity() {
Utils.alertView(this, getString(R.string.tls_ca_file),
getString(R.string.tls_ca_file_help))
}
findViewById(R.id.AudioModulesTitle) as TextView -> {
Utils.alertView(this, getString(R.string.audio_modules_title),
getString(R.string.audio_modules_help))
}
findViewById(R.id.AecTitle) as TextView-> {
Utils.alertView(this, getString(R.string.aec),
getString(R.string.aec_help))
}
findViewById(R.id.OpusBitRateTitle) as TextView-> {
Utils.alertView(this, getString(R.string.opus_bit_rate),
getString(R.string.opus_bit_rate_help))
}
findViewById(R.id.OpusPacketLossTitle) as TextView-> {
Utils.alertView(this, getString(R.string.opus_packet_loss),
getString(R.string.opus_packet_loss_help))
findViewById(R.id.AudioTitle) as TextView -> {
val i = Intent(this, AudioActivity::class.java)
startActivity(i)
}
findViewById(R.id.VolumeTitle) as TextView-> {
Utils.alertView(this, getString(R.string.default_call_volume),
@ -484,18 +351,6 @@ class ConfigActivity : AppCompatActivity() {
return true
}
private fun checkOpusBitRate(opusBitRate: String): Boolean {
val number = opusBitRate.toIntOrNull()
if (number == null) return false
return (number >= 6000) && (number <= 510000)
}
private fun checkOpusPacketLoss(opusPacketLoss: String): Boolean {
val number = opusPacketLoss.toIntOrNull()
if (number == null) return false
return (number >= 0) && (number <= 100)
}
private fun addMissingPorts(addressList: String): String {
if (addressList == "") return ""
var result = ""

View File

@ -140,117 +140,17 @@
</CheckBox>
</RelativeLayout>
<RelativeLayout
<TextView
android:id="@+id/AudioTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:orientation="vertical" >
<TextView
android:id="@+id/AudioModulesTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="@android:color/black"
android:onClick="onClick"
android:text="@string/audio_modules_title" >
</TextView>
<LinearLayout
android:id="@+id/AudioModulesList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="24dp"
android:orientation="vertical" >
</LinearLayout>
</RelativeLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp" >
<TextView
android:id="@+id/AecTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_toStartOf="@id/Aec"
android:textSize="18sp"
android:textColor="@android:color/black"
android:onClick="onClick"
android:text="@string/aec" >
</TextView>
<CheckBox
android:id="@+id/Aec"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_gravity="end"
android:checked="false" >
</CheckBox>
</RelativeLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="0dp"
android:orientation="horizontal" >
<TextView
android:id="@+id/OpusBitRateTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:textSize="18sp"
android:textColor="@android:color/black"
android:onClick="onClick"
android:text="@string/opus_bit_rate" >
</TextView>
<EditText
android:id="@+id/OpusBitRate"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_centerVertical="true"
android:layout_toEndOf="@+id/OpusBitRateTitle"
android:layout_marginStart="10dp"
android:textSize="18sp"
android:scrollHorizontally="true"
android:inputType="numberDecimal"
android:hint="@string/_28000"
android:importantForAutofill="no" >
</EditText>
</RelativeLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:orientation="horizontal" >
<TextView
android:id="@+id/OpusPacketLossTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:textSize="18sp"
android:textColor="@android:color/black"
android:onClick="onClick"
android:text="@string/opus_packet_loss" >
</TextView>
<EditText
android:id="@+id/OpusPacketLoss"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_centerVertical="true"
android:layout_toEndOf="@+id/OpusPacketLossTitle"
android:layout_marginStart="10dp"
android:textSize="18sp"
android:scrollHorizontally="true"
android:inputType="numberDecimal"
android:hint="@string/_0"
android:importantForAutofill="no" >
</EditText>
</RelativeLayout>
android:layout_marginBottom="16dp"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="@android:color/black"
android:onClick="onClick"
android:text="@string/audio" >
</TextView>
<RelativeLayout
android:layout_width="wrap_content"

View File

@ -230,13 +230,18 @@
TLS-varmenninauktoriteettien julkiset varmentimen, on joko jo ladattu tai tullaan lataamaan
Download-hakemistosta.
</string>
<string name="audio">Audio</string>
<string name="audio_modules_title">Audio-modulit</string>
<string name="audio_modules_help">Merkittyjen modulien tarjoamat audio-koodekit ovat tilien
käytettävissä.
</string>
<string name="failed_to_load_module">Modulin lataaminen epäonnistui.</string>
<string name="aec">Akustinen kaiun poisto</string>
<string name="aec">Akustinen kaiun poisto (AKP)</string>
<string name="aec_help">Jos merkitty, kaikua yritetään poistaa puheluiden aikana.</string>
<string name="aec_extented_filter">AKP laajennettu suodatin</string>
<string name="aec_extented_filter_help">Jos merkitty, kaiun poistossa käytetään laajennettua
suodatinta.
</string>
<string name="opus_bit_rate">Opus-koodekin bittinopeus</string>
<string name="opus_bit_rate_help">Opus-koodekin käyttämä
keskimääräinen enimmäisnopeus. Mahdollisia arvoja ovat

View File

@ -200,12 +200,15 @@
<string name="tls_ca_file">TLS CA File</string>
<string name="tls_ca_file_help">If checked, file \'ca_certs.crt\' containing TLS certificates
of Certificate Authorities has been or will be loaded from Download directory.</string>
<string name="audio">Audio</string>
<string name="audio_modules_title">Audio Modules</string>
<string name="audio_modules_help">Audio codecs provided by the checked modules are
available for use by the accounts.</string>
<string name="failed_to_load_module">Failed to load module.</string>
<string name="aec">Acoustic Echo Cancellation</string>
<string name="aec_help">If checked, echo cancellation is attempted on call audio.</string>
<string name="aec_extented_filter">AEC Extented Filter</string>
<string name="aec_extented_filter_help">If checked, echo cancellation is using extended filter.</string>
<string name="opus_bit_rate">Opus Bit Rate</string>
<string name="opus_bit_rate_help">Average maximum bit rate used by Opus audio stream.
Valid values are 6000-510000. Factory default is 28000.</string>