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 ¶ms) 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 ¶ms, 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"