summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--player/lua/osc.lua107
1 files changed, 47 insertions, 60 deletions
diff --git a/player/lua/osc.lua b/player/lua/osc.lua
index 872eead52d..93da61a759 100644
--- a/player/lua/osc.lua
+++ b/player/lua/osc.lua
@@ -126,8 +126,9 @@ local state = {
message_text,
message_timeout,
fullscreen = false,
- timer = nil,
- cache_idle = false,
+ tick_timer = nil,
+ tick_last_time = 0, -- when the last tick() was run
+ cache_state = nil,
idle = false,
enabled = true,
input_enabled = true,
@@ -139,7 +140,7 @@ local state = {
}
local window_control_box_width = 80
-
+local tick_delay = 0.03
--
-- Helperfunctions
@@ -1900,7 +1901,7 @@ function osc_init()
if user_opts.seekrangestyle == "none" then
return nil
end
- local cache_state = mp.get_property_native("demuxer-cache-state", nil)
+ local cache_state = state.cache_state
if not cache_state then
return nil
end
@@ -1909,14 +1910,17 @@ function osc_init()
return nil
end
local ranges = cache_state["seekable-ranges"]
- for _, range in pairs(ranges) do
- range["start"] = 100 * range["start"] / duration
- range["end"] = 100 * range["end"] / duration
- end
if #ranges == 0 then
return nil
end
- return ranges
+ local nranges = {}
+ for _, range in pairs(ranges) do
+ nranges[#nranges + 1] = {
+ ["start"] = 100 * range["start"] / duration,
+ ["end"] = 100 * range["end"] / duration,
+ }
+ end
+ return nranges
end
ne.eventresponder["mouse_move"] = --keyframe seeking when mouse is dragged
function (element)
@@ -1980,8 +1984,8 @@ function osc_init()
ne = new_element("cache", "button")
ne.content = function ()
- local cache_state = mp.get_property_native("demuxer-cache-state", {})
- if not (cache_state["seekable-ranges"] and
+ local cache_state = state.cache_state
+ if not (cache_state and cache_state["seekable-ranges"] and
#cache_state["seekable-ranges"] > 0) then
-- probably not a network stream
return ""
@@ -2119,7 +2123,7 @@ function hide_osc()
elseif (user_opts.fadeduration > 0) then
if not(state.osc_visible == false) then
state.anitype = "out"
- control_timer()
+ request_tick()
end
else
osc_visible(false)
@@ -2128,61 +2132,39 @@ end
function osc_visible(visible)
state.osc_visible = visible
- control_timer()
+ request_tick()
update_margins()
end
function pause_state(name, enabled)
state.paused = enabled
- control_timer()
-end
-
-function cache_state(name, idle)
- state.cache_idle = idle
- control_timer()
+ request_tick()
end
-function control_timer()
- if (state.paused) and (state.osc_visible) and
- ( not(state.cache_idle) or not (state.anitype == nil) ) then
-
- timer_start()
- else
- timer_stop()
- end
+function cache_state(name, st)
+ state.cache_state = st
+ request_tick()
end
-function timer_start()
- if not (state.timer_active) then
- msg.trace("timer start")
-
- if (state.timer == nil) then
- -- create new timer
- state.timer = mp.add_periodic_timer(0.03, tick)
- else
- -- resume existing one
- state.timer:resume()
- end
-
- state.timer_active = true
+-- Request that tick() is called (which typically re-renders the OSC).
+-- The tick is then either executed immediately, or rate-limited if it was
+-- called a small time ago.
+function request_tick()
+ if state.tick_timer == nil then
+ state.tick_timer = mp.add_timeout(0, tick)
end
-end
-
-function timer_stop()
- if (state.timer_active) then
- msg.trace("timer stop")
- if not (state.timer == nil) then
- -- kill timer
- state.timer:kill()
+ if not state.tick_timer:is_enabled() then
+ local now = mp.get_time()
+ local timeout = tick_delay - (now - state.tick_last_time)
+ if timeout < 0 then
+ timeout = 0
end
-
- state.timer_active = false
+ state.tick_timer.timeout = timeout
+ state.tick_timer:resume()
end
end
-
-
function mouse_leave()
if user_opts.hidetimeout >= 0 then
hide_osc()
@@ -2415,7 +2397,7 @@ function process_event(source, what)
if element_has_action(elements[n], action) then
elements[n].eventresponder[action](elements[n])
end
- tick()
+ request_tick()
end
end
@@ -2470,6 +2452,12 @@ function tick()
-- Flush OSD
mp.set_osd_ass(osc_param.playresy, osc_param.playresy, "")
end
+
+ state.tick_last_time = mp.get_time()
+
+ if state.anitype ~= nil then
+ request_tick()
+ end
end
function do_enable_keybindings()
@@ -2539,17 +2527,16 @@ mp.observe_property("window-maximized", "bool",
mp.observe_property("idle-active", "bool",
function(name, val)
state.idle = val
- tick()
+ request_tick()
end
)
mp.observe_property("pause", "bool", pause_state)
-mp.observe_property("cache-idle", "bool", cache_state)
+mp.observe_property("demuxer-cache-state", "native", cache_state)
mp.observe_property("vo-configured", "bool", function(name, val)
- if val then
- mp.register_event("tick", tick)
- else
- mp.unregister_event(tick)
- end
+ request_tick()
+end)
+mp.observe_property("playback-time", "number", function(name, val)
+ request_tick()
end)
-- mouse show/hide bindings