@openmixer/plugin-qualify 0.20.1 → 0.20.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/plugin-qualify-sync.mjs +1 -0
- package/catalogs/ca.json +251 -0
- package/catalogs/de.json +49 -0
- package/catalogs/es.json +49 -0
- package/catalogs/fr.json +49 -0
- package/catalogs/it.json +49 -0
- package/catalogs/pt.json +49 -0
- package/dist/clap-loader.js +2 -1
- package/dist/clap-loader.js.map +1 -1
- package/dist/clap-qualify.d.ts +11 -0
- package/dist/clap-qualify.js +16 -0
- package/dist/clap-qualify.js.map +1 -1
- package/dist/compare.d.ts +12 -11
- package/dist/compare.js +71 -38
- package/dist/compare.js.map +1 -1
- package/dist/host-admission.d.ts +25 -0
- package/dist/host-admission.js +41 -5
- package/dist/host-admission.js.map +1 -1
- package/dist/hostd-pin-files.d.ts +6 -2
- package/dist/hostd-pin-files.js +10 -6
- package/dist/hostd-pin-files.js.map +1 -1
- package/dist/hostd-search-path.d.ts +38 -0
- package/dist/hostd-search-path.js +58 -0
- package/dist/hostd-search-path.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/jack-registry.js +1 -1
- package/dist/lv2-loader.d.ts +33 -1
- package/dist/lv2-loader.js +82 -19
- package/dist/lv2-loader.js.map +1 -1
- package/dist/measurement/vocabulary.js +3 -3
- package/dist/measurement/vocabulary.js.map +1 -1
- package/dist/measurement-grid.d.ts +1 -1
- package/dist/measurement-grid.js +5 -3
- package/dist/measurement-grid.js.map +1 -1
- package/dist/pins-file.d.ts +3 -2
- package/dist/pins-file.js +3 -2
- package/dist/pins-file.js.map +1 -1
- package/dist/plugin-db-cli.d.ts +28 -0
- package/dist/plugin-db-cli.js +43 -0
- package/dist/plugin-db-cli.js.map +1 -0
- package/dist/plugin-db-pin.d.ts +8 -0
- package/dist/plugin-db-pin.js +29 -0
- package/dist/plugin-db-pin.js.map +1 -0
- package/dist/probe-judge.js +5 -0
- package/dist/probe-judge.js.map +1 -1
- package/dist/probe-output.d.ts +10 -0
- package/dist/probe-output.js +16 -0
- package/dist/probe-output.js.map +1 -1
- package/dist/probe-runner.js +24 -5
- package/dist/probe-runner.js.map +1 -1
- package/dist/qualification-record.d.ts +5 -0
- package/dist/qualification-record.js +13 -1
- package/dist/qualification-record.js.map +1 -1
- package/dist/qualify-adapter-pass.d.ts +1 -2
- package/dist/qualify-adapter-pass.js +6 -6
- package/dist/qualify-adapter-pass.js.map +1 -1
- package/dist/qualify-declarations.d.ts +23 -6
- package/dist/qualify-declarations.js +25 -6
- package/dist/qualify-declarations.js.map +1 -1
- package/dist/qualify-isolated.d.ts +9 -0
- package/dist/qualify-isolated.js +16 -5
- package/dist/qualify-isolated.js.map +1 -1
- package/dist/qualify-pool.js +4 -3
- package/dist/qualify-pool.js.map +1 -1
- package/dist/qualify-rejudge.js +3 -3
- package/dist/qualify-rejudge.js.map +1 -1
- package/dist/qualify-sync.d.ts +12 -5
- package/dist/qualify-sync.js +51 -30
- package/dist/qualify-sync.js.map +1 -1
- package/dist/record-figures.d.ts +52 -0
- package/dist/record-figures.js +58 -0
- package/dist/record-figures.js.map +1 -0
- package/dist/refused-stderr-kept.d.ts +12 -0
- package/dist/refused-stderr-kept.js +67 -0
- package/dist/refused-stderr-kept.js.map +1 -0
- package/dist/run-home.d.ts +4 -0
- package/dist/run-home.js +26 -0
- package/dist/run-home.js.map +1 -0
- package/dist/text-catalog.d.ts +41 -0
- package/dist/text-catalog.js +97 -0
- package/dist/text-catalog.js.map +1 -0
- package/dist/text-codes.d.ts +29 -0
- package/dist/text-codes.generated.d.ts +88 -0
- package/dist/text-codes.generated.js +96 -0
- package/dist/text-codes.generated.js.map +1 -0
- package/dist/text-codes.js +19 -0
- package/dist/text-codes.js.map +1 -0
- package/package.json +8 -6
- package/schema/codes.json +386 -0
- package/src/clap-loader.ts +2 -1
- package/src/clap-qualify.ts +25 -0
- package/src/compare.ts +85 -45
- package/src/host-admission.ts +52 -5
- package/src/hostd-pin-files.ts +13 -8
- package/src/hostd-search-path.ts +85 -0
- package/src/index.ts +4 -0
- package/src/jack-registry.ts +1 -1
- package/src/lv2-loader.ts +89 -17
- package/src/measurement/vocabulary.ts +3 -3
- package/src/measurement-grid.ts +5 -3
- package/src/pins-file.ts +3 -2
- package/src/plugin-db-cli.ts +78 -0
- package/src/plugin-db-pin.ts +33 -0
- package/src/probe-judge.ts +5 -0
- package/src/probe-output.ts +23 -0
- package/src/probe-runner.ts +25 -4
- package/src/qualification-record.ts +13 -1
- package/src/qualify-adapter-pass.ts +6 -5
- package/src/qualify-declarations.ts +27 -6
- package/src/qualify-isolated.ts +18 -5
- package/src/qualify-pool.ts +4 -3
- package/src/qualify-rejudge.ts +3 -3
- package/src/qualify-sync.ts +55 -33
- package/src/record-figures.ts +114 -0
- package/src/refused-stderr-kept.ts +84 -0
- package/src/run-home.ts +28 -0
- package/src/text-catalog.ts +116 -0
- package/src/text-codes.generated.ts +97 -0
- package/src/text-codes.ts +35 -0
- package/tools/_declarations.py +2 -1
- package/tools/catalogs-gate.sh +22 -0
- package/tools/compare-host.mjs +1 -1
- package/tools/compare-run.mjs +10 -6
- package/tools/descriptors.py +40 -3
- package/tools/gen-python-declarations.mjs +1 -0
- package/tools/gen-text-codes.d.mts +8 -0
- package/tools/gen-text-codes.mjs +77 -0
- package/tools/isolated-step.mjs +24 -3
- package/tools/mod-host-admit.mjs +57 -1
- package/tools/scan.py +29 -5
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "codes",
|
|
3
|
+
"doc": "plugin-qualify's own codes, each with its source sentence in English and the args it names (omx-contract's codes shape; translations are not here): the code its scan refuses a plugin by, and the verdict and reason sentences of its comparison and of its pin. Each language's sentences are in catalogs/<lang>.json, keyed by the code. tools/descriptors.py and src/text-catalog.ts render the English sentence from this file; no module repeats it. A code is never reworded.",
|
|
4
|
+
"codes": {
|
|
5
|
+
"descriptorDuplicateSymbol": {
|
|
6
|
+
"code": "qualify.descriptor.duplicate-symbol",
|
|
7
|
+
"text": {
|
|
8
|
+
"en": "Two ports of this plugin share the symbol {symbol}, so neither can be addressed by it; the plugin is not described."
|
|
9
|
+
},
|
|
10
|
+
"args": [
|
|
11
|
+
"symbol"
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
"compareHostNotInstalled": {
|
|
15
|
+
"code": "qualify.compare.host-not-installed",
|
|
16
|
+
"doc": "a comparison host is not installed, and the observation named no reason of its own",
|
|
17
|
+
"text": {
|
|
18
|
+
"en": "{program} is not installed"
|
|
19
|
+
},
|
|
20
|
+
"args": [
|
|
21
|
+
"program"
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
"compareHostDidNotStart": {
|
|
25
|
+
"code": "qualify.compare.host-did-not-start",
|
|
26
|
+
"doc": "a comparison host failed to start, and the observation named no reason of its own",
|
|
27
|
+
"text": {
|
|
28
|
+
"en": "{program} did not start"
|
|
29
|
+
},
|
|
30
|
+
"args": [
|
|
31
|
+
"program"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"compareHostNotAsked": {
|
|
35
|
+
"code": "qualify.compare.host-not-asked",
|
|
36
|
+
"doc": "a reference host a publishable comparison needs was left out of --hosts",
|
|
37
|
+
"text": {
|
|
38
|
+
"en": "not asked for with --hosts"
|
|
39
|
+
},
|
|
40
|
+
"args": []
|
|
41
|
+
},
|
|
42
|
+
"compareHostDidNotRun": {
|
|
43
|
+
"code": "qualify.compare.host-did-not-run",
|
|
44
|
+
"doc": "a directory of comparison records holds no row, of any status, for this host",
|
|
45
|
+
"text": {
|
|
46
|
+
"en": "{program} did not run"
|
|
47
|
+
},
|
|
48
|
+
"args": [
|
|
49
|
+
"program"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"compareFormatNotTaken": {
|
|
53
|
+
"code": "qualify.compare.format-not-taken",
|
|
54
|
+
"doc": "a host was asked to run a plugin whose format it never takes",
|
|
55
|
+
"text": {
|
|
56
|
+
"en": "{program} takes no {format} plugin"
|
|
57
|
+
},
|
|
58
|
+
"args": [
|
|
59
|
+
"program",
|
|
60
|
+
"format"
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
"compareRtNotReported": {
|
|
64
|
+
"code": "qualify.compare.rt-not-reported",
|
|
65
|
+
"doc": "no process of the host reported to rt_watch.so at all",
|
|
66
|
+
"text": {
|
|
67
|
+
"en": "no process of the host reported (rt_watch.so was not loaded, or the host was gone)"
|
|
68
|
+
},
|
|
69
|
+
"args": []
|
|
70
|
+
},
|
|
71
|
+
"compareRtNoCallback": {
|
|
72
|
+
"code": "qualify.compare.rt-no-callback",
|
|
73
|
+
"doc": "a process of the host reported, but none set a JACK process callback rt_watch.so could wrap",
|
|
74
|
+
"text": {
|
|
75
|
+
"en": "no process of the host set a JACK process callback that rt_watch.so could wrap"
|
|
76
|
+
},
|
|
77
|
+
"args": []
|
|
78
|
+
},
|
|
79
|
+
"compareRtNoWarmUp": {
|
|
80
|
+
"code": "qualify.compare.rt-no-warm-up",
|
|
81
|
+
"doc": "the process callback reported, but never ran a cycle past its warm-up window",
|
|
82
|
+
"text": {
|
|
83
|
+
"en": "the process callback never ran past its warm-up"
|
|
84
|
+
},
|
|
85
|
+
"args": []
|
|
86
|
+
},
|
|
87
|
+
"compareRtTrylocksOnly": {
|
|
88
|
+
"code": "qualify.compare.rt-trylocks-only",
|
|
89
|
+
"doc": "the audio thread took no allocation, lock or syscall, but tried a lock that never waits",
|
|
90
|
+
"text": {
|
|
91
|
+
"en": "{trylocks} try-locks on the audio thread over {cycles} cycles; a try-lock never waits"
|
|
92
|
+
},
|
|
93
|
+
"args": [
|
|
94
|
+
"trylocks",
|
|
95
|
+
"cycles"
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
"compareRtUnsafe": {
|
|
99
|
+
"code": "qualify.compare.rt-unsafe",
|
|
100
|
+
"doc": "the audio thread took an allocation, a lock or a syscall over the armed cycles",
|
|
101
|
+
"text": {
|
|
102
|
+
"en": "on the audio thread over {cycles} cycles: {allocations} allocations, {locks} locks, {syscalls} system calls"
|
|
103
|
+
},
|
|
104
|
+
"args": [
|
|
105
|
+
"cycles",
|
|
106
|
+
"allocations",
|
|
107
|
+
"locks",
|
|
108
|
+
"syscalls"
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
"compareLoadHostEnded": {
|
|
112
|
+
"code": "qualify.compare.load-host-ended",
|
|
113
|
+
"doc": "the host ended while a plugin was loading",
|
|
114
|
+
"text": {
|
|
115
|
+
"en": "the host ended ({died})"
|
|
116
|
+
},
|
|
117
|
+
"args": [
|
|
118
|
+
"died"
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
"compareLoadResp": {
|
|
122
|
+
"code": "qualify.compare.load-resp",
|
|
123
|
+
"doc": "the host answered a load with a reply code, not ok",
|
|
124
|
+
"text": {
|
|
125
|
+
"en": "resp {resp}"
|
|
126
|
+
},
|
|
127
|
+
"args": [
|
|
128
|
+
"resp"
|
|
129
|
+
]
|
|
130
|
+
},
|
|
131
|
+
"compareLoadTimeout": {
|
|
132
|
+
"code": "qualify.compare.load-timeout",
|
|
133
|
+
"doc": "the host gave no answer to a load within the timeout",
|
|
134
|
+
"text": {
|
|
135
|
+
"en": "no answer in time"
|
|
136
|
+
},
|
|
137
|
+
"args": []
|
|
138
|
+
},
|
|
139
|
+
"compareNotLoaded": {
|
|
140
|
+
"code": "qualify.compare.not-loaded",
|
|
141
|
+
"doc": "a check that needs the plugin loaded, when it did not",
|
|
142
|
+
"text": {
|
|
143
|
+
"en": "it did not load"
|
|
144
|
+
},
|
|
145
|
+
"args": []
|
|
146
|
+
},
|
|
147
|
+
"compareNoPort": {
|
|
148
|
+
"code": "qualify.compare.no-port",
|
|
149
|
+
"doc": "the plugin loaded, but no port of it appeared on the JACK graph",
|
|
150
|
+
"text": {
|
|
151
|
+
"en": "no port of the plugin appeared on the graph"
|
|
152
|
+
},
|
|
153
|
+
"args": []
|
|
154
|
+
},
|
|
155
|
+
"compareNotRunning": {
|
|
156
|
+
"code": "qualify.compare.not-running",
|
|
157
|
+
"doc": "a check that needs the plugin running (loaded with a port on the graph), when it was not",
|
|
158
|
+
"text": {
|
|
159
|
+
"en": "it is not running"
|
|
160
|
+
},
|
|
161
|
+
"args": []
|
|
162
|
+
},
|
|
163
|
+
"compareNoAudioOutput": {
|
|
164
|
+
"code": "qualify.compare.no-audio-output",
|
|
165
|
+
"doc": "the output check on a plugin with no audio output port",
|
|
166
|
+
"text": {
|
|
167
|
+
"en": "the plugin has no audio output"
|
|
168
|
+
},
|
|
169
|
+
"args": []
|
|
170
|
+
},
|
|
171
|
+
"compareOutputNotFinite": {
|
|
172
|
+
"code": "qualify.compare.output-not-finite",
|
|
173
|
+
"doc": "the output held a NaN or infinite sample",
|
|
174
|
+
"text": {
|
|
175
|
+
"en": "the output is not finite ({count} NaN or infinite samples)"
|
|
176
|
+
},
|
|
177
|
+
"args": [
|
|
178
|
+
"count"
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
"compareNoStimulusSilent": {
|
|
182
|
+
"code": "qualify.compare.no-stimulus-silent",
|
|
183
|
+
"doc": "a plugin that takes no audio or MIDI input, so no stimulus is possible, and its output was silent regardless",
|
|
184
|
+
"text": {
|
|
185
|
+
"en": "no stimulus this plugin takes (no audio or MIDI input), and its output was silent"
|
|
186
|
+
},
|
|
187
|
+
"args": []
|
|
188
|
+
},
|
|
189
|
+
"compareSilentUnderStimulus": {
|
|
190
|
+
"code": "qualify.compare.silent-under-stimulus",
|
|
191
|
+
"doc": "a plugin that takes a stimulus but gave no audible output under it",
|
|
192
|
+
"text": {
|
|
193
|
+
"en": "silent under {stimulus}"
|
|
194
|
+
},
|
|
195
|
+
"args": [
|
|
196
|
+
"stimulus"
|
|
197
|
+
]
|
|
198
|
+
},
|
|
199
|
+
"compareCyclesNotRun": {
|
|
200
|
+
"code": "qualify.compare.cycles-not-run",
|
|
201
|
+
"doc": "the load and unload cycles did not run, so the check is not-run rather than pass or fail",
|
|
202
|
+
"text": {
|
|
203
|
+
"en": "the cycles did not run"
|
|
204
|
+
},
|
|
205
|
+
"args": []
|
|
206
|
+
},
|
|
207
|
+
"compareCycleHostEnded": {
|
|
208
|
+
"code": "qualify.compare.cycle-host-ended",
|
|
209
|
+
"doc": "the host ended during one of the load and unload cycles",
|
|
210
|
+
"text": {
|
|
211
|
+
"en": "the host ended at cycle {cycle} ({died})"
|
|
212
|
+
},
|
|
213
|
+
"args": [
|
|
214
|
+
"cycle",
|
|
215
|
+
"died"
|
|
216
|
+
]
|
|
217
|
+
},
|
|
218
|
+
"compareCycleFailed": {
|
|
219
|
+
"code": "qualify.compare.cycle-failed",
|
|
220
|
+
"doc": "one load and unload cycle failed, with no named step",
|
|
221
|
+
"text": {
|
|
222
|
+
"en": "cycle {cycle} failed"
|
|
223
|
+
},
|
|
224
|
+
"args": [
|
|
225
|
+
"cycle"
|
|
226
|
+
]
|
|
227
|
+
},
|
|
228
|
+
"compareCycleFailedAt": {
|
|
229
|
+
"code": "qualify.compare.cycle-failed-at",
|
|
230
|
+
"doc": "one load and unload cycle failed at a named step",
|
|
231
|
+
"text": {
|
|
232
|
+
"en": "cycle {cycle} failed at {step}"
|
|
233
|
+
},
|
|
234
|
+
"args": [
|
|
235
|
+
"cycle",
|
|
236
|
+
"step"
|
|
237
|
+
]
|
|
238
|
+
},
|
|
239
|
+
"compareSoakHostEnded": {
|
|
240
|
+
"code": "qualify.compare.soak-host-ended",
|
|
241
|
+
"doc": "the host ended during the soak, with a named reason",
|
|
242
|
+
"text": {
|
|
243
|
+
"en": "the host ended during the soak ({died})"
|
|
244
|
+
},
|
|
245
|
+
"args": [
|
|
246
|
+
"died"
|
|
247
|
+
]
|
|
248
|
+
},
|
|
249
|
+
"compareSoakEnded": {
|
|
250
|
+
"code": "qualify.compare.soak-ended",
|
|
251
|
+
"doc": "the host ended during the soak, with no named reason",
|
|
252
|
+
"text": {
|
|
253
|
+
"en": "the host ended during the soak"
|
|
254
|
+
},
|
|
255
|
+
"args": []
|
|
256
|
+
},
|
|
257
|
+
"compareLatencyPortObservable": {
|
|
258
|
+
"code": "qualify.compare.latency-port-observable",
|
|
259
|
+
"doc": "a host (omx-clap-host, jalv) that sets a JACK latency callback itself",
|
|
260
|
+
"text": {
|
|
261
|
+
"en": "the host sets a JACK latency callback: the plugin's latency is on its output port's capture range"
|
|
262
|
+
},
|
|
263
|
+
"args": []
|
|
264
|
+
},
|
|
265
|
+
"compareLatencyHostdPortObservable": {
|
|
266
|
+
"code": "qualify.compare.latency-hostd-port-observable",
|
|
267
|
+
"doc": "plugin-hostd: its worker (omx-clap-host) sets the JACK latency callback on its behalf",
|
|
268
|
+
"text": {
|
|
269
|
+
"en": "its worker (omx-clap-host) sets a JACK latency callback"
|
|
270
|
+
},
|
|
271
|
+
"args": []
|
|
272
|
+
},
|
|
273
|
+
"compareLatencyNotObservableModHost": {
|
|
274
|
+
"code": "qualify.compare.latency-not-observable-mod-host",
|
|
275
|
+
"doc": "mod-host sets no JACK latency callback, so this host's reported latency is never observable",
|
|
276
|
+
"text": {
|
|
277
|
+
"en": "mod-host sets no JACK latency callback, so a plugin's latency is not on its ports"
|
|
278
|
+
},
|
|
279
|
+
"args": []
|
|
280
|
+
},
|
|
281
|
+
"compareLatencyUnreadable": {
|
|
282
|
+
"code": "qualify.compare.latency-unreadable",
|
|
283
|
+
"doc": "a host whose latency is observable in principle, but the output port's latency could not be read this run",
|
|
284
|
+
"text": {
|
|
285
|
+
"en": "the output port's latency could not be read"
|
|
286
|
+
},
|
|
287
|
+
"args": []
|
|
288
|
+
},
|
|
289
|
+
"compareSkippedReason": {
|
|
290
|
+
"code": "qualify.compare.skipped-reason",
|
|
291
|
+
"doc": "the summary table's row for a host it skipped, with that host's own reason already rendered",
|
|
292
|
+
"text": {
|
|
293
|
+
"en": "skipped: {reason}"
|
|
294
|
+
},
|
|
295
|
+
"args": [
|
|
296
|
+
"reason"
|
|
297
|
+
]
|
|
298
|
+
},
|
|
299
|
+
"compareDoesBetterOn": {
|
|
300
|
+
"code": "qualify.compare.does-better-on",
|
|
301
|
+
"doc": "the summary table's line naming how many plugins a host does better on, with the rendered beat list",
|
|
302
|
+
"text": {
|
|
303
|
+
"en": "{host} does better on {count}: {detail}"
|
|
304
|
+
},
|
|
305
|
+
"args": [
|
|
306
|
+
"host",
|
|
307
|
+
"count",
|
|
308
|
+
"detail"
|
|
309
|
+
]
|
|
310
|
+
},
|
|
311
|
+
"compareBeatDescription": {
|
|
312
|
+
"code": "qualify.compare.beat-description",
|
|
313
|
+
"doc": "one plugin of a does-better-on list, with the hosts it beat",
|
|
314
|
+
"text": {
|
|
315
|
+
"en": "{id} ({on} over {over})"
|
|
316
|
+
},
|
|
317
|
+
"args": [
|
|
318
|
+
"id",
|
|
319
|
+
"on",
|
|
320
|
+
"over"
|
|
321
|
+
]
|
|
322
|
+
},
|
|
323
|
+
"compareNotPublishableWithMissing": {
|
|
324
|
+
"code": "qualify.compare.not-publishable-with-missing",
|
|
325
|
+
"doc": "the summary table's closing line when --publish was asked for but a reference host is missing",
|
|
326
|
+
"text": {
|
|
327
|
+
"en": "not publishable: {missing}"
|
|
328
|
+
},
|
|
329
|
+
"args": [
|
|
330
|
+
"missing"
|
|
331
|
+
]
|
|
332
|
+
},
|
|
333
|
+
"compareNotPublishableNoFlag": {
|
|
334
|
+
"code": "qualify.compare.not-publishable-no-flag",
|
|
335
|
+
"doc": "the summary table's closing line when --publish was never asked for",
|
|
336
|
+
"text": {
|
|
337
|
+
"en": "not publishable (no --publish)"
|
|
338
|
+
},
|
|
339
|
+
"args": []
|
|
340
|
+
},
|
|
341
|
+
"pinHostdNotInstalled": {
|
|
342
|
+
"code": "qualify.pin.hostd-not-installed",
|
|
343
|
+
"doc": "plugin-hostd --pin-files could not run because plugin-hostd is not installed",
|
|
344
|
+
"text": {
|
|
345
|
+
"en": "plugin-hostd is not installed: the files of a pin are plugin-hostd's to name"
|
|
346
|
+
},
|
|
347
|
+
"args": []
|
|
348
|
+
},
|
|
349
|
+
"pinHostdNoPinFiles": {
|
|
350
|
+
"code": "qualify.pin.hostd-no-pin-files",
|
|
351
|
+
"doc": "the installed plugin-hostd predates --pin-files (0.15.0)",
|
|
352
|
+
"text": {
|
|
353
|
+
"en": "this plugin-hostd has no --pin-files (plugin-hostd 0.15.0 or later names the files of a pin)"
|
|
354
|
+
},
|
|
355
|
+
"args": []
|
|
356
|
+
},
|
|
357
|
+
"pinHostdExited": {
|
|
358
|
+
"code": "qualify.pin.hostd-exited",
|
|
359
|
+
"doc": "plugin-hostd --pin-files exited with no stderr line to say why",
|
|
360
|
+
"text": {
|
|
361
|
+
"en": "plugin-hostd --pin-files exited {status}"
|
|
362
|
+
},
|
|
363
|
+
"args": [
|
|
364
|
+
"status"
|
|
365
|
+
]
|
|
366
|
+
},
|
|
367
|
+
"pinHostdNoRootOrFile": {
|
|
368
|
+
"code": "qualify.pin.hostd-no-root-or-file",
|
|
369
|
+
"doc": "plugin-hostd --pin-files exited ok, but its output named no root or no file",
|
|
370
|
+
"text": {
|
|
371
|
+
"en": "plugin-hostd --pin-files printed no root or no file"
|
|
372
|
+
},
|
|
373
|
+
"args": []
|
|
374
|
+
},
|
|
375
|
+
"pinFileUnreadable": {
|
|
376
|
+
"code": "qualify.pin.file-unreadable",
|
|
377
|
+
"doc": "a file plugin-hostd named for the pin could not be read (and so hashed) from the bundle",
|
|
378
|
+
"text": {
|
|
379
|
+
"en": "a file plugin-hostd names cannot be read: {error}"
|
|
380
|
+
},
|
|
381
|
+
"args": [
|
|
382
|
+
"error"
|
|
383
|
+
]
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
package/src/clap-loader.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { type Dirent, existsSync, readdirSync, statSync } from "node:fs";
|
|
|
17
17
|
import { homedir } from "node:os";
|
|
18
18
|
import { basename, dirname, join, resolve } from "node:path";
|
|
19
19
|
|
|
20
|
+
import { withRunHome } from "./run-home.js";
|
|
20
21
|
import type { PluginLoader, PluginTarget } from "./loader.js";
|
|
21
22
|
import { lv2BundlesOnPath, lv2Loader } from "./lv2-loader.js";
|
|
22
23
|
import {
|
|
@@ -345,7 +346,7 @@ export interface ClapScanRunResult {
|
|
|
345
346
|
export type ClapScanRun = (tool: string, args: readonly string[], timeoutMs: number) => ClapScanRunResult;
|
|
346
347
|
|
|
347
348
|
const spawnScan: ClapScanRun = (tool, args, timeoutMs) => {
|
|
348
|
-
const r = spawnSync(tool, [...args], { encoding: "utf8", timeout: timeoutMs, maxBuffer: MAX_SCAN_BYTES });
|
|
349
|
+
const r = spawnSync(tool, [...args], { encoding: "utf8", timeout: timeoutMs, maxBuffer: MAX_SCAN_BYTES, env: withRunHome(process.env) });
|
|
349
350
|
return { status: r.status, stdout: r.stdout ?? "", ...(r.error === undefined ? {} : { error: r.error }) };
|
|
350
351
|
};
|
|
351
352
|
|
package/src/clap-qualify.ts
CHANGED
|
@@ -79,6 +79,18 @@ export interface ClapCostFigure {
|
|
|
79
79
|
readonly voices?: VoicesHeld;
|
|
80
80
|
/** What these blocks were timed under. */
|
|
81
81
|
readonly scheduling?: TimingScheduling;
|
|
82
|
+
/**
|
|
83
|
+
* For an instrument: its cost at each count of notes held with every parameter at its default (`--curve`), the
|
|
84
|
+
* rate's voiceCurve that plugin-hostd's runner carries into probe output 1.4; an entry it could not time has a reason.
|
|
85
|
+
*/
|
|
86
|
+
readonly voiceCurve?: readonly ClapVoiceCurveEntry[];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface ClapVoiceCurveEntry {
|
|
90
|
+
readonly held: number;
|
|
91
|
+
readonly nsPerSampleMedian?: number;
|
|
92
|
+
readonly nsPerSampleP95?: number;
|
|
93
|
+
readonly unmeasuredReason?: string;
|
|
82
94
|
}
|
|
83
95
|
|
|
84
96
|
/** One rate the cost arm did not time, and why; an instrument's declared capacity is kept when it has one. */
|
|
@@ -281,9 +293,22 @@ function readCostAtRate(v: unknown, where: string, notes: boolean): ClapCostAtRa
|
|
|
281
293
|
? {}
|
|
282
294
|
: { voices: { held: voices.held, basis: voices.basis, ...(voices.capacity === undefined ? {} : { capacity: voices.capacity }) } }),
|
|
283
295
|
...(scheduling === undefined ? {} : { scheduling }),
|
|
296
|
+
...(v["voiceCurve"] === undefined ? {} : { voiceCurve: readVoiceCurve(v["voiceCurve"], `${where} voiceCurve`) }),
|
|
284
297
|
};
|
|
285
298
|
}
|
|
286
299
|
|
|
300
|
+
function readVoiceCurve(v: unknown, where: string): ClapVoiceCurveEntry[] {
|
|
301
|
+
if (!Array.isArray(v)) return bad(`${where} is not a list`);
|
|
302
|
+
return v.map((e: unknown, i: number) => {
|
|
303
|
+
const at = `${where} entry ${i}`;
|
|
304
|
+
if (!isRecord(e)) return bad(`${at} is not an object`);
|
|
305
|
+
const held = count(e, "held", at);
|
|
306
|
+
if (held === 0) return bad(`${at} holds no note`);
|
|
307
|
+
if (e["unmeasuredReason"] !== undefined) return { held, unmeasuredReason: str(e, "unmeasuredReason", at) };
|
|
308
|
+
return { held, nsPerSampleMedian: figure(e, "nsPerSampleMedian", at), nsPerSampleP95: figure(e, "nsPerSampleP95", at) };
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
|
|
287
312
|
function readCost(v: unknown): ClapCostReading {
|
|
288
313
|
if (!isRecord(v)) return bad("cost is not an object");
|
|
289
314
|
const stimulus = str(v, "stimulus", "cost");
|