pub struct MixerHandle { /* private fields */ }Expand description
A cheaply-cloneable handle for adding or removing an AudioMixer’s
input sources while the pipeline is running — the mirror image of
crate::elements::TeeHandle: Tee lets you attach/detach outputs
from another thread; this lets you attach/detach inputs. Keeps only a
Weak reference for the same reason TeeHandle does: retaining a
handle after the mixer’s own pipeline finishes must not keep its
internal state alive forever, and every operation becomes a harmless
no-op once the mixer is gone.
Implementations§
Source§impl MixerHandle
impl MixerHandle
Sourcepub fn add_source(&self, name: impl Into<String>) -> Option<Box<dyn Sink>>
pub fn add_source(&self, name: impl Into<String>) -> Option<Box<dyn Sink>>
Registers a new input under name and returns a Sink to use as
a detached branch terminal. Build and attach it inside that source’s
own Pipeline::new wiring closure — a
different pipeline/thread than this mixer’s own, which is exactly
the point). None once the mixer itself is gone. Calling this
again with a name already in use replaces that input outright
(whatever it had buffered is dropped) rather than erroring — same
“just do what was asked” spirit as HashMap::insert. A sink from
the previous registration then becomes inert: its data, Eos, and
Stop cannot affect the replacement sharing its name.
The input endpoint appears in the upstream source pipeline’s graph
when attached through crate::element::Context::attach. The graph
intentionally does not invent a cross-pipeline edge to the mixer.
Sourcepub fn mix_format(&self) -> Option<MixFormat>
pub fn mix_format(&self) -> Option<MixFormat>
The format the mix is summed into and emitted at.
None once the mixer is gone.
Sourcepub fn set_mix_format(&self, format: MixFormat) -> bool
pub fn set_mix_format(&self, format: MixFormat) -> bool
Changes it, from the next tick.
Returns false for a format nothing could be resampled to, and for a
mixer that has already been dropped.
§What moves with it
Every input rebuilds its own resampler when it next pushes — each remembers what its own was built for, so none has to be found and invalidated from here, and an input registered after this call is correct without being told.
AudioMixer::time_base is 1/sample_rate, and the output pts is
a running sample count in those units. So changing the rate re-means
every timestamp after it, while the ones already downstream were
stamped under the old one. Nothing here can repair that: a muxer
holding a time base from avformat_write_header will not be told, and
an encoder was opened for a channel count.
So this is safe exactly while nothing downstream is reading timestamps
— a level meter, an idle mixer — and it is the caller’s to know. In
practice: change it between recordings, not during one. The mixer
itself keeps running either way, which is the point: its pts stays
continuous, and a rate change is not a reason to restart the one
element every audio source in the application is registered with.
Sourcepub fn remove_source(&self, name: &str)
pub fn remove_source(&self, name: &str)
Drops name’s input immediately, discarding whatever it had
buffered — a no-op if name isn’t currently registered, or the
mixer is gone.
Sourcepub fn source_count(&self) -> usize
pub fn source_count(&self) -> usize
Returns the number of inputs currently registered with the live mixer.
Returns zero after the mixer has been dropped.
Trait Implementations§
Source§impl Clone for MixerHandle
impl Clone for MixerHandle
Source§fn clone(&self) -> MixerHandle
fn clone(&self) -> MixerHandle
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more