use crate::dsp::pipeline::{BridgeBuffer, BridgeRef, DspBridge, MAX_BRIDGE_BUF};
pub fn allocate_dsp_bridge() -> BridgeRef {
let bridge: &'static DspBridge = Box::leak(Box::new(DspBridge {
buffers: [
BridgeBuffer {
buf_l: [0.0f32; MAX_BRIDGE_BUF],
buf_r: [0.0f32; MAX_BRIDGE_BUF],
n_samples: 0,
},
BridgeBuffer {
buf_l: [0.0f32; MAX_BRIDGE_BUF],
buf_r: [0.0f32; MAX_BRIDGE_BUF],
n_samples: 0,
},
],
active_read_idx: std::sync::atomic::AtomicUsize::new(0),
generation: std::sync::atomic::AtomicU64::new(0),
consumed_gen: std::sync::atomic::AtomicU64::new(0),
dropped_frames: std::sync::atomic::AtomicU32::new(0),
}));
let bridge_ptr = unsafe { BridgeRef::new(bridge as *const DspBridge as *mut DspBridge) };
let bridge_void = bridge as *const DspBridge as *mut libc::c_void;
let bridge_size = std::mem::size_of::<DspBridge>();
let ret = unsafe { libc::madvise(bridge_void, bridge_size, libc::MADV_DONTFORK) };
if ret != 0 {
log::warn!(
"madvise(MADV_DONTFORK) returned {} (errno: {}). \
Buffer may be included in forks.",
ret,
std::io::Error::last_os_error()
);
}
let ret = unsafe { libc::madvise(bridge_void, bridge_size, libc::MADV_DONTDUMP) };
if ret != 0 {
log::warn!(
"madvise(MADV_DONTDUMP) returned {} (errno: {}). \
Buffer may be included in core-dumps.",
ret,
std::io::Error::last_os_error()
);
}
bridge_ptr
}