]> Some of my projects - aniplayer.git/commitdiff
Split out MPV event handling to separate methods
authorAPTX <marek321@gmail.com>
Sat, 19 Feb 2022 10:02:21 +0000 (19:02 +0900)
committerAPTX <marek321@gmail.com>
Mon, 21 Feb 2022 15:14:55 +0000 (00:14 +0900)
backendplugins/backend_mpv/backendmpv.cpp
backendplugins/backend_mpv/backendmpv.h

index 2cd2289e7dc52b192eebb82eb275df01c8f9d832..c110179de8135d9aeb5468626dcb6a62fc450fdf 100644 (file)
@@ -269,148 +269,167 @@ void MpvInstance::processMpvEvents() {
       Q_CHECK_PTR(event->data);
       auto property = static_cast<mpv_event_property *>(event->data);
       Q_CHECK_PTR(property);
-      qCDebug(mpvVerboseBackend) << "Property" << property->name << "changed";
-      if (property->format == MPV_FORMAT_NONE) {
-        qCDebug(mpvBackend) << "No data in event";
-        break;
-      }
-      if (strcmp(property->name, "pause") == 0) {
-        auto paused = readProperty<MPV_FORMAT_FLAG>(property);
-        auto state = paused ? PlayerPluginInterface::PlayState::Paused
-                            : PlayerPluginInterface::PlayState::Playing;
-        if (!m_loadedFile)
-          state = PlayerPluginInterface::PlayState::Stopped;
-        m_player->playStateChanged(state);
-      } else if (strcmp(property->name, "duration") == 0) {
-        m_player->playbackDurationChanged(
-            static_cast<PlayerPluginInterface::TimeStamp>(
-                readProperty<MPV_FORMAT_DOUBLE>(property)));
-      } else if (strcmp(property->name, "playback-time") == 0) {
-        m_player->playbackPositionChanged(
-            static_cast<PlayerPluginInterface::TimeStamp>(
-                readProperty<MPV_FORMAT_DOUBLE>(property)));
-      } else if (strcmp(property->name, VOLUME) == 0) {
-        if (m_volumeToSet > 0) {
-          qCDebug(mpvBackend)
-              << "Requested volume still not set, skipping this update";
-        } else {
-          m_player->playbackVolumeChanged(
-              static_cast<PlayerPluginInterface::Volume>(
-                  readProperty<MPV_FORMAT_DOUBLE>(property) / 100.0));
-        }
-      } else if (strcmp(property->name, "track-list") == 0) {
-        const auto node = readProperty<MPV_FORMAT_NODE>(property);
-        const auto variant = mpv::qt::node_to_variant(node);
-        qCDebug(mpvBackend) << "TRACKS" << variant;
-
-        PlayerPluginInterface::TrackList videoTracks;
-        PlayerPluginInterface::TrackList audioTracks;
-        PlayerPluginInterface::TrackList subtitleTracks;
-        for (const auto &v : variant.toList()) {
-          const auto &map = v.toMap();
-          const auto &type = map["type"].toString();
-          auto &tracks = [&]() -> PlayerPluginInterface::TrackList & {
-            if (type == "video") {
-              return videoTracks;
-            }
-            if (type == "audio") {
-              return audioTracks;
-            }
-            return subtitleTracks;
-          }();
-          const auto track = PlayerPluginInterface::Track{
-              map["title"].toString(), map["lang"].toString(),
-              map["id"].toInt()};
-          tracks << track;
-        }
-        m_player->backendVideoTracksChanged(videoTracks);
-        m_player->backendAudioTracksChanged(audioTracks);
-        m_player->backendSubtitleTracksChanged(subtitleTracks);
-
-      } else if (strcmp(property->name, "vid") == 0) {
-        const int trackIndex = readTrackIndex(property);
-        m_player->backendCurrentVideoTrackChanged(trackIndex);
-
-      } else if (strcmp(property->name, "aid") == 0) {
-        const int trackIndex = readTrackIndex(property);
-        m_player->backendCurrentAudioTrackChanged(trackIndex);
-
-      } else if (strcmp(property->name, "sid") == 0) {
-        const int trackIndex = readTrackIndex(property);
-        m_player->backendCurrentSubtitleTrackChanged(trackIndex);
-
-      } else if (strcmp(property->name, "chapter-list") == 0) {
-        const auto node = readProperty<MPV_FORMAT_NODE>(property);
-        const auto variant = mpv::qt::node_to_variant(node);
-        qCDebug(mpvBackend) << "CHAPTERS" << variant;
-
-        PlayerPluginInterface::ChapterList chapters;
-        for (const auto &v : variant.toList()) {
-          const auto map = v.toMap();
-          chapters << PlayerPluginInterface::Chapter{map["title"].toString(),
-                                                     map["time"].toDouble()};
-        }
-        m_player->backendChaptersChanged(chapters);
-      } else if (strcmp(property->name, "idle-active") == 0) {
-        m_player->playStateChanged(PlayerPluginInterface::PlayState::Stopped);
-        m_player->backendReadyToPlay();
-      } else {
-        qCWarning(mpvBackend)
-            << "Change notification for not handled property" << property->name;
-      }
+      onPropertyChange(property);
     } break;
     case MPV_EVENT_LOG_MESSAGE: {
       Q_CHECK_PTR(event->data);
       auto log = static_cast<mpv_event_log_message *>(event->data);
       Q_CHECK_PTR(log);
-      QMessageLogger l{0, 0, 0, mpvLog().categoryName()};
-      if (log->log_level <= MPV_LOG_LEVEL_ERROR)
-        l.critical() << log->text;
-      else if (log->log_level <= MPV_LOG_LEVEL_WARN)
-        l.warning() << log->text;
-      else if (log->log_level <= MPV_LOG_LEVEL_INFO)
-        l.info() << log->text;
-      else
-        l.debug() << log->text;
+      onLogMessage(log);
     } break;
     case MPV_EVENT_FILE_LOADED: {
-      int paused = 0;
-      mpv_get_property(m_handle, "paused", MPV_FORMAT_FLAG, &paused);
-      qCDebug(mpvBackend) << "file-loaded event!" << paused;
-      m_loadedFile = true;
-      auto state = paused ? PlayerPluginInterface::PlayState::Paused
-                          : PlayerPluginInterface::PlayState::Playing;
-      m_player->playStateChanged(state);
-      m_player->backendSourceChanged(m_currentlyLoading);
-      m_currentlyLoading = QUrl{};
+      onFileLoaded();
     } break;
     case MPV_EVENT_END_FILE: {
-      m_loadedFile = false;
-
       Q_CHECK_PTR(event->data);
       auto endFile = static_cast<mpv_event_end_file *>(event->data);
-      if (endFile->reason == MPV_END_FILE_REASON_ERROR)
-        qCWarning(mpvBackend).nospace()
-            << "File ended due to error " << endFile->error << ": "
-            << mpv_error_string(endFile->error);
-      else
-        qCInfo(mpvBackend) << "File ended. Reason:" << endFile->reason;
-      m_player->playStateChanged(PlayerPluginInterface::PlayState::Stopped);
-      if (endFile->reason == MPV_END_FILE_REASON_EOF) {
-        m_player->playbackEndOfFileReached();
-      }
+      onEndFile(endFile);
     } break;
     case MPV_EVENT_AUDIO_RECONFIG: {
-      if (m_volumeToSet >= 0) {
-        qCDebug(mpvBackend) << "Audio reconfigured, maybe it's ready now?";
-        setVolume(m_volumeToSet);
-      }
+      onAudioReconfig();
     } break;
     default:;
     }
   } while (event->event_id != MPV_EVENT_NONE);
 }
 
+void MpvInstance::onPropertyChange(mpv_event_property *property) {
+  qCDebug(mpvVerboseBackend) << "Property" << property->name << "changed";
+  if (property->format == MPV_FORMAT_NONE) {
+    qCDebug(mpvBackend) << "No data in event";
+    return;
+  }
+  if (strcmp(property->name, "pause") == 0) {
+    auto paused = readProperty<MPV_FORMAT_FLAG>(property);
+    auto state = paused ? PlayerPluginInterface::PlayState::Paused
+                        : PlayerPluginInterface::PlayState::Playing;
+    if (!m_loadedFile)
+      state = PlayerPluginInterface::PlayState::Stopped;
+    m_player->playStateChanged(state);
+  } else if (strcmp(property->name, "duration") == 0) {
+    m_player->playbackDurationChanged(
+        static_cast<PlayerPluginInterface::TimeStamp>(
+            readProperty<MPV_FORMAT_DOUBLE>(property)));
+  } else if (strcmp(property->name, "playback-time") == 0) {
+    m_player->playbackPositionChanged(
+        static_cast<PlayerPluginInterface::TimeStamp>(
+            readProperty<MPV_FORMAT_DOUBLE>(property)));
+  } else if (strcmp(property->name, VOLUME) == 0) {
+    if (m_volumeToSet > 0) {
+      qCDebug(mpvBackend)
+          << "Requested volume still not set, skipping this update";
+    } else {
+      m_player->playbackVolumeChanged(
+          static_cast<PlayerPluginInterface::Volume>(
+              readProperty<MPV_FORMAT_DOUBLE>(property) / 100.0));
+    }
+  } else if (strcmp(property->name, "track-list") == 0) {
+    const auto node = readProperty<MPV_FORMAT_NODE>(property);
+    const auto variant = mpv::qt::node_to_variant(node);
+    qCDebug(mpvBackend) << "TRACKS" << variant;
+
+    PlayerPluginInterface::TrackList videoTracks;
+    PlayerPluginInterface::TrackList audioTracks;
+    PlayerPluginInterface::TrackList subtitleTracks;
+    for (const auto &v : variant.toList()) {
+      const auto &map = v.toMap();
+      const auto &type = map["type"].toString();
+      auto &tracks = [&]() -> PlayerPluginInterface::TrackList & {
+        if (type == "video") {
+          return videoTracks;
+        }
+        if (type == "audio") {
+          return audioTracks;
+        }
+        return subtitleTracks;
+      }();
+      const auto track = PlayerPluginInterface::Track{
+          map["title"].toString(), map["lang"].toString(), map["id"].toInt()};
+      tracks << track;
+    }
+    m_player->backendVideoTracksChanged(videoTracks);
+    m_player->backendAudioTracksChanged(audioTracks);
+    m_player->backendSubtitleTracksChanged(subtitleTracks);
+
+  } else if (strcmp(property->name, "vid") == 0) {
+    const int trackIndex = readTrackIndex(property);
+    m_player->backendCurrentVideoTrackChanged(trackIndex);
+
+  } else if (strcmp(property->name, "aid") == 0) {
+    const int trackIndex = readTrackIndex(property);
+    m_player->backendCurrentAudioTrackChanged(trackIndex);
+
+  } else if (strcmp(property->name, "sid") == 0) {
+    const int trackIndex = readTrackIndex(property);
+    m_player->backendCurrentSubtitleTrackChanged(trackIndex);
+
+  } else if (strcmp(property->name, "chapter-list") == 0) {
+    const auto node = readProperty<MPV_FORMAT_NODE>(property);
+    const auto variant = mpv::qt::node_to_variant(node);
+    qCDebug(mpvBackend) << "CHAPTERS" << variant;
+
+    PlayerPluginInterface::ChapterList chapters;
+    for (const auto &v : variant.toList()) {
+      const auto map = v.toMap();
+      chapters << PlayerPluginInterface::Chapter{map["title"].toString(),
+                                                 map["time"].toDouble()};
+    }
+    m_player->backendChaptersChanged(chapters);
+  } else if (strcmp(property->name, "idle-active") == 0) {
+    m_player->playStateChanged(PlayerPluginInterface::PlayState::Stopped);
+    m_player->backendReadyToPlay();
+  } else {
+    qCWarning(mpvBackend) << "Change notification for not handled property"
+                          << property->name;
+  }
+}
+
+void MpvInstance::onLogMessage(mpv_event_log_message *log) {
+  QMessageLogger l{0, 0, 0, mpvLog().categoryName()};
+  if (log->log_level <= MPV_LOG_LEVEL_ERROR)
+    l.critical() << log->text;
+  else if (log->log_level <= MPV_LOG_LEVEL_WARN)
+    l.warning() << log->text;
+  else if (log->log_level <= MPV_LOG_LEVEL_INFO)
+    l.info() << log->text;
+  else
+    l.debug() << log->text;
+}
+
+void MpvInstance::onFileLoaded() {
+  int paused = 0;
+  mpv_get_property(m_handle, "paused", MPV_FORMAT_FLAG, &paused);
+  qCDebug(mpvBackend) << "file-loaded event!" << paused;
+  m_loadedFile = true;
+  auto state = paused ? PlayerPluginInterface::PlayState::Paused
+                      : PlayerPluginInterface::PlayState::Playing;
+  m_player->playStateChanged(state);
+  m_player->backendSourceChanged(m_currentlyLoading);
+  m_currentlyLoading = QUrl{};
+}
+
+void MpvInstance::onEndFile(mpv_event_end_file *endFile) {
+  m_loadedFile = false;
+
+  if (endFile->reason == MPV_END_FILE_REASON_ERROR) {
+    qCWarning(mpvBackend).nospace()
+        << "File ended due to error " << endFile->error << ": "
+        << mpv_error_string(endFile->error);
+  } else if (endFile->reason == MPV_END_FILE_REASON_EOF) {
+    m_player->playbackEndOfFileReached();
+  } else {
+    qCInfo(mpvBackend) << "File ended. Reason:" << endFile->reason;
+  }
+  m_player->playStateChanged(PlayerPluginInterface::PlayState::Stopped);
+}
+
+void MpvInstance::onAudioReconfig() {
+  if (m_volumeToSet >= 0) {
+    qCDebug(mpvBackend) << "Audio reconfigured, maybe it's ready now?";
+    setVolume(m_volumeToSet);
+  }
+}
+
 void MpvInstance::mpvWakeupCb(void *obj) {
   auto self = static_cast<BackendMpv *>(obj);
   QMetaObject::invokeMethod(self, "processMpvEvents", Qt::QueuedConnection);
index c4bd7dabacb295790ce587ba467e452bbfd6c2eb..94885ff87ba980171b13a8295712cd0b1a307455 100644 (file)
@@ -10,6 +10,8 @@
 struct mpv_handle;
 struct mpv_event_property;
 struct mpv_render_context;
+struct mpv_event_log_message;
+struct mpv_event_end_file;
 
 class BACKEND_MPVSHARED_EXPORT BackendMpv : public QObject,
                                             public BackendPluginBase {
@@ -51,6 +53,14 @@ public:
   void setCurrentSubtitleStream(TrackIndex) override;
 
 private:
+  Q_INVOKABLE void processMpvEvents();
+
+  void onPropertyChange(mpv_event_property *);
+  void onLogMessage(mpv_event_log_message *);
+  void onFileLoaded();
+  void onEndFile(mpv_event_end_file *);
+  void onAudioReconfig();
+
   int readTrackIndex(struct mpv_event_property *);
 
   PlayerPluginInterface *m_player = nullptr;
@@ -59,7 +69,6 @@ private:
   QUrl m_currentlyLoading;
   bool m_loadedFile = false;
 
-  Q_INVOKABLE void processMpvEvents();
   static void mpvWakeupCb(void *);
 };