use anyhow::Result;
use opus::Decoder;
use crate::io::SoundPacket;
pub fn create_opus_decoder(sample_rate: u32) -> anyhow::Result<Decoder> {
let decoder: Decoder = Decoder::new(sample_rate, opus::Channels::Stereo)?;
Ok(decoder)
}
pub fn decode_sample_set_size_opus(
decoder: &mut Decoder,
sound_packet: SoundPacket,
fec: bool,
) -> Result<Vec<f32>> {
let mut buf = vec![0f32; sound_packet.samples_per_frame as usize];
decoder.decode_float(&sound_packet.bytes, &mut buf, fec)?;
Ok(buf)
}
pub fn decode_samples_opus(
mut decoder: Decoder,
sound_packets: Vec<SoundPacket>,
) -> anyhow::Result<Vec<f32>> {
let mut samples = vec![];
for sound_packet in sound_packets {
let crate::io::EncoderType::Opus(fec) = sound_packet.encoder_type;
let decoded_samples = decode_sample_set_size_opus(&mut decoder, sound_packet, fec)?;
samples.extend(decoded_samples);
}
Ok(samples)
}