|
| bool | is_audible (int channel) const noexcept |
| | Whether a channel should sound.
|
| bool | is_muted (int channel) const noexcept |
| bool | is_soloed (int channel) const noexcept |
| bool | any_soloed () const noexcept |
| void | set_muted (int channel, bool muted) noexcept |
| void | set_soloed (int channel, bool soloed) noexcept |
| void | reset () noexcept |
| bool | is_default () const noexcept |
| | Whether nothing is muted or soloed, so every channel sounds.
|
Per-channel mute and solo.
Read live so a mixer can change it while sound is running, and read where the engine mixes rather than where it starts notes: a part goes quiet on the next block and comes back on the one after, and a muted part goes on consuming polyphony exactly as an audible one does.
The flags are atomic because this is the one place in the library where two threads meet: a UI thread sets them while the render thread reads them on every note-on. Relaxed ordering is enough – each flag stands alone, nothing is published through it, and the only requirement is that a change is eventually seen and never seen half-written. That is what the reference build's Volatile bought too.