mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-10-30 17:27:09 +00:00
* fix(core): audio clips join on time and their volume lane follows the audio An incoming <audio> clip is now pre-seeked to its in-point like a video, and a playing audio element that drifts is steered by rate instead of seeked while it sounds. A routed clip's volume lane and fades are re-aimed at the element's own position whenever it starts, is seeked or changes rate. * fix(core): sounding audio is nudged at most 10%, and a larger lag seeks under a short dip Speech audibly changes tempo past a 10% rate nudge, and a bare seek clicks. Audio that holds a lag rate cannot close in about a second is seeked under a 15 ms dip on its routed graph; an unrouted element is seeked plainly. Video keeps its steps. * fix(core): a routed clip's automation has one owner, its element, looping included A rate change re-aimed a routed clip's lane on the context clock and again when the element took the new rate. Only the element re-aims it now. A looping element's wrapped position is placed on the pass the transport is in, so a looping bed's lane follows it too. * style(core): wrap a steering comment to the line limit * refactor(core): one drift policy for playing media, exported for the parent proxy The steering steps, the audio cap and limit, and the steering state move to runtime/mediaSteer.ts as steerMedia(el, offset, baseRate, settled) and forgetSteering(el), exported as @hyperframes/core/runtime/media-steer so the player's parent-frame proxy uses the same policy instead of a second one. * style(core): trim the drift policy's comments to the package's share * fix(core): the dipped seek lands on the frame-start media time Routes the one currentTime write this branch adds through mediaElementTime, so Chrome's truncated currentTime cannot land it a frame early. * test(core): expect the plain audio seek at the frame-start media time