Improve Android VAD lifecycle, audio settings and diagnostics

This commit is contained in:
evgeny committed 2026-10-04 14:36:52 +02:00
1 parent 20a1211e09
commit 123b47c612
24 files changed
+490 -127

No files matched your search

+45
View File
@@ -245,6 +245,50 @@ static void test_prefetch_deferred(UTUN_INSTANCE* instance) {
debug_set_category_level(DEBUG_CATEGORY_RADIO, DEBUG_LEVEL_NONE);
}
static std::vector<std::string> diagnostic_messages;
static void capture_diagnostic(int, const char* category, const char* message) {
if (category && !strcmp(category, "debug")) diagnostic_messages.emplace_back(message);
}
/* Проверяем наблюдаемые причины отказа и старта на настоящем PCM/TX-пути. */
static void test_vad_diagnostics(UTUN_INSTANCE* instance) {
debug_set_category_level(DEBUG_CATEGORY_DEBUG, DEBUG_LEVEL_TRACE);
debug_set_log_hook(capture_diagnostic);
diagnostic_messages.clear(); events.clear(); packets.clear(); radio_compressor_enabled = 0;
REQUIRE(radio_audio_start(7, 0) == 0 && radio_audio_capture_start(7, 1, 1) == 0);
std::array<int16_t, 1536> pcm{};
for (size_t i = 0; i < pcm.size(); ++i) pcm[i] = (int16_t)(1000 * sin(i * 0.1));
probability = 0.9f; REQUIRE(radio_audio_feed_pcm(7, pcm.data(), pcm.size()) == 0);
REQUIRE(!radio_audio_transmitting());
probability = 0.1f; REQUIRE(radio_audio_feed_pcm(7, pcm.data(), pcm.size()) == 0);
REQUIRE(!radio_audio_transmitting());
probability = 0.9f;
for (int i = 0; i < 2; ++i) REQUIRE(radio_audio_feed_pcm(7, pcm.data(), pcm.size()) == 0);
REQUIRE(radio_audio_transmitting()); uasync_poll(instance->ua, 0);
probability = 0.1f;
for (int i = 0; i < 2; ++i) REQUIRE(radio_audio_feed_pcm(7, pcm.data(), pcm.size()) == 0);
REQUIRE(!radio_audio_transmitting()); uasync_poll(instance->ua, 0);
REQUIRE(!packets.empty());
radio_audio_on_frame(instance, 7, 0x1234, 1, 0, 0, packets.front().data(), packets.front().size(), nullptr);
probability = 0.9f;
for (int i = 0; i < 2; ++i) REQUIRE(radio_audio_feed_pcm(7, pcm.data(), pcm.size()) == 0);
REQUIRE(!radio_audio_transmitting());
radio_audio_talk_begin(7); REQUIRE(radio_audio_feed_pcm(7, pcm.data(), pcm.size()) == 0);
REQUIRE(radio_audio_transmitting());
radio_audio_talk_end(7); radio_audio_capture_discontinuity(7);
radio_audio_stop(); uasync_poll(instance->ua, 0);
auto contains = [](const char* text) {
return std::any_of(diagnostic_messages.begin(), diagnostic_messages.end(),
[text](const std::string& message) { return message.find(text) != std::string::npos; });
};
for (const char* text : {"VAD config", "reason=confirming", "reason=confirm_reset", "reason=confirmed",
"reason=silence_timeout", "reason=rx_busy", "rx_node=0000000000001234", "manual=1",
"BEGIN dispatched", "capture discontinuity", "VAD capture stop", "model_rms="}) REQUIRE(contains(text));
debug_set_log_hook(nullptr);
debug_set_category_level(DEBUG_CATEGORY_DEBUG, DEBUG_LEVEL_NONE);
puts("voice TX: VAD debug logs identify confirmation reset, speech start/stop, RX blocking and manual override PASS");
}
int main() {
debug_config_init(); debug_set_level(DEBUG_LEVEL_WARN);
UTUN_INSTANCE instance{}; instance.ua = uasync_create(); REQUIRE(instance.ua);
@@ -321,6 +365,7 @@ int main() {
test_prefetch(&instance, 1, 1);
test_prefetch(&instance, 2, 1);
test_prefetch_deferred(&instance);
test_vad_diagnostics(&instance);
for (int channels : {1, 2}) for (int gain : {6, 30}) test_vad_compressor(&instance, channels, gain);
// Старый FIN не обращается к новому ядру, даже когда allocator повторно использовал тот же адрес.
REQUIRE(radio_audio_start(7, 1) == 0);