output-timer.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. #include <obs-frontend-api.h>
  2. #include <obs-module.h>
  3. #include <obs.hpp>
  4. #include <util/util.hpp>
  5. #include <QAction>
  6. #include <QMainWindow>
  7. #include <QTimer>
  8. #include <QObject>
  9. #include "output-timer.hpp"
  10. using namespace std;
  11. OutputTimer *ot;
  12. OutputTimer::OutputTimer(QWidget *parent)
  13. : QDialog(parent),
  14. ui(new Ui_OutputTimer)
  15. {
  16. ui->setupUi(this);
  17. QObject::connect(ui->outputTimerStream, SIGNAL(clicked()), this,
  18. SLOT(StreamingTimerButton()));
  19. QObject::connect(ui->outputTimerRecord, SIGNAL(clicked()), this,
  20. SLOT(RecordingTimerButton()));
  21. streamingTimer = new QTimer(this);
  22. streamingTimerDisplay = new QTimer(this);
  23. recordingTimer = new QTimer(this);
  24. recordingTimerDisplay = new QTimer(this);
  25. }
  26. void OutputTimer::closeEvent(QCloseEvent*)
  27. {
  28. obs_frontend_save();
  29. }
  30. void OutputTimer::StreamingTimerButton()
  31. {
  32. if (!obs_frontend_streaming_active()) {
  33. obs_frontend_streaming_start();
  34. } else if (streamingAlreadyActive) {
  35. StreamTimerStart();
  36. streamingAlreadyActive = false;
  37. } else if (obs_frontend_streaming_active()) {
  38. obs_frontend_streaming_stop();
  39. }
  40. }
  41. void OutputTimer::RecordingTimerButton()
  42. {
  43. if (!obs_frontend_recording_active()) {
  44. obs_frontend_recording_start();
  45. } else if (recordingAlreadyActive) {
  46. RecordTimerStart();
  47. recordingAlreadyActive = false;
  48. } else if (obs_frontend_recording_active()) {
  49. obs_frontend_recording_stop();
  50. }
  51. }
  52. void OutputTimer::StreamTimerStart()
  53. {
  54. if (!isVisible() && ui->autoStartStreamTimer->isChecked() == false) {
  55. streamingAlreadyActive = true;
  56. return;
  57. }
  58. int hours = ui->streamingTimerHours->value();
  59. int minutes = ui->streamingTimerMinutes->value();
  60. int seconds = ui->streamingTimerSeconds->value();
  61. int total = (((hours * 3600) +
  62. (minutes * 60)) +
  63. seconds) * 1000;
  64. if (total == 0)
  65. total = 1000;
  66. streamingTimer->setInterval(total);
  67. streamingTimer->setSingleShot(true);
  68. QObject::connect(streamingTimer, SIGNAL(timeout()),
  69. SLOT(EventStopStreaming()));
  70. QObject::connect(streamingTimerDisplay, SIGNAL(timeout()), this,
  71. SLOT(UpdateStreamTimerDisplay()));
  72. streamingTimer->start();
  73. streamingTimerDisplay->start(1000);
  74. ui->outputTimerStream->setText(tr("Stop"));
  75. UpdateStreamTimerDisplay();
  76. }
  77. void OutputTimer::RecordTimerStart()
  78. {
  79. if (!isVisible() && ui->autoStartRecordTimer->isChecked() == false) {
  80. recordingAlreadyActive = true;
  81. return;
  82. }
  83. int hours = ui->recordingTimerHours->value();
  84. int minutes = ui->recordingTimerMinutes->value();
  85. int seconds = ui->recordingTimerSeconds->value();
  86. int total = (((hours * 3600) +
  87. (minutes * 60)) +
  88. seconds) * 1000;
  89. if (total == 0)
  90. total = 1000;
  91. recordingTimer->setInterval(total);
  92. recordingTimer->setSingleShot(true);
  93. QObject::connect(recordingTimer, SIGNAL(timeout()),
  94. SLOT(EventStopRecording()));
  95. QObject::connect(recordingTimerDisplay, SIGNAL(timeout()), this,
  96. SLOT(UpdateRecordTimerDisplay()));
  97. recordingTimer->start();
  98. recordingTimerDisplay->start(1000);
  99. ui->outputTimerRecord->setText(tr("Stop"));
  100. UpdateRecordTimerDisplay();
  101. }
  102. void OutputTimer::StreamTimerStop()
  103. {
  104. streamingAlreadyActive = false;
  105. if (!isVisible() && streamingTimer->isActive() == false)
  106. return;
  107. if (streamingTimer->isActive())
  108. streamingTimer->stop();
  109. ui->outputTimerStream->setText(tr("Start"));
  110. if (streamingTimerDisplay->isActive())
  111. streamingTimerDisplay->stop();
  112. ui->streamTime->setText("00:00:00");
  113. }
  114. void OutputTimer::RecordTimerStop()
  115. {
  116. recordingAlreadyActive = false;
  117. if (!isVisible() && recordingTimer->isActive() == false)
  118. return;
  119. if (recordingTimer->isActive())
  120. recordingTimer->stop();
  121. ui->outputTimerRecord->setText(tr("Start"));
  122. if (recordingTimerDisplay->isActive())
  123. recordingTimerDisplay->stop();
  124. ui->recordTime->setText("00:00:00");
  125. }
  126. void OutputTimer::UpdateStreamTimerDisplay()
  127. {
  128. int remainingTime = streamingTimer->remainingTime() / 1000;
  129. int seconds = remainingTime % 60;
  130. int minutes = (remainingTime % 3600) / 60;
  131. int hours = remainingTime / 3600;
  132. QString text;
  133. text.sprintf("%02d:%02d:%02d", hours, minutes, seconds);
  134. ui->streamTime->setText(text);
  135. }
  136. void OutputTimer::UpdateRecordTimerDisplay()
  137. {
  138. int remainingTime = recordingTimer->remainingTime() / 1000;
  139. int seconds = remainingTime % 60;
  140. int minutes = (remainingTime % 3600) / 60;
  141. int hours = remainingTime / 3600;
  142. QString text;
  143. text.sprintf("%02d:%02d:%02d", hours, minutes, seconds);
  144. ui->recordTime->setText(text);
  145. }
  146. void OutputTimer::ShowHideDialog()
  147. {
  148. if (!isVisible()) {
  149. setVisible(true);
  150. QTimer::singleShot(250, this, SLOT(show()));
  151. } else {
  152. setVisible(false);
  153. QTimer::singleShot(250, this, SLOT(hide()));
  154. }
  155. }
  156. void OutputTimer::EventStopStreaming()
  157. {
  158. obs_frontend_streaming_stop();
  159. }
  160. void OutputTimer::EventStopRecording()
  161. {
  162. obs_frontend_recording_stop();
  163. }
  164. static void SaveOutputTimer(obs_data_t *save_data, bool saving, void *)
  165. {
  166. if (saving) {
  167. obs_data_t *obj = obs_data_create();
  168. obs_data_set_int(obj, "streamTimerHours",
  169. ot->ui->streamingTimerHours->value());
  170. obs_data_set_int(obj, "streamTimerMinutes",
  171. ot->ui->streamingTimerMinutes->value());
  172. obs_data_set_int(obj, "streamTimerSeconds",
  173. ot->ui->streamingTimerSeconds->value());
  174. obs_data_set_int(obj, "recordTimerHours",
  175. ot->ui->recordingTimerHours->value());
  176. obs_data_set_int(obj, "recordTimerMinutes",
  177. ot->ui->recordingTimerMinutes->value());
  178. obs_data_set_int(obj, "recordTimerSeconds",
  179. ot->ui->recordingTimerSeconds->value());
  180. obs_data_set_bool(obj, "autoStartStreamTimer",
  181. ot->ui->autoStartStreamTimer->isChecked());
  182. obs_data_set_bool(obj, "autoStartRecordTimer",
  183. ot->ui->autoStartRecordTimer->isChecked());
  184. obs_data_set_obj(save_data, "output-timer", obj);
  185. obs_data_release(obj);
  186. } else {
  187. obs_data_t *obj = obs_data_get_obj(save_data,
  188. "output-timer");
  189. if (!obj)
  190. obj = obs_data_create();
  191. ot->ui->streamingTimerHours->setValue(
  192. obs_data_get_int(obj, "streamTimerHours"));
  193. ot->ui->streamingTimerMinutes->setValue(
  194. obs_data_get_int(obj, "streamTimerMinutes"));
  195. ot->ui->streamingTimerSeconds->setValue(
  196. obs_data_get_int(obj, "streamTimerSeconds"));
  197. ot->ui->recordingTimerHours->setValue(
  198. obs_data_get_int(obj, "recordTimerHours"));
  199. ot->ui->recordingTimerMinutes->setValue(
  200. obs_data_get_int(obj, "recordTimerMinutes"));
  201. ot->ui->recordingTimerSeconds->setValue(
  202. obs_data_get_int(obj, "recordTimerSeconds"));
  203. ot->ui->autoStartStreamTimer->setChecked(
  204. obs_data_get_bool(obj, "autoStartStreamTimer"));
  205. ot->ui->autoStartRecordTimer->setChecked(
  206. obs_data_get_bool(obj, "autoStartRecordTimer"));
  207. obs_data_release(obj);
  208. }
  209. }
  210. extern "C" void FreeOutputTimer()
  211. {
  212. }
  213. static void OBSEvent(enum obs_frontend_event event, void *)
  214. {
  215. if (event == OBS_FRONTEND_EVENT_EXIT) {
  216. obs_frontend_save();
  217. FreeOutputTimer();
  218. } else if (event == OBS_FRONTEND_EVENT_STREAMING_STARTED) {
  219. ot->StreamTimerStart();
  220. } else if (event == OBS_FRONTEND_EVENT_STREAMING_STOPPING) {
  221. ot->StreamTimerStop();
  222. } else if (event == OBS_FRONTEND_EVENT_RECORDING_STARTED) {
  223. ot->RecordTimerStart();
  224. } else if (event == OBS_FRONTEND_EVENT_RECORDING_STOPPING) {
  225. ot->RecordTimerStop();
  226. }
  227. }
  228. extern "C" void InitOutputTimer()
  229. {
  230. QAction *action = (QAction*)obs_frontend_add_tools_menu_qaction(
  231. obs_module_text("OutputTimer"));
  232. obs_frontend_push_ui_translation(obs_module_get_string);
  233. QMainWindow *window = (QMainWindow*)obs_frontend_get_main_window();
  234. ot = new OutputTimer(window);
  235. auto cb = [] ()
  236. {
  237. ot->ShowHideDialog();
  238. };
  239. obs_frontend_pop_ui_translation();
  240. obs_frontend_add_save_callback(SaveOutputTimer, nullptr);
  241. obs_frontend_add_event_callback(OBSEvent, nullptr);
  242. action->connect(action, &QAction::triggered, cb);
  243. }