[{"data":1,"prerenderedAt":26},["ShallowReactive",2],{"project-plugin-hostd-protocol-protocol":3},{"page":4,"others":22},{"slug":5,"src":6,"title":6,"source":7,"toc":8,"html":21},"protocol","doc\u002Fprotocol.md","https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fplugin-hostd-protocol\u002Fblob\u002F5e12b959fa098ee4800a4a8485d5c6ce1ffada2c\u002Fdoc\u002Fprotocol.md",[9,12,15,18],{"id":10,"title":11},"the-verb-table-and-the-grammar","The verb table and the grammar",{"id":13,"title":14},"reply-codes","Reply codes",{"id":16,"title":17},"appendix-mod-host-s-command-reference","Appendix: mod-host's command reference",{"id":19,"title":20},"commands-or-protocol","Commands (or Protocol)","\u003Ch1 id=\"the-plugin-hostd-protocol\">The plugin-hostd protocol\u003C\u002Fh1>\n\u003Cp>The plugin-hostd protocol is a superset of mod-host's text protocol: any mod-host client works unchanged.\u003C\u002Fp>\n\u003Cp>Protocol \u003Ccode>plugin-hostd\u003C\u002Fcode>, version 1 of its JSON declaration (\u003Ccode>protocol\u002Fplugin-hostd.json\u003C\u002Fcode>); mod-host's protocol as the daemon models it is \u003Ccode>protocol\u002Fmod-host.json\u003C\u002Fcode>, version 1, written from the mod-host headers \u003Ccode>mod-host.h\u003C\u002Fcode>, \u003Ccode>protocol.h\u003C\u002Fcode>, \u003Ccode>host-errors.h\u003C\u002Fcode> the daemon is built against. The verbs the daemon adds are declared in \u003Ccode>data\u002Fverbs.json\u003C\u002Fcode> (since 0.12.0, requiring omx-contract-schema &gt;= 3.3.0, omx-clap-core &gt;= 0.23.0).\u003C\u002Fp>\n\u003Col>\n\u003Cli>Transport\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>what\u003C\u002Fth>\n\u003Cth>value\u003C\u002Fth>\n\u003Cth>meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>command port\u003C\u002Ftd>\n\u003Ctd>TCP, 5555 without \u003Ccode>-p\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the command port without -p; the feedback port is the next one, unless -n is given\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>feedback port\u003C\u002Ftd>\n\u003Ctd>TCP\u003C\u002Ftd>\n\u003Ctd>the next port after the command port, unless -n is given; \u003Ccode>-f &lt;port&gt;\u003C\u002Fcode> names it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>daemon ready\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>plugin-hostd ready!\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>printed on stdout once both ports accept\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>worker ready\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>ready!\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the end of the line a worker prints once its socket accepts\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>worker command line\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>-n -p &lt;command port&gt; -f &lt;feedback port&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>how the daemon starts every worker\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>line_max\u003C\u002Ftd>\n\u003Ctd>4096 bytes\u003C\u002Ftd>\n\u003Ctd>the protocol socket's buffer: the longest pin_set line the daemon takes\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>line_words_max\u003C\u002Ftd>\n\u003Ctd>64 words\u003C\u002Ftd>\n\u003Ctd>the words of one command line the daemon reads, the verb included; a word past them is not read\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>string_max\u003C\u002Ftd>\n\u003Ctd>255 bytes\u003C\u002Ftd>\n\u003Ctd>the longest string word\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>A command is one line of words, the verb first; a reply is \u003Ccode>resp &lt;code&gt; [...]\u003C\u002Fcode>: the words after the code are the verb's reply grammar below, and a negative code is a refusal, named in \u003Ca href=\"#reply-codes\">Reply codes\u003C\u002Fa>. Events go out on the feedback port, one line each (\u003Ca href=\"#4-events-and-feedback\">4. Events and feedback\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cp>Discovery: the daemon declares itself in files, not on the socket. The verb tables below are installed as:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>file in this tree\u003C\u002Fth>\n\u003Cth>installed as\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>grammar\u002Fplugin-hostd-protocol.abnf\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Fusr\u002Fshare\u002Fplugin-hostd-protocol\u002Fplugin-hostd-protocol.abnf\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>protocol\u002Fmod-host.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Fusr\u002Fshare\u002Fplugin-hostd-protocol\u002Fmod-host.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>protocol\u002Fplugin-hostd-protocol.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Fusr\u002Fshare\u002Fplugin-hostd-protocol\u002Fplugin-hostd-protocol.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>protocol\u002Fplugin-hostd.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Fusr\u002Fshare\u002Fplugin-hostd-protocol\u002Fplugin-hostd.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>protocol\u002Fplugin-hostd.schema.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Fusr\u002Fshare\u002Fplugin-hostd-protocol\u002Fplugin-hostd.schema.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>pkg-config --variable=protocoldir plugin-hostd-protocol\u003C\u002Fcode> names that directory, and \u003Ccode>--variable=table\u003C\u002Fcode>, \u003Ccode>grammar\u003C\u002Fcode> and \u003Ccode>protocoljson\u003C\u002Fcode> name the files. The \u003Ccode>protocol\u003C\u002Fcode> and \u003Ccode>version\u003C\u002Fcode> keys of the protocol JSON identify it; no verb below answers a version.\u003C\u002Fp>\n\u003Ch2 id=\"the-verb-table-and-the-grammar\">The verb table and the grammar\u003C\u002Fh2>\n\u003Cp>\u003Ccode>protocol\u002Fplugin-hostd-protocol.json\u003C\u002Fcode> is the one table of the protocol: every command, each once, with its origin, its argument types, its reply and its refusals, and every feedback line. It is merged from \u003Ccode>protocol\u002Fmod-host.json\u003C\u002Fcode>, \u003Ccode>protocol\u002Fplugin-hostd.json\u003C\u002Fcode>, \u003Ccode>data\u002Fverbs.json\u003C\u002Fcode>, \u003Ccode>include\u002Fplugin-hostd\u002Fomx_clap_core_host_verbs.h\u003C\u002Fcode> by \u003Ccode>tools\u002Fprotocol-table.py\u003C\u002Fcode>; 48 commands of origin mod-host, 27 commands of origin plugin-hostd, 11 commands of origin omx-clap-core, 21 feedback lines.\u003C\u002Fp>\n\u003Cp>\u003Ccode>grammar\u002Fplugin-hostd-protocol.abnf\u003C\u002Fcode> is the grammar of a line, in ABNF (RFC 5234, with RFC 7405's case-sensitive strings): the lexical core, written once by hand (\u003Ccode>grammar\u002Fcore.abnf\u003C\u002Fcode>), and a rule per command, per feedback line and per parse refusal generated from the table by \u003Ccode>tools\u002Fabnf-gen.py\u003C\u002Fcode>. Every line of the scenario corpus and every reply the library writes in the golden transcript is held to it (\u003Ccode>make test-grammar\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cp>A word of another origin that mod-host also has either extends mod-host's command (takes its arguments, in its types, first, and more only where mod-host's command takes a tail), or is a second form of the word told apart from mod-host's by its number of arguments, so that a line of mod-host's form is always answered as mod-host answers it. Any other is refused: the table is not written, and there is no list of exceptions. The words with more than one form:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>verb\u003C\u002Fth>\n\u003Cth>form\u003C\u002Fth>\n\u003Cth>origin\u003C\u002Fth>\n\u003Cth>reply\u003C\u002Fth>\n\u003Cth>codes\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>preset_show\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>preset_show word\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod-host\u003C\u002Ftd>\n\u003Ctd>as mod-host answers it\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>preset_show\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>preset_show int word\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>plugin-hostd\u003C\u002Ftd>\n\u003Ctd>resp 0 &lt;json&gt;\u003C\u002Ftd>\n\u003Ctd>-523 PRESET_NOT_OFFERED; -524 PRESET_INVALID; -3 reply.host.instance-non-exists; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Col start=\"2\">\n\u003Cli>mod-host's verbs on plugin-hostd\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Cp>\u003Ccode>required\u003C\u002Fcode> is answered as its grammar says; \u003Ccode>optional\u003C\u002Fcode> is answered, or refused with -902, and never misread; \u003Ccode>absent\u003C\u002Fcode> is refused on purpose, and no client of the profile may need it.\u003C\u002Fp>\n\u003Cp>Answer: \u003Ccode>same\u003C\u002Fcode> is relayed to the worker that holds the instance (any other verb to every worker) and answered as that worker answers it; \u003Ccode>differs\u003C\u002Fcode> is a verb plugin-hostd declares a grammar or a behaviour of its own for, or one the Path A run observed answered otherwise on the LV2 worker; \u003Ccode>refused\u003C\u002Fcode> is absent of every profile. The argument types are mod-host's templates (\u003Ccode>int\u003C\u002Fcode> %i, \u003Ccode>word\u003C\u002Fcode> %s, \u003Ccode>float\u003C\u002Fcode> %f, \u003Ccode>...\u003C\u002Fcode> an optional tail); the declarations carry no unit per argument, and a range or a unit a verb has is in its meaning.\u003C\u002Fp>\n\u003Cp>mod-host's templates name no reply codes per verb: a relayed verb answers what its worker answers, or one of -503 WORKER_SPAWN (the worker is not up: the spawn failed, or it is in backoff; ask again after instance_restored) or -507 VERB_DROPPED (the worker died on this very command and the daemon dropped it: it is not replayed, and the instance_verb_dropped event names it; or it died on, or did not answer in rpc_timeout_ms, the pin_expect of an add, which is then never forwarded).\u003C\u002Fp>\n\u003Ch3 id=\"required-of-every-profile\">Required of every profile\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>verb\u003C\u002Fth>\n\u003Cth>mod-host arguments\u003C\u002Fth>\n\u003Cth>levels\u003C\u002Fth>\n\u003Cth>answer\u003C\u002Fth>\n\u003Cth>what the data says\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>add\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word int ...\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>differs\u003C\u002Ftd>\n\u003Ctd>plugin-hostd declares it: \u003Ccode>&lt;uri&gt; &lt;instance&gt; [own | pool:&lt;name&gt; | chain:&lt;chain&gt; | default] [client_name]\u003C\u002Fcode> → \u003Ccode>resp &lt;instance&gt;\u003C\u002Fcode>; mod-host's add with a placement; a token after the instance that is not a placement is the jack client name&lt;br&gt;Path A: none; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>remove\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: none; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>preset_load\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>differs\u003C\u002Ftd>\n\u003Ctd>Path A: LV2: user presets fail after a pedalboard reload; CLAP: yes, presets\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>preset_save\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word word word\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: CLAP: user presets cannot be saved\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>preset_show\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: CLAP: no&lt;br&gt;a second form, \u003Ccode>preset_show int word\u003C\u002Fcode> (plugin-hostd), told apart by its number of arguments: \u003Ca href=\"#the-verb-table-and-the-grammar\">The verb table and the grammar\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>connect\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word word\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>differs\u003C\u002Ftd>\n\u003Ctd>Path A: LV2: 2 replies differ, and the pedalboard's output path through mod-monitor hangs on one worker; CLAP: yes, no audio routing\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>disconnect\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word word\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>bypass\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int int\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: none; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>param_set\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word word\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: CLAP: yes, every restored and moved parameter refused (pedalboard load ignores the code, mod\u002Fhost.py:3849 has no callback)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>set_bpm\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>float\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>a host setting (TEMPO), kept and handed to every new worker: \u003Ca href=\"#host-settings\">Host settings\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>set_bpb\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>float\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>a host setting (TEMPO), kept and handed to every new worker: \u003Ca href=\"#host-settings\">Host settings\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cpu_load\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>none\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: not compared beyond the code (a load figure is timing, OWED on hardware)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>bundle_add\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: CLAP: no (mod-ui ignores it)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>bundle_remove\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word word\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: as bundle_add\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>state_load\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: CLAP: yes, plugin state not restored with the pedalboard\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>state_save\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: none; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>state_tmpdir\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: CLAP: no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>feature_enable\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word int\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>differs\u003C\u002Ftd>\n\u003Ctd>Path A: LV2: a worker started later never hears it; CLAP: processing on\u002Foff refused\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>transport\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int float float\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: none, but the transport feedback comes once per worker (6 against 1 in the session)&lt;br&gt;a host setting (TEMPO), kept and handed to every new worker: \u003Ca href=\"#host-settings\">Host settings\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>transport_sync\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: none; no&lt;br&gt;a host setting (TEMPO), kept and handed to every new worker: \u003Ca href=\"#host-settings\">Host settings\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quit\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>none\u003C\u002Ftd>\n\u003Ctd>required (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"optional\">Optional\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>verb\u003C\u002Fth>\n\u003Cth>mod-host arguments\u003C\u002Fth>\n\u003Cth>levels\u003C\u002Fth>\n\u003Cth>answer\u003C\u002Fth>\n\u003Cth>what the data says\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>param_get\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>param_monitor\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word word float\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>relay rule SUBSCRIPTION: monitor_output is in the ledger, one line per output, and param_monitor as it was sent; a respawn replays them after the add, so a respawned instance reports the same outputs, each once, starting again from its first value\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>patch_get\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: none for the probe plugin; a plugin with patch parameters is untested; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>patch_set\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word word\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: as patch_get\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>licensee\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>monitor\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word int int\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>monitor_output\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: CLAP: no meters, and no refusal&lt;br&gt;relay rule SUBSCRIPTION: monitor_output is in the ledger, one line per output, and param_monitor as it was sent; a respawn replays them after the add, so a respawned instance reports the same outputs, each once, starting again from its first value\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>monitor_midi_program\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int int\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: CLAP-only rig: pedalboard change by MIDI program lost\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>midi_learn\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word float float\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: CLAP: MIDI learn through mod-ui lost\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>midi_map\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word int int float float\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: CLAP: saved MIDI maps not restored\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>midi_unmap\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: as midi_map\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cv_map\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word word float float word\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: CLAP: CV addressing lost\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cv_unmap\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: as cv_map\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>load\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>save\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>output_data_ready\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>none\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>Path A: CLAP: no&lt;br&gt;relay rule HANDSHAKE: output_data_ready names no instance and goes to every worker; each worker's data_finish is relayed\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>track_info\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word word ...\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>differs\u003C\u002Ftd>\n\u003Ctd>plugin-hostd declares it: \u003Ccode>&lt;instance&gt; &lt;name&gt; &lt;#RRGGBB | -&gt; [bus | return | master]\u003C\u002Fcode> → \u003Ccode>resp 0\u003C\u002Fcode>; the strip's name (&quot;&quot; for none), colour and kind, absent for an input channel; a worker whose plugin format has a track-info extension passes them on; any other word is -902\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>remote_pages\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>differs\u003C\u002Ftd>\n\u003Ctd>plugin-hostd declares it: \u003Ccode>&lt;instance&gt;\u003C\u002Fcode> → \u003Ccode>resp &lt;count&gt;\u003C\u002Fcode>; the plugin's remote-control pages, from clap.remote-controls; 0 for an instance of a format whose worker has none\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>remote_page_get\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int int\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>differs\u003C\u002Ftd>\n\u003Ctd>plugin-hostd declares it: \u003Ccode>&lt;instance&gt; &lt;page&gt;\u003C\u002Fcode> → \u003Ccode>resp 0 &lt;page_id&gt; &lt;section&gt; &lt;page_name&gt; &lt;s1&gt; &lt;s2&gt; &lt;s3&gt; &lt;s4&gt; &lt;s5&gt; &lt;s6&gt; &lt;s7&gt; &lt;s8&gt;\u003C\u002Fcode>; one page, 0 to count - 1: each slot the symbol param_set takes, - for an empty one; -902 for a page that is not one\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>param_info\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>differs\u003C\u002Ftd>\n\u003Ctd>plugin-hostd declares it: \u003Ccode>&lt;instance&gt; &lt;symbol&gt;\u003C\u002Fcode> → \u003Ccode>resp 0 &lt;unit&gt; &lt;scale&gt; &lt;min&gt; &lt;max&gt; &lt;default&gt; &lt;step&gt; &lt;stable_symbol&gt;\u003C\u002Fcode>; what a parameter's value means: its unit, its scale, and the symbol it keeps across hosts and versions; -103 for a symbol that is not a parameter, the plugin's own bypass and :bypass included; -511 for a parameter whose unit and scale the worker holds no checked contract for\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>help\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>none\u003C\u002Ftd>\n\u003Ctd>optional (every profile)\u003C\u002Ftd>\n\u003Ctd>same\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"absent-refused-on-purpose\">Absent: refused on purpose\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>verb\u003C\u002Fth>\n\u003Cth>mod-host arguments\u003C\u002Fth>\n\u003Cth>levels\u003C\u002Fth>\n\u003Cth>answer\u003C\u002Fth>\n\u003Cth>what the data says\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cc_map\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word int int word float float float int int word int ...\u003C\u002Ftd>\n\u003Ctd>absent (every profile)\u003C\u002Ftd>\n\u003Ctd>refused\u003C\u002Ftd>\n\u003Ctd>absent of every profile: refused on purpose&lt;br&gt;Path A: none on Zynthian (no Control Chain hardware); no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cc_value_set\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word float\u003C\u002Ftd>\n\u003Ctd>absent (every profile)\u003C\u002Ftd>\n\u003Ctd>refused\u003C\u002Ftd>\n\u003Ctd>absent of every profile: refused on purpose&lt;br&gt;Path A: as cc_map\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cc_unmap\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word\u003C\u002Ftd>\n\u003Ctd>absent (every profile)\u003C\u002Ftd>\n\u003Ctd>refused\u003C\u002Ftd>\n\u003Ctd>absent of every profile: refused on purpose&lt;br&gt;Path A: as cc_map\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>hmi_map\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word int int int int int word float float int\u003C\u002Ftd>\n\u003Ctd>absent (every profile)\u003C\u002Ftd>\n\u003Ctd>refused\u003C\u002Ftd>\n\u003Ctd>absent of every profile: refused on purpose&lt;br&gt;Path A: none on Zynthian (no MOD HMI); no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>hmi_unmap\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word\u003C\u002Ftd>\n\u003Ctd>absent (every profile)\u003C\u002Ftd>\n\u003Ctd>refused\u003C\u002Ftd>\n\u003Ctd>absent of every profile: refused on purpose&lt;br&gt;Path A: as hmi_map\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>show_external_ui\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>absent (every profile)\u003C\u002Ftd>\n\u003Ctd>refused\u003C\u002Ftd>\n\u003Ctd>absent of every profile: refused on purpose&lt;br&gt;Path A: none; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Verbs of Zynthian's mod-ui that are no mod-host command, each refused:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>verb\u003C\u002Fth>\n\u003Cth>levels\u003C\u002Fth>\n\u003Cth>Path A\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>set_midi_program_change_pedalboard_bank_channel\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>absent (every profile)\u003C\u002Ftd>\n\u003Ctd>dead code in Zynthian's mod-ui; the only verbs of mod-ui's source missing from protocol\u002Fmod-host.json\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>set_midi_program_change_pedalboard_snapshot_channel\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>absent (every profile)\u003C\u002Ftd>\n\u003Ctd>as above\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"the-path-a-evidence\">The Path A evidence\u003C\u002Fh3>\n\u003Cp>\u003Ccode>doc\u002Fevidence\u002Fmod-ui-verbs.tsv\u003C\u002Fcode>: every verb Zynthian's mod-ui sends, replayed against mod-host and against plugin-hostd. The column heads name the versions that ran; the rows are what was observed then, not run again by this page.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>verb\u003C\u002Fth>\n\u003Cth>sent by mod-ui (zynthian\u002Fmod-ui 817a672 file:line; times in the session)\u003C\u002Fth>\n\u003Cth>LV2 worker (plugin-hostd + mod-host 12335c2)\u003C\u002Fth>\n\u003Cth>CLAP worker (plugin-hostd + omx-clap-host 0.12.0)\u003C\u002Fth>\n\u003Cth>difference from mod-host (and: breaks a CLAP pedalboard?)\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>add\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2581, :3849 (pedalboard load); 10\u003C\u002Ftd>\n\u003Ctd>resp &lt;n&gt;, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp &lt;n&gt;\u003C\u002Ftd>\n\u003Ctd>none; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>remove\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:1083 (remove -1), :2305; 7\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp 0\u003C\u002Ftd>\n\u003Ctd>none; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>connect\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2218, :3409; 24\u003C\u002Ftd>\n\u003Ctd>resp 0 between instance ports; resp -902 for system:capture_N -&gt; mod-monitor:in_N (no instance owns either port; diff.txt); mod-monitor exists only while the first LV2 worker, the one JACK names mod-host, lives (mod-host src\u002Feffects.c:3922), -205 once it is removed (monitor-owner.txt)\u003C\u002Ftd>\n\u003Ctd>resp -205 for 22 of 24 in the replay: mod-ui writes the LV2 port symbols, the CLAP worker's ports are named otherwise; -205 for mod-monitor (probe.tsv)\u003C\u002Ftd>\n\u003Ctd>LV2: 2 replies differ, and the pedalboard's output path through mod-monitor hangs on one worker; CLAP: yes, no audio routing\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>bypass\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2161, :2692; 10\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp 0\u003C\u002Ftd>\n\u003Ctd>none; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>param_set\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2172, :2715; 40\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -103 for all 40 (LV2 symbols; the CLAP worker takes the parameter number); resp 0 with a number (probe.tsv)\u003C\u002Ftd>\n\u003Ctd>CLAP: yes, every restored and moved parameter refused (pedalboard load ignores the code, mod\u002Fhost.py:3849 has no callback)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>patch_get\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2720; 0\u003C\u002Ftd>\n\u003Ctd>resp -902, as mod-host (the probe plugin has no patch parameter)\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>none for the probe plugin; a plugin with patch parameters is untested; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>patch_set\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2189, :2730; 0\u003C\u002Ftd>\n\u003Ctd>resp -902, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>as patch_get\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>preset_load\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2166, :3867; 5\u003C\u002Ftd>\n\u003Ctd>resp 0 in one worker; resp -105 for a user preset when the instance's worker started after the preset's bundle_add (diff.txt, 2 of 5)\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>LV2: user presets fail after a pedalboard reload; CLAP: yes, presets\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>preset_save\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2925; 2\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>CLAP: user presets cannot be saved\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>preset_show\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2829; 2\u003C\u002Ftd>\n\u003Ctd>the preset's Turtle, identical\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>CLAP: no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>bundle_add\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2240; 2\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host (not replayed to later workers, see preset_load)\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>CLAP: no (mod-ui ignores it)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>bundle_remove\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2260; 0\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>as bundle_add\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>state_load\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2145, :3665; 3\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -105 (2 of 3 in the replay); resp -105 in the probe\u003C\u002Ftd>\n\u003Ctd>CLAP: yes, plugin state not restored with the pedalboard\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>state_save\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:4012; 2\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp 0\u003C\u002Ftd>\n\u003Ctd>none; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>state_tmpdir\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:1086; 1\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902 in the probe (resp 0 in the replay, sent before any CLAP worker existed)\u003C\u002Ftd>\n\u003Ctd>CLAP: no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>feature_enable\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:3489 (aggregated-midi), :5689 (processing); 17\u003C\u002Ftd>\n\u003Ctd>processing: resp 0; aggregated-midi: -202 from a worker, as mod-host here (the pod has no mod-midi-merger internal client); with no worker running the daemon answers 0 and keeps nothing\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>LV2: a worker started later never hears it; CLAP: processing on\u002Foff refused\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>transport\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2028, :4656; 7\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp 0\u003C\u002Ftd>\n\u003Ctd>none, but the transport feedback comes once per worker (6 against 1 in the session)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>transport_sync\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:4565; 1\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp 0\u003C\u002Ftd>\n\u003Ctd>none; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>monitor_output\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:2180, :2565; 0\u003C\u002Ftd>\n\u003Ctd>resp 1, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp 0 for any symbol\u003C\u002Ftd>\n\u003Ctd>CLAP: no meters, and no refusal\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>monitor_midi_program\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:1126; 0\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>CLAP-only rig: pedalboard change by MIDI program lost\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>midi_learn\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:4922; 0\u003C\u002Ftd>\n\u003Ctd>resp 1, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>CLAP: MIDI learn through mod-ui lost\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>midi_map\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:764, :2164; 0\u003C\u002Ftd>\n\u003Ctd>resp 1, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>CLAP: saved MIDI maps not restored\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>midi_unmap\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:807; 0\u003C\u002Ftd>\n\u003Ctd>resp 1, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>as midi_map\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cc_map\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:748; 0\u003C\u002Ftd>\n\u003Ctd>resp -401, as mod-host (no Control Chain)\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>none on Zynthian (no Control Chain hardware); no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cc_value_set\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:868; 0\u003C\u002Ftd>\n\u003Ctd>resp -401, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>as cc_map\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cc_unmap\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:803; 0\u003C\u002Ftd>\n\u003Ctd>resp -401, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>as cc_map\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cv_map\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:780, :2204; 0\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>CLAP: CV addressing lost\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cv_unmap\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:811; 0\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>as cv_map\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>hmi_map\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:689; 0\u003C\u002Ftd>\n\u003Ctd>resp -403, as mod-host (no HMI)\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>none on Zynthian (no MOD HMI); no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>hmi_unmap\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:694; 0\u003C\u002Ftd>\n\u003Ctd>resp -403, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>as hmi_map\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cpu_load\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:5736, mod\u002Fsession.py:354; 0\u003C\u002Ftd>\n\u003Ctd>resp 0 ..., as mod-host\u003C\u002Ftd>\n\u003Ctd>resp 0 ...\u003C\u002Ftd>\n\u003Ctd>not compared beyond the code (a load figure is timing, OWED on hardware)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>output_data_ready\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:1888; 2\u003C\u002Ftd>\n\u003Ctd>resp 0, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902 in the probe (resp 0 in the replay, broadcast)\u003C\u002Ftd>\n\u003Ctd>CLAP: no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>show_external_ui\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fsession.py:349; 0\u003C\u002Ftd>\n\u003Ctd>resp -902, as mod-host\u003C\u002Ftd>\n\u003Ctd>resp -902\u003C\u002Ftd>\n\u003Ctd>none; no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>set_midi_program_change_pedalboard_bank_channel\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:4735, commented out: never sent\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>dead code in Zynthian's mod-ui; the only verbs of mod-ui's source missing from protocol\u002Fmod-host.json\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>set_midi_program_change_pedalboard_snapshot_channel\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod\u002Fhost.py:4739, commented out: never sent\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>as above\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Col start=\"3\">\n\u003Cli>Verbs mod-host does not have\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Cp>Each is declared in \u003Ccode>protocol\u002Fplugin-hostd.json\u003C\u002Fcode>; the formats, codes and hosts come from \u003Ccode>data\u002Fverbs.json\u003C\u002Fcode>, or from omx-clap-core's verb table for a verb the two hosts share. A verb whose meaning begins &quot;sent by the daemon to a worker&quot; is the daemon's to a worker, never a controller's.\u003C\u002Fp>\n\u003Ch3 id=\"placement-and-supervision\">Placement and supervision\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>verb\u003C\u002Fth>\n\u003Cth>arguments\u003C\u002Fth>\n\u003Cth>types\u003C\u002Fth>\n\u003Cth>reply\u003C\u002Fth>\n\u003Cth>codes\u003C\u002Fth>\n\u003Cth>since (the group's)\u003C\u002Fth>\n\u003Cth>hosts\u003C\u002Fth>\n\u003Cth>meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>worker_list\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>none\u003C\u002Ftd>\n\u003Ctd>none\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp &lt;n&gt; &lt;worker&gt;:&lt;pid&gt;:&lt;format&gt;:&lt;state&gt;:&lt;core&gt;:&lt;pool&gt;:&lt;place&gt;:&lt;i&gt;,&lt;i&gt;,...\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>the workers, one record each\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>instance_info\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0 &lt;worker&gt; &lt;pid&gt; &lt;state&gt; &lt;crashes&gt; &lt;quarantined&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-3 reply.host.instance-non-exists; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>where an instance lives and what it has cost\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>supervisor_reset\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>[&lt;worker&gt; | all]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>...\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-506 NO_SUCH_WORKER; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>re-arm the storm bound and the backoff of a given-up placement\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quarantine_clear\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; | all\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-3 reply.host.instance-non-exists; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>let a quarantined instance go back where its placement says\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>policy_set\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;format | *&gt; own | pool:&lt;name&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word word\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-501 PLACEMENT_INVALID; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>the placement of an add that says default\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pool_config\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;name&gt; &lt;max_instances&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-501 PLACEMENT_INVALID; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>the instances a pool holds before a sibling opens\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>worker_env\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;format | *&gt; &lt;cpu-list|-&gt; &lt;nice|-&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word word word\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>the cpu list and the nice value of the workers of a format, at spawn and on the ones running\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>lv2_worker_set\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;uri&gt; &lt;mod-host | omx-clap-host | auto | -&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word word\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>the worker of one LV2 plugin, for its adds from now on: it overrides the lv2_worker setting, - takes the override back; -902 for a word that is none of these. Like policy_set it is the controller's, not in the ledger, gone with the daemon\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>worker_list\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; worker_list\n&lt; resp &lt;n&gt; &lt;worker&gt;:&lt;pid&gt;:&lt;format&gt;:&lt;state&gt;:&lt;core&gt;:&lt;pool&gt;:&lt;place&gt;:&lt;i&gt;,&lt;i&gt;,...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>instance_info\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; instance_info 0\n&lt; resp 0 &lt;worker&gt; &lt;pid&gt; &lt;state&gt; &lt;crashes&gt; &lt;quarantined&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>supervisor_reset\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; supervisor_reset\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>quarantine_clear\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; quarantine_clear 0\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>policy_set\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; policy_set clap own\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>pool_config\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; pool_config fx 4\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>worker_env\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; worker_env clap - -\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>lv2_worker_set\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; lv2_worker_set lv2:urn:openmixer:comp omx-clap-host\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"pins-and-qualification\">Pins and qualification\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>verb\u003C\u002Fth>\n\u003Cth>arguments\u003C\u002Fth>\n\u003Cth>types\u003C\u002Fth>\n\u003Cth>reply\u003C\u002Fth>\n\u003Cth>codes\u003C\u002Fth>\n\u003Cth>since (the group's)\u003C\u002Fth>\n\u003Cth>hosts\u003C\u002Fth>\n\u003Cth>meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pin_set\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;uri&gt; &lt;path&gt;=&lt;sha256&gt;[,&lt;path&gt;=&lt;sha256&gt;...] &lt;scheme&gt;:&lt;sha256&gt; [verdict=&lt;verdict&gt;] [pool=&lt;pool&gt;]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word word word ...\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-516 PIN_REFUSED; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>the pin of one plugin: the SHA-256 of every file the host loads for it, a path relative to the bundle (the directory of a single-file format's file), its layout fingerprint and, when they are known, the verdict of its qualification and whether its worker gets the CLAP thread pool; it replaces an earlier pin of the uri; -516 for a plugin whose pins_dir pin carries verdict=refused, which nothing overrides. The pin store, a pin_file and a pins_dir file hold the same line, with or without the verb\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pin_clear\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;uri&gt; | all\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>forget the pin of one plugin, or of every one; a pins_dir pin is read-only and holds again\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pin_reload\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>none\u003C\u002Ftd>\n\u003Ctd>none\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>read the pin_file and the pins_dir files again and put the pins in at once, without a restart; the daemon also does this by itself when one of those files changes. Running instances keep running: one the new pins refuse is logged and its id in worker_list is followed by !. The pin_set pins of the controller are kept. -902 under pin_mode off or when the pin_file is gone or has a line outside the grammar, and the earlier pins hold\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pin_changed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>[&lt;uri&gt;] [files | layout]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>...\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>the notice the package sync sends to every daemon it knows after it rewrote the pin file: the same as pin_reload, with or without the pin_changed event's words after it; more words than those are -902\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pin_accept\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;uri&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-508 PIN_ABSENT; -509 PIN_BINARY_MISMATCH; -516 PIN_REFUSED; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>pin_mode first-use only: take the plugin's files as they are now as its pin, after a pin_changed event; the layout is learned again by the next add and the verdict is dropped; -508 when the plugin has no pin, -509 when its files cannot be collected, -516 when its pins_dir pin carries verdict=refused, -902 under pin_mode strict\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pin_layout\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0 &lt;scheme&gt;:&lt;sha256&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>omx-clap-host optional, mod-host unsupported\u003C\u002Ftd>\n\u003Ctd>sent by the daemon to a worker of a format that checks layouts, after it accepted the add of a plugin whose layout pin is still unknown: the layout the worker found after init, which the daemon records in the pin\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pin_expect\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; &lt;scheme&gt;:&lt;sha256&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-1 reply.host.instance-invalid; -902 reply.host.invalid-operation; -508 PIN_ABSENT\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>plugin-hostd unsupported, omx-clap-host required, mod-host unsupported\u003C\u002Ftd>\n\u003Ctd>sent by the daemon to a worker of a format that checks layouts, just before the instance's add: the layout pin that add checks after init and before activate; any other reply than resp 0 refuses the add with that code, and the add is never forwarded\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>pin_set\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; pin_set clap:\u002Fusr\u002Flib\u002Fclap\u002Fomx-comp.clap#org.openmixer.comp &lt;path&gt;=&lt;sha256&gt; &lt;scheme&gt;:&lt;sha256&gt;\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>pin_clear\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; pin_clear clap:\u002Fusr\u002Flib\u002Fclap\u002Fomx-comp.clap#org.openmixer.comp\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>pin_reload\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; pin_reload\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>pin_changed\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; pin_changed\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>pin_accept\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; pin_accept clap:\u002Fusr\u002Flib\u002Fclap\u002Fomx-comp.clap#org.openmixer.comp\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>pin_layout\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; pin_layout 0\n&lt; resp 0 &lt;scheme&gt;:&lt;sha256&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>pin_expect\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; pin_expect 0 &lt;scheme&gt;:&lt;sha256&gt;\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"chains-and-plans\">Chains and plans\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>verb\u003C\u002Fth>\n\u003Cth>arguments\u003C\u002Fth>\n\u003Cth>types\u003C\u002Fth>\n\u003Cth>reply\u003C\u002Fth>\n\u003Cth>codes\u003C\u002Fth>\n\u003Cth>since (the group's)\u003C\u002Fth>\n\u003Cth>hosts\u003C\u002Fth>\n\u003Cth>meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>chain\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;chain&gt; &lt;instance&gt; [&lt;instance&gt; ...]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int int ...\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-518 CHAIN_UNKNOWN_INSTANCE; -519 CHAIN_DUPLICATE; -520 CHAIN_INSTANCE_BUSY; -521 CHAIN_MIXED_FORMAT; -501 PLACEMENT_INVALID; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required, omx-clap-host required, mod-host unsupported\u003C\u002Ftd>\n\u003Ctd>the instances, in this order, are one chain, run in one worker of place chain:&lt;chain&gt;: each member's state is saved, it is removed from the worker it was in and replayed in the chain's. A chain already declared takes the new order, and a member left out of it goes back to a worker of its own; while its worker is up that worker is kept: a new member joins it (its add, the order, its state, its ledger, its connections) and no other member is restarted, unless the new member's format narrows the worker's world, which forms the chain again. Members of clap and lv2-clap form one chain. A worker that runs chains in one client (clap, lv2-clap) is sent this line, with the members it holds, after the adds of its replay; one that does not (mod-host) never is. A worker that refuses the line would not run the members as one: the chain is forgotten and each member runs in a worker of its own, the line answers -501, and the event chain_refused carries the worker's own code, also when the refusal comes later, on a respawn. Every instance verb still names one member by its own number. A member that crashes the worker is quarantined to a worker of its own and the chain goes on without it; quarantine_clear puts it back. -518 for an instance no add made, -519 for one named twice, -520 for one in another chain, -521 for members no one worker program runs together, -501 for a plugin that may not share a worker while require_pins is on (a CLAP plugin whose first-use pin is not in-process; an LV2 member whose bundle is not found, since a chain's worker sees a world narrowed to the union of its members' bundles), -902 for a chain or an instance that is not a number, or fewer than chain_members_min (1) instances\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>chain_clear\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;chain&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-522 NO_SUCH_CHAIN; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>forget the chain: each member goes to a worker of its own; -522 for a chain no chain declared\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>chain_get\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;chain&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0 &lt;worker&gt; &lt;instance&gt;,... &lt;instance&gt;,...\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-522 NO_SUCH_CHAIN; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>read a chain back: its worker (- when it has none), its members in the declared order, and the members its worker runs now in their order (- for none); a quarantined member is declared and not running; -522 for a chain no chain declared, -902 for a chain that is not a number\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>plan\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;chain&gt; &lt;instance&gt; [&lt;instance&gt; ...]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int int ...\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0 &lt;instance&gt;,...;&lt;instance&gt;,...;... &lt;core&gt;,...;&lt;core&gt;,...;...\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-518 CHAIN_UNKNOWN_INSTANCE; -519 CHAIN_DUPLICATE; -520 CHAIN_INSTANCE_BUSY; -501 PLACEMENT_INVALID; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>the instances, in signal order, are planned (the grouping-planner design note): the daemon decides, from the pin and the cost of each, which runs of consecutive members share a worker. A run of two or more is declared as a chain of place chain:&lt;chain&gt;.&lt;k&gt;, k counting segments from 0; a member that shares with no neighbour is placed own. The reply names the segments in order, the members of one joined by commas and the segments by semicolons, then the cores: the segments again with each member replaced by the audio core of the worker that runs it now, - for one the setting placement did not pin (docs\u002Fplacement.md). A chain planned again keeps the running worker of every segment that did not change, and the daemon plans it again by itself when a member is quarantined and, history_regroup_s after a death that split its group, to gather it. The plan numbers are its own, apart from chain's. While the setting grouping is off the plan is answered and kept for plan_get and nothing moves. A segment that cannot be formed refuses the whole plan with its own code, moves nothing and is told by plan_get as plan-refused:&lt;code&gt;. A segment its worker refuses, which is known only once it has moved, refuses the plan with -501 too, and then every segment ends and each member runs in a worker of its own. -518 for an instance no add made, -519 for one named twice, -520 for one in a chain or in the plan of another chain, -501 for a segment no world can be built for or its worker refuses, -902 for a chain or an instance that is not a number, or fewer than chain_members_min (1) instances\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>plan_get\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;chain&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0 &lt;instance&gt;,...;&lt;instance&gt;,...;... &lt;instance&gt;:&lt;reason&gt;,... &lt;core&gt;,...;&lt;core&gt;,...;...\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-532 NO_SUCH_PLAN; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>read the last plan of a chain back: its segments as plan answered them, then the members that have a reason, instance:reason joined by commas (- for none); the reasons are the words of PLUGIN_HOSTD_GROUPING_REASONS (data\u002Fgrouping.json), then the cores of the members as plan answers them; -532 for a chain no plan planned, -902 for a chain that is not a number\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>plan_clear\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;chain&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-532 NO_SUCH_PLAN; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>forget the plan: each member goes to a worker of its own; -532 for a chain no plan planned\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>estimate\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;rate&gt; &lt;quantum&gt; &lt;uri&gt; [&lt;uri&gt; ...]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int int word ...\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0 &lt;latency_frames&gt; &lt;cpu_percent&gt; &lt;ram_bytes&gt; &lt;workers&gt; &lt;unknown_count&gt; &lt;member&gt;:&lt;code&gt;,... &lt;ram_used_bytes&gt; &lt;ram_added_bytes&gt; &lt;ram_budget_bytes&gt; &lt;ram_unknown_count&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-533 NO_RECORD; -534 NO_CELL; -535 UNKNOWN_PLUGIN; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>what a chain of these plugins, in signal order and named as add names them, would cost at that rate and quantum, read from the qualification records of qualification_dir; no plugin is loaded and nothing moves. latency_frames adds up each member's measured latency of the grid point, else its declared one; cpu_percent adds up each member's median nanoseconds per sample times the rate, percent of one core's cycle (a member's cost per block over the block's duration); ram_bytes adds up the Pss of the worker each member ran alone in, the history's pss_mb_solo of the binary its pin holds on this host class, - unless every member has one, since no qualification record carries a RAM figure; workers is how many workers plan would place the members in (an isolated one alone); unknown_count is how many members have no figure at that rate and quantum, and the latency and the CPU add up only the others. The last word names each of them as its position in the line, from 0, and its code, -533 for no record, -534 for no point of the grid at that rate and quantum, -535 for a uri that names no plugin installed here, joined by commas, - for none. Several records of one plugin (several versions) give the largest figure. -902 for a rate or a quantum that is not a whole number above 0, or no uri\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>chain\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; chain 1 0 1\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>chain_clear\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; chain_clear 1\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>chain_get\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; chain_get 1\n&lt; resp 0 &lt;worker&gt; &lt;instance&gt;,... &lt;instance&gt;,...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>plan\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; plan 1 0 1\n&lt; resp 0 &lt;instance&gt;,...;&lt;instance&gt;,...;... &lt;core&gt;,...;&lt;core&gt;,...;...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>plan_get\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; plan_get 1\n&lt; resp 0 &lt;instance&gt;,...;&lt;instance&gt;,...;... &lt;instance&gt;:&lt;reason&gt;,... &lt;core&gt;,...;&lt;core&gt;,...;...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>plan_clear\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; plan_clear 1\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>estimate\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; estimate &lt;rate&gt; &lt;quantum&gt; clap:\u002Fusr\u002Flib\u002Fclap\u002Fomx-comp.clap#org.openmixer.comp\n&lt; resp 0 &lt;latency_frames&gt; &lt;cpu_percent&gt; &lt;ram_bytes&gt; &lt;workers&gt; &lt;unknown_count&gt; &lt;member&gt;:&lt;code&gt;,... &lt;ram_used_bytes&gt; &lt;ram_added_bytes&gt; &lt;ram_budget_bytes&gt; &lt;ram_unknown_count&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"descriptors-panels-and-the-running-history\">Descriptors, panels and the running history\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>verb\u003C\u002Fth>\n\u003Cth>arguments\u003C\u002Fth>\n\u003Cth>types\u003C\u002Fth>\n\u003Cth>reply\u003C\u002Fth>\n\u003Cth>codes\u003C\u002Fth>\n\u003Cth>since (the group's)\u003C\u002Fth>\n\u003Cth>hosts\u003C\u002Fth>\n\u003Cth>meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>descriptor_get\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;uri&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0 &quot;&lt;path&gt;&quot;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-528 DIR_NOT_WRITABLE; -529 DESCRIPTOR_ABSENT; -530 DESCRIPTOR_PENDING; -531 DESCRIPTOR_SCAN_FAILED; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>the scanned descriptor of the plugin, answered from descriptor_dir: the file named for its binary as it is now (&lt;id&gt;@&lt;version&gt;-&lt;hash&gt;.json), written by the scan the plugin's add ran. -529 when there is none, -530 while its scan runs, -531 when its last scan wrote nothing, -528 when the directory could not be written\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>panel_get\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;uri&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0 &quot;&lt;path&gt;&quot;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-528 DIR_NOT_WRITABLE; -529 DESCRIPTOR_ABSENT; -530 DESCRIPTOR_PENDING; -531 DESCRIPTOR_SCAN_FAILED; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>the panel the plugin publishes (org.openmixer.panel-description\u002F1), answered from descriptor_dir: the file panels\u002F&lt;id&gt;@&lt;version&gt;-&lt;hash&gt;.json, named as its descriptor, which the same scan writes once the descriptor is in place, {&quot;plugin&quot;: {&quot;format&quot;, &quot;id&quot;}, &quot;panel&quot;: &lt;the panel object omx-clap-scan --json prints for the plugin, null when it serves none&gt;}; an LV2 plugin's panel is null. The codes are descriptor_get's: -529 when there is none, -530 while its scan runs, -531 when its last scan wrote nothing, -528 when the directory could not be written\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>history_get\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;uri&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0 &lt;history&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>what the daemon kept of the plugin on this host class, for the binary its pin holds now (the running history: the windows it ran alone and in a group, its crashes, restarts and quarantines): one word of comma-joined digest=&lt;sha256&gt;, class=&lt;host class&gt;, crashed=&lt;0|1&gt;, raises_xruns=&lt;0|1&gt; and then every key=value of the record (data\u002Fhistory.json); - when the plugin has no pin or no record, unavailable while the history file is blocked or history_window_s is 0, -902 for a line that is not one word\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>history_clear\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;uri&gt; | all\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>word\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd required\u003C\u002Ftd>\n\u003Ctd>delete the history of one plugin (every binary and host class of it), or all of it, from memory and from the file at once; -902 while the history is blocked or off, or for a line that is not one word\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>descriptor_get\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; descriptor_get clap:\u002Fusr\u002Flib\u002Fclap\u002Fomx-comp.clap#org.openmixer.comp\n&lt; resp 0 &quot;&lt;path&gt;&quot;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>panel_get\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; panel_get clap:\u002Fusr\u002Flib\u002Fclap\u002Fomx-comp.clap#org.openmixer.comp\n&lt; resp 0 &quot;&lt;path&gt;&quot;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>history_get\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; history_get clap:\u002Fusr\u002Flib\u002Fclap\u002Fomx-comp.clap#org.openmixer.comp\n&lt; resp 0 &lt;history&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>history_clear\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; history_clear clap:\u002Fusr\u002Flib\u002Fclap\u002Fomx-comp.clap#org.openmixer.comp\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"presets-and-notes-by-instance\">Presets and notes, by instance\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>verb\u003C\u002Fth>\n\u003Cth>arguments\u003C\u002Fth>\n\u003Cth>types\u003C\u002Fth>\n\u003Cth>reply\u003C\u002Fth>\n\u003Cth>codes\u003C\u002Fth>\n\u003Cth>since (the group's)\u003C\u002Fth>\n\u003Cth>hosts\u003C\u002Fth>\n\u003Cth>meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>preset_list\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp &lt;count&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-515 NO_PRESET_LIST; -3 reply.host.instance-non-exists; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd optional, omx-clap-host optional, mod-host unsupported\u003C\u002Ftd>\n\u003Ctd>the plugin's presets, the ones its preset discovery or its bundle lists; (-515) for an instance of a worker that cannot list them\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>preset_get\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; &lt;index&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0 &lt;load_key&gt; &lt;name&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-515 NO_PRESET_LIST; -3 reply.host.instance-non-exists; -901 reply.host.memory-allocation; -902 reply.host.invalid-operation\u003C\u002Ftd>\n\u003Ctd>0.12.0\u003C\u002Ftd>\n\u003Ctd>plugin-hostd optional, omx-clap-host optional, mod-host unsupported\u003C\u002Ftd>\n\u003Ctd>one preset, 0 to count - 1: the key preset_load takes for it, and its name; -902 for an index that is not one\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>note_input\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0 &lt;port | -&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-3 reply.host.instance-non-exists; -902 reply.host.invalid-operation; -514 NOTES_BY_JACK; -901 reply.host.memory-allocation\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>plugin-hostd optional, omx-clap-host required, mod-host unsupported\u003C\u002Ftd>\n\u003Ctd>whether the instance takes notes: the name of its note input on its worker's jack client, - for a plugin that takes none; (-514) for an instance of a worker that cannot say\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>note_on\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; &lt;channel&gt; &lt;key&gt; &lt;velocity&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int int int int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-513 NO_NOTE_INPUT; -514 NOTES_BY_JACK; -517 NOTE_QUEUE_FULL; -3 reply.host.instance-non-exists; -902 reply.host.invalid-operation; -901 reply.host.memory-allocation\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>plugin-hostd optional, omx-clap-host required, mod-host unsupported\u003C\u002Ftd>\n\u003Ctd>play a key: channel 0 to 15, key 0 to 127, velocity 1 to 127, a MIDI note on at the start of the worker's next cycle; (-513) for a plugin that takes no notes, (-514) for an instance of a worker that takes none on its socket, -902 for a word out of its range\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>note_off\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; &lt;channel&gt; &lt;key&gt; &lt;velocity&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int int int int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-513 NO_NOTE_INPUT; -514 NOTES_BY_JACK; -517 NOTE_QUEUE_FULL; -3 reply.host.instance-non-exists; -902 reply.host.invalid-operation; -901 reply.host.memory-allocation\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>plugin-hostd optional, omx-clap-host required, mod-host unsupported\u003C\u002Ftd>\n\u003Ctd>release a key, velocity 0 to 127, a MIDI note off; answered as note_on is\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>all_notes_off\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>resp 0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>-513 NO_NOTE_INPUT; -514 NOTES_BY_JACK; -517 NOTE_QUEUE_FULL; -3 reply.host.instance-non-exists; -902 reply.host.invalid-operation; -901 reply.host.memory-allocation\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>plugin-hostd optional, omx-clap-host required, mod-host unsupported\u003C\u002Ftd>\n\u003Ctd>release every key of every channel, MIDI's all notes off (controller 123) on each; answered as note_on is\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>preset_list\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; preset_list 0\n&lt; resp &lt;count&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>preset_get\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; preset_get 0 0\n&lt; resp 0 &lt;load_key&gt; &lt;name&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>note_input\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; note_input 0\n&lt; resp 0 &lt;port | -&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>note_on\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; note_on 0 0 60 100\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>note_off\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; note_off 0 0 60 100\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>all_notes_off\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&gt; all_notes_off 0\n&lt; resp 0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Col start=\"4\">\n\u003Cli>Events and feedback\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Cp>mod-host's feedback lines, relayed as the worker wrote them:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>line\u003C\u002Fth>\n\u003Cth>arguments\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>output_set\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int word float\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>remote_pages_changed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>int\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The daemon's events and the worker lines it relays:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>event\u003C\u002Fth>\n\u003Cth>fields\u003C\u002Fth>\n\u003Cth>meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>worker_died\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;worker&gt; &lt;pid&gt; &lt;exit:N | signal:N&gt; &lt;instance&gt;,...\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a worker died; the instances it held, or - for none\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>instance_verb_dropped\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; &lt;the command as sent&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the command a worker died on, dropped from the ledger; or the add it died on, the add as the worker was given it, which names the plugin, or the pin_expect of that add\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>instance_verb_dropped\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; suspect:&lt;ms&gt; &lt;the command as sent&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the last verb a worker answered when it died inside suspect_window_ms, &lt;ms&gt; the age of the reply\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>worker_backoff\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;worker&gt; &lt;ms&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the respawn waits this long\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>worker_respawned\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;worker&gt; &lt;pid&gt; &lt;replayed_count&gt; &lt;ms&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a worker is back and its ledger replayed\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>instance_restored\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; &lt;worker&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>an instance is back in a worker\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>instance_replay_refused\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; &lt;code&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a replayed add was refused, by its pin or by the worker, &lt;code&gt; the refusal's own: no worker holds the instance until the next replay\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>instance_quarantined\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; &lt;worker&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the culprit of a pool or a chain death, placed own until cleared; a chain goes on without it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>chain_formed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;chain&gt; &lt;worker&gt; &lt;instance&gt;,...\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a chain's worker is up with these members, in this order, after its declaration, a respawn or a member's quarantine; - for none. &lt;chain&gt; is the number chain declared, or &lt;plan&gt;.&lt;k&gt; for segment k of a plan\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>chain_refused\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;chain&gt; &lt;code&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a chain's worker would not run the members as one chain, &lt;code&gt; its own answer, and its stderr says why: the chain is forgotten and each member runs in a worker of its own. &lt;chain&gt; as chain_formed names it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>chain_stalled\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;chain&gt; &lt;instance | -&gt; &lt;step&gt; &lt;code&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a chain, or a plan's segment, has not formed within chain_form_timeout_ms of its declaration: the member and the step that held it (spawn, add, pin, state, memory) and the code it answered, 0 for none, - for no one member; said once each time it is declared or gathered again, and the daemon goes on trying\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>plan_reason\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;chain&gt; &lt;instance&gt;:&lt;reason&gt;,...\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a plan of the chain changed: the reasons plan_get answers now, after the segments, - for none\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>supervisor_gave_up\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;worker&gt; &lt;deaths&gt; &lt;window_ms&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the storm bound is spent; respawning ends\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pin_changed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;uri&gt; files | layout\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>an add or a replay of a plugin was refused because its files, or the layout the worker found, differ from its pin; the pin is as it was until pin_accept or pin_set\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>lv2_adapter_refused\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;uri&gt; &lt;reason&gt; auto | omx-clap-host\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the LV2 adapter of the lv2-clap worker refused a plugin: &lt;reason&gt; is the hosting.* code after -102 on the worker's reply to that add (- when it named none); the last word is the lv2_worker in force, auto for a plugin the lv2 row runs from now on, omx-clap-host for an add answered (-512)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>remote_pages_changed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>relayed from a worker: the plugin changed its remote pages; read them again\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>remote_page_suggest\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; &lt;page_id&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>relayed from a worker: the plugin suggests the remote page of that id (a page_id of remote_page_get); a surface may follow it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>param_gesture\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; &lt;symbol&gt; begin | end\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>relayed from a worker: the user took hold of a control of the plugin's own, or let it go; a controller writes no automation of that parameter in between. The values the plugin moves meanwhile, or at any time by itself, are mod-host's param_set feedback lines, relayed as written. A gesture whose worker died, or whose instance was removed, before its end is ended by the daemon, before the worker_died event\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>xruns\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;count&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>relayed from a worker, and read by the daemon: the JACK xruns the worker has counted since it started, written when the count changes and at most once a second; a worker that never writes it counted none. The daemon takes the first count of a worker as its baseline and, at the close of each history window, adds the window to xrun_windows_solo or xrun_windows_grouped of every member of the worker when the count rose in it; a line that is not the word and one whole number is not a count\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>abi_clobber\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; &lt;mask&gt; &lt;registers&gt; &lt;call&gt; &lt;block&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>relayed from a worker (omx-clap-host 0.26.2 or later), and read by the daemon: the plugin returned from a call with a callee-saved register changed, said once per instance. The worker put the registers back, so its own frame is whole; the other members' state in the same process is not covered, so the daemon quarantines the instance (instance_quarantined, and the history keeps it alone from then on) and, when it shares its worker or is in a chain, moves it to a worker of its own with its state saved; one already alone is only marked\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>param_set\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;instance&gt; &lt;symbol&gt; &lt;value&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>relayed from a worker: parameter feedback, a value the plugin moved by itself (its automation, an LFO, a preset load, a MIDI map, the user's knob of the plugin's own), as mod-host writes it; a controller updates its control to it. A worker never writes it for a value a controller's param_set gave it, and a worker that writes none changes nothing: the daemon adds no line of its own\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The relay rules:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>VERBATIM: every line a worker writes on its feedback port goes out on the daemon's feedback port as the worker wrote it: output_set, param_set, data_finish and the rest of mod-host's feedback, and a line the daemon does not know\u003C\u002Fli>\n\u003Cli>INSTANCE: the instance number in a relayed line is already the controller's: add hands it to the worker unchanged, so nothing in a line is rewritten\u003C\u002Fli>\n\u003Cli>ORDER: a worker's lines go out in the order it wrote them, and what a worker wrote before it died goes out before its worker_died event; an instance lives in one worker at a time, so its lines keep their order across a respawn; the lines of different workers interleave\u003C\u002Fli>\n\u003Cli>SUBSCRIPTION: monitor_output is in the ledger, one line per output, and param_monitor as it was sent; a respawn replays them after the add, so a respawned instance reports the same outputs, each once, starting again from its first value\u003C\u002Fli>\n\u003Cli>HANDSHAKE: output_data_ready names no instance and goes to every worker; each worker's data_finish is relayed\u003C\u002Fli>\n\u003Cli>NO_CONTROLLER: with no feedback port, or no controller on it, a line is dropped, as mod-host drops it; the daemon reads every worker's feedback all the time, so no worker waits on it\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"host-settings\">Host settings\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>TEMPO: the tempo, the metre and the transport a controller sets (mod-host's set_bpm, set_bpb, transport and transport_sync) are kept, the latest line of each as it was sent, in the order they were last sent\u003C\u002Fli>\n\u003Cli>REPLAY: a worker is handed them before anything else: a respawned one before its first add, and a worker started later, of a new placement, as well; a worker's refusal of one is written to stderr and is no failure\u003C\u002Fli>\n\u003Cli>GRAMMAR: a line whose words are not that command's grammar is passed on and not kept\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"reply-codes\">Reply codes\u003C\u002Fh2>\n\u003Cp>mod-host's parse refusals (\u003Ccode>protocol.h\u003C\u002Fcode>): -1 PROTOCOL_NOT_FOUND (not found); -2 PROTOCOL_MANY_ARGUMENTS (many arguments); -3 PROTOCOL_FEW_ARGUMENTS (few arguments); -4 PROTOCOL_INVALID_ARGUMENT (invalid argument).\u003C\u002Fp>\n\u003Cp>mod-host's reply codes (\u003Ccode>host-errors.h\u003C\u002Fcode>): 0 SUCCESS; -1 ERR_INSTANCE_INVALID; -2 ERR_INSTANCE_ALREADY_EXISTS; -3 ERR_INSTANCE_NON_EXISTS; -4 ERR_INSTANCE_UNLICENSED; -101 ERR_HOST_INVALID_URI; -102 ERR_HOST_INSTANTIATION; -103 ERR_HOST_INVALID_PARAM_SYMBOL; -104 ERR_HOST_INVALID_PRESET_URI; -105 ERR_HOST_CANT_LOAD_STATE; -101 ERR_LV2_INVALID_URI; -102 ERR_LV2_INSTANTIATION; -103 ERR_LV2_INVALID_PARAM_SYMBOL; -104 ERR_LV2_INVALID_PRESET_URI; -105 ERR_LV2_CANT_LOAD_STATE; -201 ERR_JACK_CLIENT_CREATION; -202 ERR_JACK_CLIENT_ACTIVATION; -203 ERR_JACK_CLIENT_DEACTIVATION; -204 ERR_JACK_PORT_REGISTER; -205 ERR_JACK_PORT_CONNECTION; -206 ERR_JACK_PORT_DISCONNECTION; -207 ERR_JACK_VALUE_OUT_OF_RANGE; -301 ERR_ASSIGNMENT_ALREADY_EXISTS; -302 ERR_ASSIGNMENT_INVALID_OP; -303 ERR_ASSIGNMENT_LIST_FULL; -304 ERR_ASSIGNMENT_FAILED; -305 ERR_ASSIGNMENT_UNUSED; -401 ERR_CONTROL_CHAIN_UNAVAILABLE; -402 ERR_ABLETON_LINK_UNAVAILABLE; -403 ERR_HMI_UNAVAILABLE; -404 ERR_EXTERNAL_UI_UNAVAILABLE; -901 ERR_MEMORY_ALLOCATION; -902 ERR_INVALID_OPERATION.\u003C\u002Fp>\n\u003Cp>The codes omx-clap-host answers too (omx-clap-core's \u003Ccode>reply.host.*\u003C\u002Fcode>):\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>resp\u003C\u002Fth>\n\u003Cth>code\u003C\u002Fth>\n\u003Cth>meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>-1\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>reply.host.instance-invalid\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod-host's ERR_INSTANCE_INVALID: an instance number outside the host's table\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-3\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>reply.host.instance-non-exists\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod-host's ERR_INSTANCE_NON_EXISTS: an instance no add made\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-103\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>reply.host.param-symbol-invalid\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod-host's ERR_LV2_INVALID_PARAM_SYMBOL: a symbol that is not a parameter param_set takes, the plugin's own bypass included\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-508\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>reply.host.pin-absent\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a layout pin in a scheme this host does not know, refused as no pin at all\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-510\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>reply.host.pin-layout-mismatch\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the add of an instance whose layout after init is not the one pin_expect named: the plugin is not activated\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-511\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>reply.host.no-param-contract\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the host holds no checked unit and scale for this parameter: the controller falls back to the layout the scan gives\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-513\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>reply.host.no-note-input\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the instance's plugin takes no notes\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-514\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>reply.host.notes-by-jack\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the instance's worker takes no notes on its socket (mod-host): the plugin is played through its jack MIDI input\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-517\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>reply.host.note-queue-full\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the worker has no room for the line's notes before its next block: nothing of it is kept, and the line may be sent again\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-901\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>reply.host.memory-allocation\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod-host's ERR_MEMORY_ALLOCATION: the reply could not be built\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-902\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>reply.host.invalid-operation\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>mod-host's ERR_INVALID_OPERATION: a word outside the verb's grammar, or a verb the host refuses on purpose\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The codes the daemon adds:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>resp\u003C\u002Fth>\n\u003Cth>name\u003C\u002Fth>\n\u003Cth>meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>-501\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>PLACEMENT_INVALID\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>placement invalid: not a placement, or not valid here, as a pool:&lt;name&gt; for a plugin of a format whose pin holds only in a world of the plugin's own, while require_pins is on\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-502\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>NO_BACKEND\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>no worker program for the scheme\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-503\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>WORKER_SPAWN\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the worker is not up: the spawn failed, or it is in backoff; ask again after instance_restored\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-504\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>REPLAY\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the name of a refused replay, never a reply: a replayed add that its pin or the worker refuses is announced by the instance_replay_refused event with the refusal's own code, and written to stderr with this one and the step that refused it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-505\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>GAVE_UP\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the storm bound is spent for that placement\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-506\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>NO_SUCH_WORKER\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>no such worker\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-507\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>VERB_DROPPED\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the worker died on this very command and the daemon dropped it: it is not replayed, and the instance_verb_dropped event names it; or it died on, or did not answer in rpc_timeout_ms, the pin_expect of an add, which is then never forwarded\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-508\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>PIN_ABSENT\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>pin_mode strict and the plugin has no pin, or its layout pin is in a scheme this version does not know: add is refused and no worker sees it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-509\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>PIN_BINARY_MISMATCH\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a pinned file is missing or its SHA-256 differs, or the plugin's manifest names a file the pin does not hold: add is refused and no worker sees it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-510\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>PIN_LAYOUT_MISMATCH\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the worker found the parameter layout after init differs from the layout pin: the instance is destroyed before activate\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-511\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>NO_PARAM_CONTRACT\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the host holds no checked unit and scale for this parameter: fall back to qualification\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-512\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>LV2_ADAPTER_REFUSED\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the lv2-clap worker's LV2 adapter cannot run this plugin (MIDI it does not feed, a required feature it lacks, a layout it does not take): the worker answered the add -102, the lv2_adapter_refused event carries the hosting.* code of that reply, and under lv2_worker auto the plugin is run by the lv2 row instead and this code is never answered; a plugin no bundle of the worker's world holds is no refusal: the worker's -101 is answered\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-513\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>NO_NOTE_INPUT\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the instance's plugin takes no notes (an effect): its worker answers note_on, note_off and all_notes_off with this code\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-514\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>NOTES_BY_JACK\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the instance's worker takes no notes on its socket (mod-host): the daemon answers the note verbs and note_input with this code, and the plugin is played through its jack MIDI input with connect\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-515\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>NO_PRESET_LIST\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the instance's worker cannot list the plugin's presets (mod-host): the daemon answers preset_list and preset_get with this code; preset_load still takes a preset the controller knows\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-516\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>PIN_REFUSED\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the plugin's pin carries verdict=refused: its files are the ones that failed qualification, so add is refused and no worker sees it, and a replayed add is refused the same way; files that differ from the pin answer (-509) first. A pins_dir pin of that verdict is never overridden: pin_set and pin_accept of its plugin answer this code\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-517\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>NOTE_QUEUE_FULL\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the instance's worker has no room for this note_on, note_off or all_notes_off before its next block: the line was not taken and nothing of it is kept; the controller may send it again\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-518\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>CHAIN_UNKNOWN_INSTANCE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a member of chain is an instance no add made: the chain is not declared\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-519\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>CHAIN_DUPLICATE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>an instance is named twice in one chain: the chain is not declared\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-520\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>CHAIN_INSTANCE_BUSY\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a member of chain is already in another chain: the chain is not declared; chain_clear of the other chain frees it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-521\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>CHAIN_MIXED_FORMAT\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the members of chain are not all run by one worker program, or are of two rows of one program and a row does not run chains in one client, so no one worker runs them: the chain is not declared\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-522\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>NO_SUCH_CHAIN\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>chain_clear or chain_get of a chain no chain declared\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-523\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>PRESET_NOT_OFFERED\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the worker: preset_load or preset_show of a stable name the plugin does not offer, or of a plugin with no preset system and no state\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-524\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>PRESET_INVALID\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>preset_save with a file path that is not absolute or with no name, or preset_load or preset_show of a file that cannot be read, is no JSON, is of a format version other than org.openmixer.preset\u002F1 and org.openmixer.preset\u002F2, or breaks the format (docs\u002Fpresets.md): the daemon answers it and no worker sees the file\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-525\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>PRESET_NEEDS_STATE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the worker: a preset file that carries state for a worker that cannot take state yet\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-526\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>PRESET_PLUGIN_CHANGED\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the worker: the preset file's plugin id, version or fingerprint is not the instance's; nothing of it is applied\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-527\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>LOAD_REFUSED\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the worker: the plugin refused the preset or the state its file carries\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-528\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>DIR_NOT_WRITABLE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>descriptor_dir or qualification_dir cannot be made or written: the daemon does not start, and says which key and which path on stderr with this code; a directory that turns read-only later makes the scan of an add write nothing, and descriptor_get and panel_get of that plugin answer this code\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-529\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>DESCRIPTOR_ABSENT\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>descriptor_get (panel_get) of a plugin that has no descriptor (panel) in descriptor_dir for its binary as it is now, and none being written: no add since it changed, or a binary that cannot be found\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-530\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>DESCRIPTOR_PENDING\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>descriptor_get (panel_get) of a plugin whose scan, started by its add, has not written its descriptor (panel) yet: ask again\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-531\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>DESCRIPTOR_SCAN_FAILED\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>descriptor_get (panel_get) of a plugin whose last scan wrote no descriptor (panel): the scanner refused the plugin, made no dump or no panel, or is not installed; the add it ran for stands, and stderr and the scan's log say why. The next add scans again\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-532\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>NO_SUCH_PLAN\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>plan_get or plan_clear of a chain no plan planned\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-533\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>NO_RECORD\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a member of estimate that no qualification record in qualification_dir names: never a reply, the code of the member in the reply's list\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-534\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>NO_CELL\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a member of estimate whose qualification records hold no point of the grid at that rate and quantum with a cost and a latency: never a reply, the code of the member in the reply's list\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-535\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>UNKNOWN_PLUGIN\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>a member of estimate whose uri names no plugin installed here (its format cannot tell the plugin's binary, or the binary is not there): never a reply, the code of the member in the reply's list\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Col start=\"5\">\n\u003Cli>JSON documents\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>schema\u003C\u002Fth>\n\u003Cth>installed as\u003C\u002Fth>\n\u003Cth>$id\u003C\u002Fth>\n\u003Cth>title\u003C\u002Fth>\n\u003Cth>format\u003C\u002Fth>\n\u003Cth>description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>protocol\u002Fplugin-hostd.schema.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Fusr\u002Fshare\u002Fplugin-hostd-protocol\u002Fplugin-hostd.schema.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fplugin-hostd-protocol\u002Fprotocol\u002Fplugin-hostd.schema.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The protocol surface plugin-hostd owns\u003C\u002Ftd>\n\u003Ctd>-\u003C\u002Ftd>\n\u003Ctd>Generated from include\u002Fplugin-hostd\u002Fprotocol.h, which is the declaration; this file says the shape of the JSON.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Counts: 48 mod-host commands, 34 same, 8 differs, 6 refused; 32 verbs mod-host does not have.\u003C\u002Fp>\n\u003Ch2 id=\"appendix-mod-host-s-command-reference\">Appendix: mod-host's command reference\u003C\u002Fh2>\n\u003Cp>The &quot;Commands (or Protocol)&quot; section of mod-host's README (FreeMixer\u002Fmod-host, branch freemixer, 013ac7d), kept as it\nis. Copyright 2013-2026 Filipe Coelho, MOD Audio UG and the mod-host contributors, GPL-3.0-or-later.\u003C\u002Fp>\n\u003Cp>Where it says &quot;mod-host&quot;, read &quot;the host&quot;: any host built on this library answers these commands. The library parses\nand dispatches them; what a command does to a plugin is the host's backend (\u003Ccode>host_backend_t\u003C\u002Fcode>, \u003Ccode>include\u002Fhost-backend.h\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Ch2 id=\"commands-or-protocol\">Commands (or Protocol)\u003C\u002Fh2>\n\u003Cp>The commands supported by mod-host are:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>add &lt;lv2_uri&gt; &lt;instance_number&gt; [client_name]\n    * add an LV2 plugin encapsulated as a jack client\n    e.g.: add &quot;http:\u002F\u002Flv2plug.in\u002Fplugins\u002Feg-amp&quot; 0\n    instance_number must be any value between 0 ~ 9990, inclusively\n    client_name is optional; when omitted the jack client (and so the graph node) is\n    named &quot;effect_&lt;instance_number&gt;&quot;, same as always. When given, mod-host tries to\n    open the jack client under that name instead -- so a host running many plugins\n    shows a graph with a name per plugin instead of an undifferentiated effect_0,\n    effect_1, effect_2... The name is sanitised for jack (':' is replaced with '_',\n    since jack uses ':' as the client:port separator, and it is truncated to the\n    running jack backend's client name limit) and, on a collision with an existing\n    jack client, disambiguated by appending &quot;_&lt;instance_number&gt;&quot;. If the sanitised\n    name is empty, or the name still collides after the instance number is appended,\n    mod-host falls back to the default &quot;effect_&lt;instance_number&gt;&quot; rather than fail\n    the add.\n    e.g.: add &quot;http:\u002F\u002Flv2plug.in\u002Fplugins\u002Feg-amp&quot; 0 &quot;channel1-eg-amp&quot;\n\nremove &lt;instance_number&gt;\n    * remove an LV2 plugin instance (and also the jack client)\n    e.g.: remove 0\n    when instance_number is -1 all plugins will be removed\n\npreset_load &lt;instance_number&gt; &lt;preset_uri&gt;\n    * load a preset state of an effect instance\n    e.g.: preset_load 0 &quot;http:\u002F\u002Fdrobilla.net\u002Fplugins\u002Fmda\u002Fpresets#JX10-moogcury-lite&quot;\n\npreset_save &lt;instance_number&gt; &lt;preset_name&gt; &lt;dir&gt; &lt;file_name&gt;\n    * save a preset state of an effect instance\n    e.g.: preset_save 0 &quot;My Preset&quot; &quot;\u002Fhome\u002Fuser\u002F.lv2\u002Fmy-presets.lv2&quot; &quot;mypreset.ttl&quot;\n\npreset_show &lt;preset_uri&gt;\n    * show the preset information of requested URI\n    e.g.: preset_show &quot;http:\u002F\u002Fdrobilla.net\u002Fplugins\u002Fmda\u002Fpresets#EPiano-bright&quot;\n\nconnect &lt;origin_port&gt; &lt;destination_port&gt;\n    * connect two jack ports\n    e.g.: connect &quot;system:capture_1&quot; &quot;effect_0:in&quot;\n\ndisconnect &lt;origin_port&gt; &lt;destination_port&gt;\n    * disconnect two jack ports\n    e.g.: disconnect &quot;system:capture_1&quot; &quot;effect_0:in&quot;\n\nbypass &lt;instance_number&gt; &lt;bypass_value&gt;\n    * toggle effect processing\n    e.g.: bypass 0 1\n    if bypass_value = 1 bypass effect\n    if bypass_value = 0 process effect\n\nparam_set &lt;instance_number&gt; &lt;param_symbol&gt; &lt;param_value&gt;\n    * set the value of a control port\n    e.g.: param_set 0 &quot;gain&quot; 2.5\n\nparam_get &lt;instance_number&gt; &lt;param_symbol&gt;\n    * get the value of a control port\n    e.g.: param_get 0 &quot;gain&quot;\n\nparam_monitor &lt;instance_number&gt; &lt;param_symbol&gt; &lt;cond_op&gt; &lt;value&gt;\n    * monitor a control port according to a condition\n    e.g: param_monitor 0 &quot;gain&quot; &quot;&gt;&quot; 2.5\n\npatch_set &lt;instance_number&gt; &lt;property_uri&gt; &lt;value&gt;\n    * set the value of a control port\n    e.g.: patch_set 0 &quot;gain&quot; 2.5\n\npatch_get &lt;instance_number&gt; &lt;property_uri&gt;\n    * get the value of a control port\n    e.g.: patch_get 0 &quot;gain&quot;\n\nlicensee &lt;instance_number&gt;\n    * get the licensee name for a commercial plugin\n    e.g.: licensee 0\n\nmonitor &lt;addr&gt; &lt;port&gt; &lt;status&gt;\n    * open a socket port for monitoring parameter changes\n    e.g: monitor localhost 12345 1\n    if status = 1 start monitoring\n    if status = 0 stop monitoring\n\nmonitor_output &lt;instance_number&gt; &lt;param_symbol&gt;\n    * request monitoring of an output control port (on the feedback port)\n    e.g.: monitor_output 0 &quot;meter&quot;\n\nmidi_learn &lt;instance_number&gt; &lt;param_symbol&gt; &lt;minimum&gt; &lt;maximum&gt;\n    * start MIDI learn for a control port\n    e.g.: midi_learn 0 &quot;gain&quot; 0.0 1.0\n\nmidi_map &lt;instance_number&gt; &lt;param_symbol&gt; &lt;midi_channel&gt; &lt;midi_cc&gt; &lt;minimum&gt; &lt;maximum&gt;\n    * map a MIDI controller to a control port\n    e.g.: midi_map 0 &quot;gain&quot; 0 7 0.0 1.0\n    a non-standard midi_cc value of 131 (0x83) is used for pitchbend\n\nmidi_unmap &lt;instance_number&gt; &lt;param_symbol&gt;\n    * unmap the MIDI controller from a control port\n    e.g.: midi_unmap 0 &quot;gain&quot;\n\nmonitor_midi_program &lt;midi_channel&gt; &lt;enable&gt;\n    * listen to MIDI program change messages (on the feedback port)\n    e.g.: monitor_midi_program 0 1\n\nset_midi_program_change_pedalboard_bank_channel &lt;enable&gt; &lt;midi_channel&gt;\n    * set the MIDI channel which changes pedalboard banks on MIDI program change. &lt;midi_channel&gt; is in the range of [0,15].\n    e.g.: set_midi_program_change_pedalboard_bank_channel 1 5 to enable listening for bank changes on channel 6\n\nset_midi_program_change_pedalboard_snapshot_channel &lt;enable&gt; &lt;midi_channel&gt;\n    * set the MIDI channel which changes pedalboard snapshots on MIDI program change. &lt;midi_channel&gt; is in the range of [0,15].\n    e.g.: set_midi_program_change_pedalboard_snapshot_channel 1 4 to enable listening for preset changes on channel 5\n\ncc_map &lt;instance_number&gt; &lt;param_symbol&gt; &lt;device_id&gt; &lt;actuator_id&gt; &lt;label&gt; &lt;value&gt; &lt;minimum&gt; &lt;maximum&gt; &lt;steps&gt; &lt;extraflags&gt; &lt;unit&gt; &lt;scalepoints_count&gt; &lt;scalepoints...&gt;\n    * map a Control Chain actuator to a control port\n    e.g.: cc_map 0 &quot;gain&quot; 0 1 &quot;Gain&quot; 0.0 -24.0 3.0 33 0 &quot;dB&quot; 0\n\ncc_unmap &lt;instance_number&gt; &lt;param_symbol&gt;\n    * unmap the Control Chain actuator from a control port\n    e.g.: cc_unmap 0 &quot;gain&quot;\n\ncc_value_set &lt;instance_number&gt; &lt;param_symbol&gt; &lt;value&gt;\n    * set the value of a  mapped Control Chain actuator\n    e.g.: cc_value_set 0 &quot;gain&quot; 2.5\n\ncv_map &lt;instance_number&gt; &lt;param_symbol&gt; &lt;source_port_name&gt; &lt;minimum&gt; &lt;maximum&gt; &lt;operational-mode&gt;\n    * map a CV source port to a control port, operational-mode being one of '-', '+', 'b' or '='\n    e.g.: cv_map 0 &quot;gain&quot; &quot;AMS CV Source:CV Out 1&quot; -24.0 3.0 =\n\ncv_unmap &lt;instance_number&gt; &lt;param_symbol&gt;\n    * unmap the CV source port actuator from a control port\n    e.g.: cv_unmap 0 &quot;gain&quot;\n\ncpu_load\n    * return current jack cpu load\n\nload &lt;file_name&gt;\n    * load a history command file\n    * dummy way to save\u002Fload workspace state\n    e.g.: load my_setup\n\nsave &lt;file_name&gt;\n    * saves the history of typed commands\n    * dummy way to save\u002Fload workspace state\n    e.g.: save my_setup\n\nbundle_add &lt;bundle_path&gt;\n    * add a bundle to the running lv2 world\n    e.g.: bundle_add &quot;\u002Fpath\u002Fto\u002Fbundle.lv2&quot;\n\nbundle_remove &lt;bundle_path&gt; &lt;resource&gt;\n    * remove a bundle from the running lv2 world\n    e.g.: bundle_remove &quot;\u002Fpath\u002Fto\u002Fbundle.lv2&quot; &quot;&quot;\n\nfeature_enable &lt;feature&gt; &lt;enable&gt;\n    * enable or disable a feature\n    * feature can be one of &quot;aggregated-midi&quot;, &quot;freewheeling&quot; or &quot;processing&quot;\n    * the &quot;aggregated-midi&quot; feature requires the use of jack2 and mod-midi-merger to be installed system-wide\n    e.g.: feature_enable link 1\n\nset_bpm &lt;beats_per_minute&gt;\n    * set the global beats per minute transport value\n    e.g.: set_bpm 120\n\nset_bpb &lt;beats_per_bar&gt;\n    * set the global beats per bar transport value\n    e.g.: set_bpb 4\n\ntransport &lt;rolling&gt; &lt;beats_per_bar&gt; &lt;beats_per_minute&gt;\n    * change the global transport state\n    e.g.: transport 1 4 120\n\ntransport_sync &lt;mode&gt;\n    * change the transport sync mode\n    * mode can be one of &quot;none&quot;, &quot;link&quot; or &quot;midi&quot;\n    e.g.: transport_sync &quot;midi&quot;\n\noutput_data_ready\n    * report feedback port ready for more messages\n\ntrack_info &lt;instance_number&gt; &lt;name&gt; &lt;color&gt; [bus|return|master]\n    * pass the name and color of the mixer track the instance sits on, color as #RRGGBB or - for none\n    * an LV2 plugin has no way to receive them, so mod-host answers -902\n    e.g.: track_info 0 &quot;Kick In&quot; #FF8000\n\nremote_pages &lt;instance_number&gt;\n    * get the number of remote-control pages of the plugin (8 parameters per page); 0 for an LV2 plugin\n    e.g.: remote_pages 0\n\nremote_page_get &lt;instance_number&gt; &lt;page_index&gt;\n    * get one remote-control page: resp 0 &lt;page_id&gt; &lt;section_name&gt; &lt;page_name&gt; &lt;symbol&gt; x8, - for an empty slot\n    e.g.: remote_page_get 0 0\n\nparam_info &lt;instance_number&gt; &lt;param_symbol&gt;\n    * get what a control means: resp 0 &lt;unit&gt; &lt;scale&gt; &lt;minimum&gt; &lt;maximum&gt; &lt;default&gt; &lt;step&gt; &lt;stable_symbol&gt;\n    * unit is an LV2 unit name (db, hz, ms, ...) or none, scale is linear, log or stepped, step 0 is continuous\n    e.g.: param_info 0 &quot;gain&quot;\n\nhelp\n    * show a help message\n\nquit\n    bye!\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>For each effect added one client on JACK will be created. The names of clients\nfollow the standard: effect_&lt;instance_number&gt;\u003C\u002Fp>\n\u003Cp>If a valid command is executed a response is given as following:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>resp &lt;status&gt; [value]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>If status is a negative number an error has occurred. The table below shows the number of each error.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>status\u003C\u002Fth>\n\u003Cth>error\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>-1\u003C\u002Ftd>\n\u003Ctd>ERR_INSTANCE_INVALID\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-2\u003C\u002Ftd>\n\u003Ctd>ERR_INSTANCE_ALREADY_EXISTS\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-3\u003C\u002Ftd>\n\u003Ctd>ERR_INSTANCE_NON_EXISTS\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-4\u003C\u002Ftd>\n\u003Ctd>ERR_INSTANCE_UNLICENSED\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-101\u003C\u002Ftd>\n\u003Ctd>ERR_LV2_INVALID_URI\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-102\u003C\u002Ftd>\n\u003Ctd>ERR_LV2_INSTANTIATION\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-103\u003C\u002Ftd>\n\u003Ctd>ERR_LV2_INVALID_PARAM_SYMBOL\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-104\u003C\u002Ftd>\n\u003Ctd>ERR_LV2_INVALID_PRESET_URI\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-105\u003C\u002Ftd>\n\u003Ctd>ERR_LV2_CANT_LOAD_STATE\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-201\u003C\u002Ftd>\n\u003Ctd>ERR_JACK_CLIENT_CREATION\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-202\u003C\u002Ftd>\n\u003Ctd>ERR_JACK_CLIENT_ACTIVATION\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-203\u003C\u002Ftd>\n\u003Ctd>ERR_JACK_CLIENT_DEACTIVATION\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-204\u003C\u002Ftd>\n\u003Ctd>ERR_JACK_PORT_REGISTER\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-205\u003C\u002Ftd>\n\u003Ctd>ERR_JACK_PORT_CONNECTION\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-206\u003C\u002Ftd>\n\u003Ctd>ERR_JACK_PORT_DISCONNECTION\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-207\u003C\u002Ftd>\n\u003Ctd>ERR_JACK_VALUE_OUT_OF_RANGE\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-301\u003C\u002Ftd>\n\u003Ctd>ERR_ASSIGNMENT_ALREADY_EXISTS\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-302\u003C\u002Ftd>\n\u003Ctd>ERR_ASSIGNMENT_INVALID_OP\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-303\u003C\u002Ftd>\n\u003Ctd>ERR_ASSIGNMENT_LIST_FULL\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-304\u003C\u002Ftd>\n\u003Ctd>ERR_ASSIGNMENT_FAILED\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-304\u003C\u002Ftd>\n\u003Ctd>ERR_ASSIGNMENT_UNUSED\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-401\u003C\u002Ftd>\n\u003Ctd>ERR_CONTROL_CHAIN_UNAVAILABLE\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-402\u003C\u002Ftd>\n\u003Ctd>ERR_LINK_UNAVAILABLE\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-403\u003C\u002Ftd>\n\u003Ctd>ERR_HMI_UNAVAILABLE\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-404\u003C\u002Ftd>\n\u003Ctd>ERR_EXTERNAL_UI_UNAVAILABLE\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-901\u003C\u002Ftd>\n\u003Ctd>ERR_MEMORY_ALLOCATION\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>-902\u003C\u002Ftd>\n\u003Ctd>ERR_INVALID_OPERATION\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>A status zero or positive means that the command was executed successfully.\nIn case of the add command, the status returned is the instance number.\nThe value field exists for the param_get, remote_page_get and param_info commands.\u003C\u002Fp>\n\u003Cp>When the plugin changes its remote-control pages, the feedback port gets:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>remote_pages_changed &lt;instance_number&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n",[23],{"slug":24,"title":25},"","plugin-hostd-protocol",1793954996190]