diff options
author | wm4 <wm4@nowhere> | 2014-03-01 21:27:37 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-03-01 21:29:13 +0100 |
commit | 8f2ee917d410094c8718172e417d8d6f5f8f040f (patch) | |
tree | adc68f10056f3d464726f9e0fa50b671e15b593d /player/playloop.c | |
parent | 4de22d1cbc1ff8201f66629ca75de32e7e7ed223 (diff) | |
download | mpv-8f2ee917d410094c8718172e417d8d6f5f8f040f.tar.bz2 mpv-8f2ee917d410094c8718172e417d8d6f5f8f040f.tar.xz |
player: cheap hack against idle event feedback loop
The OSC used significant CPU time while the player was paused. It turned
out that the "tick" event sent during pause is the problem. The OSC
accesses the player core when receiving a tick event, which in turn will
cause the core to send another tick event, leading to infinite feedback.
Fix this by sending an idle tick only every 500ms. This is not very
proper, but the idea behind the tick event isn't very clean to begin
with (and the OSC should use timers instead).
Diffstat (limited to 'player/playloop.c')
-rw-r--r-- | player/playloop.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/player/playloop.c b/player/playloop.c index 9a38b52663..0b926cae36 100644 --- a/player/playloop.c +++ b/player/playloop.c @@ -1183,8 +1183,12 @@ void run_playloop(struct MPContext *mpctx) break; } // video - if (!video_left || mpctx->paused) - mp_notify(mpctx, MPV_EVENT_TICK, NULL); + if (!video_left || mpctx->paused) { + if (mp_time_sec() - mpctx->last_idle_tick > 0.5) { + mpctx->last_idle_tick = mp_time_sec(); + mp_notify(mpctx, MPV_EVENT_TICK, NULL); + } + } video_left &= mpctx->sync_audio_to_video; // force no-video semantics |