AUDIO
Source snapshot · 12 October 2026

API reference / ravet_device::BufferedFileDuplexProcessor

Struct BufferedFileDuplexProcessor 

pub struct BufferedFileDuplexProcessor<P: Processor> { /* private fields */ }
Expand description

One unique prepared file consumer plus downstream f32 processing. Outer inputs are captured PCM already converted to the output clock by PreparedClockedDuplex; child inputs are file channels first, captured channels second. No file FIFO drift estimator exists. All rates equal the file queue rate. Prepared callbacks allocate nothing and do no lock/I/O/wait; source/capture clocks remain distinct.

At most two child calls separate consumed file PCM from stalled zero-file PCM. Capture/DSP continue while file playback pauses. Child sample_position describes file OUTPUT-frame coordinates (None above i64::MAX); it is not an original-file coordinate or hardware timestamp. No beat/tempo metadata is inferred. A fault silences the whole outer block and retains first error until reset/reprepare; source and earlier child histories already consumed cannot be rolled back. The outer status is BackendFailure after consumption; first_error retains the original child error. Source Failed alone drains queued prefix and leaves capture/DSP running, with ended=false and its original error on worker shutdown. Child latency/tail declarations exclude worker/converter/FIFO buffering.

This owner can be extracted only when directly owned and stopped. Native clocked stream closures cannot be reclaimed through this API. Native callback teardown, physical synchronization, recovery factories and session hooks retain their existing contracts. Destruction/preparation belong off audio.

use ravet_audio_file::{AudioConsumer, BufferedPlayback};
use ravet_device::{BufferedFileDuplexProcessor, ClockedDuplexOptions,
    ClockedDuplexError, PreparedClockedDuplex};
use ravet_foundation::Processor;
// Call on control with a queue prepared at output_rate. Child input channels
// are the file channels followed by the raw capture channels.
pub fn compose<P: Processor>(file: BufferedPlayback, dsp: P, raw: AudioConsumer,
    input_rate: u32, output_rate: u32, output_channels: usize,
    options: ClockedDuplexOptions)
    -> Result<PreparedClockedDuplex<BufferedFileDuplexProcessor<P>>, ClockedDuplexError>
{
    PreparedClockedDuplex::new(BufferedFileDuplexProcessor::new(file, dsp), raw,
        input_rate, output_rate, output_channels, options)
}

Implementations§

§

impl<P: Processor> BufferedFileDuplexProcessor<P>

pub fn new(playback: BufferedPlayback, processor: P) -> Self

Take exclusive owners without preparation, factory calls or source I/O.

pub fn monitor(&self) -> BufferedFileDuplexMonitor

pub fn playback(&self) -> &BufferedPlayback

pub fn playback_mut(&mut self) -> &mut BufferedPlayback

Exclusive stopped/control configuration, never concurrent with callbacks. This does not reclaim a playback owner hidden inside a native closure.

pub fn statistics(&self) -> BufferedFileDuplexStatistics

Directly owned snapshots; counters wrap, no timestamp/latency claim.

pub fn first_error(&self) -> Option<ProcessError>

First original child fault (or source BackendFailure), preserved until reset or successful preparation. Outer post-consumption faults use BackendFailure because an earlier source/child history cannot be rolled back.

pub fn into_parts(self) -> (BufferedPlayback, P)

Consume a directly owned stopped wrapper; deactivate exactly once when prepared. No child reset, file read/drain/seek or worker join is hidden.

Trait Implementations§

§

impl<P: Processor> Drop for BufferedFileDuplexProcessor<P>

§

fn drop(&mut self)

Executes the destructor for this type. Read more
§

fn pin_drop(self: Pin<&mut Self>)

Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more
§

impl<P: Processor> Processor for BufferedFileDuplexProcessor<P>

§

fn prepare(&mut self, config: ProcessConfig) -> Result<(), PrepareError>

§

fn start_audio(&mut self) -> Result<(), ProcessError>

Optional explicit audio-owner session start, after prepare and before rendering. Default is a no-op. Consumers using these hooks call once on the audio owner and stop there before transfer/deactivation. Failure must leave this processor stopped; earlier successful nodes may be stopped. Hooks follow prepared callback allocation/locking/I/O obligations. Existing adapters do not implicitly opt in; explicit graph sessions supply them.
§

fn stop_audio(&mut self)

End an explicitly started session on its audio owner, without deactivation or storage destruction. Default no-op; preparation/history may be retained.
§

fn process(&mut self, block: &mut ProcessBlock<'_, '_, '_>) -> ProcessStatus

§

fn reset(&mut self)

§

fn try_reset(&mut self) -> Result<(), ProcessError>

Attempt history reset without allocating or changing configuration. Existing processors delegate to their successful legacy reset by default. A refusal may follow earlier reset work; consumers must remain faulted.
§

fn deactivate(&mut self)

§

fn latency_samples(&self) -> u32

Prepared algorithmic latency in samples. Changes are advertised by adapters using their format’s restart/latency protocol outside the audio callback.
§

fn tail(&self) -> Tail

Decay policy after input stops. Adapters must map this to the host protocol.

Auto Trait Implementations§

Blanket Implementations§

§

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

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

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

§

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

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

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

§

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

Mutably borrows from an owned value. Read more
§

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

§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<S> FromSample<S> for S

§

fn from_sample_(s: S) -> S

§

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

§

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<F, T> IntoSample<T> for Fwhere T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> Same for T

§

type Output = T

Should always be Self
§

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

§

fn to_sample_(self) -> U

§

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

§

type Error = Infallible

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

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

Performs the conversion.
§

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

§

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

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

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

Performs the conversion.