From 975a548ef6ee2bd03e214e832d5e5b977f748bd1 Mon Sep 17 00:00:00 2001 From: NamedKitten Date: Sat, 24 Nov 2018 21:00:04 +0000 Subject: [PATCH] [Backend+UI] Added backend settings and made some changes to MPV events. --- src/DirectMpvPlayerBackend.cpp | 30 +++++++++++++++++++++--------- src/DirectMpvPlayerBackend.h | 1 + src/MpvPlayerBackend.cpp | 34 ++++++++++++++++++++++++---------- src/MpvPlayerBackend.h | 3 +++ src/main.cpp | 11 +++++++++++ src/qml/main.qml | 6 ++++++ src/utils.cpp | 16 ++++++++++++---- 7 files changed, 78 insertions(+), 23 deletions(-) diff --git a/src/DirectMpvPlayerBackend.cpp b/src/DirectMpvPlayerBackend.cpp index 31488ca..3ae5d67 100644 --- a/src/DirectMpvPlayerBackend.cpp +++ b/src/DirectMpvPlayerBackend.cpp @@ -21,8 +21,8 @@ void wakeup(void* ctx) { - QMetaObject::invokeMethod( - (DirectMpvPlayerBackend*)ctx, "on_mpv_events", Qt::QueuedConnection); + QCoreApplication::postEvent((DirectMpvPlayerBackend*)ctx, + new QEvent(QEvent::User)); } static void* @@ -99,8 +99,8 @@ DirectMpvPlayerBackend::DirectMpvPlayerBackend(QQuickItem* parent) mpv_observe_property(mpv, 0, "playback-abort", MPV_FORMAT_NONE); mpv_observe_property(mpv, 0, "chapter-list", MPV_FORMAT_NODE); mpv_observe_property(mpv, 0, "track-list", MPV_FORMAT_NODE); - mpv_observe_property(mpv, 0, "chapter-list", MPV_FORMAT_NONE); - mpv_observe_property(mpv, 0, "audio-device-list", MPV_FORMAT_NODE); + mpv_observe_property(mpv, 0, "chapter-list", MPV_FORMAT_NODE); + mpv_observe_property(mpv, 0, "audio-device-list", MPV_FORMAT_NONE); mpv_observe_property(mpv, 0, "playlist-pos", MPV_FORMAT_DOUBLE); mpv_observe_property(mpv, 0, "volume", MPV_FORMAT_NONE); mpv_observe_property(mpv, 0, "mute", MPV_FORMAT_NONE); @@ -110,7 +110,7 @@ DirectMpvPlayerBackend::DirectMpvPlayerBackend(QQuickItem* parent) mpv_observe_property(mpv, 0, "time-pos", MPV_FORMAT_DOUBLE); mpv_observe_property(mpv, 0, "demuxer-cache-duration", MPV_FORMAT_DOUBLE); mpv_observe_property(mpv, 0, "pause", MPV_FORMAT_NONE); - mpv_observe_property(mpv, 0, "playlist", MPV_FORMAT_NONE); + mpv_observe_property(mpv, 0, "playlist", MPV_FORMAT_NODE); mpv_set_wakeup_callback(mpv, wakeup, this); if (mpv_initialize(mpv) < 0) @@ -449,6 +449,15 @@ DirectMpvPlayerBackend::toggleOnTop() Utils::AlwaysOnTop(window()->winId(), onTop); } +bool +DirectMpvPlayerBackend::event(QEvent* event) +{ + if (event->type() == QEvent::User) { + on_mpv_events(); + } + return QObject::event(event); +} + void DirectMpvPlayerBackend::on_mpv_events() { @@ -557,14 +566,17 @@ DirectMpvPlayerBackend::handle_mpv_event(mpv_event* event) } else { emit playStatusChanged(Enums::PlayStatus::Playing); } - } else if (strcmp(prop->name, "tracks-menu") == 0) { - emit tracksChanged(getProperty("tracks-menu").toList()); + } else if (strcmp(prop->name, "track-list") == 0) { + mpv_node* nod = (mpv_node*)prop->data; + emit tracksChanged(mpv::qt::node_to_variant(nod).toList()); } else if (strcmp(prop->name, "audio-device-list") == 0) { emit audioDevicesChanged(getAudioDevices()); } else if (strcmp(prop->name, "playlist") == 0) { - emit playlistChanged(getProperty("playlist").toList()); + mpv_node* nod = (mpv_node*)prop->data; + emit playlistChanged(mpv::qt::node_to_variant(nod).toList()); } else if (strcmp(prop->name, "chapter-list") == 0) { - emit chaptersChanged(getProperty("chapter-list").toList()); + mpv_node* nod = (mpv_node*)prop->data; + emit chaptersChanged(mpv::qt::node_to_variant(nod).toList()); } #ifdef DISCORD updateDiscord(); diff --git a/src/DirectMpvPlayerBackend.h b/src/DirectMpvPlayerBackend.h index 6c4020f..3f147b4 100644 --- a/src/DirectMpvPlayerBackend.h +++ b/src/DirectMpvPlayerBackend.h @@ -68,6 +68,7 @@ public slots: // Just used for adding missing audio devices to list. QVariantMap getAudioDevices() const; + bool event(QEvent* event); signals: void onUpdate(); diff --git a/src/MpvPlayerBackend.cpp b/src/MpvPlayerBackend.cpp index 7b008d9..d408302 100644 --- a/src/MpvPlayerBackend.cpp +++ b/src/MpvPlayerBackend.cpp @@ -27,8 +27,7 @@ namespace { void wakeup(void* ctx) { - QMetaObject::invokeMethod( - (MpvPlayerBackend*)ctx, "on_mpv_events", Qt::QueuedConnection); + QCoreApplication::postEvent((MpvPlayerBackend*)ctx, new QEvent(QEvent::User)); } void @@ -147,11 +146,11 @@ MpvPlayerBackend::MpvPlayerBackend(QQuickItem* parent) mpv_set_option_string(mpv, "config", "yes"); // mpv_set_option_string(mpv, "sub-visibility", "no"); mpv_observe_property(mpv, 0, "tracks-menu", MPV_FORMAT_NONE); - mpv_observe_property(mpv, 0, "chapter-list", MPV_FORMAT_NONE); + mpv_observe_property(mpv, 0, "chapter-list", MPV_FORMAT_NODE); mpv_observe_property(mpv, 0, "playback-abort", MPV_FORMAT_NONE); mpv_observe_property(mpv, 0, "chapter-list", MPV_FORMAT_NODE); mpv_observe_property(mpv, 0, "track-list", MPV_FORMAT_NODE); - mpv_observe_property(mpv, 0, "audio-device-list", MPV_FORMAT_NODE); + mpv_observe_property(mpv, 0, "audio-device-list", MPV_FORMAT_NONE); mpv_observe_property(mpv, 0, "playlist-pos", MPV_FORMAT_DOUBLE); mpv_observe_property(mpv, 0, "volume", MPV_FORMAT_NONE); mpv_observe_property(mpv, 0, "mute", MPV_FORMAT_NONE); @@ -160,8 +159,8 @@ MpvPlayerBackend::MpvPlayerBackend(QQuickItem* parent) mpv_observe_property(mpv, 0, "sub-text", MPV_FORMAT_STRING); mpv_observe_property(mpv, 0, "time-pos", MPV_FORMAT_DOUBLE); mpv_observe_property(mpv, 0, "demuxer-cache-duration", MPV_FORMAT_DOUBLE); - mpv_observe_property(mpv, 0, "pause", MPV_FORMAT_NONE); - mpv_observe_property(mpv, 0, "playlist", MPV_FORMAT_NONE); + mpv_observe_property(mpv, 0, "pause", MPV_FORMAT_DOUBLE); + mpv_observe_property(mpv, 0, "playlist", MPV_FORMAT_NODE); mpv_set_wakeup_callback(mpv, wakeup, this); if (mpv_initialize(mpv) < 0) @@ -427,6 +426,15 @@ MpvPlayerBackend::toggleOnTop() Utils::AlwaysOnTop(window()->winId(), onTop); } +bool +MpvPlayerBackend::event(QEvent* event) +{ + if (event->type() == QEvent::User) { + on_mpv_events(); + } + return QObject::event(event); +} + void MpvPlayerBackend::on_mpv_events() { @@ -497,6 +505,7 @@ MpvPlayerBackend::handle_mpv_event(mpv_event* event) } } else if (strcmp(prop->name, "mute") == 0 || strcmp(prop->name, "volume") == 0) { + return; double volume = getProperty("volume").toDouble(); bool mute = getProperty("mute").toBool(); if (mute || volume == 0) { @@ -530,19 +539,24 @@ MpvPlayerBackend::handle_mpv_event(mpv_event* event) emit playlistPositionChanged(pos); } } else if (strcmp(prop->name, "pause") == 0) { + mpv_node* nod = (mpv_node*)prop->data; + qDebug() << mpv::qt::node_to_variant(nod); if (getProperty("pause").toBool()) { emit playStatusChanged(Enums::PlayStatus::Paused); } else { emit playStatusChanged(Enums::PlayStatus::Playing); } - } else if (strcmp(prop->name, "tracks-menu") == 0) { - emit tracksChanged(getProperty("track-list").toList()); + } else if (strcmp(prop->name, "track-list") == 0) { + mpv_node* nod = (mpv_node*)prop->data; + emit tracksChanged(mpv::qt::node_to_variant(nod).toList()); } else if (strcmp(prop->name, "audio-device-list") == 0) { emit audioDevicesChanged(getAudioDevices()); } else if (strcmp(prop->name, "playlist") == 0) { - emit playlistChanged(getProperty("playlist").toList()); + mpv_node* nod = (mpv_node*)prop->data; + emit playlistChanged(mpv::qt::node_to_variant(nod).toList()); } else if (strcmp(prop->name, "chapter-list") == 0) { - emit chaptersChanged(getProperty("chapter-list").toList()); + mpv_node* nod = (mpv_node*)prop->data; + emit chaptersChanged(mpv::qt::node_to_variant(nod).toList()); } #ifdef DISCORD updateDiscord(); diff --git a/src/MpvPlayerBackend.h b/src/MpvPlayerBackend.h index 71e209c..313cdb5 100644 --- a/src/MpvPlayerBackend.h +++ b/src/MpvPlayerBackend.h @@ -49,10 +49,13 @@ public slots: QVariant getProperty(const QString& name) const; // Just used for adding missing audio devices to list. QVariantMap getAudioDevices() const; + bool event(QEvent* event); signals: void onUpdate(); void mpv_events(); + void onMpvEvent(mpv_event* event); + // All below required for Player API void playStatusChanged(const Enums::PlayStatus& status); void volumeStatusChanged(const Enums::VolumeStatus& status); diff --git a/src/main.cpp b/src/main.cpp index 9606827..7f1e202 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -97,6 +97,17 @@ main(int argc, char* argv[]) app.setOrganizationName("KittehPlayer"); app.setOrganizationDomain("namedkitten.pw"); app.setApplicationName("KittehPlayer"); + + QSettings settings; + QString backendSetting = settings.value("Backend/backend", "mpv").toString(); + if (backendSetting == "mpv") { + qDebug() << "Using MPV backend."; + backend = Enums::Backends::MpvBackend; + } else if (backendSetting == "direct-mpv") { + qDebug() << "Using Direct MPV backend."; + backend = Enums::Backends::DirectMpvBackend; + } + for (int i = 1; i < argc; ++i) { if (!qstrcmp(argv[i], "--update")) { Utils::updateAppImage(); diff --git a/src/qml/main.qml b/src/qml/main.qml index e4e9992..56c39df 100644 --- a/src/qml/main.qml +++ b/src/qml/main.qml @@ -20,6 +20,12 @@ Window { id: translate } + Settings { + id: backendSettings + category: "Backend" + property string backend: "mpv" + } + Settings { id: appearance category: "Appearance" diff --git a/src/utils.cpp b/src/utils.cpp index 18b6e9e..6c8309a 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -41,12 +41,20 @@ updateAppImage() qApp->exit(); } +// https://www.youtube.com/watch?v=nXaxk27zwlk&feature=youtu.be&t=56m34s +int +fast_mod(const int input, const int ceil) +{ + return input >= ceil ? input % ceil : input; +} + QString createTimestamp(int seconds) { - int h = floor(seconds / 3600); - int m = floor(seconds % 3600 / 60); - int s = floor(seconds % 3600 % 60); + + int s = fast_mod(seconds, 60); + int m = fast_mod(seconds, 3600) / 60; + int h = fast_mod(seconds, 86400) / 3600; if (h > 0) { return QString::asprintf("%02d:%02d:%02d", h, m, s); @@ -125,4 +133,4 @@ ResetScreensaver() } #endif -} \ No newline at end of file +}