Skip to main content

sesh_sdk/
lib.rs

1pub use smallvec;
2
3pub mod scratch;
4pub mod vec;
5
6pub use scratch::{Scratch, ScratchPool};
7pub use vec::{BiquadState, EnvelopeMode, EnvelopeState, FilterType, Waveform};
8
9/// Define a Sesh audio plugin.
10///
11/// Generates the required WASM exports: `sesh_sdk_version`, `sesh_alloc`,
12/// `sesh_free`, and `sesh_process`.
13///
14/// The `process` function receives a slice of channels. Each inner slice is one
15/// channel of audio samples laid out as contiguous non-interleaved:
16/// `[L0..Ln, R0..Rn, ...]`.
17///
18/// # Example
19///
20/// ```rust
21/// use sesh_sdk::sesh_plugin;
22///
23/// fn process(channels: &mut [&mut [f32]]) {
24///     for channel in channels.iter_mut() {
25///         for sample in channel.iter_mut() {
26///             *sample *= 0.5; // simple gain reduction
27///         }
28///     }
29/// }
30///
31/// sesh_plugin!(process);
32/// ```
33#[macro_export]
34macro_rules! sesh_plugin {
35    ($fn_name:ident) => {
36        #[no_mangle]
37        pub extern "C" fn sesh_sdk_version() -> u32 {
38            2
39        }
40
41        #[no_mangle]
42        pub extern "C" fn sesh_alloc(size: usize, align: usize) -> *mut u8 {
43            let layout = ::std::alloc::Layout::from_size_align(size, align).expect("invalid layout");
44            unsafe { ::std::alloc::alloc(layout) }
45        }
46
47        #[no_mangle]
48        pub extern "C" fn sesh_free(ptr: *mut u8, size: usize, align: usize) {
49            let layout = ::std::alloc::Layout::from_size_align(size, align).expect("invalid layout");
50            unsafe { ::std::alloc::dealloc(ptr, layout) }
51        }
52
53        #[no_mangle]
54        pub extern "C" fn sesh_process(ptr: *mut f32, frames: usize, channels: usize) {
55            let buffer = unsafe { ::std::slice::from_raw_parts_mut(ptr, frames * channels) };
56            let mut chunks: $crate::smallvec::SmallVec<[&mut [f32]; 32]> =
57                buffer.chunks_mut(frames).collect();
58            $fn_name(&mut chunks);
59        }
60    };
61}