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);