chore: refactor into a RecordingDataManager, lay the ground work for a RenderManager

This commit is contained in:
2026-05-27 01:28:47 -04:00
parent f86c094dda
commit e72633f26a
22 changed files with 830 additions and 49 deletions

View File

@@ -1,6 +1,9 @@
use crate::{
OneToManyUniqueBTreeMap, UserDataManager, option_ext::OptionExt as _,
user_capnp::user::Consent, user_data::RECORD_IF_CONSENT_UNSPECIFIED,
OneToManyUniqueBTreeMap, UserDataManager,
option_ext::OptionExt as _,
recording_data::{Clip, Recording, RecordingDataManager},
user_capnp::user::Consent,
user_data::RECORD_IF_CONSENT_UNSPECIFIED,
};
use async_trait::async_trait;
use futures::FutureExt;
@@ -26,7 +29,7 @@ struct Handler {
start_instant: Instant,
start_utc: UtcDateTime,
recording_data: Operator,
recording_data_manager: RecordingDataManager,
guild_id: Id<GuildMarker>,
channel_id: Id<ChannelMarker>,
@@ -104,49 +107,44 @@ impl EventHandler for Handler {
let minute = now_utc.minute();
let second = now_utc.second();
let microseconds = now_utc.microsecond();
let microsecond = now_utc.microsecond();
let guild_id = self.guild_id;
let channel_id = self.channel_id;
let guild = self.guild_id;
let voice_channel = self.channel_id;
let user = user_id
.as_ref()
.map_or_else(|| "UNKNOWN".into(), ToString::to_string);
let user = user_id;
let path = format!(
"{year}/{month}/{day}/{hour}/{minute}/audio-{second}.{microseconds}-{guild_id}-{channel_id}-{user}.wav"
);
let clip = Clip {
second,
microsecond,
guild,
voice_channel,
user,
};
let recording = Recording {
year,
month,
day,
hour,
minute,
clip,
};
let channels = self.audio_channels;
let sample_rate = self.audio_sample_rate;
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(pcm.len() as u32);
for sample in pcm {
sample_writer.write_sample(*sample);
}
sample_writer.flush().expect("TODO");
wav_writer.finalize().expect("TODO");
tracing::info!("going to write the audio shortly");
let recording_data = self.recording_data.clone();
let recording_data_manager = self.recording_data_manager.clone();
let pcm = pcm.clone();
tokio::spawn(async move {
recording_data.write(&path, buffer).await.expect("TODO");
tracing::info!(?path, "successfully wrote the audio!");
recording_data_manager
.write(&recording, &pcm, sample_rate, channels)
.await
.expect("TODO");
tracing::info!(?recording, "successfully wrote the audio!");
});
}
}
@@ -174,7 +172,7 @@ pub async fn join_and_record(
audio_channels: Channels,
audio_sample_rate: SampleRate,
guild_id: Id<GuildMarker>,
recording_data: Operator,
recording_data_manager: RecordingDataManager,
songbird: &Songbird,
user_data_manager: UserDataManager,
voice_channel_id: Id<ChannelMarker>,
@@ -189,7 +187,7 @@ pub async fn join_and_record(
let handler = Handler {
start_instant,
start_utc,
recording_data,
recording_data_manager,
guild_id,
channel_id: voice_channel_id,
known_ssrcs: Default::default(),