cd-rec-status.cpp 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include <obs-module.h>
  2. #include <obs-frontend-api.h>
  3. #include <QLabel>
  4. #include <QTimer>
  5. #include <QVBoxLayout>
  6. #include <QWidget>
  7. #include <QDockWidget>
  8. #include <QWebSocket>
  9. #include <QJsonDocument>
  10. #include <QJsonObject>
  11. OBS_DECLARE_MODULE()
  12. OBS_MODULE_USE_DEFAULT_LOCALE("cd-rec-status", "en-US")
  13. class CDStatusDock : public QWidget {
  14. public:
  15. CDStatusDock(QWidget *parent = nullptr) : QWidget(parent), socket(new QWebSocket()) {
  16. QVBoxLayout *layout = new QVBoxLayout(this);
  17. statusLabel = new QLabel("Connecting to server...", this);
  18. layout->addWidget(statusLabel);
  19. setLayout(layout);
  20. connect(socket, &QWebSocket::connected, this, &CDStatusDock::onConnected);
  21. connect(socket, &QWebSocket::disconnected, this, &CDStatusDock::onDisconnected);
  22. connect(socket, &QWebSocket::textMessageReceived, this, &CDStatusDock::onMessageReceived);
  23. socket->open(QUrl(QStringLiteral("ws://localhost:8765")));
  24. }
  25. ~CDStatusDock() {
  26. socket->close();
  27. delete socket;
  28. }
  29. private slots:
  30. void onConnected() {
  31. statusLabel->setText("Connected to status server");
  32. }
  33. void onDisconnected() {
  34. statusLabel->setText("Disconnected from server");
  35. }
  36. void onMessageReceived(const QString &message) {
  37. QJsonParseError parseError;
  38. QJsonDocument doc = QJsonDocument::fromJson(message.toUtf8(), &parseError);
  39. if (parseError.error != QJsonParseError::NoError || !doc.isObject()) {
  40. statusLabel->setText("Invalid status message");
  41. return;
  42. }
  43. QJsonObject obj = doc.object();
  44. QString statusText = QString("Recording: %1\nCD: %2\nTrack: %3\nElapsed CD Time: %4\nElapsed Track Time: %5")
  45. .arg(obj["recording"].toBool() ? "Yes" : "No")
  46. .arg(obj["cd"].toInt())
  47. .arg(obj["track"].toInt())
  48. .arg(obj["cd_time"].toString())
  49. .arg(obj["track_time"].toString());
  50. statusLabel->setText(statusText);
  51. }
  52. private:
  53. QLabel *statusLabel;
  54. QWebSocket *socket;
  55. };
  56. static void *create_cd_status_dock(obs_source_t *) {
  57. return new CDStatusDock();
  58. }
  59. bool obs_module_load(void)
  60. {
  61. QDockWidget *dock = new QDockWidget("CD Rec Status");
  62. dock->setObjectName("cd-rec-status-dock");
  63. dock->setWidget(new CDStatusDock());
  64. obs_frontend_add_custom_qdock("cd_status_dock", (void *)dock);
  65. blog(LOG_INFO, "CD Rec Status Dock loaded!");
  66. return true;
  67. }
  68. MODULE_EXPORT const char *obs_module_description(void)
  69. {
  70. return obs_module_text("Description");
  71. }
  72. MODULE_EXPORT const char *obs_module_name(void)
  73. {
  74. return obs_module_text("CD Rec Status");
  75. }