feat: support configuring audio channels and sample rates of recordings; audio recordings now work!
This commit is contained in:
68
src/main.rs
68
src/main.rs
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user