feat: support configuring audio channels and sample rates of recordings; audio recordings now work!

This commit is contained in:
2026-04-15 01:22:38 -04:00
parent b457375e69
commit 33a7b15720
5 changed files with 127 additions and 15 deletions

View File

@@ -2,8 +2,13 @@ use clap::Parser;
use fomo_reducer::{CommandRouter, State, Storage, all_commands, initialize_vcs, update_vcs};
use secrecy::{ExposeSecret, SecretString};
use snafu::Snafu;
use songbird::{Songbird, shards::TwilightMap};
use songbird::{
Config, Songbird,
driver::{Channels, DecodeConfig, SampleRate},
shards::TwilightMap,
};
use std::{fmt::Debug, sync::Arc};
use strum::EnumString;
use tokio::{select, signal::ctrl_c, task::JoinSet};
use tokio_util::{sync::CancellationToken, time::FutureExt as _};
use tracing_subscriber::{EnvFilter, fmt::format::FmtSpan};
@@ -17,6 +22,47 @@ use twilight_model::{
id::{Id, marker::UserMarker},
};
#[derive(Clone, Copy, Debug, strum::Display, EnumString)]
enum AudioChannels {
Mono,
Stereo,
}
impl From<AudioChannels> for Channels {
fn from(value: AudioChannels) -> Self {
match value {
AudioChannels::Mono => Channels::Mono,
AudioChannels::Stereo => Channels::Stereo,
}
}
}
#[derive(Clone, Copy, Debug, strum::Display, EnumString)]
enum AudioSampleRate {
#[strum(serialize = "8000Hz")]
Hz8000,
#[strum(serialize = "12000Hz")]
Hz12000,
#[strum(serialize = "16000Hz")]
Hz16000,
#[strum(serialize = "24000Hz")]
Hz24000,
#[strum(serialize = "48000Hz")]
Hz48000,
}
impl From<AudioSampleRate> for SampleRate {
fn from(value: AudioSampleRate) -> Self {
match value {
AudioSampleRate::Hz8000 => SampleRate::Hz8000,
AudioSampleRate::Hz12000 => SampleRate::Hz12000,
AudioSampleRate::Hz16000 => SampleRate::Hz16000,
AudioSampleRate::Hz24000 => SampleRate::Hz24000,
AudioSampleRate::Hz48000 => SampleRate::Hz48000,
}
}
}
#[derive(Debug, Parser)]
struct AppArgs {
#[arg(long, env)]
@@ -31,6 +77,12 @@ struct AppArgs {
#[arg(long, env)]
discord_status: Option<Arc<str>>,
#[arg(long, env, default_value_t = AudioChannels::Mono)]
audio_channels: AudioChannels,
#[arg(long, env, default_value_t = AudioSampleRate::Hz12000)]
audio_sample_rate: AudioSampleRate,
#[arg(long, env)]
bot_data: Storage,
@@ -89,6 +141,8 @@ async fn main() -> Result<(), MainError> {
discord_bot_owner_user_id,
discord_nickname,
discord_status,
audio_channels,
audio_sample_rate,
bot_data,
user_data,
recording_data,
@@ -159,9 +213,17 @@ async fn main() -> Result<(), MainError> {
.collect(),
);
let senders = Arc::new(senders);
let audio_channels = audio_channels.into();
let audio_sample_rate = audio_sample_rate.into();
let senders = Arc::new(senders);
let songbird = Songbird::twilight(senders, discord_user_id);
songbird.set_config(
Config::default().decode_mode(songbird::driver::DecodeMode::Decode(DecodeConfig::new(
audio_channels,
audio_sample_rate,
))),
);
let interaction_client = discord_client.interaction(discord_application_id);
@@ -196,6 +258,8 @@ async fn main() -> Result<(), MainError> {
let user_data = user_data.into_inner();
let state = State {
audio_channels,
audio_sample_rate,
bot_data,
cancellation_token: cancellation_token.clone(),
discord_application_id,