use std::slice::{Chunks, ChunksMut};
use num::Float;
pub trait AudioBuffer {
type SampleType;
fn num_channels(&self) -> usize;
fn num_samples(&self) -> usize;
fn slice(&self) -> &[Self::SampleType];
fn slice_mut(&mut self) -> &mut [Self::SampleType];
fn frames(&self) -> Chunks<'_, Self::SampleType> {
self.slice().chunks(self.num_channels())
}
fn frames_mut(&mut self) -> ChunksMut<'_, Self::SampleType> {
let channels = self.num_channels();
self.slice_mut().chunks_mut(channels)
}
fn get(&self, channel: usize, sample: usize) -> &Self::SampleType;
fn get_mut(&mut self, channel: usize, sample: usize) -> &mut Self::SampleType;
fn set(&mut self, channel: usize, sample: usize, value: Self::SampleType);
unsafe fn get_unchecked(&self, channel: usize, sample: usize) -> &Self::SampleType {
self.get(channel, sample)
}
unsafe fn get_unchecked_mut(&mut self, channel: usize, sample: usize) -> &mut Self::SampleType {
self.get_mut(channel, sample)
}
unsafe fn set_unchecked(&mut self, channel: usize, sample: usize, value: Self::SampleType) {
self.set(channel, sample, value)
}
}
pub fn set_all<Buffer, SampleType>(buf: &mut Buffer, value: SampleType)
where
Buffer: AudioBuffer<SampleType = SampleType>,
SampleType: Clone,
{
for sample in buf.slice_mut() {
*sample = value.clone();
}
}
pub fn clear<Buffer, SampleType>(buf: &mut Buffer)
where
Buffer: AudioBuffer<SampleType = SampleType>,
SampleType: num::Zero,
{
for sample in buf.slice_mut() {
*sample = SampleType::zero();
}
}
pub struct InterleavedAudioBuffer<'a, SampleType> {
num_channels: usize,
inner: &'a mut [SampleType],
}
impl<'a, SampleType> InterleavedAudioBuffer<'a, SampleType> {
pub fn new(num_channels: usize, inner: &'a mut [SampleType]) -> Self {
Self {
num_channels,
inner,
}
}
}
impl<'a, SampleType> AudioBuffer for InterleavedAudioBuffer<'a, SampleType> {
type SampleType = SampleType;
#[inline]
fn num_channels(&self) -> usize {
self.num_channels
}
#[inline]
fn num_samples(&self) -> usize {
self.inner.len() / self.num_channels
}
#[inline]
fn slice(&self) -> &[Self::SampleType] {
self.inner
}
#[inline]
fn slice_mut(&mut self) -> &mut [Self::SampleType] {
self.inner
}
#[inline]
fn get(&self, channel: usize, sample: usize) -> &SampleType {
&self.inner[sample * self.num_channels + channel]
}
#[inline]
fn get_mut(&mut self, channel: usize, sample: usize) -> &mut SampleType {
&mut self.inner[sample * self.num_channels + channel]
}
#[inline]
fn set(&mut self, channel: usize, sample: usize, value: SampleType) {
let sample_ref = self.get_mut(channel, sample);
*sample_ref = value;
}
}
pub trait OwnedAudioBuffer: AudioBuffer {
fn new() -> Self;
fn resize(&mut self, num_channels: usize, num_samples: usize, sample: Self::SampleType);
}
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct VecAudioBuffer<SampleType> {
buffer: Vec<SampleType>,
num_channels: usize,
num_samples: usize,
}
impl<SampleType: Clone> VecAudioBuffer<SampleType> {
pub fn new_with(buffer: Vec<SampleType>, num_channels: usize, num_samples: usize) -> Self {
Self {
buffer,
num_samples,
num_channels,
}
}
pub fn empty_with(num_channels: usize, num_samples: usize, value: SampleType) -> Self {
let mut result = Self::new();
result.resize(num_channels, num_samples, value);
result
}
}
impl<SampleType: Clone> From<Vec<SampleType>> for VecAudioBuffer<SampleType> {
fn from(simple_vec: Vec<SampleType>) -> Self {
let num_samples = simple_vec.len();
VecAudioBuffer::new_with(simple_vec, 1, num_samples)
}
}
impl<SampleType> AudioBuffer for VecAudioBuffer<SampleType> {
type SampleType = SampleType;
#[inline]
fn num_channels(&self) -> usize {
self.num_channels
}
#[inline]
fn num_samples(&self) -> usize {
self.num_samples
}
#[inline]
fn slice(&self) -> &[Self::SampleType] {
&self.buffer
}
#[inline]
fn slice_mut(&mut self) -> &mut [Self::SampleType] {
&mut self.buffer
}
#[inline]
fn get(&self, channel: usize, sample: usize) -> &Self::SampleType {
&self.buffer[sample * self.num_channels + channel]
}
#[inline]
fn get_mut(&mut self, channel: usize, sample: usize) -> &mut Self::SampleType {
&mut self.buffer[sample * self.num_channels + channel]
}
#[inline]
fn set(&mut self, channel: usize, sample: usize, value: Self::SampleType) {
self.buffer[sample * self.num_channels + channel] = value;
}
#[inline]
unsafe fn get_unchecked(&self, channel: usize, sample: usize) -> &Self::SampleType {
self.buffer
.get_unchecked(sample * self.num_channels + channel)
}
#[inline]
unsafe fn get_unchecked_mut(&mut self, channel: usize, sample: usize) -> &mut Self::SampleType {
self.buffer
.get_unchecked_mut(sample * self.num_channels + channel)
}
#[inline]
unsafe fn set_unchecked(&mut self, channel: usize, sample: usize, value: Self::SampleType) {
let sample = self
.buffer
.get_unchecked_mut(sample * self.num_channels + channel);
*sample = value;
}
}
impl<SampleType: Clone> OwnedAudioBuffer for VecAudioBuffer<SampleType> {
#[inline]
fn new() -> Self {
VecAudioBuffer {
num_channels: 0,
num_samples: 0,
buffer: Vec::new(),
}
}
#[inline]
fn resize(&mut self, num_channels: usize, num_samples: usize, sample: Self::SampleType) {
self.num_samples = num_samples;
self.num_channels = num_channels;
self.buffer.resize(num_channels * num_samples, sample);
}
}
impl<SampleType> VecAudioBuffer<SampleType> {
pub fn interleaved(&mut self) -> InterleavedAudioBuffer<SampleType> {
InterleavedAudioBuffer::new(self.num_channels, &mut self.buffer)
}
}
#[cfg(feature = "vst_support")]
pub mod vst {
use super::*;
pub struct VSTAudioBuffer<'a, SampleType> {
inputs: ::vst::buffer::Inputs<'a, SampleType>,
outputs: ::vst::buffer::Outputs<'a, SampleType>,
}
impl<'a, SampleType: Float> VSTAudioBuffer<'a, SampleType> {
#[deprecated]
pub fn new(
inputs: ::vst::buffer::Inputs<'a, SampleType>,
outputs: ::vst::buffer::Outputs<'a, SampleType>,
) -> Self {
VSTAudioBuffer { inputs, outputs }
}
#[deprecated]
pub fn with_buffer(buffer: &'a mut ::vst::buffer::AudioBuffer<'a, SampleType>) -> Self {
let (inputs, outputs) = buffer.split();
#[allow(deprecated)]
Self::new(inputs, outputs)
}
}
impl<'a, SampleType> AudioBuffer for VSTAudioBuffer<'a, SampleType> {
type SampleType = SampleType;
fn num_channels(&self) -> usize {
self.outputs.len()
}
fn num_samples(&self) -> usize {
if self.outputs.is_empty() {
0
} else {
self.outputs.get(0).len()
}
}
fn slice(&self) -> &[Self::SampleType] {
&[]
}
fn slice_mut(&mut self) -> &mut [Self::SampleType] {
&mut []
}
fn get(&self, channel: usize, sample: usize) -> &Self::SampleType {
&self.inputs.get(channel)[sample]
}
fn get_mut(&mut self, channel: usize, sample: usize) -> &mut Self::SampleType {
&mut self.outputs.get_mut(channel)[sample]
}
fn set(&mut self, channel: usize, sample: usize, value: Self::SampleType) {
self.outputs.get_mut(channel)[sample] = value;
}
}
}
#[cfg(test)]
mod test {
use std::sync::Arc;
use std::thread;
use super::*;
#[test]
fn test_vec_is_send() {
let mut vec = VecAudioBuffer::new();
vec.resize(2, 1000, 0.0);
let handle = thread::spawn(move || println!("HELLO VEC {:?}", vec));
handle.join().unwrap();
}
#[test]
fn test_vec_is_sync() {
let mut vec = VecAudioBuffer::new();
vec.resize(2, 1000, 0.0);
let vec = Arc::new(vec);
let vec_2 = vec.clone();
let handle = thread::spawn(move || println!("HELLO VEC {:?}", vec));
println!("HELLO VEC {:?}", vec_2);
handle.join().unwrap();
}
}