output-timer.cpp 6.8 KB

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