diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/NativeLib.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/NativeLib.kt index 0d71dfc7..ce7021be 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/NativeLib.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/NativeLib.kt @@ -292,6 +292,7 @@ object NativeLib { // dBFS, valid, RX-блокировка, вероятность речи 0..1, vadValid, усиление VAD в dB, компрессор VAD включён. fun radioInputStatus(): FloatArray = nativeRadioInputStatus() fun radioCaptureStop() { nativeRadioCaptureStop() } + fun radioCaptureDiscontinuity(groupId: Long) { nativeRadioCaptureDiscontinuity(groupId) } fun radioTransmitting(): Boolean = nativeRadioTransmitting() fun radioAutoMode(): Int = nativeRadioAutoMode() fun radioTalkBegin(groupId: Long) { nativeRadioTalkBegin(groupId) } @@ -423,6 +424,7 @@ object NativeLib { private external fun nativeRadioConfigure(requestId: Long, settings: IntArray): Boolean private external fun nativeRadioInputStatus(): FloatArray private external fun nativeRadioCaptureStop() + private external fun nativeRadioCaptureDiscontinuity(groupId: Long) private external fun nativeRadioTransmitting(): Boolean private external fun nativeRadioAutoMode(): Int private external fun nativeRadioTalkBegin(groupId: Long) diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/RadioAudioEngine.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/RadioAudioEngine.kt index 1148bda8..394821a6 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/RadioAudioEngine.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/RadioAudioEngine.kt @@ -656,6 +656,8 @@ class RadioAudioEngine { } private fun captureLoop(subscription: MicrophoneCapture.Subscription, group: Long, ch: Int) { + var expected = -1L + var discontinuity = false var frameN = 0L var reportedRequestNs = 0L var statsMs = SystemClock.elapsedRealtime() @@ -678,6 +680,14 @@ class RadioAudioEngine { continue } val captured = event as MicrophoneCapture.Frame + val ageNs = System.nanoTime() - captured.createdNs + if (ageNs > 100_000_000) { + if (!discontinuity) LogManager.addLog("WARN", "radio", "stale capture group=$group ageMs=${ageNs / 1_000_000}") + discontinuity = true + continue + } + if (discontinuity || (expected >= 0 && captured.sequence != expected)) NativeLib.radioCaptureDiscontinuity(group) + discontinuity = false; expected = captured.sequence + FRAME_SAMPLES val buf = captured.pcm maxReadNs = maxOf(maxReadNs, SystemClock.elapsedRealtimeNanos() - readStartedNs) val inputDb = rmsDb(buf) diff --git a/tools/chatgui-android/jni_bridge/android_jni_bridge.c b/tools/chatgui-android/jni_bridge/android_jni_bridge.c index d871b6f9..aa46d5ff 100644 --- a/tools/chatgui-android/jni_bridge/android_jni_bridge.c +++ b/tools/chatgui-android/jni_bridge/android_jni_bridge.c @@ -2882,6 +2882,12 @@ JNIEXPORT void JNICALL Java_com_utun_chat_data_NativeLib_nativeRadioCaptureStop( radio_audio_capture_stop(); } +JNIEXPORT void JNICALL Java_com_utun_chat_data_NativeLib_nativeRadioCaptureDiscontinuity( + JNIEnv* env, jobject thiz, jlong groupId) { + (void)env; (void)thiz; + radio_audio_capture_discontinuity((uint64_t)groupId); +} + JNIEXPORT jboolean JNICALL Java_com_utun_chat_data_NativeLib_nativeRadioAudioFeed( JNIEnv* env, jobject thiz, jlong groupId, jshortArray samples) { (void)thiz;