fix(mpv): move a pending replay pause when sub-delay changes

This commit is contained in:
sudacode committed 2026-10-25 22:21:59 -07:00
1 parent 8a2da51e41
commit d06fe8b572
2 files changed
+19 -4

No files matched your search

+10 -2
View File
@@ -399,17 +399,25 @@ test('dispatchMpvProtocolMessage pauses on sub-end when pendingPauseAtSubEnd is
test('dispatchMpvProtocolMessage pauses at the sub-delay retimed sub-end', async () => { test('dispatchMpvProtocolMessage pauses at the sub-delay retimed sub-end', async () => {
let pauseAtTime: number | null = null; let pauseAtTime: number | null = null;
let subDelay = 1.5;
const { deps } = createDeps({ const { deps } = createDeps({
getPendingPauseAtSubEnd: () => true, getPendingPauseAtSubEnd: () => true,
getCurrentSubDelay: () => 1.5, getCurrentSubDelay: () => subDelay,
setCurrentSubDelay: (next) => {
subDelay = next;
},
getPauseAtTime: () => pauseAtTime,
setPauseAtTime: (next) => { setPauseAtTime: (next) => {
pauseAtTime = next; pauseAtTime = next;
}, },
}); });
await dispatchMpvProtocolMessage({ event: 'property-change', name: 'sub-end', data: 42 }, deps); await dispatchMpvProtocolMessage({ event: 'property-change', name: 'sub-end', data: 42 }, deps);
assert.equal(pauseAtTime, 43.5); assert.equal(pauseAtTime, 43.5);
// Retiming before the replay reaches its end moves the pause with the line.
await dispatchMpvProtocolMessage({ event: 'property-change', name: 'sub-delay', data: 2 }, deps);
assert.equal(pauseAtTime, 44);
}); });
test('dispatchMpvProtocolMessage updates current time before emitting time-pos change', async () => { test('dispatchMpvProtocolMessage updates current time before emitting time-pos change', async () => {
+9 -2
View File
@@ -277,8 +277,15 @@ export async function dispatchMpvProtocolMessage(
end: deps.getCurrentSubEnd(), end: deps.getCurrentSubEnd(),
}); });
} else if (msg.name === 'sub-delay') { } else if (msg.name === 'sub-delay') {
const delay = typeof msg.data === 'number' ? msg.data : Number(msg.data); const parsed = typeof msg.data === 'number' ? msg.data : Number(msg.data);
deps.setCurrentSubDelay(Number.isFinite(delay) ? delay : 0); const delay = Number.isFinite(parsed) ? parsed : 0;
// A scheduled replay pause sits at the line's end on the video clock; retiming
// mid-replay moves that end, so the pause moves with it.
const pauseAtTime = deps.getPauseAtTime();
if (pauseAtTime !== null) {
deps.setPauseAtTime(pauseAtTime + delay - deps.getCurrentSubDelay());
}
deps.setCurrentSubDelay(delay);
} else if (msg.name === 'secondary-sub-text') { } else if (msg.name === 'secondary-sub-text') {
const nextSubText = (msg.data as string) || ''; const nextSubText = (msg.data as string) || '';
deps.setCurrentSecondarySubText(nextSubText); deps.setCurrentSecondarySubText(nextSubText);