diff --git a/android/app/src/main/java/com/wzp/audio/AudioPipeline.kt b/android/app/src/main/java/com/wzp/audio/AudioPipeline.kt index 841194f..568cbfa 100644 --- a/android/app/src/main/java/com/wzp/audio/AudioPipeline.kt +++ b/android/app/src/main/java/com/wzp/audio/AudioPipeline.kt @@ -57,7 +57,7 @@ class AudioPipeline(private val context: Context) { /** Whether to attach hardware AEC. Must be set before start(). */ var aecEnabled: Boolean = true /** Enable debug recording of PCM + RMS histogram to cache dir. */ - var debugRecording: Boolean = true + var debugRecording: Boolean = false private var captureThread: Thread? = null private var playoutThread: Thread? = null diff --git a/android/app/src/main/java/com/wzp/data/SettingsRepository.kt b/android/app/src/main/java/com/wzp/data/SettingsRepository.kt index 5a4cef5..3fc32d0 100644 --- a/android/app/src/main/java/com/wzp/data/SettingsRepository.kt +++ b/android/app/src/main/java/com/wzp/data/SettingsRepository.kt @@ -28,6 +28,7 @@ class SettingsRepository(context: Context) { private const val KEY_PREFER_IPV6 = "prefer_ipv6" private const val KEY_IDENTITY_SEED = "identity_seed_hex" private const val KEY_AEC_ENABLED = "aec_enabled" + private const val KEY_DEBUG_RECORDING = "debug_recording" private const val KEY_RECENT_ROOMS = "recent_rooms" private const val TOFU_PREFIX = "tofu_" } @@ -120,6 +121,11 @@ class SettingsRepository(context: Context) { fun saveAecEnabled(enabled: Boolean) { prefs.edit().putBoolean(KEY_AEC_ENABLED, enabled).apply() } fun loadAecEnabled(): Boolean = prefs.getBoolean(KEY_AEC_ENABLED, true) + // --- Debug recording --- + + fun saveDebugRecording(enabled: Boolean) { prefs.edit().putBoolean(KEY_DEBUG_RECORDING, enabled).apply() } + fun loadDebugRecording(): Boolean = prefs.getBoolean(KEY_DEBUG_RECORDING, false) + // --- Identity seed --- /** diff --git a/android/app/src/main/java/com/wzp/ui/call/CallViewModel.kt b/android/app/src/main/java/com/wzp/ui/call/CallViewModel.kt index 7772f93..a677a75 100644 --- a/android/app/src/main/java/com/wzp/ui/call/CallViewModel.kt +++ b/android/app/src/main/java/com/wzp/ui/call/CallViewModel.kt @@ -105,6 +105,9 @@ class CallViewModel : ViewModel(), WzpCallback { private val _aecEnabled = MutableStateFlow(true) val aecEnabled: StateFlow = _aecEnabled.asStateFlow() + private val _debugRecording = MutableStateFlow(false) + val debugRecording: StateFlow = _debugRecording.asStateFlow() + /** True when a call just ended and debug report can be sent. */ private val _debugReportAvailable = MutableStateFlow(false) val debugReportAvailable: StateFlow = _debugReportAvailable.asStateFlow() @@ -159,6 +162,7 @@ class CallViewModel : ViewModel(), WzpCallback { _captureGainDb.value = s.loadCaptureGain() _seedHex.value = s.getOrCreateSeedHex() _aecEnabled.value = s.loadAecEnabled() + _debugRecording.value = s.loadDebugRecording() _recentRooms.value = s.loadRecentRooms() } @@ -288,6 +292,11 @@ class CallViewModel : ViewModel(), WzpCallback { settings?.saveAecEnabled(enabled) } + fun setDebugRecording(enabled: Boolean) { + _debugRecording.value = enabled + settings?.saveDebugRecording(enabled) + } + /** * Resolve DNS hostname to IP address on the Kotlin/Android side, * since Rust's DNS resolution may not work on Android. @@ -476,6 +485,7 @@ class CallViewModel : ViewModel(), WzpCallback { it.playoutGainDb = _playoutGainDb.value it.captureGainDb = _captureGainDb.value it.aecEnabled = _aecEnabled.value + it.debugRecording = _debugRecording.value it.start(e) } audioRouteManager?.register() diff --git a/scripts/build-android-docker.sh b/scripts/build-android-docker.sh index bea4c1a..9a981f7 100755 --- a/scripts/build-android-docker.sh +++ b/scripts/build-android-docker.sh @@ -41,7 +41,7 @@ LOCAL_OUTPUT_DIR="target/android-apk" PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" LOCAL_KEYSTORE_DIR="$PROJECT_DIR/android/keystore" -SSH_OPTS="-o ConnectTimeout=10 -o LogLevel=ERROR" +SSH_OPTS="-o ConnectTimeout=10 -o LogLevel=ERROR -o ServerAliveInterval=15 -o ServerAliveCountMax=4" # --------------------------------------------------------------------------- # Helpers