use super::{
collections::{BitStream, CircularStack, NibbleList},
math::FixedParabola,
};
use serde::{Deserialize, Serialize};
pub use std::io::{Seek, SeekFrom};
pub mod adhoc;
pub mod wav;
pub use adhoc::*;
const NORMALIZE_FACTOR: f32 = 1.0 / i16::MAX as f32;
fn normalize_sample<T>(samp: T) -> f32
where
T: Clone,
i32: From<T>,
{
i32::from(samp) as f32 * NORMALIZE_FACTOR
}
fn truncate_sample(samp: f32) -> i16 {
(samp.clamp(-1.0, 1.0) * ((i16::MAX) as f32)) as i16
}
#[derive(Copy, Clone, Default, Serialize, Deserialize)]
pub struct StreamInfo {
sample_rate: u32,
channels: u32,
}
impl StreamInfo {
pub fn new(sample_rate: u32, channels: u32) -> Self {
Self {
sample_rate,
channels,
}
}
pub fn channels(&self) -> usize {
self.channels as usize
}
pub fn frequency(&self) -> usize {
self.sample_rate as usize
}
pub fn as_bytes(&self) -> &[u8] {
let data = self as *const Self as *const u8;
unsafe { std::slice::from_raw_parts(data, std::mem::size_of::<StreamInfo>()) }
}
}
pub trait Streamable {
fn info(&self) -> StreamInfo;
fn filesize_upperbound(&self) -> u64;
fn encode(&mut self, samples: &[f32]) -> Option<usize>;
fn decode(&mut self, samples: &mut [f32]) -> Option<usize>;
fn seek(&mut self, dt: SeekFrom);
}