WAV Writer
Create WAV files from processed audio.
Creating a Writer
#![allow(unused)] fn main() { use bbx_file::writers::wav::WavFileWriter; let writer = WavFileWriter::<f32>::new( "output.wav", // path 44100.0, // sample rate 2, // channels )?; }
Writing Audio Data
Per-Channel
#![allow(unused)] fn main() { use bbx_file::writers::wav::WavFileWriter; use bbx_dsp::writer::Writer; let mut writer = WavFileWriter::<f32>::new("output.wav", 44100.0, 2)?; writer.write_channel(0, &left_samples)?; writer.write_channel(1, &right_samples)?; writer.finalize()?; }
Interleaved
#![allow(unused)] fn main() { // Write interleaved samples [L, R, L, R, ...] writer.write_interleaved(&interleaved_samples)?; }
Finalization
Always call finalize() to:
- Flush buffered data
- Update WAV header with correct sizes
- Close the file
#![allow(unused)] fn main() { writer.finalize()?; }
Without finalization, the file may be corrupt or truncated.
Writer Trait
WavFileWriter implements the Writer trait from bbx_dsp:
#![allow(unused)] fn main() { pub trait Writer<S: Sample>: Send { fn sample_rate(&self) -> f64; fn num_channels(&self) -> usize; fn write_channel(&mut self, channel: usize, samples: &[S]) -> Result<()>; fn finalize(&mut self) -> Result<()>; } }
Usage with FileOutputBlock
#![allow(unused)] fn main() { use bbx_dsp::{blocks::{FileOutputBlock, OscillatorBlock}, graph::GraphBuilder, waveform::Waveform}; use bbx_file::writers::wav::WavFileWriter; let mut builder = GraphBuilder::<f32>::new(44100.0, 512, 2); // Audio source let osc = builder.add(OscillatorBlock::new(440.0, Waveform::Sine, None)); // File output let writer = WavFileWriter::<f32>::new("output.wav", 44100.0, 2)?; let file_out = builder.add(FileOutputBlock::new(Box::new(writer))); builder.connect(osc, 0, file_out, 0); let mut graph = builder.build(); // Process audio for _ in 0..1000 { let mut left = vec![0.0f32; 512]; let mut right = vec![0.0f32; 512]; let mut outputs: [&mut [f32]; 2] = [&mut left, &mut right]; graph.process_buffers(&mut outputs); } // Finalize graph.finalize(); }
Output Format
Default output format:
- IEEE Float 32-bit
- Little-endian
- Standard RIFF/WAVE header
Error Handling
#![allow(unused)] fn main() { use bbx_file::writers::wav::WavFileWriter; let writer = WavFileWriter::<f32>::new("output.wav", 44100.0, 2); match writer { Ok(w) => { // Use writer } Err(e) => { eprintln!("Failed to create writer: {}", e); } } }
Non-Blocking I/O
FileOutputBlock uses non-blocking I/O internally to avoid blocking the audio thread. Actual disk writes happen on a background thread.