diff --git a/src/render_data.rs b/src/render_data.rs index 167b044..b5b43e8 100644 --- a/src/render_data.rs +++ b/src/render_data.rs @@ -1,7 +1,7 @@ -use std::{convert::Infallible, fmt::Display}; +use std::{convert::Infallible, fmt::Display, io::Cursor}; +use hound::{SampleFormat, WavSpec}; use opendal::Operator; -use opus2::Application; use time::{UtcDateTime, format_description::StaticFormatDescription, macros::format_description}; use twilight_model::id::{ Id, @@ -42,7 +42,7 @@ impl Display for Render { let start = start.format(&DATE_FORMAT).unwrap(); let end = end.format(&DATE_FORMAT).unwrap(); - write!(f, "{guild_id}/{voice_channel_id}/{start}_{end}.opus") + write!(f, "{guild_id}/{voice_channel_id}/{start}_{end}.wav") } } @@ -66,24 +66,32 @@ impl RenderManager { (), Infallible, // TODO: a real error type > { - let mut encoder = - opus2::Encoder::new(sample_rate, channels, Application::Audio).expect("TODO"); + let channels = channels as u16; - let estimated_max_size = samples.len() * size_of::() / size_of::(); - tracing::debug!(?estimated_max_size); - let encode_result = encoder.encode_vec(&samples, estimated_max_size); - if let Err(error) = &encode_result { - tracing::error!(%error); - } else { - tracing::info!("encode ok"); + let wav_spec = WavSpec { + channels, + sample_rate, + bits_per_sample: 16, + sample_format: SampleFormat::Int, + }; + + let mut buffer = Vec::new(); + let writer = Cursor::new(&mut buffer); + + let mut wav_writer = hound::WavWriter::new(writer, wav_spec).expect("TODO"); + + let mut sample_writer = wav_writer.get_i16_writer(samples.len() as u32); + + for sample in samples { + sample_writer.write_sample(sample); } - let bytes = encode_result.expect("TODO"); + sample_writer.flush().expect("TODO"); + + wav_writer.finalize().expect("TODO"); let path = render.to_string(); - let write_result = self.operator.write(&path, bytes).await; - tracing::info!(?write_result); - write_result.expect("TODO"); + self.operator.write(&path, buffer).await.expect("TODO"); Ok(()) }