From 69be7a0ba2f1d81521a6b649897c98fb5058d27f Mon Sep 17 00:00:00 2001 From: Pau Aliagas Date: Sun, 11 Oct 2026 14:08:24 +0200 Subject: [PATCH 1/2] Remove the committed push-failure log and ignore it --- .git-push-failures.log | 4 ---- .gitignore | 1 + 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 .git-push-failures.log diff --git a/.git-push-failures.log b/.git-push-failures.log deleted file mode 100644 index bada23a..0000000 --- a/.git-push-failures.log +++ /dev/null @@ -1,4 +0,0 @@ -remote: -remote: Create a pull request for 'lane/reac-shared-homes' on GitHub by visiting: -remote: https://github.com/FreeREAC/libreac/pull/new/lane/reac-shared-homes -remote: diff --git a/.gitignore b/.gitignore index 4f7c5b9..13159d0 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,4 @@ test_hold __pycache__/ *.py[co] test_box_facts +.git-push-failures.log From 6395ba2ddda2f97fb227b0cbb64465990cc6ed73 Mon Sep 17 00:00:00 2001 From: Pau Aliagas Date: Sun, 11 Oct 2026 14:08:24 +0200 Subject: [PATCH 2/2] Comments state the code's own facts: drop ticket numbers and private-repo citations Task numbers, local capture paths and pointers to a consumer's private design notes are replaced by the fact they stood for, or removed. --- include/reac/reac.h | 2 +- include/reac/reac_braid.h | 2 +- include/reac/reac_cfg.h | 6 +++--- include/reac/reac_clock.h | 2 +- include/reac/reac_ctrlblk.h | 2 +- include/reac/reac_disco.h | 5 ++--- include/reac/reac_headamp_tx.h | 6 +++--- include/reac/reac_hunt.h | 5 ++--- include/reac/reac_link_state.h | 19 ++++++++----------- include/reac/reac_master.h | 6 +++--- include/reac/reac_role.h | 7 +++---- include/reac/reac_upstream.h | 2 +- include/reac/transport/reac_conf.h | 8 ++++---- include/reac/transport/reac_ifname.h | 2 +- include/reac/transport/reac_ifscan.h | 3 +-- include/reac/transport/reac_pacer.h | 19 +++++++++---------- include/reac/transport/reac_role_swap.h | 3 +-- include/reac/transport/reac_segment_ident.h | 3 +-- include/reac/transport/reac_slave.h | 2 +- include/reac/transport/reac_tap.h | 4 +--- include/reac/transport/reac_topo.h | 4 +--- include/reac/transport/reac_tx.h | 2 +- include/reac/transport/reac_vlan.h | 1 - .../vendor/reac-pw-headers/reac_rate_cfg.h | 4 +--- .../vendor/reac-pw-headers/reac_role_cfg.h | 3 +-- src/reac_ctrlblk.c | 4 ++-- src/reac_disco.c | 2 +- src/reac_grant.c | 4 ++-- src/reac_upstream.c | 2 +- tests/test_reac.c | 2 +- tests/test_topo_hears_vlans.c | 3 +-- tests/test_upstream.c | 2 +- tools/README | 4 ++-- tools/conformance-tap-silent.sh | 3 +-- tools/m200-compare.sh | 4 ++-- transport/src/reac_conf.c | 2 +- transport/src/reac_ifname.c | 17 ++++++++--------- transport/src/reac_pacer.c | 14 +++++++------- transport/src/reac_slave.c | 4 ++-- 39 files changed, 84 insertions(+), 105 deletions(-) diff --git a/include/reac/reac.h b/include/reac/reac.h index e648091..a2b917c 100644 --- a/include/reac/reac.h +++ b/include/reac/reac.h @@ -305,7 +305,7 @@ int reac_detect_rate_fd(int fd, int window_ms); * not a patch, because reac_cfg.h's PUBLIC vocabulary moves: REAC_CFG_REFUSED_NONE is * "none" (was ""), REAC_ROLE_PROP and REAC_CFG_ROLE_STATE_HUNTING are ADDED, and * REAC_CFG_RATE_COUNT / REAC_CFG_RATE_LIST_INIT, which nothing read, are REMOVED. A - * consumer pinned to the old header (openmixer's TS mirror) must move with it. + * consumer pinned to the old header (a mirror of it in another language) must move with it. * Behaviour: reac_detect_rate_fd measures one stream; a new clock reference is * LOCKING until measured; reac_ctrl_identity_reply requires both checksums; * reac_decode_plain_le refuses an oversize geometry; reac_boxreg refuses an diff --git a/include/reac/reac_braid.h b/include/reac/reac_braid.h index 3bcdc2f..fe3f113 100644 --- a/include/reac/reac_braid.h +++ b/include/reac/reac_braid.h @@ -21,7 +21,7 @@ * - obs-h8819 (norihiro): convert_to_pcm24lep, developed and LISTENING- * validated against a real Roland M-200i downstream at 48 kHz; * - the FreeREAC rig: the S-1608/S-0808/S-4000 upstream returns decode real - * microphones under the braid (reac-pw task #108, upstream fixtures here); + * microphones under the braid; * - zoneA/zoneB goldens (a real M-5000's two REAC ports, program audio) * decode at coherence 0.99 / spectral flatness 0.002 under the braid at * audio offset exactly 50, and as noise under every other layout x offset diff --git a/include/reac/reac_cfg.h b/include/reac/reac_cfg.h index 5859b0c..bb28d3b 100644 --- a/include/reac/reac_cfg.h +++ b/include/reac/reac_cfg.h @@ -7,9 +7,9 @@ * * ONE DECLARATION, BOTH SIDES (spec §2). reac-pw's `param_changed` reads these * keys off a segment's `reac-playback[.]` node and answers on them; - * openmixer's TS mirror (`@openmixer/core`'s `reac-cfg.ts`) is conformance- - * pinned against this file byte-for-byte, so a knob cannot exist as a string - * literal in one repo and silently drift from the other. + * a console that mirrors these names is expected to pin them against this file + * byte-for-byte, so a knob cannot exist as a string literal in two places and + * silently drift. * * THE CHANNEL IS PROPS, NOT A FILE. A config file holds STARTUP values and * fixed site facts, read once and never watched; every LIVE reconfiguration — diff --git a/include/reac/reac_clock.h b/include/reac/reac_clock.h index e35bc8a..f0269d2 100644 --- a/include/reac/reac_clock.h +++ b/include/reac/reac_clock.h @@ -174,7 +174,7 @@ const char *reac_clock_quality_name(enum reac_clock_quality q); /* ELIGIBILITY (issue #77 item 5). Is this tier fit to own a REAC segment's pace? * Reporting-only and PURE: this module never yanks a reference out from under a * running segment on its own opinion — that decision belongs to whoever offers - * the master/follower control (the Setup -> Clock panel, openmixer). What we owe + * the master/follower control (a console's clock panel). What we owe * them is an unambiguous answer, and MARGINAL answering "no" is the whole point: * free-running while owning a segment is a legitimate emergency configuration, * not something to slide into by accident. */ diff --git a/include/reac/reac_ctrlblk.h b/include/reac/reac_ctrlblk.h index 70d97e3..68918f4 100644 --- a/include/reac/reac_ctrlblk.h +++ b/include/reac/reac_ctrlblk.h @@ -242,7 +242,7 @@ int reac_ctrl_scene_build(uint8_t *body, size_t n, const uint8_t mac[6]); * a constant that is not settled. Sensitivity is the input level that reaches * full scale, so it runs the OTHER WAY from gain: the hottest setting is the * most negative number. Against a 0 dBu reference this library's curve is - * equivalent to gain_dB = 10 + value, and openmixer publishes the same control + * equivalent to gain_dB = 10 + value, and a console may publish the same control * as 0..55 dB, a different zero by 10 dB. * * NEITHER IS SILENTLY CONVERTIBLE INTO THE OTHER. The loopback that measured the diff --git a/include/reac/reac_disco.h b/include/reac/reac_disco.h index 4835771..db52b87 100644 --- a/include/reac/reac_disco.h +++ b/include/reac/reac_disco.h @@ -13,7 +13,7 @@ * ownership-blind, and its verdict never reaches the FSM. * * Presence is NEVER a heuristic. A sighting requires a 0x8819 frame and (for non-FILLER) a - * verified checksum. A packet COUNT is not evidence — openmixer #161 announced any NIC over + * verified checksum. A packet COUNT is not evidence — a consumer that announced any NIC over * ~62 pkt/s (ordinary Wi-Fi) as a REAC master because an rx_packets delta was fed in as a * device. * @@ -50,8 +50,7 @@ * alloc, no stdio) — the pacer thread calls them, one `reac_disco_peer_lock` per segment's own * pacer (so its lifetime matches the segment's: a drop/reopen gets a fresh, unlocked lock). * The TABLE is main-thread-only: sightings cross threads on the pacer's existing lock-free - * event ring, so there is no new cross-thread primitive here. See - * 2026-07-16-reac-discovery-via-reac-pw (openmixer) for the seam. */ + * event ring, so there is no new cross-thread primitive here. */ #ifndef REAC_DISCO_H #define REAC_DISCO_H diff --git a/include/reac/reac_headamp_tx.h b/include/reac/reac_headamp_tx.h index 6f3d10d..f0534f8 100644 --- a/include/reac/reac_headamp_tx.h +++ b/include/reac/reac_headamp_tx.h @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2026 Pau Aliagas -/* reac_headamp_tx — the MASTER-role head-amp SEND model (task #155 reac-pw half). +/* reac_headamp_tx — the MASTER-role head-amp SEND model. * * The protocol, as the committed captures show it (HEADAMP-PROTOCOL-AUDIT-2026-07-22 * in reac-firmware-re; pcaps m200-s1608-BIDIR-reboot, matrix-m200-s1608 and @@ -71,7 +71,7 @@ * the box's own panel within one cadence; that authority over 48 V belongs to the * operator, and the mechanism is rig-unproven — no capture in this repo shows a * box receiving a redundant head-amp record, because no master here ever sent - * one. Until it is accepted and capture-gated, openmixer's scene watch + * one. Until it is accepted and capture-gated, a controller's scene watch * (REAC_SCENE_SETTLE_REPLAY_MS) remains the writer that re-applies a recorded * scene, and this master asserts once, as a real M-200 does. * @@ -97,7 +97,7 @@ struct reac_headamp_setting { /* Pack/unpack a (ch, param, value) head-amp command into ONE 32-bit word. * - * This is the atomicity primitive for the LIVE control path (task #203): a + * This is the atomicity primitive for the LIVE control path: a * controller's per-channel phantom/pad/sens change travels from the PipeWire * main-loop thread (the prop handler) to the RT pacer thread through a lock-free * SPSC queue of these words. Because the whole triple lives in a single 32-bit diff --git a/include/reac/reac_hunt.h b/include/reac/reac_hunt.h index 2e92a51..62bad36 100644 --- a/include/reac/reac_hunt.h +++ b/include/reac/reac_hunt.h @@ -13,9 +13,8 @@ * down for any of it: a role a normal box needs hand-set is a defect in the defaults, * exactly as a hand-set rate would be. * - * (openmixer's REAC master-arbitration and trunk-VLAN daemon notes describe the same - * three outcomes from the CONSOLE's side, which is what its `auto` role projects. They - * are a useful cross-reference and they are not this repo's law; DESIGN.md is.) + * (A console describes the same three outcomes from its side, which is what an `auto` + * role projects. DESIGN.md is this repo's law.) * * IT DECIDES NOTHING BY ITSELF THAT reac_arbitration HAS NOT ALREADY OBSERVED. * reac_arbitration stays passive — it publishes who drives the segment — and this diff --git a/include/reac/reac_link_state.h b/include/reac/reac_link_state.h index db1c646..4ed0273 100644 --- a/include/reac/reac_link_state.h +++ b/include/reac/reac_link_state.h @@ -2,7 +2,7 @@ // Copyright (C) 2026 Pau Aliagas /* reac_link_state — the PURE mapping from the MASTER FSM (reac_master_state) - * onto the small badge vocabulary a PipeWire consumer (openmixer's stagebox + * onto the small badge vocabulary a PipeWire consumer (a stagebox * card) reads off the reac-capture / reac-playback node properties, so it can * show "no box / probing / connected" without inferring it from wire traffic. * @@ -77,10 +77,9 @@ * * IT IS PUBLISHED BECAUSE reac.master.mac IS NOT IT AND CANNOT BE. That key names * whoever drives the segment, which in the master role is THIS machine's NIC. A - * consumer that keys a stagebox registry by box address — openmixer keys its - * `reac:` patch names exactly that way — read reac.master.mac, matched + * consumer that keys a stagebox registry by box address — for example by + * `reac:` patch names — read reac.master.mac, matched * our own NIC against a registry of Roland addresses, and missed on every rig - * (openmixer 2026-09-06-rig-headamp-and-clip-findings §5). * The alternative was for every consumer to re-derive the peer from a discovery * sighting list, which is a second implementation of a fact only the master * actually holds. */ @@ -98,7 +97,7 @@ * REAC_PROP_HEADAMP_BASE is the head-amp WIRE CHANNEL the box's input 1 sits at — * `base` in `CH = base + (input - 1)`. It is published because the alternative is * every consumer re-deriving it from the width against its own copy of the - * placement table (openmixer does exactly that today), which is a second + * placement table (a consumer may do exactly that), which is a second * implementation of a policy only reac-pw can actually observe, and it is wrong * the moment the placement rule gains a case. Decimal; REAC_BOX_SOURCE_NONE when * no box is known, so a numeric parse fails rather than reading as base 0. */ @@ -109,11 +108,10 @@ #define REAC_BOX_SOURCE_WIRE "wire" /* the box declared itself; we matched it */ #define REAC_BOX_SOURCE_NONE "none" /* no box on this wire — a normal state */ -/* reac.discovery.* — passive discovery (task #178): what is ON THE SEGMENT, as opposed +/* reac.discovery.* — passive discovery: what is ON THE SEGMENT, as opposed * to the reac.link-state/box-* keys above, which describe only the peer THIS master * joined. Same seam, same node, same 200 ms poll; see reac_disco.h for the rules that - * keep the device list honest, and openmixer's - * 2026-07-16-reac-discovery-via-reac-pw for the contract. + * keep the device list honest. * * A reader that finds reac-playback WITHOUT these keys is talking to a reac-pw that * predates discovery — which is "could not scan", never "scanned and found nothing". */ @@ -155,9 +153,8 @@ * live. Adding a socket, a file or an HTTP endpoint would be a second ledger for * the same facts, with neither door announcing the other. One store, one writer. * - * The console side is NOT built here (another lane owns that repo). openmixer's - * telemetry is a settled design — its own SSE, latest-wins, skip when late, never - * accumulate — and these rows are shaped to drop straight into it: every one is a + * The console side is NOT built here. A console's telemetry is expected to be latest-wins, + * skip when late, never accumulate, and these rows are shaped to drop straight into it: every one is a * scalar over the window that just closed, so a consumer that misses three * updates has lost nothing but resolution. * diff --git a/include/reac/reac_master.h b/include/reac/reac_master.h index b222dbc..4ff61b0 100644 --- a/include/reac/reac_master.h +++ b/include/reac/reac_master.h @@ -10,7 +10,7 @@ * the real cdea/cfea control block into the 32-byte block [18:50] of the * downstream broadcast frame that libreac's reac_downstream_build builds. * - * EVENT-DRIVEN (task #130): a real M-5000 never advances the establishment on a + * EVENT-DRIVEN: a real M-5000 never advances the establishment on a * timer — it PROBES until the box's cold-connect (cdea 04 03) arrives, ECHOES * that block back as the grant burst, and settles the instant the box switches * to unicast. The earlier cut auto-advanced PROBING->GRANTING after ~1 s blind @@ -247,8 +247,8 @@ const struct reac_mixer_profile *reac_mixer_profile_by_name(const char *name); const struct reac_mixer_profile *reac_mixer_profile_at(int i); /* Resolve the master's EMISSION rate for a requested --rate against the - * impersonated mixer profile (task #156, "96k is not anything different, same - * state diagram, doubled frequency" — parameterizing the existing 48k path by + * impersonated mixer profile (96k uses the same + * state diagram at a doubled frequency: parameterizing the existing 48k path by * mixer profile rather than re-engineering the FSM). * * THE RATE IS INDEPENDENT OF WHICH DESK WE IMPERSONATE (operator, 2026-08-21). diff --git a/include/reac/reac_role.h b/include/reac/reac_role.h index 6b789f1..b6a5cef 100644 --- a/include/reac/reac_role.h +++ b/include/reac/reac_role.h @@ -5,7 +5,7 @@ * parse + validation contract is unit-testable without PipeWire/sockets. * * REAC has no fixed master: any box can be the master and the rest slave to it - * (REAC-PROTOCOL-AND-TESTS.md §2/§4). openmixer must fit either role: + * (REAC-PROTOCOL-AND-TESTS.md §2/§4). a console must fit either role: * - master (default): WE drive the cdea/cfea establishment and WE GENERATE THE * PACE (the SCHED_FIFO pacer's cadence); a stagebox slaves to us. * - slave: an EXTERNAL master drives; we RESPOND and lock to its cadence (frame @@ -55,7 +55,7 @@ static inline const char *reac_role_name(enum reac_role r) * slave to it; a STAGEBOX masters it, we refuse and say so. reac_hunt.h * resolves it from what the wire actually says. * - * A console face may speak its own words for the same two ends (openmixer's shows + * A console face may speak its own words for the same two ends (one may show * `mixer`/`recorder`); REAC_ROLE and this parser stay on the WIRE's words, and the * translation is the console's to do. */ enum reac_role_intent { @@ -66,8 +66,7 @@ enum reac_role_intent { * all: no announce, no join, no grant, no seglock, no TX socket. It is the only * intent that has no wire role even after the wire has answered, which is why it * cannot be spelled as a value of `enum reac_role` above. See - * , and openmixer's master-arbitration spec, eighth - * amendment (2026-09-13): beside a real desk, a courting slave of ours kept that + * : beside a real desk, a courting slave of ours kept that * desk's own box from enrolling for 180 s and a granted one blocked it outright. * EXPLICIT ONLY — `auto` never resolves to it. */ REAC_ROLE_INTENT_TAP, diff --git a/include/reac/reac_upstream.h b/include/reac/reac_upstream.h index 35d8c12..9b233f9 100644 --- a/include/reac/reac_upstream.h +++ b/include/reac/reac_upstream.h @@ -15,7 +15,7 @@ * reac_decode(): it uses the channel-pair byte BRAID — the REAC wire layout, * see for the byte map and the full evidence trail. * - * Resolved 2026-07-10 (reac-pw task #108) against the rig captures in + * Resolved 2026-07-10 against the rig captures in * reac-captures: under the braid the loud wired capture's music channel decodes * at lag1 autocorrelation +0.998 and every idle channel collapses to the mic * noise floor; under plain LE every channel reads sign-extension garbage (the diff --git a/include/reac/transport/reac_conf.h b/include/reac/transport/reac_conf.h index 837b86c..87d35e4 100644 --- a/include/reac/transport/reac_conf.h +++ b/include/reac/transport/reac_conf.h @@ -17,7 +17,7 @@ * * 1. THE COMMAND LINE --rate, --live, ... * Handled by main.c, not here: an explicit argument is not a lookup. It is - * the layer openmixer uses — the console owns the desk's configuration and + * the layer a console uses — the console owns the desk's configuration and * hands it over when it launches us, which is what "omx needs to override" * means in practice. * @@ -31,8 +31,8 @@ * boxes, different NICs, potentially different rates. A per-segment fact * is the key SUFFIXED with the segment's name — REAC_ROLE_enp131s0 — in * any of the layers below, and it outranks the bare key in every one of - * them. Segments are discovered, not declared (openmixer's - * 2026-08-23-reac-trunk-vlan-daemon, amendment 2026-09-02), so there + * them. Segments are discovered, not declared (every linked wired + * interface is listened on), so there * is no per-segment FILE to create: a segment's name is its interface's, * and the console generates the key into reac-pw.env. * @@ -41,7 +41,7 @@ * * 5. ~/.config/openmixer/reac.env LAST RESORT * The bottom layer. It is what makes a STANDALONE install work with no - * console present, and openmixer overrides it and surfaces the value to the + * console present, and a console overrides it and surfaces the value to the * user. It is NOT a stray duplicate and it is NOT to be deleted; it is the * floor of the stack, and a floor is the thing you land on when nothing * above answered. diff --git a/include/reac/transport/reac_ifname.h b/include/reac/transport/reac_ifname.h index b24a1b5..f42a746 100644 --- a/include/reac/transport/reac_ifname.h +++ b/include/reac/transport/reac_ifname.h @@ -2,7 +2,7 @@ // Copyright (C) 2026 Pau Aliagas /* reac_ifname — a segment's STABLE, PHYSICAL-ADDRESS-DERIVED name: "pci" / "usb", - * ported from openmixer's classifyBus (packages/server/src/net-interfaces.ts) with one + * derived from the sysfs bus of the interface, with one * correction forced by measurement (see reac_ifname.c's header comment): a raw kernel * interface NAME (enp128s20f0u2, eth0, ...) is assigned by udev from bus topology or plain * enumeration order, and BOTH can change under the operator with the physical NIC untouched diff --git a/include/reac/transport/reac_ifscan.h b/include/reac/transport/reac_ifscan.h index fb5e4e4..c95af4e 100644 --- a/include/reac/transport/reac_ifscan.h +++ b/include/reac/transport/reac_ifscan.h @@ -3,8 +3,7 @@ * * reac_ifscan — WHICH interfaces to listen on, and which of them are SEGMENTS. The host's * netdev table, watched over rtnetlink, folded into one decision per interface - * (openmixer's 2026-08-23-reac-trunk-vlan-daemon §7-§9, amendment - * 2026-09-02: every linked WIRED interface is listened on; nothing is declared per NIC). + * (every linked WIRED interface is listened on; nothing is declared per NIC). * * LINK IS THE GATE TO LISTEN; HEARING IS THE GATE TO SERVE. An Ethernet interface that carries * link (IFF_LOWER_UP) is SNIFFED — a passive 0x8819 socket that transmits nothing, so an office diff --git a/include/reac/transport/reac_pacer.h b/include/reac/transport/reac_pacer.h index c814e2b..4a33ca1 100644 --- a/include/reac/transport/reac_pacer.h +++ b/include/reac/transport/reac_pacer.h @@ -78,7 +78,7 @@ int reac_frame_ring_push(struct reac_frame_ring *r, const uint8_t *frame, uint1 uint16_t reac_frame_ring_pop(struct reac_frame_ring *r, uint8_t *out); uint32_t reac_frame_ring_readable(const struct reac_frame_ring *r); -/* ---- drain-to-target depth guard (task #152) ----------------------------- * +/* ---- drain-to-target depth guard ----------------------------- * * The graph pushes whole encoded frames into the ring; the pacer drains exactly * one per slot. If the graph clock runs marginally fast versus the wire clock, * the ring depth walks up over long uptime toward the ~250 ms ring cap — silently @@ -89,7 +89,7 @@ uint32_t reac_frame_ring_readable(const struct reac_frame_ring *r); * The band is derived from the ACTUAL producer burst, NOT a guessed steady state. * The graph delivers up to one quantum of audio per process() callback, i.e. * quantum/12 frames pushed at once, so the ring depth SAWTOOTHS by that much - * every drive cycle — measured LIVE at ~38..113 frames (peak 113) with openmixer + * every drive cycle — measured LIVE at ~38..113 frames (peak 113) with a console * feeding playback_08 at the deployed quantum (an earlier guessed HIGH of 128 * sat one bigger burst away from trimming healthy audio). HIGH must clear several * such bursts: HIGH = max(FLOOR, MULT * quantum_frames), TARGET = HIGH/2. FLOOR @@ -228,7 +228,7 @@ struct reac_pacer_event { #define REAC_PACER_EVRING 128 /* power of two */ -/* Live head-amp control command ring (task #203). A controller (openmixer) sets a +/* Live head-amp control command ring. A controller sets a * per-channel phantom/pad/sens prop on the master node; the PipeWire main-loop * prop handler enqueues the change here and the RT pacer thread drains + applies * it. SPSC, opposite direction from the event ring: PRODUCER = main loop, @@ -252,7 +252,7 @@ struct reac_pacer_cfg { const uint8_t *src_mac; /* our master MAC (Roland OUI); NULL -> a stand-in */ struct reac_console_cfg console; /* box I/O advertised downstream; a zero * out_channels -> the S-1608 default */ - /* Optional MASTER head-amp send table (task #155): the operator's per-channel + /* Optional MASTER head-amp send table: the operator's per-channel * phantom/pad/sens, loaded into the DMX re-assert scheduler at open. NULL/0 -> * the head-amp overlay is entirely off and the downstream is unchanged. */ const struct reac_headamp_setting *headamps; @@ -429,7 +429,7 @@ struct reac_pacer { uint64_t health_slots_dropped; uint64_t health_slots_catchup; - /* frame-ring depth guard telemetry (task #152). ring_depth_{min,peak} bound the + /* frame-ring depth guard telemetry. ring_depth_{min,peak} bound the * depth SAWTOOTH seen since the last EMITTED depth line (read-and-reset there), * so a heartbeat surfaces the interval's real min/max; the trim counters are * cumulative. Written by the pacer thread, read+reset by the non-RT drain. @@ -489,14 +489,13 @@ struct reac_pacer { _Atomic uint64_t grant_attempts; /* grant windows opened */ _Atomic uint64_t drops[8]; /* backward drops by reac_master_drop_reason */ - /* Passive discovery (task #178). Two halves, deliberately on opposite sides of the + /* Passive discovery. Two halves, deliberately on opposite sides of the * event ring so no new cross-thread primitive is needed: * disco_gate — PACER-THREAD-ONLY. Decides which sightings earn a ring slot. * disco — MAIN-THREAD-ONLY. Built by reac_pacer_log_drain from the ring and * read by the sink node's property poll. The pacer thread must never * touch it. - * See reac_disco.h; the seam it feeds is documented in openmixer's - * 2026-07-16-reac-discovery-via-reac-pw. + * See reac_disco.h. * * disco_peer_lock — PACER-THREAD-ONLY, like disco_gate. One reac_pacer is one segment * (embedded in the segment's sink node), so its lifetime matches the segment's: a @@ -512,7 +511,7 @@ struct reac_pacer { _Atomic uint32_t ev_head, ev_tail; /* free-running u32 indices */ _Atomic uint64_t ev_drops; /* events dropped (ring full) */ - /* Live head-amp command ring (task #203): producer = PipeWire main loop + /* Live head-amp command ring: producer = PipeWire main loop * (reac_pacer_headamp_set), consumer = the RT pacer thread * (reac_pacer_headamp_drain). Each cell is a reac_headamp_pack()'d * (ch,param,value) — one atomic word, no torn triple. The pacer thread @@ -667,7 +666,7 @@ uint64_t reac_pacer_box_mac48(const struct reac_pacer *p); * number of events drained. */ int reac_pacer_log_drain(struct reac_pacer *p, FILE *out); -/* LIVE head-amp control (task #203). PRODUCER side — call from the PipeWire main +/* LIVE head-amp control. PRODUCER side — call from the PipeWire main * loop (the node's prop handler). Enqueues one per-channel (ch,param,value) * change for the RT pacer thread to apply to the head-amp send table, so an * external controller can drive the box preamps at runtime (mixer knob -> prop -> diff --git a/include/reac/transport/reac_role_swap.h b/include/reac/transport/reac_role_swap.h index 5dfb549..4ee8678 100644 --- a/include/reac/transport/reac_role_swap.h +++ b/include/reac/transport/reac_role_swap.h @@ -3,8 +3,7 @@ /* reac_role_swap — what a segment ANSWERS while a `reac.cfg.role` change is * being carried out, and once it has been - * (2026-08-20-reac-master-arbitration §8, in the openmixer - * tree). reac_role_cfg decides an assertion; this module answers for it + * reac_role_cfg decides an assertion; this module answers for it * afterwards. * * THE TWO ARE SEPARATE BECAUSE A ROLE CHANGE IS NOT AN INSTANT. Master and diff --git a/include/reac/transport/reac_segment_ident.h b/include/reac/transport/reac_segment_ident.h index 956eb4e..af04433 100644 --- a/include/reac/transport/reac_segment_ident.h +++ b/include/reac/transport/reac_segment_ident.h @@ -3,8 +3,7 @@ /* reac_segment_ident — WHAT A SEGMENT IS, in whichever role it is running, so a * console addresses the SEGMENT and never a node kind - * (2026-08-20-reac-master-arbitration §1 and §8, in the - * openmixer tree; docs/SLAVE-EMULATION-SCOPE.md W1). + * (docs/SLAVE-EMULATION-SCOPE.md W1). * * THE DEFECT THIS CLOSES. A segment's identity was only ever recoverable by * PARSING a node name — `reac-playback.` minus the prefix. That works for diff --git a/include/reac/transport/reac_slave.h b/include/reac/transport/reac_slave.h index 77a7ccd..efc0133 100644 --- a/include/reac/transport/reac_slave.h +++ b/include/reac/transport/reac_slave.h @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2026 Pau Aliagas -/* reac_slave — the SLAVE-role engine: openmixer slaved to an EXTERNAL REAC master +/* reac_slave — the SLAVE-role engine: a console slaved to an EXTERNAL REAC master * (a desk, or another box configured as master). It is the inverse of reac_pacer: * * - reac_pacer (MASTER role): WE drive the cdea/cfea establishment + WE own the diff --git a/include/reac/transport/reac_tap.h b/include/reac/transport/reac_tap.h index 1f49570..aae088b 100644 --- a/include/reac/transport/reac_tap.h +++ b/include/reac/transport/reac_tap.h @@ -14,9 +14,7 @@ * things on the wire, and the difference was measured. Beside a real Roland desk on * 2026-09-12, a courting slave of ours kept the desk's own S-1608 from enrolling for * 180 s, and a GRANTED slave of ours blocked it outright while it rebooted — four - * trials. A role that never transmits is a different role, not a quieter one - * (openmixer 2026-08-20-reac-master-arbitration, eighth amendment; - * 2026-09-13-reac-plug-and-play §0/§4). + * trials. A role that never transmits is a different role, not a quieter one. * * WHAT IT SERVES. Per segment it hears: the master's 40-channel downstream broadcast, * and ONE upstream stream per box source MAC at that box's own width. Each stream gets diff --git a/include/reac/transport/reac_topo.h b/include/reac/transport/reac_topo.h index 825cf08..b399cc1 100644 --- a/include/reac/transport/reac_topo.h +++ b/include/reac/transport/reac_topo.h @@ -2,7 +2,6 @@ * Copyright (C) 2026 Pau Aliagas * * reac_topo — is this NIC an access port or a TRUNK, and which VLANs carry REAC on it. - * (openmixer's 2026-08-23-reac-trunk-vlan-daemon §3, §4, §5.) * * OBSERVE ONCE TO LEARN THE TOPOLOGY; NEVER PARSE A TAG IN THE AUDIO PATH. Learning that * tagged 0x8819 frames arrive, and which VIDs they carry, is a read-only discovery act; @@ -12,8 +11,7 @@ * hearing path then serves like any other interface. Nothing here touches audio. * * THE TAG IS METADATA, NOT BYTES, AND THAT DECIDES THE SOCKET. Measured on this kernel - * (7.2.4-200.fc44, 2026-09-09, openmixer's tools/probe-vlan-8819.py in a private netns, - * matching the spec's §3 table taken on 6.x): + * (7.2.4-200.fc44, 2026-09-09, a probe in a private netns): * * - a socket bound to 0x8819 ON THE PARENT receives every tagged frame as well, with the * 802.1Q header ABSENT from the buffer and `vlan_tci = none` — indistinguishable from diff --git a/include/reac/transport/reac_tx.h b/include/reac/transport/reac_tx.h index a890734..1142f85 100644 --- a/include/reac/transport/reac_tx.h +++ b/include/reac/transport/reac_tx.h @@ -48,7 +48,7 @@ struct reac_tx { * `len` bytes. Verification vector: reac_eth_crc32("123456789", 9) == 0xCBF43926 * (the standard CRC-32 check value). * - * This is NOT a REAC field and no builder or emitter calls it — see task #156's + * This is NOT a REAC field and no builder or emitter calls it — see the * RE writeup (docs/MASTER-HARDWARE-VERIFY.md, "downstream OHRCA trailer") and * the earlier, already-committed finding for the box-UPSTREAM direction * (docs/SLAVE-EMULATION-SCOPE.md W4(a)). The "2-byte OHRCA trailer" some M-5000 diff --git a/include/reac/transport/reac_vlan.h b/include/reac/transport/reac_vlan.h index bb35222..e029748 100644 --- a/include/reac/transport/reac_vlan.h +++ b/include/reac/transport/reac_vlan.h @@ -3,7 +3,6 @@ * * reac_vlan — the netdevs behind the topology detector: `.` adopted if it is * there, created over rtnetlink if it is not, and removed at the end only if WE made it. - * (openmixer's 2026-08-23-reac-trunk-vlan-daemon §4c, §4d.) * * ONE STORE, ONE WRITER, APPLIED TO HOST NETWORK STATE: the daemon owns exactly the netdevs * it minted and nothing else. That dissolves the choice between "the daemon configures the diff --git a/packaging/vendor/reac-pw-headers/reac_rate_cfg.h b/packaging/vendor/reac-pw-headers/reac_rate_cfg.h index 51d114e..40aa724 100644 --- a/packaging/vendor/reac-pw-headers/reac_rate_cfg.h +++ b/packaging/vendor/reac-pw-headers/reac_rate_cfg.h @@ -2,9 +2,7 @@ // Copyright (C) 2026 Pau Aliagas /* reac_rate_cfg — the REAC pace: a CLOSED per-protocol list, DECLARED here; - * drivability is a separate, OBSERVED fact - * (2026-08-26-reac-runtime-config §0, in the openmixer - * tree). REAC has exactly three rates by definition: 44100, 48000, 96000 Hz. + * drivability is a separate, OBSERVED fact REAC has exactly three rates by definition: 44100, 48000, 96000 Hz. * This module is the one place that list is spelled out for reac-pw today; * the shared cross-repo vocabulary table (a libreac header both sides pin * against) is the spec's own increment 2, not this one. diff --git a/packaging/vendor/reac-pw-headers/reac_role_cfg.h b/packaging/vendor/reac-pw-headers/reac_role_cfg.h index 7420f4f..0b38d18 100644 --- a/packaging/vendor/reac-pw-headers/reac_role_cfg.h +++ b/packaging/vendor/reac-pw-headers/reac_role_cfg.h @@ -2,8 +2,7 @@ // Copyright (C) 2026 Pau Aliagas /* reac_role_cfg — the `reac.cfg.role` live control, the ROLE half of runtime - * config alongside reac_rate_cfg's pace half - * (2026-08-26-reac-runtime-config, in the openmixer tree). + * config alongside reac_rate_cfg's pace half. * * THE VOCABULARY — write side and answer side — IS libreac's . This * header names its macros and spells none of the strings (libreac review 2026-09-25, diff --git a/src/reac_ctrlblk.c b/src/reac_ctrlblk.c index 5b5172d..9c90459 100644 --- a/src/reac_ctrlblk.c +++ b/src/reac_ctrlblk.c @@ -392,7 +392,7 @@ size_t reac_ctrl_box_frame_len(int n_ch) * The loop itself moved to libreac on 2026-07-29 as reac_braid_encode() * (): it was byte-for-byte the same loop as the downstream * encoder's, which is the point — the braid is the REAC wire format in BOTH - * directions (task #108, the ex-"FPGA scramble" of task #61), and it is the + * directions, and it is the * exact inverse of reac_upstream_decode(). What stayed here is everything the * layout is not: the 32-byte control block, its two nested checksums, the * box-model matrix and the frame envelope, all of which are handshake state @@ -997,7 +997,7 @@ static const struct ctrl_frame CTRL_FRAMES[CTRL_FRAME_COUNT] = { .cksum = CKSUM_BLOCK, .len = LEN_ARG_WIDTH }, /* The established unicast upstream: the 32-byte descriptor [18:50] = 00 7a per * slot (16 slots), as the real box, over audio in the BRAIDED layout (resolved - * 2026-07-10, task #108). FILLER (type 00 00) is checksum-exempt. */ + * 2026-07-10). FILLER (type 00 00) is checksum-exempt. */ [CTRL_UPSTREAM_FILLER] = { .type0 = 0x00, .type1 = 0x00, .block = BLOCK_DESC, .cksum = CKSUM_NONE, .len = LEN_ARG_WIDTH, .audio = 1 }, diff --git a/src/reac_disco.c b/src/reac_disco.c index b1552dc..8cb7387 100644 --- a/src/reac_disco.c +++ b/src/reac_disco.c @@ -266,7 +266,7 @@ int reac_disco_table_observe(struct reac_disco_table *t, e->last_seen_ns = now_ns; /* liveness always advances… */ int changed = 0; /* …but only a real upgrade is a CHANGE. A re-sighting that bumped seq would - * have openmixer re-reading an identical list at wire rate. Facts only ever + * have a consumer re-reading an identical list at wire rate. Facts only ever * sharpen: an ambiguous role or an unidentified model is replaced once it is * known, never downgraded back by a later ambiguous frame. * diff --git a/src/reac_grant.c b/src/reac_grant.c index 6c60baa..8350fe6 100644 --- a/src/reac_grant.c +++ b/src/reac_grant.c @@ -47,8 +47,8 @@ * SO: we keep pinning the OBSERVED base per width. Reasons, in order: (a) it predicts * all 42 rows and is the only placement each real box is known to have accepted; * (b) the S-1608's 0x20 origin is already baked into the rest of the stack as that - * model's head-amp CH base (reac_ctrl.h's head-amp block comment, openmixer's - * channel mapping), so choosing differently here would silently desync them; + * model's head-amp CH base (reac_ctrl.h's head-amp block comment, and the + * consumers' channel mapping), so choosing differently here would silently desync them; * (c) a wrong-but-self-consistent allocation is exactly the failure we are fixing — * being consistent with the REST OF THE WORLD is the whole point. * diff --git a/src/reac_upstream.c b/src/reac_upstream.c index 0d06c4b..6de77f0 100644 --- a/src/reac_upstream.c +++ b/src/reac_upstream.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2026 Pau Aliagas // Braid layout per norihiro/obs-h8819-source convert_to_pcm24lep (GPL-3.0-or-later), -// confirmed for the S-1608/S-0808 upstream against rig captures (reac-pw task #108). +// confirmed for the S-1608/S-0808 upstream against rig captures. #include "reac/reac_upstream.h" diff --git a/tests/test_reac.c b/tests/test_reac.c index 24cc896..c778743 100644 --- a/tests/test_reac.c +++ b/tests/test_reac.c @@ -79,7 +79,7 @@ int main(void) * has not stopped anyone converting one into the other. What libreac * publishes is SENSITIVITY in dBu and it runs the other way from gain: * against a 0 dBu reference the same control reads gain = 10 + value, where - * openmixer publishes 0..55 dB. That is a 10 dB offset between two live + * a console may publish 0..55 dB. That is a 10 dB offset between two live * consumers, and ground truth is the M-200's own SENS display, unread. These * two assertions go red the moment libreac's own zero moves, whichever way * the dispute is closed - which is the point: it gets closed on both sides diff --git a/tests/test_topo_hears_vlans.c b/tests/test_topo_hears_vlans.c index fd3b80c..6682c06 100644 --- a/tests/test_topo_hears_vlans.c +++ b/tests/test_topo_hears_vlans.c @@ -28,8 +28,7 @@ * 1-4094 flood that amendment rejects. * * THE ORDER OF THE ARMS IS THE DESK-SAFETY RULING, NOT A CONVENIENCE. enp131s0's native - * VLAN is 11 and the S-4000 on it is heard UNTAGGED (measured 2026-09-10, recorded in - * openmixer's design notes of that date). reac_topo_is_trunk() decides + * VLAN is 11 and the S-4000 on it is heard UNTAGGED (measured 2026-09-10). reac_topo_is_trunk() decides * whether that parent may be driven at all (a trunk parent is never driven: it receives every * sub-interface's frames untagged and would put a second master on one box). So a non-REAC * tag MUST NOT make a parent a trunk, or one STP frame from the switch would unserve the diff --git a/tests/test_upstream.c b/tests/test_upstream.c index c1b9599..1ded239 100644 --- a/tests/test_upstream.c +++ b/tests/test_upstream.c @@ -11,7 +11,7 @@ * 2026-07-24; 1206 = 52 + 32*36 + the +2 CRC trailer after the end marker, * with a 1204 B trailerless variant on the same wire). * The expected planar PCM tables were produced by the capture-side analysis - * that resolved the layout (2026-07-10, task #108): the upstream audio region + * that resolved the layout (2026-07-10): the upstream audio region * uses the obs-h8819 even/odd channel-pair byte BRAID (even ch = group bytes * 3,0,1; odd ch = 4,5,2 as LE lo/mid/hi), NOT the M-5000 downstream's plain * LE sample-major layout. Verified against the loud wired capture: the music diff --git a/tools/README b/tools/README index 407307d..c884468 100644 --- a/tools/README +++ b/tools/README @@ -2,5 +2,5 @@ m200-compare.sh -- tap the mirror port, capture, run corpus_check/scene-on-wire. recover-scene.py/pace-compare.sh, and diff a real M-200's master traffic against reac-pw's own (wire_census/group_map_scan/ctrl_delta) into m200-vs-reac-pw.md. Subcommands: tap | capture | analyse | diff | all. `--help` is the usage banner -at the top of the file; the fixture pair to try it on lives under -~/Devel/audio/reac-captures/captures/m200i-s1608-48k-*. +at the top of the file; the fixture pair to try it on is two captures of an +M-200 with an S-1608 at 48k (the real desk, and ours). diff --git a/tools/conformance-tap-silent.sh b/tools/conformance-tap-silent.sh index 446efec..1554dc9 100755 --- a/tools/conformance-tap-silent.sh +++ b/tools/conformance-tap-silent.sh @@ -3,8 +3,7 @@ # Copyright (C) 2026 Pau Aliagas # # THE TAP ROLE NEVER TRANSMITS. No announce, no join, no grant, no seglock, no -# TX socket opened at all — openmixer's master-arbitration spec, eighth -# amendment (2026-09-13), and the courtship trials of 2026-09-12 that forced it: +# TX socket opened at all — the courtship trials of 2026-09-12 forced it: # a courting slave of ours kept a real desk's S-1608 from enrolling for 180 s, # and a granted one blocked it outright. # diff --git a/tools/m200-compare.sh b/tools/m200-compare.sh index cc7ba23..daac4b8 100755 --- a/tools/m200-compare.sh +++ b/tools/m200-compare.sh @@ -43,8 +43,8 @@ # # Fixture test (proves the pipeline before rig day, no hardware needed): # tools/m200-compare.sh diff \ -# --m200 ~/Devel/audio/reac-captures/captures/m200i-s1608-48k-mirror__real-m200-s1608-coldboot-2026-07-11.pcap \ -# --ours ~/Devel/audio/reac-captures/captures/m200i-s1608-48k-clean__reacpw-s1608-establish-2026-07-18.pcap \ +# --m200 captures/m200i-s1608-48k-mirror__real-m200-s1608-coldboot-2026-07-11.pcap \ +# --ours captures/m200i-s1608-48k-clean__reacpw-s1608-establish-2026-07-18.pcap \ # --out /tmp/m200-vs-reac-pw.md set -u SELF=$(cd "$(dirname "$0")" && pwd) diff --git a/transport/src/reac_conf.c b/transport/src/reac_conf.c index 421e708..65d6e98 100644 --- a/transport/src/reac_conf.c +++ b/transport/src/reac_conf.c @@ -100,7 +100,7 @@ static enum reac_conf_layer lookup_bare(const char *key, const char *home, /* Layer 5 — the last resort, and the reason this function exists rather than * a getenv. It is what makes a standalone install work with no console - * present; openmixer overrides it from above and shows the user the result. + * present; a console overrides it from above and shows the user the result. * It is the FLOOR of the stack, not a stray duplicate. */ snprintf(path, sizeof path, "%s/.config/openmixer/reac.env", home); if (reac_conf_read_file(path, key, out, cap)) diff --git a/transport/src/reac_ifname.c b/transport/src/reac_ifname.c index 8350dde..58eeb53 100644 --- a/transport/src/reac_ifname.c +++ b/transport/src/reac_ifname.c @@ -3,18 +3,17 @@ /* reac_ifname — see reac_ifname.h. * - * WHY realpath(), NOT A SINGLE readlink() — openmixer's classifyBus (this module's starting - * point) does the latter (`readlinkSync(devicePath)`, checking the result for "/usb"/"/pci"). + * WHY realpath(), NOT A SINGLE readlink() — a single readlink() of the device link, checking + * the result for "/usb"/"/pci", is the obvious approach, and it fails. * Measured on a real box, 2026-09-03: `readlink("/sys/class/net/enp128s20f0u2/device")` * returns `../../../4-2:1.0` — a string that contains NEITHER substring. `/sys/class/net/ * ` is ITSELF a symlink (to `.../devices//net/`), so a single - * readlink() on the `device` entry inside it only ever sees the LAST hop, never the bus path - * classifyBus greps for; the same measurement on `enp131s0` (PCI) and `wlp128s20f3` (PCI, - * wireless) gave `../../../0000:83:00.0` and `../../../0000:80:14.3` — same shape, same - * miss. openmixer's own test fixtures fabricate the symlink TARGET string directly - * (`symlinkSync('/some/usb/path', ...)`), which never exercises a real kernel one-hop link - * and so could not have caught this (false-signals #2: a self-consistent suite proves the - * suite, not the filesystem). realpath() asks the kernel to walk the WHOLE chain and hands + * readlink() on the `device` entry inside it only ever sees the LAST hop, never the bus path; + * the same measurement on `enp131s0` (PCI) and `wlp128s20f3` (PCI, wireless) gave + * `../../../0000:83:00.0` and `../../../0000:80:14.3` — same shape, same miss. A test that + * fabricates the symlink TARGET string directly never exercises a real kernel one-hop link + * and so cannot catch this (a self-consistent suite proves the suite, not the filesystem). + * realpath() asks the kernel to walk the WHOLE chain and hands * back the canonical absolute path, which does carry the bus path * ("/sys/devices/pci0000:80/0000:80:14.0/usb4/4-2/4-2:1.0") — confirmed against this box's * real NICs; see tests/test_reac_ifname.c. */ diff --git a/transport/src/reac_pacer.c b/transport/src/reac_pacer.c index 9c5cb4c..aeb87e0 100644 --- a/transport/src/reac_pacer.c +++ b/transport/src/reac_pacer.c @@ -536,7 +536,7 @@ void reac_pacer_rx_ingest(struct reac_pacer *p, const uint8_t *frame, size_t len * door — here — and in no parser. */ len = reac_frame_clean_len(len); - /* PASSIVE DISCOVERY first, and independently (task #178). The socket is already + /* PASSIVE DISCOVERY first, and independently. The socket is already * promiscuous (see the PACKET_ADD_MEMBERSHIP rationale below), so every 0x8819 * frame on this segment arrives here — including the ones the master classifier * is about to discard as none of its business: another master's broadcast @@ -1165,8 +1165,8 @@ int reac_pacer_health_poll(struct reac_pacer *p, uint64_t now_ns, return 1; } -/* ---- live head-amp control handoff (task #203) --------------------------- * - * A controller (openmixer) sets a per-channel phantom/pad/sens prop on the +/* ---- live head-amp control handoff --------------------------- * + * A controller sets a per-channel phantom/pad/sens prop on the * master node; the change must reach the box preamps at runtime. The head-amp * send TABLE (reac_headamp_tx) is read AND advanced by the RT pacer thread every * emit (reac_headamp_tx_next clears dirty flags + walks the re-assert sweep), so @@ -1640,7 +1640,7 @@ static void *pacer_loop(void *arg) reac_pacer_rx_ingest(p, rxbuf, (size_t)rn); } - /* Bound the graph->wire buffering (task #152). The graph clock can run + /* Bound the graph->wire buffering. The graph clock can run * marginally fast vs. the fixed wire clock, walking the ring depth up over * long uptime toward the ~250 ms cap. As the ring's consumer (we own tail) * drop the OLDEST excess back to TARGET once depth exceeds HIGH — latency @@ -1700,14 +1700,14 @@ static void *pacer_loop(void *arg) p->last_chanmap_ns = mono_ns(); /* hb-after-walk latency base */ /* Absorb any LIVE head-amp control changes a controller pushed since the - * last slot (task #203). Drained on THIS thread so the head-amp table stays + * last slot. Drained on THIS thread so the head-amp table stays * single-writer here: reac_pacer_headamp_set only enqueues; we apply. Run * every slot regardless of FSM state so a change is already in the table the * instant we reach an ESTABLISHED FILLER slot below — cheap when the ring is * empty (two atomic loads). */ reac_pacer_headamp_drain(p); - /* MASTER head-amp overlay (task #155), STRICTLY GUARDED so it can never + /* MASTER head-amp overlay, STRICTLY GUARDED so it can never * touch establishment: it only ever OVERWRITES a FILLER slot, and only once * ESTABLISHED. It never replaces a PROBE/GRANT/CHANMAP/CFEA/ENROLL frame, so * the verified grant/chanmap/announce cadence (reac_master_next) is @@ -2034,7 +2034,7 @@ int reac_pacer_open(struct reac_pacer *p, const struct reac_pacer_cfg *cfg) ccfg_buf.console_field = reac_pace_code(cfg->fps); reac_master_init(&p->master, p->src, &ccfg_buf, cfg->fps); - /* MASTER head-amp DMX send table (task #155). Off unless the caller passes at + /* MASTER head-amp DMX send table. Off unless the caller passes at * least one setting: an all-unset table's next() always returns 0, so the * downstream stays byte-identical to a no-head-amp master. Loaded here (before * the pacer thread starts) so the table is single-writer from the RT thread on diff --git a/transport/src/reac_slave.c b/transport/src/reac_slave.c index a418f94..23d110e 100644 --- a/transport/src/reac_slave.c +++ b/transport/src/reac_slave.c @@ -905,7 +905,7 @@ static void *slave_loop(void *arg) fprintf(stderr, "reac_slave: %sSTATE %s\n", s->tag, st_name[prev_state]); while (atomic_load_explicit(&s->running, memory_order_acquire)) { - /* State-transition trace (task #130): the FSM's phase is the ground truth + /* State-transition trace: the FSM's phase is the ground truth * for establishment — log every change so a live run shows FLOOD -> * COLDCONNECT -> (grant) TX_MUTE -> ESTABLISHED and any DROP/re-flood flap. */ if (s->fsm.state != prev_state) { @@ -959,7 +959,7 @@ static void *slave_loop(void *arg) fprintf(stderr, "reac_slave: head-amp record (ch %u param %u) " "DROPPED — inner checksum bad\n", p.ch, p.param); } else { - /* APPLY it as our INPUT GAIN (task #202): a virtual box has no + /* APPLY it as our INPUT GAIN: a virtual box has no * preamp, so the console's SENS/PAD must scale the audio we send * upstream, or the master's head-amp is inert. Updates per-input * state + precomputes the linear gain off the RT path; returns our