Skip to content

Zynthian spike: a chain's audio slots as a plugin-hostd strip, parallel slots through an explicit mix - #129

Merged
linuxnow merged 4 commits into
devel/zynthianfrom
spike/zynthian-strip
Oct 24, 2026
Merged

linuxnow merged 4 commits into
devel/zynthianfrom
spike/zynthian-strip

Conversation

@linuxnow

Copy link
Copy Markdown
Contributor

The next step of the Zynthian spike (#124, merged as #125), on the strip model: plugin-hostd replaces the jalv and mod-ui engines as the way a Zynthian chain hosts its plugins.

  • docs/zynthian/chain-profile.md: a Zynthian chain written as a strip profile (source, control domain, audio chain, boundaries, limits, verbs), each fact cited to zynthian-ui f46b018. A parallel slot is a fan-out plus an explicit mix element: a third arrangement beside pool and chain. Open points are listed.
  • docs/zynthian/engine-gaps.md: what jalv and mod-ui give a chain against Path B. Three gaps mattered for single-processor slots: chain order, removal healing, host bypass. This branch closes all three.
  • zynthian_engine_plugind.patch: the new zynthian_plugind_strip.py joins adjacent plugind stages with mod-host connect, in slot order. It re-links on add at a position, on move and on remove (links are disconnected before the instance goes). A parallel slot gets a mixer instance declared by PLUGIND_MIX, at unity gain per branch, the same as Zynthian's implicit sum. Refusals have names: PARALLEL_SLOT_FOREIGN, MIX_ELEMENT_ABSENT, MIX_BRANCHES_EXCEEDED, MIX_ADD_REFUSED. realise_links is the marked seam for Protocol: declare a chain of instances run in one worker, with crash quarantine (for omx-clap-core#104) #101's chain. No new protocol verb.
  • tools/zynthian/test-strip.py / strip.sh: seven scenarios on the real zynthian_chain against plugin-hostd and the fake host. They read the graph and values back from the daemon. Nine sabotages each turn one scenario red.

No N-input mixer exists on the test machine or in omx-plugins, so the mix element is realised only with the fake host's fake:mix. Zynthian reorders by nudging through a parallel slot, so without a mixer a plugind chain cannot be reordered.

Not tested: the engine under the strip with lilv and JACK, real ports, autoconnect's pass, timing, hardware. Commits are unsigned: there is no GPG key on this laptop.

…Path B, and chain_manager lines read at the pinned commit
…o slots on plugin-hostd in order, a parallel slot through an explicit mix element

zynthian_plugind_strip.py holds the daemon client, the instance numbers and the strip: adjacent plugind
stages are joined with mod-host connect in slot order, re-linked on add at a position, move and remove
(stale links disconnected before the instance goes), and a parallel slot is a fan-out into its members
and a mix element (a mixer instance declared by PLUGIND_MIX, unity gain per branch as Zynthian's
implicit sum) whose output feeds what follows. Refusals by name: PARALLEL_SLOT_FOREIGN,
MIX_ELEMENT_ABSENT, MIX_BRANCHES_EXCEEDED, MIX_ADD_REFUSED; a nudge that would form a slot the strip
cannot realise answers False and leaves the chain as it was. An effect with no bypass port gets the
host's :bypass, sent as mod-host bypass. realise_links is the marked seam for plugin-hostd#101's chain.
… fake host, every guard sabotaged once

Seven scenarios on the real zynthian_chain read the daemon's graph and values back: series order and
add at a position, removal healing (and no stale link replayed after a worker respawn), a move through
Zynthian's parallel step with the mix element, the three refusals, host bypass and branch gain. Nine
sabotages each turn one red. strip.sh applies the patch at the pinned commit and runs it; one run in
evidence/strip. chain-profile.md: a reorder passes through a parallel slot, and what is not tested.
@linuxnow
linuxnow force-pushed the spike/zynthian-strip branch from d08a8d2 to 556b02a Compare October 21, 2026 03:35
@linuxnow

Copy link
Copy Markdown
Contributor Author

Fix-first done; head is now 556b02a (force-with-lease over d08a8d2). docs/zynthian/chain-profile.md:4 states the strip model in plain words, no repository path, URL or branch name; make private-refs passes with its self-test. The fix is folded into the commit that introduced the file (d7870cd, was 7975cf2), so the private path is out of the branch's history, and all four commits are re-signed with authors, messages and order kept and no trailer: d7870cd, 28b1766, dca9ffe, 556b02a. The tree differs from d08a8d2 by that one file only (3 insertions, 4 deletions).

@linuxnow

Copy link
Copy Markdown
Contributor Author

Ruling, operator 2026-10-24: folded into devel/zynthian as the record of the pre-chain shape. The Zynthian chain is the plugin-hostd chain line (ruled 2026-10-21); the engine over it is a lane after omx-clap-core#104 and the #131 verbs, with a mixer plugin or a ruled refusal of parallel slots. Review note: openmixer-ops ops/notes/reviews/2026-10-24-fable-spikes-vst3-zynthian.md.

@linuxnow
linuxnow merged commit 8de7fb2 into devel/zynthian Oct 24, 2026
35 checks passed
@linuxnow
linuxnow deleted the spike/zynthian-strip branch October 24, 2026 20:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant