NA could not list a single audio interface. The module was installed from the catalog, which ships source only because the capture binary is gitignored, and the picker shells out to that binary with --list. So it returned nothing, forever: [spl-meter] device list failed: spawn .../spl-capture ENOENT The missing-binary build existed, but only inside the listener, and the listener only starts once a device has been picked. No tool meant no device list, and no device meant no listener to build the tool. Nothing was going to break that on its own. The build now lives at module scope and both callers use it: init() asks for it on mount whether or not a device is configured, and /devices asks again each time it is called, so opening the admin page is enough to start it. It is still a plain spawn that never touches the event loop, and health() now names the situation instead of leaving an empty dropdown unexplained. Also removed two per-listener build flags left shadowing the module-scope ones, which would have made the "is a build already running" test always false and let a second build start under the first. Tested the way it actually failed: a data directory holding only the six source files, no binary. The build starts on mount and /devices answers with the real device list moments later. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
95 lines
2.6 KiB
JSON
95 lines
2.6 KiB
JSON
{
|
|
"id": "spl-meter",
|
|
"name": "SPL Meter",
|
|
"version": "0.4.2",
|
|
"proddash": ">=1.5.0",
|
|
"description": "Calibrated sound level, Leq and RTA from an audio input on this machine",
|
|
"permissions": [
|
|
{
|
|
"kind": "microphone",
|
|
"reason": "Measuring sound level from an audio input on this machine"
|
|
}
|
|
],
|
|
"client": "client.js",
|
|
"server": "server.js",
|
|
"style": "style.css",
|
|
"minSize": {
|
|
"w": 2,
|
|
"h": 1
|
|
},
|
|
"defaultSize": {
|
|
"w": 3,
|
|
"h": 2
|
|
},
|
|
"configGroups": {
|
|
"Input": {
|
|
"toggle": "enabled"
|
|
},
|
|
"Measurement": {
|
|
"columns": 2
|
|
},
|
|
"Calibration": {
|
|
"collapsed": "whenSet",
|
|
"help": "A sound level calibrator fits over the microphone capsule and emits a known level, almost always 94 dB at 1 kHz. Put it on, press Measure beside the channel, and copy the offset it reports into the box. Without this the meter still works, but it reads in dB relative to full scale and every tile says so."
|
|
}
|
|
},
|
|
"configSchema": {
|
|
"enabled": {
|
|
"type": "switch",
|
|
"label": "Sound level measurement",
|
|
"group": "Input",
|
|
"default": false
|
|
},
|
|
"device": {
|
|
"type": "select",
|
|
"label": "Audio device",
|
|
"group": "Input",
|
|
"showWhen": "enabled",
|
|
"default": "",
|
|
"optionsRoute": "/devices"
|
|
},
|
|
"channels": {
|
|
"type": "string",
|
|
"label": "Channels on that device (1-based, comma separated)",
|
|
"group": "Input",
|
|
"showWhen": "enabled",
|
|
"default": "1",
|
|
"help": "One meter per channel — \"1\" for a single measurement mic, \"1,2\" for a stereo pair."
|
|
},
|
|
"weighting": {
|
|
"type": "select",
|
|
"label": "Weighting",
|
|
"group": "Measurement",
|
|
"default": "A",
|
|
"options": [
|
|
{
|
|
"value": "A",
|
|
"label": "A — how loud it sounds"
|
|
},
|
|
{
|
|
"value": "C",
|
|
"label": "C — keeps the low end"
|
|
},
|
|
{
|
|
"value": "Z",
|
|
"label": "Z — no weighting at all"
|
|
}
|
|
]
|
|
},
|
|
"bands": {
|
|
"type": "switch",
|
|
"label": "Spectrum analysis",
|
|
"group": "Measurement",
|
|
"default": true,
|
|
"help": "1/48-octave bands for the RTA and spectrogram tiles, which each fold them to their own banding. Turn it off if you only ever show the number."
|
|
},
|
|
"calibration": {
|
|
"type": "string",
|
|
"label": "Offsets in dB, one per channel",
|
|
"group": "Calibration",
|
|
"default": "",
|
|
"help": "Leave empty and every reading is dB relative to full scale, labelled dBFS so nobody mistakes it for real SPL."
|
|
}
|
|
}
|
|
}
|