#[cfg(feature = "wasm")]
use wasm_bindgen::prelude::*;
#[cfg(feature = "wasm")]
use crate::quantizer::Quantizer as _;
#[cfg(feature = "wasm")]
#[wasm_bindgen]
pub struct WasmLinearQuantizer {
inner: crate::LinearQuantizer,
}
#[cfg(feature = "wasm")]
#[wasm_bindgen]
impl WasmLinearQuantizer {
#[wasm_bindgen(constructor)]
pub fn new(min: f32, max: f32, bits: u32) -> Result<WasmLinearQuantizer, JsValue> {
let bits_u8 =
u8::try_from(bits).map_err(|_| JsValue::from_str("bits must fit in a u8 (0–255)"))?;
crate::LinearQuantizer::new(min, max, bits_u8)
.map(|inner| WasmLinearQuantizer { inner })
.map_err(|e| JsValue::from_str(&e.to_string()))
}
pub fn encode(&self, value: f32) -> u32 {
self.inner.quantize(value).max(0) as u32
}
pub fn decode(&self, code: u32) -> f32 {
self.inner.dequantize(code as i32)
}
pub fn num_levels(&self) -> u32 {
self.inner.num_levels() as u32
}
pub fn step_size(&self) -> f32 {
self.inner.step_size()
}
}
#[cfg(feature = "wasm")]
#[wasm_bindgen]
pub struct WasmMuLawCodec {
inner: crate::MuLawCodec,
}
#[cfg(feature = "wasm")]
#[wasm_bindgen]
impl WasmMuLawCodec {
#[wasm_bindgen(constructor)]
pub fn new(bits: u32) -> Result<WasmMuLawCodec, JsValue> {
let bits_u8 =
u8::try_from(bits).map_err(|_| JsValue::from_str("bits must fit in a u8 (0–255)"))?;
Ok(WasmMuLawCodec {
inner: crate::MuLawCodec::new(bits_u8),
})
}
pub fn encode(&self, sample: f32) -> u32 {
self.inner.quantize(sample).max(0) as u32
}
pub fn decode(&self, code: u32) -> f32 {
self.inner.dequantize(code as i32)
}
pub fn mu(&self) -> f32 {
self.inner.mu()
}
pub fn num_levels(&self) -> u32 {
1u32 << self.inner.bits()
}
}