Skip to main content

synapto_interface/
peer_input_audio.rs

1use crate::plugin::Plugin;
2use derive_more::{Deref, DerefMut, IntoIterator};
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5use std::time::Duration;
6
7pub const PEER_INPUT_AUDIO_SAMPLE_RATE: usize = 16_000;
8
9pub const PEER_INPUT_AUDIO_CHUNK_SIZE: usize = 1280_usize;
10
11pub const PEER_INPUT_AUDIO_CHUNK_DURATION: Duration = Duration::from_millis(
12    PEER_INPUT_AUDIO_CHUNK_SIZE as u64 * 1000 / PEER_INPUT_AUDIO_SAMPLE_RATE as u64,
13);
14
15/// Represents a chunk of raw audio input from a peer.
16#[derive(Deref, DerefMut, IntoIterator, Clone, Debug, Serialize, Deserialize, JsonSchema)]
17pub struct PeerInputAudio(Vec<i16>);
18
19impl PeerInputAudio {
20    pub fn new(data: [i16; PEER_INPUT_AUDIO_CHUNK_SIZE]) -> Self {
21        Self(data.to_vec())
22    }
23}
24
25impl From<PeerInputAudio> for Vec<u16> {
26    fn from(value: PeerInputAudio) -> Self {
27        value.0.iter().map(|&s| (s as u16) ^ 0x8000).collect()
28    }
29}
30
31impl From<PeerInputAudio> for Vec<u8> {
32    fn from(value: PeerInputAudio) -> Self {
33        value.0.iter().flat_map(|&s| s.to_ne_bytes()).collect()
34    }
35}
36
37impl From<PeerInputAudio> for [i32; PEER_INPUT_AUDIO_CHUNK_SIZE] {
38    fn from(peer_input_audio: PeerInputAudio) -> Self {
39        let mut result = [0i32; PEER_INPUT_AUDIO_CHUNK_SIZE];
40        for (i, &sample) in peer_input_audio.0.iter().enumerate() {
41            if i < PEER_INPUT_AUDIO_CHUNK_SIZE {
42                result[i] = sample as i32;
43            }
44        }
45        result
46    }
47}
48
49// impl From<PeerInputAudio> for &[i16] {
50//     fn from(peer_input_audio: PeerInputAudio) -> Self {
51//         peer_input_audio
52//     }
53// }
54
55use crate::sync::mpsc;
56use async_trait::async_trait;
57#[async_trait]
58pub trait AudioInputPlugin: Plugin + Send + Sync {
59    async fn start(&self, tx: mpsc::Sender<PeerInputAudio>) -> Result<(), String>;
60}