atm0s_media_server_codecs/
opus.rs

1use opus_wrap::{Application, Channels};
2
3use crate::{AudioDecoder, AudioEncodder};
4
5#[allow(unused)]
6#[allow(clippy::redundant_field_names)]
7#[allow(clippy::len_zero)]
8#[allow(clippy::needless_lifetimes)]
9mod opus_wrap;
10
11pub struct OpusDecoder {
12    decoder: opus_wrap::Decoder,
13}
14
15impl Default for OpusDecoder {
16    fn default() -> Self {
17        let decoder = opus_wrap::Decoder::new(48000, Channels::Mono).expect("Should create opus decoder");
18        Self { decoder }
19    }
20}
21
22impl AudioDecoder for OpusDecoder {
23    fn decode(&mut self, in_buf: &[u8], out_buf: &mut [i16]) -> Option<usize> {
24        //TODO handle fec
25        self.decoder.decode(in_buf, out_buf, false).ok()
26    }
27}
28
29pub struct OpusEncoder {
30    encoder: opus_wrap::Encoder,
31}
32
33impl Default for OpusEncoder {
34    fn default() -> Self {
35        let encoder = opus_wrap::Encoder::new(48000, Channels::Mono, Application::Voip).expect("Should create opus encoder");
36        Self { encoder }
37    }
38}
39
40impl AudioEncodder for OpusEncoder {
41    fn encode(&mut self, in_buf: &[i16], out_buf: &mut [u8]) -> Option<usize> {
42        self.encoder.encode(in_buf, out_buf).ok()
43    }
44}