diff --git a/src/DirectMpvPlayerBackend.cpp b/src/DirectMpvPlayerBackend.cpp index 3ae5d67..5b122b6 100644 --- a/src/DirectMpvPlayerBackend.cpp +++ b/src/DirectMpvPlayerBackend.cpp @@ -471,13 +471,31 @@ DirectMpvPlayerBackend::on_mpv_events() } void -DirectMpvPlayerBackend::updateDurationString() +DirectMpvPlayerBackend::updateDurationString(int numTime) { - emit durationStringChanged( - QString("%1 / %2 (%3x)") - .arg(Utils::createTimestamp(getProperty("time-pos").toInt()), - totalDurationString, - getProperty("speed").toString())); + QVariant speed = getProperty("speed"); + QMetaMethod metaMethod = sender()->metaObject()->method(senderSignalIndex()); + if (metaMethod.name() == "positionChanged") { + if (speed != lastSpeed) { + lastSpeed = speed.toDouble(); + } else { + if (numTime == lastTime) { + return; + } + } + lastTime = numTime; + lastPositionString = Utils::createTimestamp(lastTime); + } else if (metaMethod.name() == "durationChanged") { + totalDurationString = Utils::createTimestamp(numTime); + } + QString durationString; + durationString += lastPositionString; + durationString += " / "; + durationString += totalDurationString; + if (lastSpeed != 1) { + durationString += " (" + speed.toString() + "x)"; + } + emit durationStringChanged(durationString); } void @@ -518,13 +536,12 @@ DirectMpvPlayerBackend::handle_mpv_event(mpv_event* event) if (prop->format == MPV_FORMAT_DOUBLE) { double time = *(double*)prop->data; emit positionChanged(time); - Utils::ResetScreensaver(); } } else if (strcmp(prop->name, "duration") == 0) { if (prop->format == MPV_FORMAT_DOUBLE) { double time = *(double*)prop->data; - totalDurationString = Utils::createTimestamp(time); emit durationChanged(time); + Utils::ResetScreensaver(); } } else if (strcmp(prop->name, "mute") == 0 || strcmp(prop->name, "volume") == 0) { diff --git a/src/DirectMpvPlayerBackend.h b/src/DirectMpvPlayerBackend.h index c4f8b99..889ff26 100644 --- a/src/DirectMpvPlayerBackend.h +++ b/src/DirectMpvPlayerBackend.h @@ -42,7 +42,10 @@ class DirectMpvPlayerBackend mpv_opengl_cb_context* mpv_gl; MpvRenderer* renderer; bool onTop = false; + int lastTime = 0; + double lastSpeed = 0; QString totalDurationString; + QString lastPositionString; public: static void on_update(void* ctx); @@ -92,7 +95,7 @@ signals: private slots: void doUpdate(); void on_mpv_events(); - void updateDurationString(); + void updateDurationString(int numTime); void handleWindowChanged(QQuickWindow* win); private: diff --git a/src/MpvPlayerBackend.cpp b/src/MpvPlayerBackend.cpp index 62c77a0..52f7403 100644 --- a/src/MpvPlayerBackend.cpp +++ b/src/MpvPlayerBackend.cpp @@ -449,13 +449,31 @@ MpvPlayerBackend::on_mpv_events() } void -MpvPlayerBackend::updateDurationString() +MpvPlayerBackend::updateDurationString(int numTime) { - emit durationStringChanged( - QString("%1 / %2 (%3x)") - .arg(Utils::createTimestamp(getProperty("time-pos").toInt()), - totalDurationString, - getProperty("speed").toString())); + QVariant speed = getProperty("speed"); + QMetaMethod metaMethod = sender()->metaObject()->method(senderSignalIndex()); + if (metaMethod.name() == "positionChanged") { + if (speed != lastSpeed) { + lastSpeed = speed.toDouble(); + } else { + if (numTime == lastTime) { + return; + } + } + lastTime = numTime; + lastPositionString = Utils::createTimestamp(lastTime); + } else if (metaMethod.name() == "durationChanged") { + totalDurationString = Utils::createTimestamp(numTime); + } + QString durationString; + durationString += lastPositionString; + durationString += " / "; + durationString += totalDurationString; + if (lastSpeed != 1) { + durationString += " (" + speed.toString() + "x)"; + } + emit durationStringChanged(durationString); } void @@ -496,13 +514,12 @@ MpvPlayerBackend::handle_mpv_event(mpv_event* event) if (prop->format == MPV_FORMAT_DOUBLE) { double time = *(double*)prop->data; emit positionChanged(time); - Utils::ResetScreensaver(); } } else if (strcmp(prop->name, "duration") == 0) { if (prop->format == MPV_FORMAT_DOUBLE) { double time = *(double*)prop->data; - totalDurationString = Utils::createTimestamp(time); emit durationChanged(time); + Utils::ResetScreensaver(); } } else if (strcmp(prop->name, "mute") == 0 || strcmp(prop->name, "volume") == 0) { diff --git a/src/MpvPlayerBackend.h b/src/MpvPlayerBackend.h index c8161b8..a1501b0 100644 --- a/src/MpvPlayerBackend.h +++ b/src/MpvPlayerBackend.h @@ -27,7 +27,10 @@ class MpvPlayerBackend mpv_handle* mpv; mpv_render_context* mpv_gl; bool onTop = false; + int lastTime = 0; + double lastSpeed = 0; QString totalDurationString; + QString lastPositionString; friend class MpvRenderer; @@ -77,7 +80,7 @@ signals: private slots: void doUpdate(); void on_mpv_events(); - void updateDurationString(); + void updateDurationString(int numTime); private: void handle_mpv_event(mpv_event* event); diff --git a/src/qml/icons/Niconico/backward.svg b/src/qml/icons/Niconico/backward.svg index 633505a..1f4120b 100644 --- a/src/qml/icons/Niconico/backward.svg +++ b/src/qml/icons/Niconico/backward.svg @@ -1 +1,2 @@ - \ No newline at end of file + + diff --git a/src/qml/icons/Niconico/forward.svg b/src/qml/icons/Niconico/forward.svg index 3b31b1b..b6e1557 100644 --- a/src/qml/icons/Niconico/forward.svg +++ b/src/qml/icons/Niconico/forward.svg @@ -1 +1 @@ - \ No newline at end of file +