soundboard/src/main.rs

79 lines
2.3 KiB
Rust

use axum::extract::State;
use axum::{routing, routing::get, Router};
use axum_template::{engine::Engine, Key, RenderHtml};
use minijinja::{path_loader, Environment};
use state::{AppState, TemplateEngine};
use log::info;
use serde::{Deserialize, Serialize};
use std::env;
use std::{
net::SocketAddr,
sync::{Arc, Mutex},
thread,
};
use tokio::sync::mpsc;
use dotenvy::dotenv;
use vbplay::{example_handler, AudioThread, DeviceSelection, PlaybackAction, SoundDecoder};
mod handlers;
mod server;
mod soundclips;
mod state;
mod ui;
mod vbplay;
#[tokio::main]
async fn main() {
dotenv().ok();
let device_pattern = env::var("DEVICE_PATTERN").expect("Need a device pattern");
let folder = env::var("DIRECTORY").expect("Need a directory in env file.");
let mut jinja = Environment::new();
jinja.set_loader(path_loader("templates"));
let template_engine = Engine::from(jinja);
let mut audio = vbplay::AudioHandler::new(
DeviceSelection::FindByPattern(device_pattern),
SoundDecoder::Detect,
);
let event_handler = Box::new(example_handler::PressMouseForward::new());
audio.on_playback(event_handler);
let audio = Arc::new(Mutex::new(audio));
let server_settings = Arc::new(Mutex::new(server::ServerSettings {
port: "3000".to_string(),
}));
let should_run = Arc::new(Mutex::new(true));
let app_state = AppState {
engine: template_engine,
clips: soundclips::scan_directory_for_clips(&folder, &["mp3", "ogg", "wav", "flac"])
.expect("No Soundclips found."),
player: audio.clone(),
playback: None,
settings: server_settings.clone(),
should_run: should_run.clone(),
};
let (ui_to_server_tx, ui_to_server_rx) = mpsc::channel(32);
// Run the server in a separate thread
let server_thread = thread::spawn(move || {
let rt = tokio::runtime::Runtime::new().unwrap();
rt.block_on(async {
server::run_server(app_state, ui_to_server_rx).await;
});
});
// Run the UI on the main thread
ui::run_ui(server_settings, should_run, ui_to_server_tx);
// Wait for the server thread to finish
server_thread.join().unwrap();
audio.lock().unwrap().exit();
eprintln!("Reached end of program.");
}