1use serde::{Deserialize, Serialize};
2
3pub mod agc;
4pub mod ambiance;
5pub mod asr_processor;
6pub mod cache;
7pub mod denoiser;
8pub mod dtmf;
9pub mod engine;
10pub mod inactivity;
11pub mod loader;
12pub mod negotiate;
13pub mod processor;
14pub mod realtime_processor;
15pub mod recorder;
16#[cfg(feature = "ringback-detection")]
17pub mod ringback_detection;
18pub mod stream;
19#[cfg(test)]
20mod tests;
21pub mod track;
22pub mod vad;
23pub mod volume_control;
24pub use audio_codec::PcmBuf;
25pub use audio_codec::Sample;
26pub const INTERNAL_SAMPLERATE: u32 = 16000;
27pub type TrackId = String;
28pub type PayloadBuf = Vec<u8>;
29
30#[derive(Debug, Clone, Serialize, Deserialize)]
31pub enum Samples {
32 PCM {
33 samples: PcmBuf,
34 },
35 RTP {
36 sequence_number: u16,
37 payload_type: u8,
38 payload: PayloadBuf,
39 },
40 Empty,
41}
42#[derive(Debug, Clone, Serialize, Deserialize)]
43pub struct SourcePacket {
44 pub sequence_number: u16,
45 pub payload_type: u8,
46 pub payload: PayloadBuf,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct AudioFrame {
51 pub track_id: TrackId,
52 pub samples: Samples,
53 pub src_packet: Option<SourcePacket>,
54 pub timestamp: u64,
55 pub sample_rate: u32,
56 pub channels: u16,
57 #[serde(default, skip_serializing_if = "Option::is_none")]
58 pub speech_probability: Option<f32>,
59}
60
61impl Samples {
62 pub fn payload_type(&self) -> Option<u8> {
63 match self {
64 Samples::RTP { payload_type, .. } => Some(*payload_type),
65 _ => None,
66 }
67 }
68}
69
70pub fn get_timestamp() -> u64 {
72 let now = std::time::SystemTime::now();
73 now.duration_since(std::time::UNIX_EPOCH)
74 .expect("Time went backwards")
75 .as_millis() as u64
76}