1
0

OBSBasic_ReplayBuffer.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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 <qt-wrappers.hpp>
  19. #include <QCheckBox>
  20. #define REPLAY_BUFFER_START "==== Replay Buffer Start ==========================================="
  21. #define REPLAY_BUFFER_STOP "==== Replay Buffer Stop ============================================"
  22. void OBSBasic::ReplayBufferActionTriggered()
  23. {
  24. if (outputHandler->ReplayBufferActive())
  25. StopReplayBuffer();
  26. else
  27. StartReplayBuffer();
  28. };
  29. void OBSBasic::ShowReplayBufferPauseWarning()
  30. {
  31. auto msgBox = []() {
  32. QMessageBox msgbox(App()->GetMainWindow());
  33. msgbox.setWindowTitle(QTStr("Output.ReplayBuffer."
  34. "PauseWarning.Title"));
  35. msgbox.setText(QTStr("Output.ReplayBuffer."
  36. "PauseWarning.Text"));
  37. msgbox.setIcon(QMessageBox::Icon::Information);
  38. msgbox.addButton(QMessageBox::Ok);
  39. QCheckBox *cb = new QCheckBox(QTStr("DoNotShowAgain"));
  40. msgbox.setCheckBox(cb);
  41. msgbox.exec();
  42. if (cb->isChecked()) {
  43. config_set_bool(App()->GetUserConfig(), "General", "WarnedAboutReplayBufferPausing", true);
  44. config_save_safe(App()->GetUserConfig(), "tmp", nullptr);
  45. }
  46. };
  47. bool warned = config_get_bool(App()->GetUserConfig(), "General", "WarnedAboutReplayBufferPausing");
  48. if (!warned) {
  49. QMetaObject::invokeMethod(App(), "Exec", Qt::QueuedConnection, Q_ARG(VoidFunc, msgBox));
  50. }
  51. }
  52. void OBSBasic::StartReplayBuffer()
  53. {
  54. if (!outputHandler || !outputHandler->replayBuffer)
  55. return;
  56. if (outputHandler->ReplayBufferActive())
  57. return;
  58. if (disableOutputsRef)
  59. return;
  60. if (!UIValidation::NoSourcesConfirmation(this))
  61. return;
  62. if (!OutputPathValid()) {
  63. OutputPathInvalidMessage();
  64. return;
  65. }
  66. if (LowDiskSpace()) {
  67. DiskSpaceMessage();
  68. return;
  69. }
  70. OnEvent(OBS_FRONTEND_EVENT_REPLAY_BUFFER_STARTING);
  71. SaveProject();
  72. if (outputHandler->StartReplayBuffer() && os_atomic_load_bool(&recording_paused)) {
  73. ShowReplayBufferPauseWarning();
  74. }
  75. }
  76. void OBSBasic::ReplayBufferStopping()
  77. {
  78. if (!outputHandler || !outputHandler->replayBuffer)
  79. return;
  80. emit ReplayBufStopping();
  81. if (sysTrayReplayBuffer)
  82. sysTrayReplayBuffer->setText(QTStr("Basic.Main.StoppingReplayBuffer"));
  83. replayBufferStopping = true;
  84. OnEvent(OBS_FRONTEND_EVENT_REPLAY_BUFFER_STOPPING);
  85. }
  86. void OBSBasic::StopReplayBuffer()
  87. {
  88. if (!outputHandler || !outputHandler->replayBuffer)
  89. return;
  90. SaveProject();
  91. if (outputHandler->ReplayBufferActive())
  92. outputHandler->StopReplayBuffer(replayBufferStopping);
  93. OnDeactivate();
  94. }
  95. void OBSBasic::ReplayBufferStart()
  96. {
  97. if (!outputHandler || !outputHandler->replayBuffer)
  98. return;
  99. emit ReplayBufStarted();
  100. if (sysTrayReplayBuffer)
  101. sysTrayReplayBuffer->setText(QTStr("Basic.Main.StopReplayBuffer"));
  102. replayBufferStopping = false;
  103. OnEvent(OBS_FRONTEND_EVENT_REPLAY_BUFFER_STARTED);
  104. OnActivate();
  105. blog(LOG_INFO, REPLAY_BUFFER_START);
  106. }
  107. void OBSBasic::ReplayBufferSave()
  108. {
  109. if (!outputHandler || !outputHandler->replayBuffer)
  110. return;
  111. if (!outputHandler->ReplayBufferActive())
  112. return;
  113. calldata_t cd = {0};
  114. proc_handler_t *ph = obs_output_get_proc_handler(outputHandler->replayBuffer);
  115. proc_handler_call(ph, "save", &cd);
  116. calldata_free(&cd);
  117. }
  118. void OBSBasic::ReplayBufferSaved()
  119. {
  120. if (!outputHandler || !outputHandler->replayBuffer)
  121. return;
  122. if (!outputHandler->ReplayBufferActive())
  123. return;
  124. calldata_t cd = {0};
  125. proc_handler_t *ph = obs_output_get_proc_handler(outputHandler->replayBuffer);
  126. proc_handler_call(ph, "get_last_replay", &cd);
  127. std::string path = calldata_string(&cd, "path");
  128. QString msg = QTStr("Basic.StatusBar.ReplayBufferSavedTo").arg(QT_UTF8(path.c_str()));
  129. ShowStatusBarMessage(msg);
  130. lastReplay = path;
  131. calldata_free(&cd);
  132. OnEvent(OBS_FRONTEND_EVENT_REPLAY_BUFFER_SAVED);
  133. AutoRemux(QT_UTF8(path.c_str()));
  134. }
  135. void OBSBasic::ReplayBufferStop(int code)
  136. {
  137. if (!outputHandler || !outputHandler->replayBuffer)
  138. return;
  139. emit ReplayBufStopped();
  140. if (sysTrayReplayBuffer)
  141. sysTrayReplayBuffer->setText(QTStr("Basic.Main.StartReplayBuffer"));
  142. blog(LOG_INFO, REPLAY_BUFFER_STOP);
  143. if (code == OBS_OUTPUT_UNSUPPORTED && isVisible()) {
  144. OBSMessageBox::critical(this, QTStr("Output.RecordFail.Title"), QTStr("Output.RecordFail.Unsupported"));
  145. } else if (code == OBS_OUTPUT_NO_SPACE && isVisible()) {
  146. OBSMessageBox::warning(this, QTStr("Output.RecordNoSpace.Title"), QTStr("Output.RecordNoSpace.Msg"));
  147. } else if (code != OBS_OUTPUT_SUCCESS && isVisible()) {
  148. OBSMessageBox::critical(this, QTStr("Output.RecordError.Title"), QTStr("Output.RecordError.Msg"));
  149. } else if (code == OBS_OUTPUT_UNSUPPORTED && !isVisible()) {
  150. SysTrayNotify(QTStr("Output.RecordFail.Unsupported"), QSystemTrayIcon::Warning);
  151. } else if (code == OBS_OUTPUT_NO_SPACE && !isVisible()) {
  152. SysTrayNotify(QTStr("Output.RecordNoSpace.Msg"), QSystemTrayIcon::Warning);
  153. } else if (code != OBS_OUTPUT_SUCCESS && !isVisible()) {
  154. SysTrayNotify(QTStr("Output.RecordError.Msg"), QSystemTrayIcon::Warning);
  155. }
  156. OnEvent(OBS_FRONTEND_EVENT_REPLAY_BUFFER_STOPPED);
  157. OnDeactivate();
  158. }
  159. bool OBSBasic::ReplayBufferActive()
  160. {
  161. if (!outputHandler)
  162. return false;
  163. return outputHandler->ReplayBufferActive();
  164. }