503023f3e5
Match the mxl-gst-sink pattern: sleep until the next grain's delivery deadline using mxlSleepUntil, then read with a short 5ms timeout. Uses 2-grain read delay (40ms at 50fps) for buffering headroom. Previous approach of mxlSleepForNs + 20ms GetGrain timeout caused the passthrough to fall behind: each iteration took ~25ms (poll+sleep+read), missing grains and perpetually chasing headIndex via realign.