From 0929af46ca4d321411ef708dec2db31eb1089a73 Mon Sep 17 00:00:00 2001 From: Waters Church Date: Wed, 30 Sep 2026 10:12:42 -0400 Subject: [PATCH] SPL Meter 0.5.0: the capture tool ships prebuilt, for Apple silicon and Intel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same move as Timers 1.7.0. The capture tool existed only where the macOS app build had compiled it, with the module trying swiftc on the booth as a fallback — NA has been logging "spawn spl-capture ENOENT" since its catalog install. Under the module guide's rule it now ships built: bin/spl-capture-macos-arm64 and bin/spl-capture-macos-x86_64, signed with the Developer ID (hardened runtime, audio-input entitlement), from native/spl-capture.swift via native/build.sh. captureTool() picks the binary for this platform; where there is none — Windows, until a Windows implementation exists — measurement reports itself off in the health line and the device picker while the module stays mounted. The runtime build and its "building…" state are gone, and the old top-level binary is no longer gitignored. Co-Authored-By: Claude Fable 5.1 --- .gitignore | 3 - modules/spl-meter/bin/spl-capture-macos-arm64 | Bin 0 -> 164000 bytes .../spl-meter/bin/spl-capture-macos-x86_64 | Bin 0 -> 139424 bytes modules/spl-meter/module.json | 2 +- modules/spl-meter/native/build.sh | 48 +++++++ modules/spl-meter/native/helper.entitlements | 10 ++ .../spl-meter/{ => native}/spl-capture.swift | 7 +- modules/spl-meter/server.js | 30 ++--- modules/spl-meter/spl-listener.js | 123 +++++------------- 9 files changed, 108 insertions(+), 115 deletions(-) create mode 100755 modules/spl-meter/bin/spl-capture-macos-arm64 create mode 100755 modules/spl-meter/bin/spl-capture-macos-x86_64 create mode 100755 modules/spl-meter/native/build.sh create mode 100644 modules/spl-meter/native/helper.entitlements rename modules/spl-meter/{ => native}/spl-capture.swift (99%) diff --git a/.gitignore b/.gitignore index b553dd6..7960cd0 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,3 @@ launcher/macos/build/ launcher/macos/.cache/ launcher/windows/build/ launcher/windows/.cache/ - -# Compiled per-machine, source sits next to it (see spl-capture.swift). -modules/spl-meter/spl-capture diff --git a/modules/spl-meter/bin/spl-capture-macos-arm64 b/modules/spl-meter/bin/spl-capture-macos-arm64 new file mode 100755 index 0000000000000000000000000000000000000000..2b9c11b6fc1bd695bc8f69aad33570c632a3b154 GIT binary patch literal 164000 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

C|~usJt^Zt?b3KV?L>{|UE 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 z z%(KjM_$|2d5Pc52TWg{JJ-ciL`dhZtu99XwI(OnGY4q8s&nj=5puU~4dq$U%)!G-* zon#q#)Ipj{Hpj~f9+N70R8s{?Crm6&{l+;(y8D>Wz8sB&zD)x}i}7mBfLoQt@i zOFEgj(4g54>F<{lmkIXj@5m00sBbWKR(rBy1kKJ?1qyMy7F}?r_BpALqAP$t5Z!nq zWX&TQvek>n<}MS-r=cyg_)=GF>&aq@nRa+;T5-E;{FZoPB@1(rdQ3MgVBpC`sj8whcFYW z#pDI~OytclPbjKWrXrtcbE}kXRL}LcWSTWIfjt(7%y0orHt1#p)GMShE1lpjcB=); zJ>tqyx<;LEWOs{}3nT2__m>t^Poan|g>=$ourwEq!KIii%Ez>toYWTIQQ=Y^@zkj` zr!#>URA;55YB3d^6KXAmCq!%6zeB1!GM4+C@$Eg=9G41V-+~I=YU4WaOIunJnW^<9 zR6*UW=DcQCbFD9&kqOEBYPL1F9fWRmYB=6)7nY9uR-vmL`&8+(S(t{R*Q>3VmfqJ# zYoA)vF!Rydg6VyKMZZ?+RZF>So2F^H4c`;#wHa&q0(-SI)vaYKcrcFmUb?Y!y zwrOeNi_G!5xqDOsa_;_rq|KR@CA>)sKv>n_#gw>Jj#y6XqmIkzSJm3TavCB{&BcA# zohD4zHeL`2Uf`&6`j^s?VT_9O9~@0hOPU>M8EQmNNWI9gn3v9Q&8=~k zK)rYuQ})H>^C%kn)kK}dAZrvo#^9g~>AQ!Tab1^DS|a;Lv3J!+^u11X6z>D<_l`R! z5HqG#hB&rpxD+p@sqb~HxT_0wSH}r+v`kvH#ELa3`IaVDr}~RUOoj~{Yue@GjzQ@* z+>gx;$f~wiua?&0aFgJ4M^rkEA1&&dTo>9y%|AxeWy2~l1^8oFmQMHD56&Xd?)6(_t!ZSNy6`?Y zTl=s4GH{9J1^I)sssCaiY&!eLuqmsy$&DrDLDn8M@i7+L!JzKK7@U_3(G;^LqsiNl z<{6wNhSo@D$&c0q$L!2R=dfI zA{@Sv8*CC~0;^TVQl)pP%Re|fW7)jFUY$DsKZw4a)|>6mK6_vgHen~hAarq*4BY8N zcWe-v?1RwM#~@!dg}rILx5;2;l$w2Y4tXHGgX%(Sw(*dHE$0wgGsQX*s!w(CrTT#9 zI>;(@@aA{b^JJ1^33jz(rzCcphMQ}=P3~GVbU7R}#xnPl2y#k*T<`WE6-hLq&|ez$ zatpQb0qLiT`G5>?AP>w;{b1d|q?|5DcDo*6cQV!t>x=ctEh88O{eb*4hy>}QUC{YO zbyi>Zzzco07=0KMrFD>+)s|+E0aV+PUaqQP?xQ&|AK=uv(QYnbakJIE^aL^~hhqn{ zHYZcQuv~lZy$iZrEPy4bBYJI-&ab*KW>Db3UH!|zZ$1e!z?C2wsVkZp@ z+x5z0Dlw;Z9}SK`w>C>(>v#Lax|;FJH2s7+>zYQ>!txMP?-O~kV}CdcDWymz)Ej?D zZeabf(|!Z%jXx1NuzvMKcCq2K9)JKIdX!|unw#*`zi%#+VUBev(%z7z0Z$g z4X2OhWkIZFG!)MISk)F+$Id~~iygBruvOU{bRN6!Ium+Jt8Me_{c9Q6l7tS%)vbNF zW>hygWmHb&j#iuXc0#WdZ@W%KE`AKS_Cd=`V)>w-E-nTba+yhJqeFQMQ%tcqtqu87|v=sb=z|^b=AkD7t2smZ=Y*W<*5`=D9;Ow5ysU(aaI~sboRxo#4OV)9KAidk1;D^ABE}u zB0n~BH((NI6+nOX(afE&Nkp8kPpd6uqOXd)0n4x{Hds`(WWZ`u%<~QGJ2_AuI499O zpRld>9=Bfm>_q<1>+5U7oY2&7oT#;If0|@Qi))M7pM4Jjdrcb380vEb2)%aq zEhOrsAzS@pOd1NS5|0h@`r1~7AySo%E8PP(+N2s4F+6=~y>-wt-_tBwNrt(!f6?6Z zf6-j}zhW+vPTtP3&?>*?clpg4_swc0jrrJ)j{~f-JnBqjFU46k+Sz8uf|6#BHH|*o zT}|~t?EZ~cvXGKIzmD1LhF+%lY`AdBjeQTArCDS!AG@+eouE^&PA3())QwRz9gw$F z=+tvaIS+vd#QVfJz_w!vLvt2FvC z5v&&Ve7&nKF6}a#Npt|^5d=8C8PvylRzS!Pa0-2~wob1l13LnnylQ=>3zIbsVs5;l zUt) zCL`!>#-xzfV$JE@&2!{g96q=i`+c{4bQf-+*@rLc-FxYH$E_nn7s_wL=uS1<<2L*z z1$T3RzYa5`K1tzAX>qet9TXOmBIr0J=|!J8Id+#TzJ)=3|Ad`FDM`VdX!OJJ^r^K@ zUl5zAr#3rly@9DM*_n>abfr8yYrZ`*DqGh;8d>9yCG@8@b}t_hYeF^pSJnU&o_QN^yn)+k3`4sJL~O?XRjT|mg0Bst2(Cg z*$dx1?JDb&UZv{AFXa_dFGmXulz;N^b0zkdAa=KCI9`bek z4~O6V^I2P#zjxBML(hHb(i3KVd6)0K-E%J4&|dh*BBk=?-R9q&oN;5|{<6RQ=}%3T zF$+e2`NdlsUB^s*f8W`8f7?5J{TaJUUwCbd+1&N}1$O&Sewc9gO*_6hJ-Y0fxz%@H z*cf@S_%B0?ZJ(Gg969Qr!Rq#lhc0+JkU7eKSwY^{o;Ol%^WAseRS!*jYOg78;iu1C zdDktMK9lwRhRg5R(c<{-XHVM#A6@my&s>)b?^^TdCd)6@efoLV&Cji99(LA=v%04& zdGxCLYEFOs<8!~6a8vVH%U!=bB|GV>vAbKYcyPj7mYMeF-~IicW{>^VcUv~B8~@bKGwW2%Xz`Gd%`#Va@{eXZ9Apt>Dz-O$O(XM9ey;PJRj+w65C8JsW1~4~?(n|%Z@u{5 zGryiP=Jk}ouUp37b#>>mBWJI_#J zzn}YM^Z#k@%HyHz+P@iN-wWAIWMAeUTXxx!tl3LsnXxmNv85~{3PnXFTSOr$vPPSz zER`gpMJ0MtDp?X)-g8?@&(rfh@8|c&^Zef5Z+t#u=A8RF=RWuM+~+#q>$>lAo#O%f zF*iAfH4~EwXPeVg#w9pJtz6F4R`DX530IT5_^g6lr+#ZI{r04rd&n}rx&oXVDb7%xzC84T$5RV?w-{L50?8Z<>pcIu(`E;X3)n;zZ~6 z%De@6x6BVJt&L6F?sZLlE|XA1_#@qXo60jX&xYI!x}?A@N;ds$!l$fek~dV*(K+R1 zeh?G4B}YdiX&?gPHn)RVH>m9swTURM4bZd^Vl6_U~UERvAnI^d>R zsy`Zko_<@a$$^*R0lAS;O=I2(I}O|>Ol{@-f*-s*vrB-W5afPO$+bS{Q)ApiUH*|HPCSXQABQ;M$pisAC_JZJuz07D+lxw@ja^+oXwsML`J=#0ZZ8*MnKQAWh8T;z@UIZ8*EH}gn%TcdoS(39N5J+f!T}Wsh3swPA zfUpV*SOu)|j&&>w8&@Tv2&^0=vsjXOg8@Di?+4#PXk!EPpPgu>LCk;App~m(UVSyI zuNNXCL{=jLprj@v*r-50Ba)0jP$h<1&^l)7emo;8gDlwfn5c6@xjcCvqYmwc=%Qmf z?=4u^KVXwe?>=cyEan`m_XF$4YJf?b9b*Kg@Lmz4_`?^WG+HQ+MQHX;>n=b+;qa*JW*)VshZF7rk|gOD(F+sYziM+e@qHP4BLi z(c_Lew(?~U#k2|g7zp@jH7ymrbO4f7{8%ZqONn0bbp;4*P$OA+nOh8+XK!kZ1F z22V^%u-BqRf(gM-Zd-=j(h^H`DxexZrE+kKT56@nyTdW^$1+_e!tYP8GFoe&p0Vf^ zy0GuqA%!b;W{Jb$JTJ>K_3C$T=HGWZ@jmC<1Dy`ZUoO}+%hE_2US#SsDM7L+l^wX_ zYMW@#DnX?CNFFku3A}bYks}-jy{b zMqO{4YUaf98K*4DWx};xurht>OLlIDWqqTArDrOA6?&?@OcqTDtkFS02W#~^*mAVS zWsD{HTITOpUuNxd7U*f$s#ZTg!Ny8;l&NApw>+s^ljW%!cWFV;Q6p>H#)}x;%CFyE z2i|*AU}_j8Z0c)yTsN_qJt* z=ZB@Y$}Np_GGaH-eWAY_YP5eG+&`4TFNgMDj(su$o@fNoC^CW`oDob_2&(0o$sI?7 zfMUlWXGMPdNB2H+ro;DEW#%@2=; zLpOo-XE-$QPWZzF1qY}^01m{k0FlDrLLo%F>`x~Ogx`FGPX;8vpC4u-f$)NS5c3hP zleDyySN?ZHb5VWmR5@uX7he0}VAiwou&lArhhdOKqi}p&JpV~8qm5%FS({R1A5|P) z(|c`#nDy}?j;%eyLaFz(_H_7yZwuYXUbVPnYjl@tbH(*c3r61snc3|{Gz@#zZL;GK zB6Za!i)t7ZbQ3lVyzi_He8Fb;N}}zvfB1*rs@JV6eikL7+$PrD$JXQf==26rj;Z{z zRAQ{lZGJ}v%+X6<4YrKBsOEA_YKeQIlN5cXSjZjy?+Y-~);^B78}5o>Q|ffGcJH6C zt!I5wPvo_z?o)|w+;7`gbn>!--nZWFpxmf@t6Ki6X?h#hNZ(--tTD@Wc5g9>S!a1J zsr$*`>;ne6jpZRB>mf2t6;NT>%QVKrvDhpuchGJ%R4|SC2Pp(#Hwr3{8WxLHQB+Y- z_yfC%Ex__YJhY4qN5vD<#$<5_1T*6g!j3h7^uRzsQ8R1&M15cewal>8(Wb_B#^y$7 zdtDntD{Hj=7F#R*EojLfl}N4dHm0Ad7KHfWsu`I%e^tRx#19O=e@}$II_MY+?nSGr z-d!^$I#aDxEnI|T4+$d`3h;7UjCbZb6OL>4ypHajkTiZsHLgO}(#L_l?;Ve3^P5%K zWgzxh!|n3`(66nrTK?dM9l@E5UyJdxHagHhhCMVnTq7Q`62~Wc`&`hoLu!9ftPwI01_bQP2zf%ROtUv>lzVt86%pZCb@48}oU?6U|N5o)m$P6*A z)Im+XinPw)5}B^Pu$D@Wbm>2kV_$IIBJ@ zAwu8#T+jT3MrqK(tNdD)H)7`+<=V+Y17`cA44?n@c)KV*YBjb$vn{4D$hom`4UcT%j=V?=Lnf}Lm9&4*C?5Eo+e#zZ^^qFdN;(6T;DG3^c zb#D;MWX6}fjCN(Q9!lr$hxpTl6*h)uG_k9RX!{$aHzU%`SUU`ur^T3!brc1&_ylp) zWvryb#k;2)o|epF$(&9QnR7d^R-xGVe^5Uo=~vGgt8C^xGU5@?%PZC}12vZEdx8!D z34Bj5&|uk?bi5*jRl;Hwm3KgxA4gGG5fu7kZ_M*=HudR4Vz}c6=_Yn%OE}rr#d-)S z_8j#)WHYlL(p)a!j$=S#F_7FU^Zh?4O-4xlD38FB5qv-qaQ|1icov;1I5<=*p7`Bw zvKV(CI8YcgabTNY_{T<)x2~cG$u=a=#&4^=wY`t72jrj}7T{p#t_90smIXC2%Vq!I zbNL-L06 ziH9T3*yZH>mRzMfrf|#5oZMs2a`@Jh+Z&$vwypKfeSYfIu01pnoT)tzhxwRn$yZCd z`=9ys?1{QmMn*mF)Av7l=0tV@uK}iEK;}KU+oP?^d}bQsqLpDX$fBurS-Ruiaf2(5uK*B@w7RKa>yT1x7Y4jWjiih86_V``I0ZLKobR9Aw&p5E0Bg-(UTK_6St7 zep@hy{Ftrq*ivyL3c94G>h$G=I@n{7U)H}ZAe(G7_*B?^W5Q`c% zy>X~$O7s}v0QQwKOV{n>x&?`-%KA@w$8Jo#o2L`;5r{vSu1#e2gt=o5M@^7 z5T_Jvj?7z*eLVY75qcHSfZ$mh`LJ?FL&dm>4jZKR*V|j!Q}I-)DN%h&5`MYkZ0iaH z3@)F?bnYRZoblG&P5;PQ;5pUt8d7_0plgZZZS7HLUvlxB1_7~R#5MwcboJk`G^KlD z=J)zH#;fK#h<}|Pkm?^3NCQO{9ZWFCq5%moZ_R&Ky0Aq$3Q4XI3qVc;eo0Q24buN3 zWbD_ZiXKvg$(Aq*__HC&Jn_5@2`di-es#Z-QVZV5INRsW1n5o;{L1ib4CE||I-U=fM zzq1egB4s=_t;+OxsL3;j4e20@xM5f_JGFP-J3J? zvDY_#Bn%Xu_VMQOowyO|)eW!k@&wJPg(FXQBz#GGD)r##oi~n?wxNeM zYjx07MFttCyS*9-xSe-dgag>Ybin-hw5$d9n%cXc8Xv9wy%zlYT>46oGVIt_Qd%;4 zekDlMAwkTP;U<3zYxsdfjUsjR>(^$reN4)I9_hGHFx*)X8#TZ1=AiMQ z2IDmQ*Qs9HuTzj-!=IT~Di0_7gRJRVMSH`u@K?sW9f#|p`9<%X?x-q} z9RB(|@W6Vt@u!N}O~Lv-T6)_~)SnkjIr=apxydPevi;yQA0PGS?``&e;Pf5u(N1ge z-)*yNOh1MFLFmpbDrQ0RHqCo8Z>DZ)2iMm1zg0TNm3LvMXEAeGmJq)3H5=IWWcWfC zqO0h+9x-IkHvRZa7xrftBp&*DwkjGDS~G<5GNa8n(q4HljF=dXo41Lu+CLVd8xpD7 zKb+lV*dCxWlu|dlxqD}8c`1#$|3=Az;>~!1ZNArmcUIc16OZ1^=oAi$$5gBP_B0Jm zE5x=aoZj*(g|>iqu(Dml4v~w9+$#)5}h7j+TqTT zw6mVBehpzezI;2k)^3dUyv*MEoHf3M&7rYRWw_d_(HY* z+%9sNW%GyQR*w}euHO0@*-Ml*<%s6(*fwT3{{FeSks4oxN5N5}hYzwA&iC>RbFQ=8 z#@-w*x-BJZ9GP>!#_KWp(bgx~5+%7^&E@3X^~QIsh4dR6<2>$Ml8aT67Jd1l(6<|N z{l;1L#3S5@BZ2+CE?X;hm)Ja#x?=xqjhf-<6H#VN_@v%mDVEoRMq~S)Xr5yGps#Mh zw9zzF=nhs^aZ+UQ?I+4V3IY@aCX1Skkl5TGDHL4bk)1px{I q6a**;P!OOXKtX_l00jXG0u%%&2v889AV5KYf&c{p3IhMn5cn6gx21Xj literal 0 HcmV?d00001 diff --git a/modules/spl-meter/module.json b/modules/spl-meter/module.json index 8eea9e5..0fb7c4d 100644 --- a/modules/spl-meter/module.json +++ b/modules/spl-meter/module.json @@ -1,7 +1,7 @@ { "id": "spl-meter", "name": "SPL Meter", - "version": "0.4.3", + "version": "0.5.0", "proddash": ">=1.5.0", "description": "Calibrated sound level, Leq and RTA from an audio input on this machine", "permissions": [ diff --git a/modules/spl-meter/native/build.sh b/modules/spl-meter/native/build.sh new file mode 100755 index 0000000..d6748b0 --- /dev/null +++ b/modules/spl-meter/native/build.sh @@ -0,0 +1,48 @@ +#!/bin/zsh +# Build this module's native helper for every macOS architecture it ships — +# ../bin/spl-capture-macos-arm64 and ../bin/spl-capture-macos-x86_64 — +# from spl-capture.swift beside this script. Run it on any Mac with the +# Xcode command line tools; both architectures cross-compile from either. +# The binaries are committed: a machine running ProdDash never builds +# anything (docs/MODULE-GUIDE.md, "Native helpers"). +# +# Signed with a Developer ID Application certificate when one is installed +# (override with CODESIGN_IDENTITY) — hardened runtime plus the audio-input +# entitlement, which a helper that reads a microphone needs under the +# hardened runtime — and ad-hoc otherwise, which is fine on your own Macs. +# +# Windows is not built here: there is no Windows implementation of this +# tool yet, so on Windows the module reports measurement off. +set -e -u +cd "$(dirname "$0")" + +NAME="spl-capture" +DEPLOYMENT_TARGET="13.0" + +command -v swiftc >/dev/null || { + echo "build.sh: swiftc not found — install the Xcode command line tools: xcode-select --install" >&2 + exit 1 +} + +IDENTITY="${CODESIGN_IDENTITY:-}" +if [[ -z "$IDENTITY" ]]; then + IDENTITY=$(security find-identity -v -p codesigning 2>/dev/null \ + | awk -F'"' '/Developer ID Application/ {print $2; exit}') +fi +if [[ -n "$IDENTITY" ]]; then + echo "signing as $IDENTITY" + SIGN=(--force --sign "$IDENTITY" --options runtime --timestamp) +else + echo "signing ad-hoc (no Developer ID installed — fine on your own Macs)" + SIGN=(--force --sign - --options runtime) +fi + +mkdir -p ../bin +for ARCH in arm64 x86_64; do + OUT="../bin/$NAME-macos-$ARCH" + echo " compiling $OUT" + swiftc -O -whole-module-optimization -target "$ARCH-apple-macos$DEPLOYMENT_TARGET" -o "$OUT" "$NAME.swift" + codesign "${SIGN[@]}" --entitlements helper.entitlements "$OUT" + codesign --verify --strict "$OUT" + echo " built $OUT ($(du -h "$OUT" | awk '{print $1}'))" +done diff --git a/modules/spl-meter/native/helper.entitlements b/modules/spl-meter/native/helper.entitlements new file mode 100644 index 0000000..6d11e71 --- /dev/null +++ b/modules/spl-meter/native/helper.entitlements @@ -0,0 +1,10 @@ + + + + + + com.apple.security.device.audio-input + + + diff --git a/modules/spl-meter/spl-capture.swift b/modules/spl-meter/native/spl-capture.swift similarity index 99% rename from modules/spl-meter/spl-capture.swift rename to modules/spl-meter/native/spl-capture.swift index 25a76dc..4b90d5b 100644 --- a/modules/spl-meter/spl-capture.swift +++ b/modules/spl-meter/native/spl-capture.swift @@ -8,10 +8,11 @@ // measurement is done here and only the answers cross the pipe. // // Everything below uses Accelerate, which ships with macOS. No third-party -// code, no package manager, ~2 s to build: +// code, no package manager. It ships prebuilt in the module's bin/ (one +// binary per platform, committed — a booth never builds anything). To +// rebuild after a change here, on any Mac with the Xcode command line tools: // -// swiftc -O -o modules/spl-meter/spl-capture \ -// modules/spl-meter/spl-capture.swift +// modules/spl-meter/native/build.sh (both architectures) // // spl-capture --list // every input-capable device: name, input channels, sample rate diff --git a/modules/spl-meter/server.js b/modules/spl-meter/server.js index 0ae966a..ded2dbc 100644 --- a/modules/spl-meter/server.js +++ b/modules/spl-meter/server.js @@ -20,7 +20,7 @@ */ const path = require('path'); -const { createSplListener, ensureCaptureBinary } = require('./spl-listener'); +const { createSplListener, captureTool } = require('./spl-listener'); /** Reference level of a sound level calibrator. Effectively always 94 dB. */ const CALIBRATOR_DB = 94; @@ -120,12 +120,9 @@ module.exports = { pinger: null, }; - // Before anything else: the device picker shells out to this tool, so a - // machine that installed the module from the catalog (source only — the - // binary is gitignored) needs the build kicked off here. Waiting for a - // listener would never happen: no tool means no device list, and no - // device means no listener. - state.toolMissing = ensureCaptureBinary({ moduleDir, log }); + // The capture tool ships prebuilt in the module (bin/); with none for + // this platform every reading is off and the health line says so. + state.toolMissing = captureTool(moduleDir).missing; if (!config.enabled) { state.error = 'Sound level measurement is off — turn it on in ProdDash settings'; @@ -185,9 +182,7 @@ module.exports = { return { stop() { teardown(); }, health() { - if (state.toolMissing && !fsExists(path.join(moduleDir, 'spl-capture'))) { - return { status: 'error', message: state.toolMissing }; - } + if (state.toolMissing) return { status: 'error', message: state.toolMissing }; if (state.error) return { status: 'error', message: state.error }; if (!state.frame) return { status: 'connecting', message: 'waiting for the first reading' }; const quiet = silentMs(); @@ -311,11 +306,10 @@ module.exports = { /** Device list for the admin page. Runs the capture tool's --list, which is the only thing that knows what CoreAudio can see. */ 'GET /devices': async (req, res) => { - const missing = ensureCaptureBinary({ moduleDir: __dirname, log }); - if (missing) { - if (state) state.toolMissing = missing; - log(`device list unavailable — ${missing}`); - json(res, 200, { options: [] }); + const tool = captureTool(__dirname); + if (tool.missing) { + log(`device list unavailable — ${tool.missing}`); + json(res, 200, { options: [], error: tool.missing }); return; } try { @@ -447,7 +441,7 @@ function teardown() { function listDevices() { return new Promise((resolve, reject) => { const { execFile } = require('child_process'); - execFile(path.join(__dirname, 'spl-capture'), ['--list'], { timeout: 10000 }, + execFile(captureTool(__dirname).bin, ['--list'], { timeout: 10000 }, (err, stdout) => { if (err && !stdout) { reject(err); return; } try { resolve(JSON.parse(stdout).devices || []); } @@ -456,10 +450,6 @@ function listDevices() { }); } -function fsExists(p) { - try { return require('fs').existsSync(p); } catch { return false; } -} - function json(res, code, body) { const text = JSON.stringify(body); res.writeHead(code, { diff --git a/modules/spl-meter/spl-listener.js b/modules/spl-meter/spl-listener.js index ebe1276..6738762 100644 --- a/modules/spl-meter/spl-listener.js +++ b/modules/spl-meter/spl-listener.js @@ -3,7 +3,8 @@ /** * Sound level listener — owns the native capture child. * - * Spawns spl-capture (compiled from spl-capture.swift beside it) for the + * Spawns spl-capture (bin/spl-capture-macos-, shipped prebuilt; + * source in native/) for the * admin-configured device and channels, reads its JSON lines, and hands the * latest frame upward. All measurement happens in the child; this file is * plumbing and supervision, nothing more. @@ -13,12 +14,11 @@ * { frame: {...}, meta: {...} } measuring * { error: '' } not measuring * - * The capture binary is per-machine and gitignored, exactly like the Timers - * module's ltc-capture. It normally arrives already built — compiled beside - * the app, or copied from any Mac of the same architecture. When it is - * missing this will build it, but in the background and never on the event - * loop, and from module scope so the device picker can trigger it too — see - * ensureCaptureBinary for what both of those cost the first time round. + * The capture tool ships prebuilt inside the module, one binary per + * platform under bin/ (module guide, "Native helpers"), exactly like the + * Timers module's ltc-capture: nothing is ever built on the machine running + * ProdDash. captureTool() picks the binary for this platform; when there is + * none, measurement reports itself off and the rest of the module carries on. * * The same macOS gotcha applies as for LTC, and is worth repeating because * it costs an afternoon every time: a ProdDash launched over SSH or from a @@ -31,72 +31,31 @@ const path = require('path'); const fs = require('fs'); const { spawn } = require('child_process'); -const BUILD_HELP = 'Sound level capture tool missing — build it on any Apple Silicon Mac with ' - + '`swiftc -O -o modules/spl-meter/spl-capture modules/spl-meter/spl-capture.swift` ' - + 'and copy it next to spl-capture.swift'; -const BUILDING = 'Building the capture tool — this takes a minute or two'; +/* ── the capture tool: prebuilt, one binary per platform ───────────────── */ + +/** What the module ships in bin/, by platform and architecture. */ +const HELPERS = { + darwin: { arm64: 'spl-capture-macos-arm64', x64: 'spl-capture-macos-x86_64' }, + win32: { x64: 'spl-capture-win-x64.exe' }, +}; /** - * Build the capture tool if it is missing, WITHOUT blocking, and shared by - * everything that needs it. + * The capture tool for this machine. It is never built here and never + * looked for anywhere else: the module ships it, or measurement is off on + * this platform and says so. `bin` is the usable binary; otherwise + * `missing` is what to tell the admin page and the tiles. * - * This lives at module scope rather than inside a listener because of a trap - * the first version walked into: the admin page's device picker runs the tool - * with --list, but the build only ran when a listener started, and a listener - * only starts once a device has been picked. On a machine that got the module - * from the catalog — source only, the binary being gitignored — the picker - * was empty, and nothing would ever fill it. - * - * It also must never block. It was a spawnSync once, copied from the LTC - * listener where the source is a third the size and builds in seconds. Here - * it took nearly two minutes on the production Mac and held the Node event - * loop for all of it, freezing every other module, then did it again on the - * next retry. - * - * The binary should normally already be there: built beside the app, or - * copied from any Mac of the same architecture. This is the fallback. - * - * @returns {string} '' when the tool is ready, otherwise what to say. + * @returns {{bin:string, missing:string}} */ -let building = false; -let buildFailed = false; - -function ensureCaptureBinary({ moduleDir, log, onReady }) { - const bin = path.join(moduleDir, 'spl-capture'); - if (fs.existsSync(bin)) return ''; - const src = bin + '.swift'; - if (!fs.existsSync(src)) return 'spl-capture.swift is missing from the module folder'; - if (building) return BUILDING; - if (buildFailed) return BUILD_HELP; - - building = true; - log('spl-capture binary missing — building it in the background'); - const build = spawn('swiftc', ['-O', '-o', bin, src], { stdio: ['ignore', 'ignore', 'pipe'] }); - let buildErr = ''; - build.stderr.setEncoding('utf8'); - build.stderr.on('data', (t) => { buildErr = (buildErr + t).slice(-800); }); - const giveUp = setTimeout(() => { - try { build.kill('SIGKILL'); } catch { /* already gone */ } - }, 300000); - build.on('error', (err) => { - clearTimeout(giveUp); - building = false; buildFailed = true; - log(`swiftc could not be run: ${err.message}`); - }); - build.on('exit', (code) => { - clearTimeout(giveUp); - building = false; - if (code === 0 && fs.existsSync(bin)) { - log('spl-capture built'); - buildFailed = false; - if (typeof onReady === 'function') onReady(); - return; - } - buildFailed = true; - log(`spl-capture build failed (exit ${code})` - + (buildErr ? `: ${buildErr.trim().split('\n').pop()}` : '')); - }); - return BUILDING; +function captureTool(moduleDir, platform = process.platform, arch = process.arch) { + const name = HELPERS[platform]?.[arch] || ''; + const bin = name ? path.join(moduleDir, 'bin', name) : ''; + if (bin && fs.existsSync(bin)) return { bin, missing: '' }; + const here = `${platform === 'darwin' ? 'macOS' : platform === 'win32' ? 'Windows' : platform} ${arch}`; + return { + bin: '', + missing: `The module ships no sound level capture tool for ${here}${name ? ` (bin/${name} is missing)` : ''} — measurement is off on this machine`, + }; } const RESTART_MS = 5000; @@ -114,7 +73,6 @@ const STALL_MS = 3000; */ function createSplListener(opts) { const { device, channels, weighting, bands, calibration, moduleDir, log, onUpdate } = opts; - const bin = path.join(moduleDir, 'spl-capture'); let child = null; let stopped = false; @@ -124,13 +82,6 @@ function createSplListener(opts) { let meta = null; let lastFrameWall = 0; - /** '' when the tool is ready, otherwise what to say about it. */ - function ensureBinary() { - return ensureCaptureBinary({ moduleDir, log, onReady() { - if (!stopped) { clearTimeout(restartTimer); restartTimer = null; start(); } - } }); - } - function scheduleRestart(ms) { if (stopped || restartTimer) return; restartTimer = setTimeout(() => { restartTimer = null; start(); }, ms); @@ -150,15 +101,11 @@ function createSplListener(opts) { function start() { if (stopped) return; - const missing = ensureBinary(); - if (missing) { - onUpdate({ error: missing }); - // onReady is only the FAST path (a successful build restarts us at - // once). The slow retry must stay armed regardless: a failed build - // never calls back, and a binary can also arrive from outside — scp'd - // in on a machine whose toolchain can't build (AB's broken CLT). - // Waiting on onReady alone deadlocked exactly that way in the Timers - // module: "building…" forever, with a working binary on disk. + const tool = captureTool(moduleDir); + if (tool.missing) { + // No binary for this platform: say so and look again later — a module + // update remounts us anyway, this is only belt and braces. + onUpdate({ error: tool.missing }); scheduleRestart(BAD_CONFIG_RETRY_MS); return; } @@ -175,7 +122,7 @@ function createSplListener(opts) { let stderrTail = ''; let buf = ''; - child = spawn(bin, args, { stdio: ['pipe', 'pipe', 'pipe'] }); + child = spawn(tool.bin, args, { stdio: ['pipe', 'pipe', 'pipe'] }); child.stderr.setEncoding('utf8'); child.stderr.on('data', (text) => { @@ -258,4 +205,4 @@ function createSplListener(opts) { }; } -module.exports = { createSplListener, ensureCaptureBinary }; +module.exports = { createSplListener, captureTool };