File indexing completed on 2024-05-19 04:45:38

0001 /*
0002  * SPDX-FileCopyrightText: 2023 George Florea Bănuș <georgefb899@gmail.com>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005  */
0006 
0007 #include "mpvabstractitem.h"
0008 #include "mpvabstractitem_p.h"
0009 
0010 #include <QThread>
0011 
0012 #include "mpvcontroller.h"
0013 #include "mpvrenderer.h"
0014 
0015 MpvAbstractItemPrivate::MpvAbstractItemPrivate(MpvAbstractItem *q)
0016     : q_ptr(q)
0017 {
0018 }
0019 
0020 MpvAbstractItem::MpvAbstractItem(QQuickItem *parent)
0021     : QQuickFramebufferObject(parent)
0022     , d_ptr{std::make_unique<MpvAbstractItemPrivate>(this)}
0023 {
0024     d_ptr->m_workerThread = new QThread;
0025     d_ptr->m_mpvController = new MpvController;
0026     d_ptr->m_workerThread->start();
0027     d_ptr->m_mpvController->moveToThread(d_ptr->m_workerThread);
0028     QMetaObject::invokeMethod(d_ptr->m_mpvController, "init", Qt::BlockingQueuedConnection);
0029     d_ptr->m_mpv = d_ptr->m_mpvController->mpv();
0030 
0031     connect(d_ptr->m_workerThread, &QThread::finished, d_ptr->m_mpvController, &MpvController::deleteLater);
0032     connect(this, &MpvAbstractItem::observeProperty, d_ptr->m_mpvController, &MpvController::observeProperty, Qt::QueuedConnection);
0033     connect(this, &MpvAbstractItem::setProperty, d_ptr->m_mpvController, &MpvController::setProperty, Qt::QueuedConnection);
0034     connect(this, &MpvAbstractItem::command, d_ptr->m_mpvController, &MpvController::command, Qt::QueuedConnection);
0035 }
0036 
0037 MpvAbstractItem::~MpvAbstractItem()
0038 {
0039     if (d_ptr->m_mpv_gl) {
0040         mpv_render_context_free(d_ptr->m_mpv_gl);
0041     }
0042     mpv_set_wakeup_callback(d_ptr->m_mpv, nullptr, nullptr);
0043 
0044     d_ptr->m_workerThread->quit();
0045     d_ptr->m_workerThread->wait();
0046     d_ptr->m_workerThread->deleteLater();
0047     mpv_terminate_destroy(d_ptr->m_mpv);
0048 }
0049 
0050 QQuickFramebufferObject::Renderer *MpvAbstractItem::createRenderer() const
0051 {
0052     return new MpvRenderer(const_cast<MpvAbstractItem *>(this));
0053 }
0054 
0055 MpvController *MpvAbstractItem::mpvController()
0056 {
0057     return d_ptr->m_mpvController;
0058 }
0059 
0060 int MpvAbstractItem::setPropertyBlocking(const QString &property, const QVariant &value)
0061 {
0062     int error;
0063     QMetaObject::invokeMethod(d_ptr->m_mpvController,
0064                               "setProperty",
0065                               Qt::BlockingQueuedConnection,
0066                               Q_RETURN_ARG(int, error),
0067                               Q_ARG(QString, property),
0068                               Q_ARG(QVariant, value));
0069 
0070     return error;
0071 }
0072 
0073 void MpvAbstractItem::setPropertyAsync(const QString &property, const QVariant &value, int id)
0074 {
0075     QMetaObject::invokeMethod(d_ptr->m_mpvController,
0076                               "setPropertyAsync",
0077                               Qt::QueuedConnection,
0078                               Q_ARG(QString, property),
0079                               Q_ARG(QVariant, value),
0080                               Q_ARG(int, id));
0081 }
0082 
0083 QVariant MpvAbstractItem::getProperty(const QString &property)
0084 {
0085     QVariant value;
0086     QMetaObject::invokeMethod(d_ptr->m_mpvController, "getProperty", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QVariant, value), Q_ARG(QString, property));
0087 
0088     return value;
0089 }
0090 
0091 void MpvAbstractItem::getPropertyAsync(const QString &property, int id)
0092 {
0093     QMetaObject::invokeMethod(d_ptr->m_mpvController, "getPropertyAsync", Qt::QueuedConnection, Q_ARG(QString, property), Q_ARG(int, id));
0094 }
0095 
0096 QVariant MpvAbstractItem::commandBlocking(const QVariant &params)
0097 {
0098     QVariant value;
0099     QMetaObject::invokeMethod(d_ptr->m_mpvController, "command", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QVariant, value), Q_ARG(QVariant, params));
0100     return value;
0101 }
0102 
0103 void MpvAbstractItem::commandAsync(const QStringList &params, int id)
0104 {
0105     QMetaObject::invokeMethod(d_ptr->m_mpvController, "commandAsync", Qt::QueuedConnection, Q_ARG(QVariant, params), Q_ARG(int, id));
0106 }
0107 
0108 QVariant MpvAbstractItem::expandText(const QString &text)
0109 {
0110     QVariant value;
0111     QMetaObject::invokeMethod(d_ptr->m_mpvController,
0112                               "command",
0113                               Qt::BlockingQueuedConnection,
0114                               Q_RETURN_ARG(QVariant, value),
0115                               Q_ARG(QVariant, QVariant::fromValue(QStringList{QStringLiteral("expand-text"), text})));
0116     return value;
0117 }
0118 
0119 #include "moc_mpvabstractitem.cpp"