Skip to main content

TrackConfig

Struct TrackConfig 

Source
pub struct TrackConfig {
    pub muted: AtomicBool,
    pub soloed: AtomicBool,
    pub armed: AtomicBool,
    pub midi_active: AtomicBool,
    pub volume: AtomicU32,
}
Expand description

Audio-thread-safe track configuration.

Written by the UI thread, read by the audio thread — all fields are atomic so no locks are needed.

Fields§

§muted: AtomicBool§soloed: AtomicBool§armed: AtomicBool§midi_active: AtomicBool

Whether this track is currently selected for MIDI input. Only one track should be selected at a time.

§volume: AtomicU32

Fader position as a linear gain, stored as f32 bits in an AtomicU32.

Written by the UI thread, read once per buffer by the audio thread. Constrained to TrackConfig::MIN_VOLUME..=TrackConfig::MAX_VOLUME by TrackConfig::set_volume, which is the only way to write it.

Implementations§

Source§

impl TrackConfig

Source

pub const MIN_VOLUME: f32 = 0.0

Bottom of the fader: silence.

Source

pub const UNITY_VOLUME: f32 = 1.0

Unity gain — the track reaches the master bus at the level the instrument produced it.

Source

pub const MAX_VOLUME: f32 = 2.0

Top of the fader, +6 dB.

Makeup gain above unity, not decoration. The instruments are trimmed so that ordinary playing peaks near −12 dBFS, which leaves room for several tracks to sum; a user who is playing one quiet pad on its own needs somewhere to get that back, and the alternative is the operating system’s volume control, which raises everything else on the machine too. The master limiter is what makes the top of the range safe.

Source

pub const DEFAULT_VOLUME: f32 = 0.75

Where a new track’s fader starts, −2.5 dB.

Below unity so that adding a second and third track does not immediately need the limiter, and so the fader has visible travel in both directions before it is touched.

Source

pub fn new() -> Self

Source

pub fn get_volume(&self) -> f32

Source

pub fn set_volume(&self, v: f32)

Set the fader position, clamped to the fader’s travel.

The clamp is here rather than at the call sites because this value is read on the audio thread and multiplied into every sample of the track: a caller that computes a position wrongly would otherwise turn a UI arithmetic slip into a full-scale burst. A NaN is not a fader position at all, so it is ignored rather than stored — storing it would multiply the track to NaN, which the master limiter turns into silence, and a silent track with no visible cause is worse than a dropped keystroke.

Source

pub fn is_muted(&self) -> bool

Source

pub fn is_soloed(&self) -> bool

Source

pub fn is_armed(&self) -> bool

Source

pub fn is_midi_active(&self) -> bool

Trait Implementations§

Source§

impl Debug for TrackConfig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TrackConfig

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<S> FromSample<S> for S

Source§

fn from_sample_(s: S) -> S

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

Source§

fn to_sample_(self) -> U

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more