]> git.sur5r.net Git - minitube/blobdiff - lib/media/src/mpv/mediampv.cpp
New upstream version 3.4
[minitube] / lib / media / src / mpv / mediampv.cpp
index b077530dad4c2c6a178cb0fde9abde76fff8eb21..b7cd2361f7185c54ba7f4e0146416ef536bfc2f9 100644 (file)
@@ -1,7 +1,6 @@
 #include "mediampv.h"
 
 #include <clocale>
-#include <mpv/qthelper.hpp>
 
 #ifndef MEDIA_AUDIOONLY
 #include "mpvwidget.h"
@@ -85,6 +84,7 @@ MediaMPV::MediaMPV(QObject *parent) : Media(parent), widget(nullptr) {
     mpv_observe_property(mpv, 0, "duration", MPV_FORMAT_DOUBLE);
     mpv_observe_property(mpv, 0, "volume", MPV_FORMAT_DOUBLE);
     mpv_observe_property(mpv, 0, "mute", MPV_FORMAT_FLAG);
+    mpv_observe_property(mpv, 0, "pause", MPV_FORMAT_FLAG);
 }
 
 // This slot is invoked by wakeup() (through the mpvEvents signal).
@@ -109,7 +109,7 @@ void MediaMPV::checkAboutToFinish(qint64 position) {
 }
 
 void MediaMPV::handleMpvEvent(mpv_event *event) {
-    // qDebug() << event->data;
+    // qDebug() << event->event_id << event->data;
     switch (event->event_id) {
     case MPV_EVENT_START_FILE:
         clearTrackState();
@@ -121,12 +121,18 @@ void MediaMPV::handleMpvEvent(mpv_event *event) {
         setState(Media::BufferingState);
         break;
 
-    case MPV_EVENT_FILE_LOADED:
-        setState(Media::PlayingState);
+    case MPV_EVENT_PLAYBACK_RESTART: {
+        int pause;
+        mpv_get_property(mpv, "pause", MPV_FORMAT_FLAG, &pause);
+        bool paused = pause == 1;
+        if (paused)
+            setState(Media::PausedState);
+        else
+            setState(Media::PlayingState);
         break;
+    }
 
-    case MPV_EVENT_PLAYBACK_RESTART:
-    case MPV_EVENT_UNPAUSE:
+    case MPV_EVENT_FILE_LOADED:
         setState(Media::PlayingState);
         break;
 
@@ -141,13 +147,9 @@ void MediaMPV::handleMpvEvent(mpv_event *event) {
         break;
     }
 
-    case MPV_EVENT_PAUSE:
-        setState(Media::PausedState);
-        break;
-
     case MPV_EVENT_PROPERTY_CHANGE: {
         mpv_event_property *prop = (mpv_event_property *)event->data;
-        // qDebug() << prop->name << prop->data;
+        qDebug() << prop->name << prop->data;
 
         if (strcmp(prop->name, "time-pos") == 0) {
             if (prop->format == MPV_FORMAT_DOUBLE) {
@@ -172,6 +174,23 @@ void MediaMPV::handleMpvEvent(mpv_event *event) {
             }
         }
 
+        else if (strcmp(prop->name, "pause") == 0) {
+            if (prop->format == MPV_FORMAT_FLAG) {
+                int pause = *(int *)prop->data;
+                bool paused = pause == 1;
+                if (paused)
+                    setState(Media::PausedState);
+                else {
+                    int coreIdle;
+                    mpv_get_property(mpv, "core-idle", MPV_FORMAT_FLAG, &coreIdle);
+                    if (coreIdle == 1)
+                        setState(Media::StoppedState);
+                    else
+                        setState(Media::PlayingState);
+                }
+            }
+        }
+
         break;
     }
 
@@ -205,6 +224,7 @@ void MediaMPV::sendCommand(const char *args[]) {
 
 void MediaMPV::setState(Media::State value) {
     if (value != currentState) {
+        qDebug() << "State" << value;
         currentState = value;
         emit stateChanged(currentState);
     }