Skip to main content

AudioMixer

Struct AudioMixer 

Source
pub struct AudioMixer { /* private fields */ }
Expand description

Sums an arbitrary, dynamically-changing number of audio sources into one output stream — the structural mirror of crate::elements::Tee: Tee is one input fanned out to a dynamic set of outputs behind a lock; AudioMixer is a dynamic set of inputs (added/removed via MixerHandle, from whatever thread each one’s own source pipeline runs on) summed into one output. Unlike Tee, which is a passive Sink driven entirely by whatever calls consume, AudioMixer has to drive itself: it’s a SourceElement with its own run thread, ticking every TICK_INTERVAL to sum however many samples each currently-attached input has ready — because mixing has to keep producing something on a steady clock even when some (or all) inputs have gone quiet, the same reason WasapiCaptureSource synthesizes silence for gaps rather than just emitting nothing.

Every input is resampled to this mixer’s own fixed sample_rate/channels (always Sample::F32(Packed) internally — float headroom during summation, same reason real mixing consoles work in float even when everything else is integer PCM) — an input short on samples for a given tick contributes silence for the shortfall rather than blocking the whole mix. Samples are summed and hard-clipped to [-1.0, 1.0], not averaged: two or three sources is the expected case, where clipping is rare, and averaging would quietly lower the whole mix’s volume every time a source count changes — a caller who wants headroom can lower an individual input’s gain before it ever reaches the mixer (not implemented — nothing needs it yet).

pts is a plain, always-continuous sample count (see AudioMixer::time_base), advancing in lockstep with wall-clock time regardless of which/how many inputs are actually contributing at any moment.

Runs until Stop — never reaches Eos on its own, same as every other live source in this crate; an individual input reaching Eos or being removed just drops out of future ticks, it doesn’t end the mix.

Implementations§

Source§

impl AudioMixer

Source

pub fn new( name: impl Into<String>, options: AudioMixerOptions, ) -> (Self, MixerHandle)

Starts with no inputs — add some via the returned MixerHandle before (or any time after) wiring AudioMixer into a crate::pipeline::Pipeline (Pipeline::new registers it as that pipeline’s own source automatically, same as any other SourceElement — no crate::element::Context needed here, unlike crate::elements::TeeBuilder::new, since AudioMixer has no chains of its own for a handle to build).

Source

pub fn time_base(&self) -> Rational

The unit each emitted frame’s pts is expressed in.

Trait Implementations§

Source§

impl Element for AudioMixer

Source§

fn name(&self) -> Arc<str>

Returns a cheap clone (refcount bump, not a deep copy) of this element’s name — crate::bus::BusEvent stores names as Arc<str> for exactly this reason: a hot path like crate::queue::Queue posting BusEvent::Dropped once per overflowed buffer shouldn’t pay for a fresh heap allocation every time it wants to report which element it is.
Source§

fn element_type(&self) -> ElementType

Source§

fn pp_log(&self) -> &PpLog

This element’s identity for crate::bus::Bus::post — same id/name as Element::name, just already wrapped as the crate::pp_log::PpLog its pp_info!/pp_warn!/pp_error! macros need. A stored private field, not built fresh per call, for the same reason name() returns a cheap Arc<str> clone instead of a fresh String — see its own docs.
Source§

fn pp_log_mut(&mut self) -> &mut PpLog

Mutable access to the same field Element::pp_log reads — used by crate::pipeline::ChainBuilder to stamp the owning crate::pipeline::Pipeline’s id onto every element that passes through it, via element_pp_log. Not meant to be called from anywhere else.
Source§

fn graph_id(&self) -> Option<ElementId>

A pre-reserved graph identity for elements that expose dynamic attachment handles. Most elements receive an ID from ChainBuilder and keep the default None implementation.
Source§

impl Send for AudioMixer

Source§

impl Source for AudioMixer

Source§

fn src_pads(&mut self) -> &mut [SrcPad]

Source§

impl SourceElement for AudioMixer

Source§

fn run(&mut self, control: &ControlReceiver, bus: &Bus) -> Result<()>

Drives this source until Eos (normal completion), crate::pipeline::Pipeline::finish, or Stop (see ControlMsg::Stop) — call crate::control::drain_control once per loop iteration to make control responsive between blocking reads. Read more
Source§

fn seek(&mut self, _target: Duration) -> Result<Duration>

Repositions this source to target, an absolute position from the start of the media (e.g. av_seek_frame for crate::elements::FileDemuxer). Called by crate::control::drain_control as part of handling ControlMsg::Seek, before that message is forwarded to the source’s own pads — so whatever’s read next comes from the new position by the time downstream elements are told to flush for it. 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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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.

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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