chore: refactor into a RecordingDataManager, lay the ground work for a RenderManager
This commit is contained in:
74
src/call.rs
74
src/call.rs
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user