codec/
lib.rs

1use std::io::Cursor;
2
3use bytemuck::cast_slice;
4use decoder::SeaDecoder;
5use encoder::{EncoderSettings, SeaEncoder};
6
7pub mod codec;
8pub mod decoder;
9pub mod encoder;
10pub mod wasm_api;
11
12pub fn sea_encode(
13    input_samples: &[i16],
14    sample_rate: u32,
15    channels: u32,
16    settings: EncoderSettings,
17) -> Vec<u8> {
18    let u8_input_samples: &[u8] = cast_slice(input_samples);
19    let mut cursor: Cursor<_> = Cursor::new(u8_input_samples);
20    let mut sea_encoded = Vec::<u8>::with_capacity(input_samples.len());
21    let mut sea_encoder = SeaEncoder::new(
22        channels as u8,
23        sample_rate,
24        Some(input_samples.len() as u32 / channels),
25        settings,
26        &mut cursor,
27        &mut sea_encoded,
28    )
29    .unwrap();
30
31    while sea_encoder.encode_frame().unwrap() {}
32    sea_encoder.finalize().unwrap();
33
34    sea_encoded
35}
36
37pub struct SeaDecodeInfo {
38    pub samples: Vec<i16>,
39    pub sample_rate: u32,
40    pub channels: u32,
41}
42
43pub fn sea_decode(encoded: &[u8]) -> SeaDecodeInfo {
44    let mut cursor: Cursor<&[u8]> = Cursor::new(encoded);
45    let mut sea_decoded = Vec::<u8>::with_capacity(encoded.len() * 8);
46
47    let mut sea_decoder: SeaDecoder<&mut Cursor<&[u8]>, &mut Vec<u8>> =
48        SeaDecoder::new(&mut cursor, &mut sea_decoded).unwrap();
49
50    while sea_decoder.decode_frame().unwrap() {}
51    sea_decoder.finalize().unwrap();
52
53    let header = sea_decoder.get_header();
54
55    let decoded: &[i16] = cast_slice(&sea_decoded);
56
57    SeaDecodeInfo {
58        samples: decoded.to_vec(),
59        sample_rate: header.sample_rate,
60        channels: header.channels as u32,
61    }
62}