Sync multichannel audio input: capture path and qualification
14 September 2026 · Research report · Revision 2 · Native audio input
Sync implements native audio capture through RtAudio and transfers interleaved float32 samples to Noisedeck through its authenticated localhost connection. The browser adapter supplies discrete channels to an AudioWorklet and the existing band and raw-signal analysis. The implementation is included in native preview 0.2.68 and SDK 0.3.0. E1 E2
The retained qualification consists of two short Linux native probes, a separate 30-second Linux-to-Chromium integration run, synthetic integration tests, and cross-platform build and package checks. The browser run retained channel identity but reported dropped frames. Physical AudioFuse capture, Windows WASAPI capture, signed installed macOS audio permission, and sustained simultaneous audio/video operation remain unqualified. This editorial revision contains no new capture measurements. E1 E2
1. Scope and source revisions
The requirement is 1–32 independently selectable input channels per native source, with stable channel order during capture and signed samples available to the existing raw-control calculation. The application must expose the opened source's actual channel count. It must not synthesize additional channels when a driver exposes fewer inputs. Audio output, recording, arbitrary channel remapping, native video input, network audio distribution, and sample-accurate audio/video synchronization are outside this implementation. E3 E4
Table 1. Source and release identifiers
| Component or record | Identifier and scope |
|---|---|
| Native companion and SDK | 1972af1ce3f0d14054f3693e250c668aff536884; exact source of native preview 0.2.68 and SDK 0.3.0, and of the final x86_64 native probes. |
| Noisedeck feature | 3ac22df8a8dcc5450bee25e48350a200137bbb96; tested and deployed application integration. This identifier does not convert an earlier capture receipt into a new test of that revision. |
| Retained research record | 7e067e6d1ecf96eb864cca0923db1b25cfad1c7e; repository revision used for the qualification JSON and technical notes cited here. |
| Browser capture receipt | 2026-09-14T03:35:12.370Z; 30-second production RtAudio/JACK route through SDK 0.3.0 into Chromium and Noisedeck. |
Companion and SDK version numbers are independent. A client must check that an audio provider with receive direction is selected and available. A product version alone is insufficient for capability detection. E2 E3
2. Browser capture boundaries
The reported interface exposed many native input ports while its Chromium capture stream exposed two. Source inspection identified restrictions at device capture and at a later MediaStream-to-Web-Audio conversion. The two-channel result depends on the selected implementation path. It is not a general limit on the number of channels in a Web Audio graph. Source checks date from 13 September 2026; available source receipts were refreshed on 14 September. E5
Table 2. Browser boundaries examined
| Boundary | Observed source behavior | Consequence |
|---|---|---|
| Linux PulseAudio | GetInputStreamParameters constructs a stereo layout. | A requested count of 32 does not change that native input layout. Source |
| Linux ALSA | Input parameters also select stereo. | Switching between the examined Linux backends alone does not provide a wide capture stream. Source |
| macOS | The initial input layout is stereo. The device layout replaces it only when the reported count is at most two. | A multichannel CoreAudio interface can still yield a stereo browser track. Source |
| MediaStream audio sink | The Web Audio sink initializes separate stereo parameters. | Channels can be lost after capture during stream conversion. Source |
| Web Audio processing graph | Discrete interpretation, channel splitters, and worklets support multichannel processing. | Samples supplied independently of restricted capture paths can remain separate in the graph. Specification |
Noisedeck already requests an ideal count of 32 and disables echo cancellation, noise suppression, and automatic gain control. Its TrackProcessor bridge addresses the later conversion boundary. Neither configuration can recover inputs discarded during capture. The initial synthetic MediaStream destination experiment encountered a separate eight-channel fixture limit; it did not establish the limit of an independently supplied worklet. Capture constraints E5 E6
3. Alternative designs
Table 3 records design assessments for independent audio and signed control inputs. The alternatives were not subjected to a common performance comparison. Their disposition follows the capture boundary, implementation scope, and deployment requirements. E5
Table 3. Capture and transport alternatives
| Approach | Assessment | Disposition |
|---|---|---|
| Capture constraints, splitters, worklets, speech-processing controls | Applicable where the track already contains the required channels. Cannot reconstruct discarded channels. | Retain the existing browser improvements; use native capture for the unresolved boundary. |
| Another browser engine | Requires an operating-system and physical-device matrix. Changing engines does not resolve the Chromium/Electron requirement. | No browser compatibility claim established by this investigation. |
| Separate mono/stereo virtual endpoints | Can expose selected inputs through an operating-system graph. Adds endpoint setup, capture sessions, naming, and clock-alignment requirements. | Specialist workaround. PipeWire can also provide a native JACK route. PipeWire reference |
| Electron native addon | A native addon can replace device capture. A wrapper retaining Chromium capture retains that path's restrictions. | Would add a desktop-specific adapter. Sync provides a common local protocol for browser clients. |
| Chromium patch or fork | Both native capture and stream conversion need examination. Distribution would require maintaining browser builds and updates. | Possible upstream work; not a dependency of the native companion implementation. |
| Native feature extraction | Sending levels or signed statistics at visual-update cadence could reduce traffic. It would duplicate analysis semantics and remove original-sample access. | Deferred pending measured transport and processing costs. |
| Native PCM through Sync | Preserves sample values and channel identity while reusing pairing, transport, and browser analysis. Requires bounded buffering and discontinuity handling. | Implemented in the released preview. |
| DAW plugin producer | Could provide stems or control signals when the DAW owns the interface. Requires plugin distribution and host testing. | Possible additional producer; not implemented. |
| WebUSB driver | WebUSB protects the USB Audio interface class. A vendor-specific interface would require a separate device integration. | Not a general audio-interface workaround. Protected interfaces |
| WebRTC, encoded media, or multiplexing into stereo | Still requires an unrestricted producer. Adds fidelity, clock, and recovery considerations for signed or near-DC inputs. | Not selected for the initial localhost PCM route. |
4. Native capture and ownership
RtAudio 6.0.1 is pinned to source revision b4f04903312e0e0efffbe77655172e0f060dc085 with an archive checksum. Sync implements device enumeration, capture lifetime, buffering, protocol encoding, and browser integration around that dependency. The package notices include its license. Build definition Pinned dependency
The selected backend is CoreAudio on macOS, WASAPI on Windows, and ALSA or JACK on Linux. The initial Windows build does not enable ASIO. The Linux release includes the JACK path; PipeWire supplies JACK compatibility through pw-jack. The installed service must start through that wrapper to use it. Installing the compatibility package alone does not modify a running service. E3 E5
Opening a source selects the first min(inputChannels, 32) channels at the device's reported current or preferred sample rate. Physical inputs above 32 cannot be selected, and arbitrary channel maps are not implemented. Source identifiers derive from backend and device name. Duplicate names within one backend are omitted because the current API does not provide a persistent hardware identifier that distinguishes them. E3
Capture belongs to the authenticated connection that opened it. Foreign reads and closes are rejected. Device open and capture work are separated from the control-loop work; pending cleanup retains the connection until completion. The client pulls bounded packets rather than receiving an unbounded pushed stream. Slow-open cleanup and ownership checks have separate fixture coverage. E3 E6
The protocol-v1 capability catalog has four entries for compatibility with existing video clients. Normal platform defaults leave room for audio. An advanced command-line selection of all four video providers disables audio and emits a diagnostic. Provider registration
5. Transport format and buffering
Audio uses authenticated listAudioSources, openAudioSource, readAudioSource, and closeAudioSource control requests. Discovery supplies identifiers, names, channel counts, and sample rates. Open returns the actual format. Reads return binary sample packets; errors remain bounded JSON responses. The SDK gives open a 60-second deadline to accommodate operating-system permission. Ordinary reads retain the configured control deadline. E4
Table 4. Audio packet layout
| Byte offset | Type or size | Field |
|---|---|---|
| 0 | 4 bytes | ASCII NAUD magic |
| 4 | uint16 | Packet version, currently 1 |
| 6 | uint16 | Channel count, 1–32 |
| 8 | uint32 | Sample rate, samples per second per channel |
| 12 | uint32 | Frame count, 0–480 |
| 16 | uint64 | First audio-frame cursor |
| 24 | uint64 | Cumulative dropped-frame count |
| 32 | frames × channels × 4 bytes | Interleaved float32 samples |
Numeric fields are little-endian. The maximum packet size is 32 + 480 × 32 × 4 = 61,472 bytes, below the server's 64 KiB queued-write limit with WebSocket framing. The SDK represents uint64 cursors as BigInt and rejects invalid lengths, unsupported formats, and nonfinite incoming samples. E4
The browser converts the interleaved samples into transferable channel planes. The worklet has a 4,096-frame ring and a 512-frame prefill. At 48 kHz, those counts correspond to 85.33 ms of capacity and 10.67 ms of prefill. Neither value is a measured end-to-end latency. The AudioContext rate must match the received rate; this path has no resampler or shared audio/video clock. E5
At 32 channels and 48 kHz, the sample payload is 32 × 48,000 × 4 = 6,144,000 bytes/s, excluding transport overhead. A detected native cursor gap or change in the native drop counter resets worklet state. A browser worklet underrun holds the last sample until data can resume. These behaviors differ and must be measured separately. E4 E5
6. Browser integration and permissions
Noisedeck's audio automation provides Connect Sync audio and lists native source names with a Sync suffix. Native identifiers use the sync-audio: prefix. Compiled audio requirements determine which inputs are opened, and removal of the final consumer closes the source. Native selection bypasses getUserMedia. The browser output is connected through zero gain; this input controls visual parameters rather than providing speaker playback. E5 E6
The channel selector uses the actual opened count. Existing low, mid, high, volume, and raw calculations remain in use. Raw zero maps to the midpoint between the visual parameter's minimum and maximum. Preservation of signed samples does not establish that a physical interface is DC-coupled or compatible with a particular control voltage. Audio response reference
Saved video-origin tokens do not automatically grant audio access. Native audio discovery and capture require explicit successful pairing during the current daemon lifetime. Restarting Sync requires fresh audio approval. Operating-system microphone permission is separate from origin pairing. The macOS audio helper requests that permission on open. Audio authorization macOS permission
Audio and video share the companion and local pairing infrastructure, but use different data paths. Video carries browser frames to native receivers; audio carries native samples into the browser. Audio frame cursors are not timestamps in a shared video clock domain. E3 E4
7. Measurement method
The native probe opens a separate JACK software source that generates 32 distinguishable constant signed signals. For channel n, numbered 1–32, the expected value is (−1)^(n+1) × n / 64. Odd channels are positive and even channels are negative. This pattern detects channel permutation, duplication, loss, sign changes, and altered sample values along the tested route. It does not measure a physical converter's frequency response, DC behavior, crosstalk, or noise. Source generator E1
One audio frame contains one sample from every input channel. The native probes run for a configured 2,000 ms, report received frames, exclude 1,024 startup frames from pattern validation, and count incorrect samples, cursor discontinuities, and native ring drops. The two final probes ran on Ubuntu 24.04 x86_64, separately through JACK and PipeWire's JACK compatibility path. E1 E2
The separate browser acceptance run used an Ubuntu 24.04 ARM64 container on a macOS host and Chromium 148.0.7778.96. Its route was JACK source → production RtAudio capture → Sync daemon → SDK 0.3.0 → Noisedeck worklet → channel selection and raw analysis. It checked all 32 selector choices and sampled the signed raw values once per second during a configured 30-second interval. All received packets subject to pattern validation were checked across the channels. The aggregate records incorrect packets rather than an incorrect-sample total. E1 E6
The browser test used isolated test authentication; installed approval dialogs were not exercised. Native video was inactive. The container relay was a test arrangement, with the browser and daemon on separate sides of the host/container boundary. A normal installation runs both on one host. These conditions constrain the interpretation of the results. E1 E5 E6
8. Results
Table 5. Retained 32-channel, 48 kHz captures
| Route | Configured duration, s | Received frames | Validated frames | Mismatch count and unit | Native dropped frames |
|---|---|---|---|---|---|
| JACK, native probe; Ubuntu x86_64 | 2 | 95,232 | 94,208 | 0 samples | 0 |
| PipeWire through pw-jack, native probe; Ubuntu x86_64 | 2 | 96,192 | 95,168 | 0 samples | 0 |
| JACK → Sync → Chromium/Noisedeck; Ubuntu ARM64 container/macOS host | 30 | 1,481,664 | 1,480,640 | 0 packets | 1,024 |
Both native probes reported zero cursor discontinuities. The browser receipt contains 4,330 packets and no separate aggregate discontinuity count. Every test excludes 1,024 startup frames from its pattern validation. The frame totals include the test's capture and setup timing; they are not used here to derive a precise throughput estimate from the configured duration. E1
The browser run reported 1,024 native ring drops, equivalent to 1,024 / 48,000 = 0.02133 s of missing audio in total. This quantity is not transport latency. Zero mismatched packets establishes consistency of the validated received data; it does not establish continuity across the missing frames. The once-per-second raw checks also do not form a continuous trace of worklet output. E1
Figure 1. Retained signed values by input channel in the browser acceptance record. The plotted observations match the source pattern defined in section 7. The figure is not a time series. Full-size figure. E1
The earlier 13 September run validated 1,479,072 frames, with zero mismatched packets and 1,088 dropped frames. It is a separate historical experiment; its interval is not combined with the current run to imply a longer test. E7
The first container-relay attempt delivered 130,560 frames over roughly 12 seconds and reported 434,144 drops. It used 8 KiB transfer chunks with Nagle enabled, and its worklet repeatedly reset before reaching the expected raw values. A repeat using 64 KiB chunks and TCP_NODELAY on both relay sockets passed. Both settings changed together, so their individual causal contributions were not isolated. Sync already enabled TCP_NODELAY on its accepted sockets; the correction affected the test relay. E7 Socket configuration
9. Platform and release qualification
The exact native source passed all 11 jobs in the cross-platform CI matrix. The separate Windows camera workflow also passed. These workflows establish their recorded build, packaging, lifecycle, and video outcomes; they do not turn an absent audio endpoint or an untested physical interface into a capture result. E2
Table 6. Platform evidence and missing qualification
| Platform or gate | Retained result | Not established |
|---|---|---|
| macOS / CoreAudio | Build, native, JavaScript, packaging, and loopback checks passed. Discovery listed one built-in microphone channel at 48 kHz. | Physical capture, signed installed audio permission, denied/revoked permission recovery, and physical multichannel input. |
| Linux / JACK and PipeWire | The final x86_64 probes passed through both software-source driver paths. A separate production-driver route reached Chromium with 32 channels and the drops shown in Table 5. | Physical interface compatibility, direct ALSA ownership behavior, sustained combined audio/video operation. |
| Windows / WASAPI | Build/runtime and package gates passed. The audio inventory in the camera workflow contained zero sources; selected-source capture was skipped. | Any WASAPI PCM capture or physical multichannel audio qualification. |
| Physical AudioFuse | No retained capture result. | Opened format, channel mapping, signal identity, physical raw behavior, and recovery. |
| Simultaneous audio and video | Credential coexistence cases passed. Audio was inactive in the native video acceptance runs. | Sustained combined throughput, latency, resource use, and continuity. |
Local automated checks retained 153 SDK/package passes, 247 JavaScript unit passes, 22 macOS native test groups, and 30 macOS real-loopback passes. Noisedeck feature source passed 902 Node tests with one existing skip and 10 browser tests. These counts describe separate software suites; they are not physical-device qualification counts. E2 E6
Seven Noisedeck browser cases use the standalone synthetic server: four channel-count cases at 1, 2, 8, and 32; source independence; ownership and slow-open cleanup; and a missing source without microphone fallback. Three additional cases test video/audio credential propagation, fresh audio consent with video recovery, and stale consent failure after credential replacement. These ten cases do not constitute a new production-driver or combined-load capture. E6
Native preview 0.2.68 and SDK 0.3.0 were published from the source in Table 1. Retained public byte checks matched expected installer and SDK sizes and SHA-256 hashes. Noisedeck preview deployment, promotion, production deployment, and health checks passed. Physical audio and combined-load claims remain subject to Table 6. E2
10. Limitations
- The wide-input tests use software-generated signals. They do not qualify an AudioFuse or another physical interface, ADC, input profile, or driver version.
- The two native probes and separate browser run are short tests. They do not establish long-session reliability or uninterrupted delivery. The browser drop count is nonzero.
- The raw observation cadence is one second. No continuous per-channel worklet-output trace, CPU profile, memory-growth measurement, or calibrated end-to-end latency result is retained.
- The container relay introduces an additional transport arrangement. Its failure and correction cannot be generalized into a measured performance result for a normal installed companion.
- The browser run used isolated authentication. Installed permission behavior remains distinct from protocol and credential tests.
- The initial implementation uses the first 32 reported channels, has no arbitrary channel map or resampler, and has no shared sample-accurate audio/video clock.
- WASAPI capture, signed installed macOS audio permission, physical AudioFuse input, and sustained combined audio/video use remain pending.
These limits follow the retained experiment conditions and implemented bounds. No additional hardware or performance qualification was conducted for this document revision. E1 E2 E3 E6
11. Qualification plan
The next experiments must retain the same distinction between channel correctness, continuity, installed permission, and video delivery. Table 7 defines the required observations. These are planned actions, not completed results.
Table 7. Next qualification actions
| Action | Configuration and observations | Acceptance or decision |
|---|---|---|
| Installed capture on each platform | Record installer, OS, backend, interface, driver, opened count, and rate. Exercise allow, deny, revoke, and restart. Windows requires a non-empty WASAPI inventory; macOS requires the signed installed bundle. | Retain actual source-open and sample results, with correct consent and documented recovery. Build or camera success is not a substitute. |
| Physical AudioFuse channel identity | Apply distinguishable signals to inputs 1, 2, 3, 8, 16, and 32 where exposed, then sweep all available inputs. Record interface profile and routing. Test signed control signals only within the interface's supported electrical behavior. | Only the selected input changes its assigned control. Record every mapped input and any unavailable channels. |
| Device and session recovery | Unplug/replug, busy device, rate change, duplicate name, final-consumer removal, and daemon restart. Record errors and resulting capture state. | No unintended input substitution, foreign capture access, or retained capture after the final consumer is removed. Recovery must follow the documented procedure. |
| Combined audio/video measurement | Collect an audio-only baseline and a matched combined run. A proposed first long interval is 30 minutes at 32 channels/48 kHz. Fix video resolution, provider, receiver, and target rate from one identified video test. Retain gaps, drops, CPU, memory, video delivery, and a documented latency method. | A continuity claim requires zero mismatches, unexplained cursor gaps, and reported drops in the measured interval. Any nonzero values remain explicit. Define latency and resource targets before the comparison. |
| Bottleneck-dependent follow-up | If measured sample-transport cost dominates, compare pooling or native feature messages with fixed analysis semantics. If interface ownership blocks use, evaluate a DAW producer. Recheck improving browser paths with the same identity test. | Retain a change only against its measured target. An allocation reduction or mean rate alone does not establish improved continuity. |
Video I/O remains a parallel qualification effort with its own delivery criteria. Relevant records are the bounded camera acquisition report, the video research plan, and the 0.2.68 video release measurements. None supplies simultaneous native-audio evidence.
12. Reproducibility
The public normalized measurements identify native probe results, browser environment, channel values, frame counts, and qualification limits. The source receipts reference the qualification record at an immutable repository revision. Both JSON files are byte-identical to the first publication. This revision replaces the exposition and layout and removes the figure's headline treatment. E1 E5
Reproduction uses the isolated JACK source, the production daemon, and the native-audio browser acceptance script. The source generator and test assertions are linked below. The full instructions specify build commands, separate foreground processes, test-origin authentication, expected source name, and container relay settings when needed. Test authentication is confined to that isolated setup. Reproduction procedure Acceptance script Signal source
Generated artifacts, original receipts, the preceding publication, and verification outputs remain in the experiment archive outside Git. The served bundle retains its existing address, and its checksum manifest identifies this revision. User setup and recovery procedures remain on the audio guide and troubleshooting page.
Evidence references
- E1. Normalized measurements,
nativeProbes,browserAcceptance, andqualification. Frame counts, sample pattern, environment, duration settings, and retained limits. Original record: audio-qualification.json. - E2. Qualification and release record,
ciQualification,localChecks, andreleasePreparation. Cross-platform source CI; Windows camera and audio inventory; Installer publication; SDK 0.3.0. - E3. Native enumeration and capture; Capture contract; Ownership, control loop, and authorization; Capability registration. Exact native source from Table 1.
- E4. PCM encoder; Control protocol; SDK decoder and operations; Wire-format tests; Video protocol.
- E5. Native audio research and implementation notes. Browser-boundary review, alternatives, buffering, platform setup, and scope. Retained source references and content digests.
- E6. Standalone synthetic fixture; Production-driver browser assertions; Loopback and consent checks; Retained Noisedeck case list and test outcomes.
- E7. Earlier browser acceptance; Failed container-relay diagnostic. Separate historical measurements, 13 September 2026.