1
0

OBSBasic_VirtualCam.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /******************************************************************************
  2. Copyright (C) 2023 by Lain Bailey <[email protected]>
  3. Zachary Lund <[email protected]>
  4. Philippe Groarke <[email protected]>
  5. This program is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. ******************************************************************************/
  16. #include "OBSBasic.hpp"
  17. #include <components/UIValidation.hpp>
  18. #include <dialogs/OBSBasicVCamConfig.hpp>
  19. #define VIRTUAL_CAM_START "==== Virtual Camera Start =========================================="
  20. #define VIRTUAL_CAM_STOP "==== Virtual Camera Stop ==========================================="
  21. void OBSBasic::StartVirtualCam()
  22. {
  23. if (!outputHandler || !outputHandler->virtualCam)
  24. return;
  25. if (outputHandler->VirtualCamActive())
  26. return;
  27. if (disableOutputsRef)
  28. return;
  29. SaveProject();
  30. outputHandler->StartVirtualCam();
  31. }
  32. void OBSBasic::StopVirtualCam()
  33. {
  34. if (!outputHandler || !outputHandler->virtualCam)
  35. return;
  36. SaveProject();
  37. if (outputHandler->VirtualCamActive())
  38. outputHandler->StopVirtualCam();
  39. OnDeactivate();
  40. }
  41. void OBSBasic::OnVirtualCamStart()
  42. {
  43. if (!outputHandler || !outputHandler->virtualCam)
  44. return;
  45. emit VirtualCamStarted();
  46. if (sysTrayVirtualCam)
  47. sysTrayVirtualCam->setText(QTStr("Basic.Main.StopVirtualCam"));
  48. OnEvent(OBS_FRONTEND_EVENT_VIRTUALCAM_STARTED);
  49. OnActivate();
  50. blog(LOG_INFO, VIRTUAL_CAM_START);
  51. }
  52. void OBSBasic::OnVirtualCamStop(int)
  53. {
  54. if (!outputHandler || !outputHandler->virtualCam)
  55. return;
  56. emit VirtualCamStopped();
  57. if (sysTrayVirtualCam)
  58. sysTrayVirtualCam->setText(QTStr("Basic.Main.StartVirtualCam"));
  59. OnEvent(OBS_FRONTEND_EVENT_VIRTUALCAM_STOPPED);
  60. blog(LOG_INFO, VIRTUAL_CAM_STOP);
  61. OnDeactivate();
  62. if (!restartingVCam)
  63. return;
  64. /* Restarting needs to be delayed to make sure that the virtual camera
  65. * implementation is stopped and avoid race condition. */
  66. QTimer::singleShot(100, this, &OBSBasic::RestartingVirtualCam);
  67. }
  68. void OBSBasic::VirtualCamActionTriggered()
  69. {
  70. if (outputHandler->VirtualCamActive()) {
  71. StopVirtualCam();
  72. } else {
  73. if (!UIValidation::NoSourcesConfirmation(this))
  74. return;
  75. StartVirtualCam();
  76. }
  77. }
  78. void OBSBasic::OpenVirtualCamConfig()
  79. {
  80. OBSBasicVCamConfig dialog(vcamConfig, outputHandler->VirtualCamActive(), this);
  81. connect(&dialog, &OBSBasicVCamConfig::Accepted, this, &OBSBasic::UpdateVirtualCamConfig);
  82. connect(&dialog, &OBSBasicVCamConfig::AcceptedAndRestart, this, &OBSBasic::RestartVirtualCam);
  83. dialog.exec();
  84. }
  85. void log_vcam_changed(const VCamConfig &config, bool starting)
  86. {
  87. const char *action = starting ? "Starting" : "Changing";
  88. switch (config.type) {
  89. case VCamOutputType::Invalid:
  90. break;
  91. case VCamOutputType::ProgramView:
  92. blog(LOG_INFO, "%s Virtual Camera output to Program", action);
  93. break;
  94. case VCamOutputType::PreviewOutput:
  95. blog(LOG_INFO, "%s Virtual Camera output to Preview", action);
  96. break;
  97. case VCamOutputType::SceneOutput:
  98. blog(LOG_INFO, "%s Virtual Camera output to Scene : %s", action, config.scene.c_str());
  99. break;
  100. case VCamOutputType::SourceOutput:
  101. blog(LOG_INFO, "%s Virtual Camera output to Source : %s", action, config.source.c_str());
  102. break;
  103. }
  104. }
  105. void OBSBasic::UpdateVirtualCamConfig(const VCamConfig &config)
  106. {
  107. vcamConfig = config;
  108. outputHandler->UpdateVirtualCamOutputSource();
  109. log_vcam_changed(config, false);
  110. }
  111. void OBSBasic::RestartVirtualCam(const VCamConfig &config)
  112. {
  113. restartingVCam = true;
  114. StopVirtualCam();
  115. vcamConfig = config;
  116. }
  117. void OBSBasic::RestartingVirtualCam()
  118. {
  119. if (!restartingVCam)
  120. return;
  121. outputHandler->UpdateVirtualCamOutputSource();
  122. StartVirtualCam();
  123. restartingVCam = false;
  124. }
  125. bool OBSBasic::VirtualCamActive()
  126. {
  127. if (!outputHandler)
  128. return false;
  129. return outputHandler->VirtualCamActive();
  130. }