Expose the adaptive call video range in Android audio settings
This commit is contained in:
1 parent
cc341221d4
commit
6980bc7a88
3 files changed
+43
No files matched your search
@@ -1,6 +1,7 @@
|
||||
package com.utun.chat.ui.screens
|
||||
|
||||
import com.utun.chat.R
|
||||
import kotlin.math.roundToInt
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.Canvas
|
||||
@@ -35,6 +36,7 @@ import com.utun.chat.data.RadioOverlayService
|
||||
import com.utun.chat.data.RadioAudioEngine
|
||||
import com.utun.chat.data.RadioAutoSettings
|
||||
import com.utun.chat.data.ConfigProvider
|
||||
import com.utun.chat.data.CallVideoBitrateRange
|
||||
import com.utun.chat.data.MicrophonePermission
|
||||
import com.utun.chat.data.LogManager
|
||||
import com.utun.chat.data.ServerEntry
|
||||
@@ -903,6 +905,11 @@ private fun AudioSettingsTab(vm: ChatViewModel) {
|
||||
var presetExpanded by remember { mutableStateOf(false) }
|
||||
|
||||
var jitterReserveMs by remember { mutableStateOf(provider.getInt("chat.call_jitter_max_reserve_ms")) }
|
||||
val savedVideoRange = remember { provider.getCallVideoBitrateRange() }
|
||||
var videoMinimum by rememberSaveable { mutableIntStateOf(savedVideoRange.minimum) }
|
||||
var videoMaximum by rememberSaveable { mutableIntStateOf(savedVideoRange.maximum) }
|
||||
var videoRangeSaving by remember { mutableStateOf(false) }
|
||||
var videoRangeSaveFailed by remember { mutableStateOf(false) }
|
||||
|
||||
/* Все параметры восстанавливаются из одного снимка DataStore. */
|
||||
var compressorOn by remember { mutableStateOf(savedVoiceSettings.compressorEnabled) }
|
||||
@@ -1035,6 +1042,34 @@ private fun AudioSettingsTab(vm: ChatViewModel) {
|
||||
}
|
||||
)
|
||||
|
||||
Text(stringResource(R.string.call_video_bitrate_range), style = MaterialTheme.typography.titleMedium)
|
||||
Text(stringResource(R.string.call_video_bitrate_range_value, videoMinimum, videoMaximum))
|
||||
Text(stringResource(R.string.call_video_bitrate_range_hint), style = MaterialTheme.typography.bodySmall)
|
||||
RangeSlider(
|
||||
value = videoMinimum.toFloat()..videoMaximum.toFloat(),
|
||||
onValueChange = { videoMinimum = it.start.roundToInt(); videoMaximum = it.endInclusive.roundToInt() },
|
||||
valueRange = 300f..4000f,
|
||||
steps = 36,
|
||||
enabled = !videoRangeSaving,
|
||||
onValueChangeFinished = {
|
||||
val range = CallVideoBitrateRange(videoMinimum, videoMaximum)
|
||||
videoRangeSaving = true
|
||||
videoRangeSaveFailed = false
|
||||
vm.viewModelScope.launch {
|
||||
try {
|
||||
provider.saveCallVideoBitrateRange(range)
|
||||
NativeLib.setChatSetting("call_video_bitrate_range_kbps", range.encode())
|
||||
} catch (e: IOException) {
|
||||
videoRangeSaveFailed = true
|
||||
LogManager.addLog("ERROR", "CallSettings", "Video bitrate range save failed: $range: $e")
|
||||
} finally {
|
||||
videoRangeSaving = false
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
if (videoRangeSaveFailed) Text(stringResource(R.string.call_video_bitrate_range_save_failed), color = MaterialTheme.colorScheme.error)
|
||||
|
||||
/* ── Voice Compressor ── */
|
||||
Text(stringResource(R.string.voice_compressor), style = MaterialTheme.typography.titleMedium)
|
||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||
|
||||
@@ -282,6 +282,10 @@
|
||||
<string name="test">"Проверить"</string>
|
||||
<string name="voice_codec_quality">"Качество голосового кодека"</string>
|
||||
<string name="call_max_jitter_reserve">"Звонки: максимальный запас джиттер-буфера"</string>
|
||||
<string name="call_video_bitrate_range">Звонки: диапазон битрейта видео</string>
|
||||
<string name="call_video_bitrate_range_value">%1$d–%2$d кбит/с</string>
|
||||
<string name="call_video_bitrate_range_hint">Битрейт видео подстраивается под связь в заданном диапазоне. По умолчанию: 300–4000 кбит/с.</string>
|
||||
<string name="call_video_bitrate_range_save_failed">Не удалось сохранить диапазон битрейта видеозвонка. Попробуйте ещё раз.</string>
|
||||
<string name="call_jitter_hint">"%1$s с · применяется к следующему звонку"</string>
|
||||
<string name="voice_compressor">"Голосовой компрессор"</string>
|
||||
<string name="lookback_time">"Время анализа:"</string>
|
||||
|
||||
@@ -283,6 +283,10 @@
|
||||
<string name="test">"Test"</string>
|
||||
<string name="voice_codec_quality">"Voice codec quality"</string>
|
||||
<string name="call_max_jitter_reserve">"Calls: maximum jitter buffer reserve"</string>
|
||||
<string name="call_video_bitrate_range">Calls: video bitrate range</string>
|
||||
<string name="call_video_bitrate_range_value">%1$d–%2$d kbit/s</string>
|
||||
<string name="call_video_bitrate_range_hint">Video bitrate adapts to the connection within this range. Default: 300–4000 kbit/s.</string>
|
||||
<string name="call_video_bitrate_range_save_failed">Could not save the call video bitrate range. Try again.</string>
|
||||
<string name="call_jitter_hint">"%1$s s · applies to the next call"</string>
|
||||
<string name="voice_compressor">"Voice compressor"</string>
|
||||
<string name="lookback_time">"Lookback time:"</string>
|
||||
|
||||
Reference in new issue
Block a user