|
@@ -1080,6 +1080,12 @@ retryScene:
|
|
|
opt_start_replaybuffer = false;
|
|
|
}
|
|
|
|
|
|
+ if (opt_start_virtualcam) {
|
|
|
+ QMetaObject::invokeMethod(this, "StartVirtualCam",
|
|
|
+ Qt::QueuedConnection);
|
|
|
+ opt_start_virtualcam = false;
|
|
|
+ }
|
|
|
+
|
|
|
copyStrings.clear();
|
|
|
copyFiltersString = nullptr;
|
|
|
|
|
@@ -1518,6 +1524,18 @@ void OBSBasic::ReplayBufferClicked()
|
|
|
StartReplayBuffer();
|
|
|
};
|
|
|
|
|
|
+void OBSBasic::AddVCamButton()
|
|
|
+{
|
|
|
+ vcamButton = new ReplayBufferButton(QTStr("Basic.Main.StartVirtualCam"),
|
|
|
+ this);
|
|
|
+ vcamButton->setCheckable(true);
|
|
|
+ connect(vcamButton.data(), &QPushButton::clicked, this,
|
|
|
+ &OBSBasic::VCamButtonClicked);
|
|
|
+
|
|
|
+ vcamButton->setProperty("themeID", "vcamButton");
|
|
|
+ ui->buttonsVLayout->insertWidget(2, vcamButton);
|
|
|
+}
|
|
|
+
|
|
|
void OBSBasic::ResetOutputs()
|
|
|
{
|
|
|
ProfileScope("OBSBasic::ResetOutputs");
|
|
@@ -1645,6 +1663,13 @@ void OBSBasic::OBSInit()
|
|
|
cef = obs_browser_init_panel();
|
|
|
#endif
|
|
|
|
|
|
+ obs_data_t *obsData = obs_get_private_data();
|
|
|
+ vcamEnabled = obs_data_get_bool(obsData, "vcamEnabled");
|
|
|
+ if (vcamEnabled) {
|
|
|
+ AddVCamButton();
|
|
|
+ }
|
|
|
+ obs_data_release(obsData);
|
|
|
+
|
|
|
InitBasicConfigDefaults2();
|
|
|
|
|
|
CheckForSimpleModeX264Fallback();
|
|
@@ -2248,6 +2273,23 @@ void OBSBasic::CreateHotkeys()
|
|
|
LoadHotkeyPair(replayBufHotkeys, "OBSBasic.StartReplayBuffer",
|
|
|
"OBSBasic.StopReplayBuffer");
|
|
|
|
|
|
+ if (vcamEnabled) {
|
|
|
+ vcamHotkeys = obs_hotkey_pair_register_frontend(
|
|
|
+ "OBSBasic.StartVirtualCam",
|
|
|
+ Str("Basic.Main.StartVirtualCam"),
|
|
|
+ "OBSBasic.StopVirtualCam",
|
|
|
+ Str("Basic.Main.StopVirtualCam"),
|
|
|
+ MAKE_CALLBACK(!basic.outputHandler->VirtualCamActive(),
|
|
|
+ basic.StartVirtualCam,
|
|
|
+ "Starting virtual camera"),
|
|
|
+ MAKE_CALLBACK(basic.outputHandler->VirtualCamActive(),
|
|
|
+ basic.StopVirtualCam,
|
|
|
+ "Stopping virtual camera"),
|
|
|
+ this, this);
|
|
|
+ LoadHotkeyPair(vcamHotkeys, "OBSBasic.StartVirtualCam",
|
|
|
+ "OBSBasic.StopVirtualCam");
|
|
|
+ }
|
|
|
+
|
|
|
togglePreviewHotkeys = obs_hotkey_pair_register_frontend(
|
|
|
"OBSBasic.EnablePreview",
|
|
|
Str("Basic.Main.PreviewConextMenu.Enable"),
|
|
@@ -5247,6 +5289,10 @@ void OBSBasic::OpenSceneFilters()
|
|
|
"==== Streaming Start ==============================================="
|
|
|
#define STREAMING_STOP \
|
|
|
"==== Streaming Stop ================================================"
|
|
|
+#define VIRTUAL_CAM_START \
|
|
|
+ "==== Virtual Camera Start =========================================="
|
|
|
+#define VIRTUAL_CAM_STOP \
|
|
|
+ "==== Virtual Camera Stop ==========================================="
|
|
|
|
|
|
void OBSBasic::StartStreaming()
|
|
|
{
|
|
@@ -5967,6 +6013,61 @@ void OBSBasic::ReplayBufferStop(int code)
|
|
|
UpdateReplayBuffer(false);
|
|
|
}
|
|
|
|
|
|
+void OBSBasic::StartVirtualCam()
|
|
|
+{
|
|
|
+ if (!outputHandler || !outputHandler->virtualCam)
|
|
|
+ return;
|
|
|
+ if (outputHandler->VirtualCamActive())
|
|
|
+ return;
|
|
|
+ if (disableOutputsRef)
|
|
|
+ return;
|
|
|
+
|
|
|
+ SaveProject();
|
|
|
+
|
|
|
+ if (!outputHandler->StartVirtualCam()) {
|
|
|
+ vcamButton->setChecked(false);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void OBSBasic::StopVirtualCam()
|
|
|
+{
|
|
|
+ if (!outputHandler || !outputHandler->virtualCam)
|
|
|
+ return;
|
|
|
+
|
|
|
+ SaveProject();
|
|
|
+
|
|
|
+ if (outputHandler->VirtualCamActive())
|
|
|
+ outputHandler->StopVirtualCam();
|
|
|
+
|
|
|
+ OnDeactivate();
|
|
|
+}
|
|
|
+
|
|
|
+void OBSBasic::OnVirtualCamStart()
|
|
|
+{
|
|
|
+ if (!outputHandler || !outputHandler->virtualCam)
|
|
|
+ return;
|
|
|
+
|
|
|
+ vcamButton->setText(QTStr("Basic.Main.StopVirtualCam"));
|
|
|
+ vcamButton->setChecked(true);
|
|
|
+
|
|
|
+ OnActivate();
|
|
|
+
|
|
|
+ blog(LOG_INFO, VIRTUAL_CAM_START);
|
|
|
+}
|
|
|
+
|
|
|
+void OBSBasic::OnVirtualCamStop(int)
|
|
|
+{
|
|
|
+ if (!outputHandler || !outputHandler->virtualCam)
|
|
|
+ return;
|
|
|
+
|
|
|
+ vcamButton->setText(QTStr("Basic.Main.StartVirtualCam"));
|
|
|
+ vcamButton->setChecked(false);
|
|
|
+
|
|
|
+ blog(LOG_INFO, VIRTUAL_CAM_STOP);
|
|
|
+
|
|
|
+ OnDeactivate();
|
|
|
+}
|
|
|
+
|
|
|
void OBSBasic::on_streamButton_clicked()
|
|
|
{
|
|
|
if (outputHandler->StreamingActive()) {
|
|
@@ -6073,6 +6174,20 @@ void OBSBasic::on_recordButton_clicked()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void OBSBasic::VCamButtonClicked()
|
|
|
+{
|
|
|
+ if (outputHandler->VirtualCamActive()) {
|
|
|
+ StopVirtualCam();
|
|
|
+ } else {
|
|
|
+ if (!UIValidation::NoSourcesConfirmation(this)) {
|
|
|
+ vcamButton->setChecked(false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ StartVirtualCam();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void OBSBasic::on_settingsButton_clicked()
|
|
|
{
|
|
|
on_action_Settings_triggered();
|