Problem
requestBeatAtTime waits for the next quantum boundary whenever numPeers() > 0. That's correct when peers are musical participants, but wrong when the only other peer is a passive Link Audio receiver (e.g. a mixer that just subscribes to channels). The performing app now has a launch delay for a peer that has no transport, no sequencer, and no need for phase alignment.
Workarounds don't fit:
- Disabling launch-quantize on the performing app breaks legitimate sync with real peers.
- Inferring "passive" from sink/source topology is unreliable — a sampler-with-sequencer is source-only but still needs alignment.
The opt-out belongs on the peer that knows its own intent.
Proposal
Add a per-peer flag on BasicLink:
void setSyncContributor(bool contributes);// default: true
bool isSyncContributor() const;
requestBeatAtTime (and equivalent launch-quantize code paths) treats the session as if alone when every other peer has isSyncContributor() == false. If any other peer still contributes, current behavior is preserved.
This requires carrying the flag in the peer announcement. Default-true keeps existing apps unchanged.
Use case
A receive-only Link Audio mixer joins a session to consume another peer's published channels. With this flag set to false on the mixer, pressing Play on the performing peer fires immediately. Add a third, contributing peer and quantized launch resumes automatically.
Problem
requestBeatAtTime waits for the next quantum boundary whenever numPeers() > 0. That's correct when peers are musical participants, but wrong when the only other peer is a passive Link Audio receiver (e.g. a mixer that just subscribes to channels). The performing app now has a launch delay for a peer that has no transport, no sequencer, and no need for phase alignment.
Workarounds don't fit:
The opt-out belongs on the peer that knows its own intent.
Proposal
Add a per-peer flag on BasicLink:
requestBeatAtTime(and equivalent launch-quantize code paths) treats the session as if alone when every other peer hasisSyncContributor() == false. If any other peer still contributes, current behavior is preserved.This requires carrying the flag in the peer announcement. Default-true keeps existing apps unchanged.
Use case
A receive-only Link Audio mixer joins a session to consume another peer's published channels. With this flag set to false on the mixer, pressing Play on the performing peer fires immediately. Add a third, contributing peer and quantized launch resumes automatically.