|
|
|
|
@ -26,6 +26,7 @@ extern "C" {
|
|
|
|
|
static UTUN_INSTANCE instance{}; |
|
|
|
|
static std::atomic<float> probability{0}; |
|
|
|
|
static bool detectorAvailable = true; |
|
|
|
|
static bool failCapture; |
|
|
|
|
static int begins, ends, packets, inputs, outputs; |
|
|
|
|
|
|
|
|
|
extern "C" UTUN_INSTANCE* gui_bridge_get_inst() { return &instance; } |
|
|
|
|
@ -46,6 +47,7 @@ extern "C" ma_result __wrap_ma_context_init(const ma_backend*, ma_uint32, const
|
|
|
|
|
} |
|
|
|
|
extern "C" ma_result __wrap_ma_device_start(ma_device* device) { |
|
|
|
|
if (device->type == ma_device_type_capture) ++inputs; else ++outputs; |
|
|
|
|
if (failCapture && device->type == ma_device_type_capture) return MA_ERROR; |
|
|
|
|
return __real_ma_device_start(device); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -163,6 +165,19 @@ int main(int argc, char** argv) {
|
|
|
|
|
await([&]() { return engine->vadAvailable(); }); |
|
|
|
|
REQUIRE(engine->groupId() == 8 && vad->isChecked()); |
|
|
|
|
engine->stop(); |
|
|
|
|
failCapture = true; |
|
|
|
|
REQUIRE(engine->start(9) == 0); |
|
|
|
|
REQUIRE(!engine->captureAvailable() && vad->isEnabled() && !ptt->isEnabled()); |
|
|
|
|
vad->click(); |
|
|
|
|
await([&]() { return !engine->settingsBusy() && !engine->vadEnabled(); }); |
|
|
|
|
REQUIRE(!engine->captureAvailable()); |
|
|
|
|
failCapture = false; |
|
|
|
|
await([&]() { return engine->captureAvailable(); }); |
|
|
|
|
vad->click(); |
|
|
|
|
await([&]() { return !engine->settingsBusy() && engine->vadAvailable(); }); |
|
|
|
|
REQUIRE(vad->isChecked() && ptt->isEnabled()); |
|
|
|
|
qInfo("radio panel: unavailable microphone permits VAD settings; capture recovery restores controls PASS"); |
|
|
|
|
engine->stop(); |
|
|
|
|
engine->loadSettings(directory.filePath("missing.cfg")); |
|
|
|
|
await([&]() { return !engine->settingsBusy(); }); |
|
|
|
|
REQUIRE(!engine->applySettings({{"radio_vad_enabled", 0}}) && engine->vadEnabled() && !engine->settingsError().isEmpty()); |
|
|
|
|
@ -170,7 +185,12 @@ int main(int argc, char** argv) {
|
|
|
|
|
REQUIRE(QMetaObject::invokeMethod(button->menu(), "aboutToShow", Qt::DirectConnection)); |
|
|
|
|
REQUIRE(!button->menu()->actions().isEmpty()); |
|
|
|
|
} |
|
|
|
|
panel.grab().save("/tmp/desktop-radio-panel.png"); |
|
|
|
|
engine->loadSettings(configPath); |
|
|
|
|
await([&]() { return !engine->settingsBusy(); }); |
|
|
|
|
REQUIRE(engine->start(10) == 0 && engine->vadAvailable()); |
|
|
|
|
pump(100); |
|
|
|
|
REQUIRE(panel.grab().save("/tmp/desktop-radio-panel.png")); |
|
|
|
|
engine->stop(); |
|
|
|
|
radio_audio_destroy(&instance); |
|
|
|
|
uasync_destroy(instance.ua, 0); |
|
|
|
|
instance.ua = nullptr; |
|
|
|
|
|