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}