Sigil 0.22.7

release

A game audio and correctness release. Sound effects in the browser now play the moment they're triggered, a game's synth can drop to a lower rate on a weak phone, and sigil is ready to take upgrades from the signed registry. Three defects are fixed along the way: an error lost between nested guards, a -L path that stopped sigil starting, and tests run against dependencies the lock doesn't name.

Download 0.22.7Get started

Existing projects build without changes. The audio calls come with sigil-audio 0.13.0, released alongside.

Sound effects play at once in the browser

A sound effect pushed into the music stream was heard one buffer later, up to a quarter second on a phone, and the delay came and went. Load a sound once with load-audio-cue and play it with play-audio-cue: it's mixed into the very next audio block, about 3 ms, however much music is buffered. audio-cue-lag reports the wait for an on-device readout.

A slow synth can render at a lower rate

open-audio-stream takes rate:, and set-audio-stream-rate! changes it mid-stream. The sink upsamples on the audio thread, so a game can render its music at 24000 on a 48000 device without a resampler of its own.

(sigil audio ladder) decides when to step down. It's the policy Crash The Stack tuned on a phone: it watches the steady cost per frame, ignores the moments next to a sound effect or a tune starting, and never steps back up on its own. rate-ladder-report gives a readout line such as 48000/24000 BY LADDER@20.2S.

audio-stream-underruns-sounding counts only the dropouts a player could hear, apart from a stream with nothing to play running dry.

Upgrades verified end to end

sigil can now take upgrades from the registry's signed release list, checking every step itself with no minisign needed: the key list against the root key built into sigil, the release list against a key from that list, and the binary against the hash, size and file name the list gives for your platform. An older list than one sigil has already seen is refused, so a stale copy can't roll you back.

The registry's signed list goes live with its first signing. Until then, and whenever the registry can't be reached, sigil says Registry unavailable, using Codeberg. and upgrades from Codeberg as before. If the registry answers but what it serves fails a check, sigil installs nothing and says why. SIGIL_REGISTRY points it at a mirror.

An error passed on by an inner guard reaches the outer one

0.22.6's known issue is fixed: when one guard sat in tail position of another's body, an error the inner one passed on skipped the outer handler. The workarounds are no longer needed.

One cost: a loop that calls itself from inside a guard body now keeps each iteration's handler until it returns, about 150 bytes each. For a long-running loop, put the recursive call after the guard.

-L can no longer stop sigil starting

Pointing -L at another project's build output could replace the modules sigil itself is built from, and it failed before running anything. Those modules now always come from sigil's own copy. Separately released packages such as (sigil json) can still be replaced with -L.

Build, test and run stop when dependencies don't match the lock

After switching branches, .sigil/deps can still point at the old branch's dependencies, and tests ran against code the lock doesn't name. sigil build, sigil test and sigil run now stop with exit code 78 and name the package and both commits. Run sigil deps install, or set SIGIL_ALLOW_STALE_DEPS=1 to go ahead anyway.

A clean build from source

make no longer prints Error in macro 'let' while bootstrapping, and the core library it builds is now checked to match a normal build.