From: APTX Date: Sat, 19 Feb 2022 10:02:21 +0000 (+0900) Subject: Split out MPV event handling to separate methods X-Git-Url: https://gitweb.aptx.org/?a=commitdiff_plain;h=706c352c60fd06950e234ca19bd3dbb8a8b57b56;p=aniplayer.git Split out MPV event handling to separate methods --- diff --git a/backendplugins/backend_mpv/backendmpv.cpp b/backendplugins/backend_mpv/backendmpv.cpp index 2cd2289..c110179 100644 --- a/backendplugins/backend_mpv/backendmpv.cpp +++ b/backendplugins/backend_mpv/backendmpv.cpp @@ -269,148 +269,167 @@ void MpvInstance::processMpvEvents() { Q_CHECK_PTR(event->data); auto property = static_cast(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(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( - readProperty(property))); - } else if (strcmp(property->name, "playback-time") == 0) { - m_player->playbackPositionChanged( - static_cast( - readProperty(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( - readProperty(property) / 100.0)); - } - } else if (strcmp(property->name, "track-list") == 0) { - const auto node = readProperty(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(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(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(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(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( + readProperty(property))); + } else if (strcmp(property->name, "playback-time") == 0) { + m_player->playbackPositionChanged( + static_cast( + readProperty(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( + readProperty(property) / 100.0)); + } + } else if (strcmp(property->name, "track-list") == 0) { + const auto node = readProperty(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(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(obj); QMetaObject::invokeMethod(self, "processMpvEvents", Qt::QueuedConnection); diff --git a/backendplugins/backend_mpv/backendmpv.h b/backendplugins/backend_mpv/backendmpv.h index c4bd7da..94885ff 100644 --- a/backendplugins/backend_mpv/backendmpv.h +++ b/backendplugins/backend_mpv/backendmpv.h @@ -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 *); };