Struct Buffered File Duplex Processor
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>
impl<P: Processor> BufferedFileDuplexProcessor<P>
pub fn new(playback: BufferedPlayback, processor: P) -> Self
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
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
pub fn statistics(&self) -> BufferedFileDuplexStatistics
Directly owned snapshots; counters wrap, no timestamp/latency claim.
pub fn first_error(&self) -> Option<ProcessError>
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)
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.