From 5adc6b031bf235773229b9bf20d1bc7d1f9ca0fa Mon Sep 17 00:00:00 2001 From: Elliu <elliu@hashi.re> Date: Thu, 13 Jan 2022 23:45:52 +0100 Subject: [PATCH] Wait for mpv to be launched before returning from creating module --- src/module/module_qt_window.cc | 9 +++++++-- src/module/module_qt_window.hh | 1 + src/module/qt_window/mainwindow.cc | 3 ++- src/module/qt_window/mpvwidget.cc | 6 +++++- src/module/qt_window/mpvwidget.hh | 4 +++- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/module/module_qt_window.cc b/src/module/module_qt_window.cc index 7eb7f578..a1cb86d2 100644 --- a/src/module/module_qt_window.cc +++ b/src/module/module_qt_window.cc @@ -214,12 +214,17 @@ module_qt_window_new(struct module_qt_window_s **win, struct queue *queue, lkt_d RETURN_UNLESS(*win, "Out of memory", false); memset(*win, 0, sizeof(struct module_qt_window_s)); - (*win)->queue = queue; - (*win)->db = db; + (*win)->queue = queue; + (*win)->db = db; + (*win)->launched = false; pthread_t thread; RETURN_IF(pthread_create(&thread, nullptr, ___create_mpv_widget, *win), "Failed to launch the Qt thread", false); + + timespec timeToWait = { 0, 10000000 }; + while (!(*win)->launched) + nanosleep(&timeToWait, nullptr); } return true; diff --git a/src/module/module_qt_window.hh b/src/module/module_qt_window.hh index 9ac08807..760f16a2 100644 --- a/src/module/module_qt_window.hh +++ b/src/module/module_qt_window.hh @@ -11,6 +11,7 @@ struct module_qt_window_s { MpvWidget *mpv_widget; struct module_reg *reg; + bool launched; /* Things from the server */ struct queue *queue; diff --git a/src/module/qt_window/mainwindow.cc b/src/module/qt_window/mainwindow.cc index 38eb490d..4ac58fee 100644 --- a/src/module/qt_window/mainwindow.cc +++ b/src/module/qt_window/mainwindow.cc @@ -3,7 +3,8 @@ MainWindow::MainWindow(module_qt_window_s *qt_window, QWidget *parent) : QMainWindow(parent) { - qt_window->mpv_widget = new MpvWidget(qt_window->queue, qt_window->db, qt_window->reg, this); + qt_window->mpv_widget = new MpvWidget(qt_window->queue, qt_window->db, qt_window->reg, + &(qt_window->launched), this); connect(qt_window->mpv_widget, &MpvWidget::titleChanged, this, &MainWindow::updateWindowTitle); setCentralWidget(qt_window->mpv_widget); setFocusPolicy(Qt::StrongFocus); diff --git a/src/module/qt_window/mpvwidget.cc b/src/module/qt_window/mpvwidget.cc index e81597c3..be53b3ca 100644 --- a/src/module/qt_window/mpvwidget.cc +++ b/src/module/qt_window/mpvwidget.cc @@ -28,11 +28,13 @@ get_proc_address(void *ctx, const char *name) return reinterpret_cast<void *>(glctx->getProcAddress(QByteArray(name))); } -MpvWidget::MpvWidget(struct queue *queue, lkt_db *db, struct module_reg *reg, QWidget *parent) +MpvWidget::MpvWidget(struct queue *queue, lkt_db *db, struct module_reg *reg, bool *launched, + QWidget *parent) : QOpenGLWidget(parent) , m_queue(queue) , m_db(db) , m_reg(reg) + , m_launched(launched) { mpv = mpv_create(); if (!mpv) @@ -136,6 +138,7 @@ MpvWidget::handle_mpv_event(mpv_event *event) case MPV_EVENT_SHUTDOWN: lkt_queue_send(m_queue, LKT_EVENT_PLAY_TOGGLE, LKT_PLAY_STOP); + *m_launched = false; reg_call(m_reg, "close", 1); break; @@ -166,6 +169,7 @@ MpvWidget::handle_mpv_event(mpv_event *event) case MPV_EVENT_IDLE: lkt_queue_make_available(m_queue, static_cast<LKT_EVENT_TYPE>(LKT_EVENT_PLAY)); lkt_queue_make_available(m_queue, static_cast<LKT_EVENT_TYPE>(LKT_EVENT_PROP)); + *m_launched = true; emit titleChanged("[Lektord] Stopped"); break; diff --git a/src/module/qt_window/mpvwidget.hh b/src/module/qt_window/mpvwidget.hh index 244bcc9c..93aee66b 100644 --- a/src/module/qt_window/mpvwidget.hh +++ b/src/module/qt_window/mpvwidget.hh @@ -9,7 +9,8 @@ class MpvWidget Q_DECL_FINAL : public QOpenGLWidget { Q_OBJECT public: - MpvWidget(struct queue *queue, lkt_db *db, struct module_reg *reg, QWidget *parent); + MpvWidget(struct queue *queue, lkt_db *db, struct module_reg *reg, bool *launched, + QWidget *parent); ~MpvWidget() override; void command(const QVariant ¶ms); void setProperty(const QString &name, const QVariant &value); @@ -36,6 +37,7 @@ private: struct queue *m_queue; lkt_db *m_db; struct module_reg *m_reg; + bool *m_launched; int m_position; int m_duration; -- GitLab