]> Some of my projects - aniplayer.git/commitdiff
Split backend plugins from backend instances
authorAPTX <marek321@gmail.com>
Sun, 26 Feb 2017 18:43:01 +0000 (19:43 +0100)
committerAPTX <marek321@gmail.com>
Sun, 26 Feb 2017 18:46:51 +0000 (19:46 +0100)
backendplugins/backend_mpv/backendmpv.cpp
backendplugins/backend_mpv/backendmpv.h
backendplugins/backend_null/backendnull.cpp
backendplugins/backend_null/backendnull.h
core/backendpluginbase.h
core/instancemanager.cpp
core/instancemanager.h
core/player.cpp
core/player.h
core/videoelement.cpp
core/videoelement.h

index 2181fc054cfd01f246ec7d3476d5f4b9a7e7940e..49cf3d24472a8e296a6f55dd222bebdccc913f97 100644 (file)
 Q_LOGGING_CATEGORY(mpvBackend, "MPV")
 Q_LOGGING_CATEGORY(mpvLog, "MPV Log")
 
-BackendMpv::BackendMpv() {
+BackendMpv::BackendMpv(QObject *parent) : QObject{parent} {
 #ifdef Q_OS_UNIX
   setlocale(LC_NUMERIC, "C");
 #endif
 }
 
-BackendMpv::~BackendMpv() {}
+BackendInstance *BackendMpv::createInstance(PlayerPluginInterface *player) {
+  return new MpvInstance{player};
+}
 
-bool BackendMpv::initialize(PlayerPluginInterface *playerInterface) {
+MpvInstance::MpvInstance(PlayerPluginInterface *playerInterface,
+                         QObject *parent)
+    : QObject{parent}, m_player{playerInterface} {
   qCDebug(mpvBackend) << "Initialize";
-  m_player = playerInterface;
   m_handle = mpv_create();
 
+  Q_CHECK_PTR(m_handle);
+
   qCDebug(mpvBackend()).nospace()
       << "Client API version: " << (mpv_client_api_version() >> 16) << '.'
       << (mpv_client_api_version() & ~(~0u << 16));
 
-  // mpv_set_option(handle, "wid", MPV_FORMAT_INT64, &wid);
   mpv_set_option_string(m_handle, "vo", "opengl-cb");
 
   int error = mpv_initialize(m_handle);
   if (error) {
     qCDebug(mpvBackend) << "Error initializing mpv" << mpv_error_string(error);
-    return false;
+    return;
   }
 
   mpv_set_wakeup_callback(m_handle, mpvWakeupCb, this);
@@ -54,49 +58,48 @@ bool BackendMpv::initialize(PlayerPluginInterface *playerInterface) {
 
   qCDebug(mpvBackend) << "request log messages"
                       << mpv_request_log_messages(m_handle, "info");
-  return !error;
 }
 
-void BackendMpv::deinitialize() {
+MpvInstance::~MpvInstance() {
   qCDebug(mpvBackend) << "Deinitialize";
   mpv_terminate_destroy(m_handle);
 }
 
-VideoRendererBase *BackendMpv::createRenderer(VideoUpdateInterface *vui) {
+VideoRendererBase *MpvInstance::createRenderer(VideoUpdateInterface *vui) {
   qCDebug(mpvBackend, "BackendMpv::createRenderer");
   return new VideoRendererMpv(m_handle, vui);
 }
 
-bool BackendMpv::open(const QUrl &source) {
+bool MpvInstance::open(const QUrl &source) {
   qCDebug(mpvBackend) << "Opening " << source;
   const QByteArray tmp = source.toLocalFile().toUtf8();
 
-  const char *args[] = {"loadfile", tmp.constData(), NULL};
+  const char *args[] = {"loadfile", tmp.constData(), nullptr};
   mpv_command_async(m_handle, 1, args);
   pause();
 
   return true;
 }
 
-void BackendMpv::play() {
+void MpvInstance::play() {
   qCDebug(mpvBackend) << "Play";
   int f = 0;
   mpv_set_property(m_handle, "pause", MPV_FORMAT_FLAG, &f);
 }
 
-void BackendMpv::pause() {
+void MpvInstance::pause() {
   qCDebug(mpvBackend) << "Pause";
   int f = 1;
   mpv_set_property(m_handle, "pause", MPV_FORMAT_FLAG, &f);
 }
 
-void BackendMpv::stop() { qCDebug(mpvBackend) << "Stop"; }
+void MpvInstance::stop() { qCDebug(mpvBackend) << "Stop"; }
 
-void BackendMpv::seek(TimeStamp pos) {
+void MpvInstance::seek(TimeStamp pos) {
   mpv_set_property(m_handle, "playback-time", MPV_FORMAT_DOUBLE, &pos);
 }
 
-void BackendMpv::setVolume(BackendPluginBase::Volume volume) {
+void MpvInstance::setVolume(Volume volume) {
   double percantageVolume = volume * 100;
   int error = mpv_set_property(m_handle, "ao-volume", MPV_FORMAT_DOUBLE,
                                &percantageVolume);
@@ -151,7 +154,7 @@ decltype(auto) readProperty(struct mpv_event_property *property) {
   return MpvProperty<TYPE>::read(property);
 }
 
-void BackendMpv::processMpvEvents() {
+void MpvInstance::processMpvEvents() {
   struct mpv_event *event = nullptr;
   do {
     event = mpv_wait_event(m_handle, 0);
@@ -248,7 +251,7 @@ void BackendMpv::processMpvEvents() {
   } while (event->event_id != MPV_EVENT_NONE);
 }
 
-void BackendMpv::mpvWakeupCb(void *obj) {
+void MpvInstance::mpvWakeupCb(void *obj) {
   auto self = static_cast<BackendMpv *>(obj);
   QMetaObject::invokeMethod(self, "processMpvEvents", Qt::QueuedConnection);
 }
index 41b0d3a22dcc35779190b8dee75fa3e048dc2430..43271a3c3c5610bf4fa6c3c5eb19faeb44060fb5 100644 (file)
@@ -18,10 +18,17 @@ class BACKEND_MPVSHARED_EXPORT BackendMpv : public QObject,
   Q_INTERFACES(BackendPluginBase)
 
 public:
-  BackendMpv();
-  virtual ~BackendMpv();
-  bool initialize(PlayerPluginInterface *) override;
-  void deinitialize() override;
+  explicit BackendMpv(QObject *parent = nullptr);
+
+  BackendInstance *createInstance(PlayerPluginInterface *) override;
+};
+
+class BACKEND_MPVSHARED_EXPORT MpvInstance : public QObject,
+                                             public BackendInstance {
+  Q_OBJECT
+public:
+  MpvInstance(PlayerPluginInterface *, QObject *parent = nullptr);
+  virtual ~MpvInstance() override;
 
   VideoRendererBase *createRenderer(VideoUpdateInterface *) override;
 
@@ -35,8 +42,8 @@ public:
   void setVolume(Volume) override;
 
 private:
-  mpv_handle *m_handle = nullptr;
   PlayerPluginInterface *m_player = nullptr;
+  mpv_handle *m_handle = nullptr;
   Volume m_volumeToSet = -1;
   bool m_loadedFile = false;
 
index c09259e7684ccfd4db144eac5e3b3d7aac8fb327..08efa5196a4dffb894ec19441919d975a124b3ce 100644 (file)
@@ -1,63 +1,33 @@
 #include "backendnull.h"
 
-#include <QTimer>
 #include <QDebug>
+#include <QTimer>
 
-BackendNull::BackendNull()
-{
-}
-
-BackendNull::~BackendNull()
-{
-}
-
-bool BackendNull::initialize(PlayerPluginInterface *)
-{
-    qDebug() << "Initialize";
-    m_timer = new QTimer{this};
-    m_timer->setInterval(1000);
-    return true;
-}
-
-void BackendNull::deinitialize()
-{
-    qDebug() << "Deinitialize";
-    delete m_timer;
-    m_timer = nullptr;
+BackendInstance *BackendNull::createInstance(PlayerPluginInterface *) {
+  return new NullInstance;
 }
 
-bool BackendNull::open(const QUrl &source)
-{
-    qDebug() << "Opening " << source;
-    return true;
+NullInstance::NullInstance() {
+  qDebug() << "Initialize";
+  m_timer = new QTimer{this};
+  m_timer->setInterval(1000);
 }
 
-void BackendNull::play()
-{
-    qDebug() << "Play";
+bool NullInstance::open(const QUrl &source) {
+  qDebug() << "Opening " << source;
+  return true;
 }
 
-void BackendNull::pause()
-{
-    qDebug() << "Pause";
-}
+void NullInstance::play() { qDebug() << "Play"; }
 
-void BackendNull::stop()
-{
-    qDebug() << "Stop";
-}
+void NullInstance::pause() { qDebug() << "Pause"; }
 
+void NullInstance::stop() { qDebug() << "Stop"; }
 
-VideoRendererBase *BackendNull::createRenderer(VideoUpdateInterface *)
-{
-    return nullptr;
+VideoRendererBase *NullInstance::createRenderer(VideoUpdateInterface *) {
+  return nullptr;
 }
 
+void NullInstance::seek(TimeStamp) {}
 
-void BackendNull::seek(TimeStamp)
-{
-}
-
-void BackendNull::setVolume(BackendPluginBase::Volume)
-{
-}
+void NullInstance::setVolume(Volume) {}
index 9915925d811cf72911948294544b466f6f9a3051..b997636c5d7bc4d7436170792c7376b82f140551 100644 (file)
@@ -9,33 +9,37 @@
 
 class QTimer;
 
-class BACKEND_NULLSHARED_EXPORT BackendNull : public QObject, public BackendPluginBase
-{
-    Q_OBJECT
-    Q_PLUGIN_METADATA(IID ANIPLAYER_BACKEND_DPLUGIN_INTERFACE_IID FILE "backend_null.json")
-    Q_INTERFACES(BackendPluginBase)
+class BACKEND_NULLSHARED_EXPORT BackendNull : public QObject,
+                                              public BackendPluginBase {
+  Q_OBJECT
+  Q_PLUGIN_METADATA(IID ANIPLAYER_BACKEND_DPLUGIN_INTERFACE_IID FILE
+                    "backend_null.json")
+  Q_INTERFACES(BackendPluginBase)
 
 public:
-    BackendNull();
-    virtual ~BackendNull();
-    bool initialize(PlayerPluginInterface *) override;
-    void deinitialize() override;
+  using QObject::QObject;
+  virtual BackendInstance *createInstance(PlayerPluginInterface *) override;
+};
 
-    bool open(const QUrl &source) override;
-    void play() override;
-    void pause() override;
-    void stop() override;
+class BACKEND_NULLSHARED_EXPORT NullInstance : public QObject,
+                                               public BackendInstance {
+  Q_OBJECT
+public:
+  NullInstance();
 
+  bool open(const QUrl &source) override;
+  void play() override;
+  void pause() override;
+  void stop() override;
 
-    void seek(TimeStamp) override;
+  void seek(TimeStamp) override;
 
-    void setVolume(Volume) override;
+  void setVolume(Volume) override;
 
-     VideoRendererBase *createRenderer(VideoUpdateInterface *) override;
+  VideoRendererBase *createRenderer(VideoUpdateInterface *) override;
 
 private:
-    QTimer *m_timer = nullptr;
-
+  QTimer *m_timer = nullptr;
 };
 
 #endif // BACKENDNULL_H
index 58f1a6891a642bc8ca1ddf66573a8f2295f952af..d7aeaf376d74b2e2a2a3d1deecd8b1cccb5afab5 100644 (file)
@@ -5,16 +5,13 @@
 
 class QUrl;
 
-class BackendPluginBase {
+class BackendInstance {
 public:
+  // In seconds
   using TimeStamp = double;
   // Volume valid range is 0.0-1.0
   using Volume = double;
-
-  virtual ~BackendPluginBase() = default;
-
-  virtual bool initialize(PlayerPluginInterface *) = 0;
-  virtual void deinitialize() = 0;
+  virtual ~BackendInstance() = default;
 
   virtual VideoRendererBase *createRenderer(VideoUpdateInterface *) = 0;
 
@@ -29,6 +26,13 @@ public:
   virtual void setVolume(Volume) = 0;
 };
 
+class BackendPluginBase {
+public:
+  virtual ~BackendPluginBase() = default;
+
+  virtual BackendInstance *createInstance(PlayerPluginInterface *) = 0;
+};
+
 #define ANIPLAYER_BACKEND_DPLUGIN_INTERFACE_IID                                \
   "org.aptx.aniplayer.BackendPluginInterface"
 
index e59bee21e7d1f9d62f017fcceff3f5966c3c958a..3935346afd46dfd9b5dde1bfea078d21bbc5522b 100644 (file)
@@ -28,10 +28,10 @@ int InstanceManager::runInstance(const QCoreApplication &app) {
 
   player = new Player{this};
   Q_CHECK_PTR(player);
+  qCDebug(imCategory, "Player Created");
 
   if (!positionalArgs.empty())
     player->setNextSource(QUrl::fromUserInput(positionalArgs[0]));
-  qCDebug(imCategory, "Player Created");
   TimeFormatter timeFormatter;
   engine.rootContext()->setContextProperty("player", player);
   engine.rootContext()->setContextProperty("timeFormatter", &timeFormatter);
index 0b8f17ed28d0a919fa69304e92305a397d351bd8..c1ae55b4b8c89d2e10cf14961d1f3d703aa07843 100644 (file)
@@ -26,7 +26,7 @@ private:
                                           "Start playback specific position",
                                           "position in seconds", "0"};
   QCommandLineParser parser;
-  Player *player;
+  Player *player = nullptr;
 };
 
 #endif // INSTANCEMANAGER_H
index f00f72dcaaeefd46fb19308ba6bd2e4fd85becff..a2b3317bd48c310f72fd46a08a50e411a4d1fbe2 100644 (file)
@@ -5,9 +5,17 @@
 
 Q_LOGGING_CATEGORY(playerCategory, "Player")
 
-Player::Player(QObject *parent) : QObject(parent) { loadBackend(); }
+Player::Player(QObject *parent) : QObject(parent) {
+  qCDebug(playerCategory) << "Creating player" << this;
+  loadBackend();
+}
+
+Player::~Player()
+{
+  qCDebug(playerCategory) << "Destroying player" << this;
+}
 
-BackendPluginBase *Player::backend() const { return m_backend; }
+BackendInstance *Player::backend() const { return m_backend; }
 
 bool Player::hasRenderer() const { return m_renderer != nullptr; }
 
@@ -130,7 +138,7 @@ void Player::setCurrentSubtitleStream(
 }
 
 void Player::backendReadyToPlay() {
-  m_backendReady = true;
+  m_backendInstanceReady = true;
   if (canLoadVideoNow())
     loadNextFile();
 }
@@ -199,22 +207,23 @@ void Player::loadBackend() {
 #ifdef Q_OS_WIN
   QStringList pluginPaths{"backendplugins"};
 #else
-  QStringList pluginPaths{"/usr/lib/aniplayer/backendplugins",
-                          "backendplugins"};
+  QStringList pluginPaths{"backendplugins",
+                          "/usr/lib/aniplayer/backendplugins"};
 #endif
   m_pluginManager.setPluginDirectories(pluginPaths);
   m_pluginManager.setPluginPrefix("backend");
   m_pluginManager.loadDefaultPlugin();
-  m_backend = m_pluginManager.instance<BackendPluginBase>();
-  if (!m_backend)
+  m_plugin = m_pluginManager.instance<BackendPluginBase>();
+  if (!m_plugin)
     throw std::runtime_error{std::string("Failed to load backend: ") +
                              qPrintable(m_pluginManager.errorString())};
-  m_backend->initialize(this);
+  m_backend = m_plugin->createInstance(this);
+  Q_CHECK_PTR(m_backend);
   qCDebug(playerCategory) << "Loaded backend" << m_backend;
 }
 
 bool Player::canLoadVideoNow() const {
-  return m_backendReady && m_renderer && m_rendererReady;
+  return m_backendInstanceReady && m_renderer && m_rendererReady;
 }
 
 void Player::loadNextFile() {
index 51cc43eb3a2e7f4d64a94c8a369a212f117a441d..ab28b702ddedc8ba4351fff62a263f4f248d408b 100644 (file)
@@ -53,7 +53,7 @@ public:
   static const constexpr Volume MAX_VOLUME = Volume{1.0};
 
   explicit Player(QObject *parent = 0);
-  //    ~Player() /*override*/;
+  ~Player() override;
 
   enum class PlayState {
     Stopped = static_cast<int>(PlayerPluginInterface::PlayState::Stopped),
@@ -62,7 +62,7 @@ public:
   };
   Q_ENUM(PlayState)
 
-  BackendPluginBase *backend() const;
+  BackendInstance *backend() const;
   bool hasRenderer() const;
 
   QUrl currentSource() const;
@@ -149,7 +149,8 @@ private:
   void loadNextFile();
 
   PluginManager m_pluginManager;
-  BackendPluginBase *m_backend = nullptr;
+  BackendPluginBase *m_plugin = nullptr;
+  BackendInstance *m_backend = nullptr;
   QUrl m_currentSource;
   PlayState m_state = PlayState::Stopped;
   Volume m_volume = MAX_VOLUME;
@@ -164,7 +165,7 @@ private:
   QUrl m_nextSource;
   VideoUpdateInterface *m_renderer = nullptr;
   bool m_muted = false;
-  bool m_backendReady = false;
+  bool m_backendInstanceReady = false;
   bool m_rendererReady = false;
 };
 
index 05b40fbf606f7a51ec6287ad15923493f021d987..fcf7d3daafc897b64fb12ef44ffb828fa5a8fd0d 100644 (file)
@@ -1,6 +1,10 @@
 #include "videoelement.h"
 #include "player.h"
 
+#include <QLoggingCategory>
+
+Q_LOGGING_CATEGORY(videoElementCategory, "VideoElement")
+
 VideoElement::VideoElement() : m_source{nullptr} {
   connect(this, SIGNAL(updateRequested()), this, SLOT(update()),
           Qt::QueuedConnection);
@@ -9,7 +13,7 @@ VideoElement::VideoElement() : m_source{nullptr} {
 VideoElement::~VideoElement() {}
 
 VideoElement::Renderer *VideoElement::createRenderer() const {
-  qDebug("creating VideoElement::Renderer");
+  qDebug(videoElementCategory, "creating VideoElement::Renderer");
   return new Renderer;
 }
 
@@ -29,7 +33,7 @@ void VideoElement::setSource(Player *source) {
     m_source = source;
 
     emit sourceChanged(source);
-    qDebug() << "source has been set!";
+    qDebug(videoElementCategory) << "source has been set!" << m_source;
     rendererUpdateRequired = true;
     return;
   }
@@ -57,12 +61,12 @@ void VideoElement::Renderer::synchronize(QQuickFramebufferObject *object) {
     m_renderer = nullptr;
     return;
   }
-  qDebug("creating backend renderer");
+  qDebug(videoElementCategory, "creating backend renderer");
   m_renderer = ve->source()->backend()->createRenderer(ve);
   // Call via base to ensure a public method.
   PlayerRendererInterface *src = ve->m_source;
   src->rendererReady();
-  qDebug("backend renderer created");
+  qDebug(videoElementCategory, "backend renderer created");
 }
 
 void VideoElement::videoUpdated() { emit updateRequested(); }
index a26f51201b09f936c963bc2839323f1b30d797da..ca3d014da1b8a3ed655a77b77b478b9a30ad3738 100644 (file)
@@ -18,10 +18,10 @@ class VideoElement : public QQuickFramebufferObject,
     void synchronize(QQuickFramebufferObject *object) override;
 
   private:
-    VideoRendererBase *m_renderer;
+    VideoRendererBase *m_renderer = nullptr;
   };
 
-  Player *m_source;
+  Player *m_source = nullptr;
 
 public:
   VideoElement();