diff --git a/tools/chatgui/tests/test_stream_publish.cpp b/tools/chatgui/tests/test_stream_publish.cpp index e7c31254..58ace38b 100644 --- a/tools/chatgui/tests/test_stream_publish.cpp +++ b/tools/chatgui/tests/test_stream_publish.cpp @@ -492,6 +492,15 @@ private slots: auto* audio = menu(controls, "streamAudioSource"); choose(audio, QVariant()); QVERIFY(!chosen(audio).isValid()); QVERIFY(!sound->isChecked()); choose(audio, QString()); QVERIFY(chosen(audio).isValid()); QVERIFY(sound->isChecked()); + QVERIFY(sound->isEnabled()); QSignalSpy errors(&engine, &StreamPublishEngine::errorOccurred); + QSignalSpy settings(&controls, &StreamPublishWindow::settingsChanged); + QTest::mouseClick(sound, Qt::LeftButton); QVERIFY(!sound->isChecked()); QVERIFY(!engine.active()); QVERIFY(errors.isEmpty()); + QVERIFY(!settings.isEmpty()); const QString mutedSettings = settings.last().front().toString(); + QVERIFY(QJsonDocument::fromJson(mutedSettings.toUtf8()).object().value("muted").toBool()); + choose(menu(controls, "streamVideoBitrate"), 0); QVERIFY(!sound->isChecked()); + StreamPublishEngine reopenedEngine; StreamPublishWindow reopened(&reopenedEngine, group, nullptr, mutedSettings); + QVERIFY(!reopened.findChild("streamSound")->isChecked()); + QTest::mouseClick(sound, Qt::LeftButton); QVERIFY(sound->isChecked()); QVERIFY(errors.isEmpty()); auto* resolution = menu(controls, "streamVideoResolution"); auto* fps = menu(controls, "streamVideoFps"); for (auto* submenu : {resolution, fps, qp, audio}) { QVERIFY(!submenu->actions().first()->text().isEmpty()); QVERIFY(!submenu->actions().first()->isCheckable()); @@ -514,6 +523,30 @@ private slots: } } } + void initiallyMutedStream() { +#if defined(HAVE_STREAM_CAPTURE) && defined(TEST_NULL_AUDIO) + if (!qEnvironmentVariableIsSet("UTUN_TEST_SCREEN_CAPTURE")) QSKIP("Run under isolated Xvfb"); + QVERIFY(SoundManager::instance()->init()); + StreamPublishEngine engine; StreamPublishConfig config; config.startMuted = true; + config.video.width = 320; config.video.height = 180; config.video.fps = 15; + for (const auto& source : engine.sources()) if (source.kind == StreamVideoSource::Screen && source.screen) { + config.source = source; break; + } + QVERIFY(config.source.screen); + connect(&engine, &StreamPublishEngine::softwareEncodingRequested, &engine, + [&engine](uint64_t generation) { engine.answerSoftwareEncoding(generation, true); }); + QVERIFY(engine.start(group, config)); QVERIFY(engine.muted()); + stream_member_state member{}; + QTRY_VERIFY_WITH_TIMEOUT(stream_member_load(inst, group, inst->node_id, &member, nullptr) == STREAM_OK && member.published, 5000); + QVERIFY(!member.audio_enabled); uint64_t epoch = member.source.source_epoch; + engine.setMuted(false); QVERIFY(!engine.muted()); + QTRY_VERIFY_WITH_TIMEOUT(stream_member_load(inst, group, inst->node_id, &member, nullptr) == STREAM_OK && member.audio_enabled, 2000); + QCOMPARE(member.source.source_epoch, epoch); + engine.stop(); QTRY_VERIFY_WITH_TIMEOUT(!engine.active(), 4000); +#else + QSKIP("Capture and null audio are required"); +#endif + } void nativeScreenCapture_data() { QTest::addColumn("codec"); QTest::newRow("h264") << int(STREAM_MEDIA_H264);