Skip to main content

libfoksalcommon/
lib.rs

1pub mod config;
2pub mod net;
3pub mod utils;
4
5use rkyv::{Archive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
6use serde::{Deserialize, Serialize};
7
8pub type CommonSample = f32;
9
10pub const AUDIO_BUF_LEN: usize = 8192;
11
12#[derive(Clone, Copy)]
13pub struct AudioSpec {
14    pub n_channels: usize,
15    pub sample_rate: usize,
16}
17
18#[derive(Archive, Clone, Default, RkyvDeserialize, RkyvSerialize)]
19pub struct AudioChunk {
20    pub samples: Vec<CommonSample>,
21    pub n_channels: usize,
22    pub sample_rate: usize,
23    pub is_final: bool,
24}
25
26#[derive(Deserialize, Serialize)]
27#[serde(deny_unknown_fields)]
28pub struct RawFilter {
29    pub tag: String,
30    pub regex: String,
31}
32
33impl AudioSpec {
34    pub fn new(n_channels: usize, sample_rate: usize) -> Self {
35        Self {
36            n_channels,
37            sample_rate,
38        }
39    }
40}
41
42impl AudioChunk {
43    pub fn new(
44        samples: Vec<CommonSample>,
45        n_channels: usize,
46        sample_rate: usize,
47        is_final: bool,
48    ) -> Self {
49        Self {
50            samples,
51            n_channels,
52            sample_rate,
53            is_final,
54        }
55    }
56
57    pub fn slice(&self, start: usize, end: usize) -> Self {
58        let end = end.min(self.samples.len() - 1);
59        let is_final = end >= self.samples.len() - 1;
60
61        Self {
62            samples: self.samples[start..=end].to_vec(),
63            n_channels: self.n_channels,
64            sample_rate: self.sample_rate,
65            is_final,
66        }
67    }
68}