1
0
Fork 0

[Backend] Source formatted with clang-format.

This commit is contained in:
Kitteh 2018-11-06 07:39:42 +00:00
parent 6b1078f93b
commit 8fc36d20b7
4 changed files with 345 additions and 315 deletions

View file

@ -1,52 +1,51 @@
#include <stdexcept>
#include <clocale> #include <clocale>
#include <stdexcept>
#include "MpvPlayerBackend.h" #include "MpvPlayerBackend.h"
#include <QApplication> #include <QApplication>
#include <QQuickWindow>
#include <QOpenGLContext> #include <QOpenGLContext>
#include <QOpenGLFramebufferObject> #include <QOpenGLFramebufferObject>
#include <QQuickWindow>
namespace {
namespace void
wakeup(void* ctx)
{ {
QMetaObject::invokeMethod(
void wakeup(void *ctx) (MpvPlayerBackend*)ctx, "on_mpv_events", Qt::QueuedConnection);
{
QMetaObject::invokeMethod((MpvPlayerBackend*)ctx, "on_mpv_events", Qt::QueuedConnection);
} }
void on_mpv_redraw(void *ctx) void
on_mpv_redraw(void* ctx)
{ {
MpvPlayerBackend::on_update(ctx); MpvPlayerBackend::on_update(ctx);
} }
static void *get_proc_address_mpv(void *ctx, const char *name) static void*
get_proc_address_mpv(void* ctx, const char* name)
{ {
Q_UNUSED(ctx) Q_UNUSED(ctx)
QOpenGLContext* glctx = QOpenGLContext::currentContext(); QOpenGLContext* glctx = QOpenGLContext::currentContext();
if (!glctx) return nullptr; if (!glctx)
return nullptr;
return reinterpret_cast<void*>(glctx->getProcAddress(QByteArray(name))); return reinterpret_cast<void*>(glctx->getProcAddress(QByteArray(name)));
} }
} // namespace
}
class MpvRenderer : public QQuickFramebufferObject::Renderer class MpvRenderer : public QQuickFramebufferObject::Renderer
{ {
MpvPlayerBackend* obj; MpvPlayerBackend* obj;
public: public:
MpvRenderer(MpvPlayerBackend* new_obj) MpvRenderer(MpvPlayerBackend* new_obj)
: obj{ new_obj } : obj{ new_obj }
{ {}
}
virtual ~MpvRenderer() {} virtual ~MpvRenderer() {}
@ -55,11 +54,13 @@ public:
QOpenGLFramebufferObject* createFramebufferObject(const QSize& size) QOpenGLFramebufferObject* createFramebufferObject(const QSize& size)
{ {
// init mpv_gl: // init mpv_gl:
if (!obj->mpv_gl) if (!obj->mpv_gl) {
{ mpv_opengl_init_params gl_init_params{ get_proc_address_mpv,
mpv_opengl_init_params gl_init_params{get_proc_address_mpv, nullptr, nullptr}; nullptr,
nullptr };
mpv_render_param params[]{ mpv_render_param params[]{
{MPV_RENDER_PARAM_API_TYPE, const_cast<char *>(MPV_RENDER_API_TYPE_OPENGL)}, { MPV_RENDER_PARAM_API_TYPE,
const_cast<char*>(MPV_RENDER_API_TYPE_OPENGL) },
{ MPV_RENDER_PARAM_OPENGL_INIT_PARAMS, &gl_init_params }, { MPV_RENDER_PARAM_OPENGL_INIT_PARAMS, &gl_init_params },
{ MPV_RENDER_PARAM_INVALID, nullptr } { MPV_RENDER_PARAM_INVALID, nullptr }
}; };
@ -73,14 +74,15 @@ public:
return QQuickFramebufferObject::Renderer::createFramebufferObject(size); return QQuickFramebufferObject::Renderer::createFramebufferObject(size);
} }
void render() void render()
{ {
obj->window()->resetOpenGLState(); obj->window()->resetOpenGLState();
QOpenGLFramebufferObject* fbo = framebufferObject(); QOpenGLFramebufferObject* fbo = framebufferObject();
mpv_opengl_fbo mpfbo{.fbo = static_cast<int>(fbo->handle()), .w = fbo->width(), .h = fbo->height(), .internal_format = 0}; mpv_opengl_fbo mpfbo{ .fbo = static_cast<int>(fbo->handle()),
.w = fbo->width(),
.h = fbo->height(),
.internal_format = 0 };
int flip_y{ 0 }; int flip_y{ 0 };
mpv_render_param params[] = { mpv_render_param params[] = {
@ -101,9 +103,10 @@ public:
}; };
MpvPlayerBackend::MpvPlayerBackend(QQuickItem* parent) MpvPlayerBackend::MpvPlayerBackend(QQuickItem* parent)
: QQuickFramebufferObject(parent), mpv{mpv_create()}, mpv_gl(nullptr) : QQuickFramebufferObject(parent)
, mpv{ mpv_create() }
, mpv_gl(nullptr)
{ {
if (!mpv) if (!mpv)
throw std::runtime_error("could not create mpv context"); throw std::runtime_error("could not create mpv context");
@ -120,10 +123,6 @@ MpvPlayerBackend::MpvPlayerBackend(QQuickItem * parent)
mpv_set_option_string(mpv, "config", "yes"); mpv_set_option_string(mpv, "config", "yes");
// mpv_set_option_string(mpv, "sub-visibility", "no"); // mpv_set_option_string(mpv, "sub-visibility", "no");
mpv_observe_property(mpv, 0, "playback-abort", MPV_FORMAT_NONE); 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, "chapter-list", MPV_FORMAT_NODE);
mpv_observe_property(mpv, 0, "track-list", MPV_FORMAT_NODE); mpv_observe_property(mpv, 0, "track-list", MPV_FORMAT_NODE);
@ -141,122 +140,150 @@ MpvPlayerBackend::MpvPlayerBackend(QQuickItem * parent)
if (mpv_initialize(mpv) < 0) if (mpv_initialize(mpv) < 0)
throw std::runtime_error("could not initialize mpv context"); throw std::runtime_error("could not initialize mpv context");
connect(this, &MpvPlayerBackend::onUpdate, this, &MpvPlayerBackend::doUpdate, connect(this,
&MpvPlayerBackend::onUpdate,
this,
&MpvPlayerBackend::doUpdate,
Qt::QueuedConnection); Qt::QueuedConnection);
} }
MpvPlayerBackend::~MpvPlayerBackend() MpvPlayerBackend::~MpvPlayerBackend()
{ {
if (mpv_gl) if (mpv_gl) {
{
mpv_render_context_free(mpv_gl); mpv_render_context_free(mpv_gl);
} }
mpv_terminate_destroy(mpv); mpv_terminate_destroy(mpv);
} }
void MpvPlayerBackend::on_update(void *ctx) void
MpvPlayerBackend::on_update(void* ctx)
{ {
MpvPlayerBackend* self = (MpvPlayerBackend*)ctx; MpvPlayerBackend* self = (MpvPlayerBackend*)ctx;
emit self->onUpdate(); emit self->onUpdate();
} }
// connected to onUpdate(); signal makes sure it runs on the GUI thread // connected to onUpdate(); signal makes sure it runs on the GUI thread
void MpvPlayerBackend::doUpdate() void
MpvPlayerBackend::doUpdate()
{ {
update(); update();
} }
QVariant
QVariant MpvPlayerBackend::getProperty(const QString &name) const MpvPlayerBackend::getProperty(const QString& name) const
{ {
return mpv::qt::get_property_variant(mpv, name); return mpv::qt::get_property_variant(mpv, name);
} }
void
void MpvPlayerBackend::command(const QVariant& params) MpvPlayerBackend::command(const QVariant& params)
{ {
qDebug() << params; qDebug() << params;
mpv::qt::command_variant(mpv, params); mpv::qt::command_variant(mpv, params);
} }
void MpvPlayerBackend::setProperty(const QString& name, const QVariant& value) void
MpvPlayerBackend::setProperty(const QString& name, const QVariant& value)
{ {
mpv::qt::set_property_variant(mpv, name, value); mpv::qt::set_property_variant(mpv, name, value);
} }
void MpvPlayerBackend::setOption(const QString& name, const QVariant& value) void
MpvPlayerBackend::setOption(const QString& name, const QVariant& value)
{ {
mpv::qt::set_option_variant(mpv, name, value); mpv::qt::set_option_variant(mpv, name, value);
} }
void MpvPlayerBackend::launchAboutQt() void
MpvPlayerBackend::launchAboutQt()
{ {
QApplication *qapp = qobject_cast<QApplication *>(QCoreApplication::instance()); QApplication* qapp =
qobject_cast<QApplication*>(QCoreApplication::instance());
qapp->aboutQt(); qapp->aboutQt();
} }
void MpvPlayerBackend::togglePlayPause() void
MpvPlayerBackend::togglePlayPause()
{ {
command(QVariantList() << "cycle" << "pause"); command(QVariantList() << "cycle"
<< "pause");
} }
void MpvPlayerBackend::toggleMute() void
MpvPlayerBackend::toggleMute()
{ {
command(QVariantList() << "cycle" << "mute"); command(QVariantList() << "cycle"
<< "mute");
} }
void MpvPlayerBackend::nextAudioTrack() void
MpvPlayerBackend::nextAudioTrack()
{ {
command(QVariantList() << "cycle" << "audio"); command(QVariantList() << "cycle"
<< "audio");
} }
void MpvPlayerBackend::nextSubtitleTrack() void
MpvPlayerBackend::nextSubtitleTrack()
{ {
command(QVariantList() << "cycle" << "sub"); command(QVariantList() << "cycle"
<< "sub");
} }
void MpvPlayerBackend::nextVideoTrack() void
MpvPlayerBackend::nextVideoTrack()
{ {
command(QVariantList() << "cycle" << "video"); command(QVariantList() << "cycle"
<< "video");
} }
void MpvPlayerBackend::prevPlaylistItem() void
MpvPlayerBackend::prevPlaylistItem()
{ {
command(QVariantList() << "playlist-prev"); command(QVariantList() << "playlist-prev");
} }
void MpvPlayerBackend::nextPlaylistItem() void
MpvPlayerBackend::nextPlaylistItem()
{ {
command(QVariantList() << "playlist-next" << "force"); command(QVariantList() << "playlist-next"
<< "force");
} }
void MpvPlayerBackend::loadFile(const QVariant &filename) void
MpvPlayerBackend::loadFile(const QVariant& filename)
{ {
command(QVariantList() << "loadfile" << filename); command(QVariantList() << "loadfile" << filename);
} }
void MpvPlayerBackend::setVolume(const QVariant &volume) void
MpvPlayerBackend::setVolume(const QVariant& volume)
{ {
command(QVariantList() << "set" << "volume" << volume); command(QVariantList() << "set"
<< "volume" << volume);
} }
void MpvPlayerBackend::addVolume(const QVariant &volume) void
MpvPlayerBackend::addVolume(const QVariant& volume)
{ {
command(QVariantList() << "add" << "volume" << volume); command(QVariantList() << "add"
<< "volume" << volume);
} }
void MpvPlayerBackend::seek(const QVariant &seekTime) void
MpvPlayerBackend::seek(const QVariant& seekTime)
{ {
command(QVariantList() << "seek" << seekTime); command(QVariantList() << "seek" << seekTime);
} }
QVariant MpvPlayerBackend::getTracks() const QVariant
MpvPlayerBackend::getTracks() const
{ {
return mpv::qt::get_property_variant(mpv, "track-list"); return mpv::qt::get_property_variant(mpv, "track-list");
} }
void MpvPlayerBackend::on_mpv_events() void
MpvPlayerBackend::on_mpv_events()
{ {
while (mpv) { while (mpv) {
mpv_event* event = mpv_wait_event(mpv, 0); mpv_event* event = mpv_wait_event(mpv, 0);
@ -266,10 +293,10 @@ void MpvPlayerBackend::on_mpv_events()
} }
handle_mpv_event(event); handle_mpv_event(event);
} }
} }
void MpvPlayerBackend::handle_mpv_event(mpv_event *event) void
MpvPlayerBackend::handle_mpv_event(mpv_event* event)
{ {
switch (event->event_id) { switch (event->event_id) {
case MPV_EVENT_PROPERTY_CHANGE: { case MPV_EVENT_PROPERTY_CHANGE: {
@ -277,22 +304,27 @@ void MpvPlayerBackend::handle_mpv_event(mpv_event *event)
if (strcmp(prop->name, "time-pos") == 0) { if (strcmp(prop->name, "time-pos") == 0) {
if (prop->format == MPV_FORMAT_DOUBLE) { if (prop->format == MPV_FORMAT_DOUBLE) {
double time = *(double*)prop->data; double time = *(double*)prop->data;
QMetaObject::invokeMethod(this,"setProgressBarValue",Q_ARG(QVariant,time)); QMetaObject::invokeMethod(
this, "setProgressBarValue", Q_ARG(QVariant, time));
} }
} else if (strcmp(prop->name, "duration") == 0) { } else if (strcmp(prop->name, "duration") == 0) {
if (prop->format == MPV_FORMAT_DOUBLE) { if (prop->format == MPV_FORMAT_DOUBLE) {
double time = *(double *)prop->data;Q_ARG(QVariant,"txt1"), double time = *(double*)prop->data;
QMetaObject::invokeMethod(this,"setProgressBarEnd",Q_ARG(QVariant,time)); Q_ARG(QVariant, "txt1"),
QMetaObject::invokeMethod(
this, "setProgressBarEnd", Q_ARG(QVariant, time));
} }
} else if (strcmp(prop->name, "volume") == 0) { } else if (strcmp(prop->name, "volume") == 0) {
if (prop->format == MPV_FORMAT_DOUBLE) { if (prop->format == MPV_FORMAT_DOUBLE) {
double volume = *(double*)prop->data; double volume = *(double*)prop->data;
QMetaObject::invokeMethod(this,"updateVolume",Q_ARG(QVariant,volume)); QMetaObject::invokeMethod(
this, "updateVolume", Q_ARG(QVariant, volume));
} }
} else if (strcmp(prop->name, "muted") == 0) { } else if (strcmp(prop->name, "muted") == 0) {
if (prop->format == MPV_FORMAT_DOUBLE) { if (prop->format == MPV_FORMAT_DOUBLE) {
double muted = *(double*)prop->data; double muted = *(double*)prop->data;
QMetaObject::invokeMethod(this,"updateMuted",Q_ARG(QVariant,muted)); QMetaObject::invokeMethod(
this, "updateMuted", Q_ARG(QVariant, muted));
} }
} else if (strcmp(prop->name, "media-title") == 0) { } else if (strcmp(prop->name, "media-title") == 0) {
if (prop->format == MPV_FORMAT_STRING) { if (prop->format == MPV_FORMAT_STRING) {
@ -302,12 +334,14 @@ void MpvPlayerBackend::handle_mpv_event(mpv_event *event)
} else if (strcmp(prop->name, "sub-text") == 0) { } else if (strcmp(prop->name, "sub-text") == 0) {
if (prop->format == MPV_FORMAT_STRING) { if (prop->format == MPV_FORMAT_STRING) {
char* subs = *(char**)prop->data; char* subs = *(char**)prop->data;
QMetaObject::invokeMethod(this,"setSubtitles",Q_ARG(QVariant,subs)); QMetaObject::invokeMethod(
this, "setSubtitles", Q_ARG(QVariant, subs));
} }
} else if (strcmp(prop->name, "demuxer-cache-duration") == 0) { } else if (strcmp(prop->name, "demuxer-cache-duration") == 0) {
if (prop->format == MPV_FORMAT_DOUBLE) { if (prop->format == MPV_FORMAT_DOUBLE) {
double duration = *(double*)prop->data; double duration = *(double*)prop->data;
QMetaObject::invokeMethod(this,"setCachedDuration",Q_ARG(QVariant,duration)); QMetaObject::invokeMethod(
this, "setCachedDuration", Q_ARG(QVariant, duration));
} }
} else if (strcmp(prop->name, "playlist-pos") == 0) { } else if (strcmp(prop->name, "playlist-pos") == 0) {
if (prop->format == MPV_FORMAT_DOUBLE) { if (prop->format == MPV_FORMAT_DOUBLE) {
@ -329,7 +363,8 @@ void MpvPlayerBackend::handle_mpv_event(mpv_event *event)
} }
} }
QQuickFramebufferObject::Renderer *MpvPlayerBackend::createRenderer() const QQuickFramebufferObject::Renderer*
MpvPlayerBackend::createRenderer() const
{ {
window()->setPersistentOpenGLContext(true); window()->setPersistentOpenGLContext(true);
window()->setPersistentSceneGraph(true); window()->setPersistentSceneGraph(true);

View file

@ -2,15 +2,13 @@
#define MpvPlayerBackend_H #define MpvPlayerBackend_H
#include <mpv/client.h> #include <mpv/client.h>
#include <mpv/render_gl.h>
#include <mpv/qthelper.hpp> #include <mpv/qthelper.hpp>
#include <mpv/render_gl.h>
#include <QObject> #include <QObject>
#include <QOpenGLContext> #include <QOpenGLContext>
#include <QQuickFramebufferObject> #include <QQuickFramebufferObject>
class MpvRenderer; class MpvRenderer;
class MpvPlayerBackend : public QQuickFramebufferObject class MpvPlayerBackend : public QQuickFramebufferObject
@ -28,7 +26,6 @@ public:
virtual ~MpvPlayerBackend(); virtual ~MpvPlayerBackend();
virtual Renderer* createRenderer() const; virtual Renderer* createRenderer() const;
public slots: public slots:
void launchAboutQt(); void launchAboutQt();
void togglePlayPause(); void togglePlayPause();
@ -49,7 +46,6 @@ public slots:
void setOption(const QString& name, const QVariant& value); void setOption(const QString& name, const QVariant& value);
QVariant getProperty(const QString& name) const; QVariant getProperty(const QString& name) const;
signals: signals:
void onUpdate(); void onUpdate();
void positionChanged(int value); void positionChanged(int value);
@ -61,10 +57,6 @@ private slots:
private: private:
void handle_mpv_event(mpv_event* event); void handle_mpv_event(mpv_event* event);
}; };
#endif #endif

View file

@ -4,17 +4,17 @@
#include <cstdlib> #include <cstdlib>
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QProcessEnvironment>
#include "MpvPlayerBackend.h" #include "MpvPlayerBackend.h"
#include <QApplication>
#include <QProcessEnvironment>
#include <QQmlApplicationEngine>
#ifdef WIN32 #ifdef WIN32
#include "setenv_mingw.hpp" #include "setenv_mingw.hpp"
#endif #endif
int main( int argc, char *argv[] ) int
main(int argc, char* argv[])
{ {
setenv("QT_QUICK_CONTROLS_STYLE", "Desktop", 1); setenv("QT_QUICK_CONTROLS_STYLE", "Desktop", 1);
QApplication app(argc, argv); QApplication app(argc, argv);
@ -23,10 +23,15 @@ int main( int argc, char *argv[] )
app.setApplicationName("KittehPlayer"); app.setApplicationName("KittehPlayer");
for (int i = 1; i < argc; ++i) { for (int i = 1; i < argc; ++i) {
if (!qstrcmp(argv[i], "--update")) { if (!qstrcmp(argv[i], "--update")) {
QString program = QProcessEnvironment::systemEnvironment().value("APPDIR", "") + "/usr/bin/appimageupdatetool"; QString program =
QProcessEnvironment::systemEnvironment().value("APPDIR", "") +
"/usr/bin/appimageupdatetool";
QProcess updater; QProcess updater;
updater.setProcessChannelMode(QProcess::ForwardedChannels); updater.setProcessChannelMode(QProcess::ForwardedChannels);
updater.start(program, QStringList() << QProcessEnvironment::systemEnvironment().value("APPIMAGE", "")); updater.start(program,
QStringList()
<< QProcessEnvironment::systemEnvironment().value(
"APPIMAGE", ""));
updater.waitForFinished(); updater.waitForFinished();
qDebug() << program; qDebug() << program;
exit(0); exit(0);
@ -36,7 +41,9 @@ int main( int argc, char *argv[] )
QProcess dpms; QProcess dpms;
dpms.start("xset", QStringList() << "-dpms"); dpms.start("xset", QStringList() << "-dpms");
QString newpath = QProcessEnvironment::systemEnvironment().value("APPDIR", "") + "/usr/bin:" + QProcessEnvironment::systemEnvironment().value("PATH", ""); QString newpath =
QProcessEnvironment::systemEnvironment().value("APPDIR", "") +
"/usr/bin:" + QProcessEnvironment::systemEnvironment().value("PATH", "");
qDebug() << newpath; qDebug() << newpath;
setenv("PATH", newpath.toUtf8().constData(), 1); setenv("PATH", newpath.toUtf8().constData(), 1);

View file

@ -31,12 +31,13 @@
* *
*/ */
#include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <errno.h>
int setenv( const char *var, const char *value, int overwrite ) int
setenv(const char* var, const char* value, int overwrite)
{ {
/* Core implementation for both setenv() and unsetenv() functions; /* Core implementation for both setenv() and unsetenv() functions;
* at the outset, assume that the requested operation may fail. * at the outset, assume that the requested operation may fail.
@ -46,15 +47,13 @@ int setenv( const char *var, const char *value, int overwrite )
/* The specified "var" name MUST be non-NULL, not a zero-length /* The specified "var" name MUST be non-NULL, not a zero-length
* string, and must not include any '=' character. * string, and must not include any '=' character.
*/ */
if( var && *var && (strchr( var, '=' ) == NULL) ) if (var && *var && (strchr(var, '=') == NULL)) {
{
/* A properly named variable may be added to, removed from, /* A properly named variable may be added to, removed from,
* or modified within the environment, ONLY if "overwrite" * or modified within the environment, ONLY if "overwrite"
* mode is enabled, OR if the named variable does not yet * mode is enabled, OR if the named variable does not yet
* exist... * exist...
*/ */
if( overwrite || getenv( var ) == NULL ) if (overwrite || getenv(var) == NULL) {
{
/* ... in which cases, we convert the specified name and /* ... in which cases, we convert the specified name and
* value into the appropriate form for use with putenv(), * value into the appropriate form for use with putenv(),
* (noting that we accept a NULL "value" as equivalent to * (noting that we accept a NULL "value" as equivalent to
@ -72,14 +71,12 @@ int setenv( const char *var, const char *value, int overwrite )
* free memory; ensure that errno is set accordingly. * free memory; ensure that errno is set accordingly.
*/ */
errno = ENOMEM; errno = ENOMEM;
} } else
else
/* The named variable already exists, and overwrite mode /* The named variable already exists, and overwrite mode
* was not enabled; there is nothing to be done. * was not enabled; there is nothing to be done.
*/ */
retval = 0; retval = 0;
} } else
else
/* The specified environment variable name was invalid. /* The specified environment variable name was invalid.
*/ */
errno = EINVAL; errno = EINVAL;
@ -89,4 +86,3 @@ int setenv( const char *var, const char *value, int overwrite )
*/ */
return retval; return retval;
} }