diff --git a/src/module/module_qt_window.cc b/src/module/module_qt_window.cc index 6110ff6ddd1a1fc3d33c6a3ff8f99365129b1a5c..4a012ade1aa69ebfe87af96e3e8607e634495daa 100644 --- a/src/module/module_qt_window.cc +++ b/src/module/module_qt_window.cc @@ -196,9 +196,9 @@ 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)->is_in_preparation = true; + (*win)->queue = queue; + (*win)->db = db; + (*win)->reg = qt_window_reg; arg = LKT_ALLOC_STRUCT(poller_thread_arg); RETURN_UNLESS(arg, "Out of memory", false); diff --git a/src/module/module_qt_window.hh b/src/module/module_qt_window.hh index 98732907a83835171d7c39bf25c404b207d507e5..fa0e28695f0f135175747c66a9863ffdf71ee7e9 100644 --- a/src/module/module_qt_window.hh +++ b/src/module/module_qt_window.hh @@ -10,11 +10,8 @@ struct module_qt_window_s { MainWindow *main_window; MpvWidget *mpv_widget; - /* Thread related */ struct poller_thread self; - volatile int launched; /* SDL you sucks */ - volatile bool is_in_preparation; /* Inside the MPV & SDL init */ - volatile bool has_preparation_failed; /* The init failed */ + struct module_reg *reg; /* Things from the server */ struct queue *queue; diff --git a/src/module/qt_window/mainwindow.cc b/src/module/qt_window/mainwindow.cc index 8d22e104747be319ab059c2e88da2c88b9268add..0ad17a8a4a8e9d0a039c113e43402231ce5b6fbc 100644 --- a/src/module/qt_window/mainwindow.cc +++ b/src/module/qt_window/mainwindow.cc @@ -3,7 +3,7 @@ MainWindow::MainWindow(struct module_qt_window_s *qt_window, QWidget *parent) : QMainWindow(parent) { - qt_window->mpv_widget = new MpvWidget(qt_window->queue, qt_window->db, this); + qt_window->mpv_widget = new MpvWidget(qt_window->queue, qt_window->db, qt_window->reg, 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 99c06830451dd48719ec502d63b0a4d84a6268d6..0cc422e9da790b1b138f7a301c57c7a8ed7731c9 100644 --- a/src/module/qt_window/mpvwidget.cc +++ b/src/module/qt_window/mpvwidget.cc @@ -28,10 +28,11 @@ get_proc_address(void *ctx, const char *name) return reinterpret_cast<void *>(glctx->getProcAddress(QByteArray(name))); } -MpvWidget::MpvWidget(struct queue *queue, lkt_db *db, QWidget *parent) +MpvWidget::MpvWidget(struct queue *queue, lkt_db *db, struct module_reg *reg, QWidget *parent) : QOpenGLWidget(parent) , m_queue(queue) , m_db(db) + , m_reg(reg) { mpv = mpv_create(); if (!mpv) @@ -41,6 +42,7 @@ MpvWidget::MpvWidget(struct queue *queue, lkt_db *db, QWidget *parent) mpv_set_option_string(mpv, "terminal", "yes"); mpv_set_option_string(mpv, "msg-level", "all=v"); + mpv_set_option_string(mpv, "osc", "yes"); if (mpv_initialize(mpv) < 0) throw std::runtime_error("could not initialize mpv context"); @@ -129,6 +131,41 @@ MpvWidget::handle_mpv_event(mpv_event *event) (void)prop; switch (event->event_id) { + case MPV_EVENT_PAUSE: + lkt_queue_send(m_queue, LKT_EVENT_PLAY_TOGGLE, LKT_PLAY_PAUSE); + break; + + case MPV_EVENT_UNPAUSE: + lkt_queue_send(m_queue, LKT_EVENT_PLAY_TOGGLE, LKT_PLAY_PLAY); + break; + + case MPV_EVENT_SHUTDOWN: + lkt_queue_send(m_queue, LKT_EVENT_PLAY_TOGGLE, LKT_PLAY_STOP); + reg_call(m_reg, "close", 1); + break; + + case MPV_EVENT_START_FILE: + //SET_STATE_FLAG(*(arg->state), PLAY); + //*(arg->hinib) = false; + LOG_DEBUG("WINDOW", "Start of file!"); + break; + + case MPV_EVENT_END_FILE: + //LOG_DEBUG("WINDOW", "End of file!"); + //if (((*(arg->state)) != STATE_STOP) && !(*(arg->hinib))) { + // LOG_DEBUG("WINDOW", "Send play_next event"); + // lkt_queue_send(queue, LKT_EVENT_PLAY_NEXT, NULL); + //} else + // LOG_DEBUG("WINDOW", "Don't send play_next event, hinib is %d and state is %s", + // *(arg->hinib), + // (*(arg->state) == STATE_STOP) ? "STOP" + // : (*(arg->state) == STATE_PLAY) ? "PLAY" + // : (*(arg->state) == STATE_PAUSE) ? "PAUSE" + // : "UNKNOWN"); + LOG_DEBUG("WINDOW", "End of file!"); + //lkt_queue_send(m_queue, LKT_EVENT_PLAY_NEXT, NULL); + break; + case MPV_EVENT_PROPERTY_CHANGE: { prop = static_cast<mpv_event_property *>(event->data); if (strcmp(prop->name, "time-pos") == 0) { @@ -146,22 +183,19 @@ MpvWidget::handle_mpv_event(mpv_event *event) } case MPV_EVENT_IDLE: + lkt_queue_make_available(m_queue, (LKT_EVENT_TYPE)LKT_EVENT_PLAY); + lkt_queue_make_available(m_queue, (LKT_EVENT_TYPE)LKT_EVENT_PROP); titleChanged("[Lektord] Stopped"); break; - case MPV_EVENT_SHUTDOWN: case MPV_EVENT_LOG_MESSAGE: case MPV_EVENT_GET_PROPERTY_REPLY: case MPV_EVENT_SET_PROPERTY_REPLY: case MPV_EVENT_NONE: case MPV_EVENT_COMMAND_REPLY: - case MPV_EVENT_START_FILE: - case MPV_EVENT_END_FILE: case MPV_EVENT_FILE_LOADED: case MPV_EVENT_TRACKS_CHANGED: case MPV_EVENT_TRACK_SWITCHED: - case MPV_EVENT_PAUSE: - case MPV_EVENT_UNPAUSE: case MPV_EVENT_TICK: case MPV_EVENT_SCRIPT_INPUT_DISPATCH: case MPV_EVENT_CLIENT_MESSAGE: @@ -207,18 +241,22 @@ MpvWidget::on_update(void *ctx) bool MpvWidget::get_elapsed(int UNUSED *elapsed_sec) { + *elapsed_sec = 5; return true; } bool MpvWidget::get_duration(int UNUSED *dur_sec) { + *dur_sec = 90; return true; } bool -MpvWidget::set_paussed(int UNUSED paused) +MpvWidget::set_paussed(int paused) { + const char *cmd[] = {"set", "pause", paused == 1 ? "yes" : "no", NULL}; + mpv_command_async(mpv, 0, cmd); return true; } @@ -229,9 +267,9 @@ MpvWidget::set_volume(int UNUSED vol) } bool -MpvWidget::set_position(int UNUSED sec) +MpvWidget::set_position(int sec) { - return true; + return lmpv_set_position(mpv, sec); } bool @@ -274,20 +312,22 @@ MpvWidget::update_window_title() bool MpvWidget::toggle_pause() { + const char *cmd[] = {"cycle", "pause", NULL}; + mpv_command_async(mpv, 0, cmd); return true; } -#define MPV_SEND_COMMAND_ASYNC( ... ) \ - { \ - const char *cmd_seek[] = { __VA_ARGS__ }; \ - mpv_command_async(mpv, 0, cmd_seek); \ - break; \ +#define MPV_SEND_COMMAND_ASYNC( ... ) \ + { \ + const char *cmd[] = { __VA_ARGS__ }; \ + mpv_command_async(mpv, 0, cmd); \ + break; \ } - void MpvWidget::keyPressEvent(QKeyEvent* event) { switch(event->modifiers()){ + /* SHIFTED */ case Qt::ShiftModifier: switch(event->key()){ case Qt::Key_J: @@ -296,11 +336,20 @@ MpvWidget::keyPressEvent(QKeyEvent* event) } break; + + /* UN-SHIFTED */ default: switch(event->key()){ /* Playback */ case Qt::Key_Space: lmpv_toggle_pause(mpv); + //lkt_queue_send(m_queue, LKT_EVENT_PLAY_TOGGLE, LKT_PLAY_TOGGLE); + break; + case Qt::Key_Enter: + lkt_queue_send(m_queue, LKT_EVENT_PLAY_NEXT, NULL); + break; + case Qt::Key_Less: + lkt_queue_send(m_queue, LKT_EVENT_PLAY_PREV, NULL); break; case Qt::Key_Left: MPV_SEND_COMMAND_ASYNC("osd-msg-bar", "seek", "-5", "relative", NULL); @@ -326,6 +375,8 @@ MpvWidget::keyPressEvent(QKeyEvent* event) /* Misc */ case Qt::Key_I: MPV_SEND_COMMAND_ASYNC("script-binding", "stats/display-stats", NULL); + case Qt::Key_Delete: + MPV_SEND_COMMAND_ASYNC("script-binding", "osc/visibility", NULL); default: break; diff --git a/src/module/qt_window/mpvwidget.hh b/src/module/qt_window/mpvwidget.hh index 38b8190c8dbd6c0fa7692a06475367f92306cec9..ecf86a365af474b5649956f1e783736974a3b4d4 100644 --- a/src/module/qt_window/mpvwidget.hh +++ b/src/module/qt_window/mpvwidget.hh @@ -9,7 +9,7 @@ class MpvWidget Q_DECL_FINAL : public QOpenGLWidget { Q_OBJECT public: - MpvWidget(struct queue *queue, lkt_db *db, QWidget *parent); + MpvWidget(struct queue *queue, lkt_db *db, struct module_reg *reg, QWidget *parent); virtual ~MpvWidget() override; void command(const QVariant ¶ms); void setProperty(const QString &name, const QVariant &value); @@ -36,6 +36,7 @@ public: private: struct queue *m_queue; lkt_db *m_db; + struct module_reg *m_reg; protected: void keyPressEvent(QKeyEvent* event);