synapto_interface/
peer_input_audio.rs1use 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#[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
49use 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}