sea_codec/
lib.rs

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