5b48d86c6e
The fundamental issue: mxlSleepUntil/mxlSleepForNs blocks the entire thread, making LWS unresponsive and causing control commands to hang. Meanwhile, LWS poll(1) adds latency that makes grain timing unreliable. Solution: run node->process() in a dedicated thread that can freely use mxlSleepUntil for precise grain timing, while the main thread runs control_server->poll(10) for LWS event handling. Passthrough now uses mxlSleepUntil(deadline) matching the mxl-gst-sink Cursor pattern, with 2-grain read delay for buffering.