Improve Android VAD lifecycle, audio settings and diagnostics
This commit is contained in:
1 parent
20a1211e09
commit
123b47c612
24 files changed
+490
-127
No files matched your search
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user