UI for Server base code #1

Merged
g4borg merged 6 commits from server-ui into main 2024-06-08 00:22:53 +02:00
6 changed files with 144 additions and 194 deletions
Showing only changes of commit 7b5ee1f397 - Show all commits

178
Cargo.lock generated
View File

@ -134,14 +134,13 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
[[package]] [[package]]
name = "alsa" name = "alsa"
version = "0.7.0" version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8512c9117059663fb5606788fbca3619e2a91dac0e3fe516242eab1fa6be5e44" checksum = "37fe60779335388a88c01ac6c3be40304d1e349de3ada3b15f7808bb90fa9dce"
dependencies = [ dependencies = [
"alsa-sys", "alsa-sys",
"bitflags 1.3.2", "bitflags 2.5.0",
"libc", "libc",
"nix 0.24.3",
] ]
[[package]] [[package]]
@ -177,7 +176,7 @@ dependencies = [
"bitflags 2.5.0", "bitflags 2.5.0",
"cc", "cc",
"cesu8", "cesu8",
"jni 0.21.1", "jni",
"jni-sys", "jni-sys",
"libc", "libc",
"log", "log",
@ -1124,27 +1123,25 @@ dependencies = [
[[package]] [[package]]
name = "cpal" name = "cpal"
version = "0.15.2" version = "0.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779"
dependencies = [ dependencies = [
"alsa", "alsa",
"core-foundation-sys 0.8.4", "core-foundation-sys 0.8.4",
"coreaudio-rs", "coreaudio-rs",
"dasp_sample", "dasp_sample",
"jni 0.19.0", "jni",
"js-sys", "js-sys",
"libc", "libc",
"mach2", "mach2",
"ndk 0.7.0", "ndk 0.8.0",
"ndk-context", "ndk-context",
"oboe", "oboe",
"once_cell",
"parking_lot 0.12.1",
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-futures", "wasm-bindgen-futures",
"web-sys", "web-sys",
"windows 0.46.0", "windows 0.54.0",
] ]
[[package]] [[package]]
@ -1306,24 +1303,24 @@ dependencies = [
] ]
[[package]] [[package]]
name = "dirs-next" name = "dirs"
version = "2.0.0" version = "5.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "dirs-sys",
"dirs-sys-next",
] ]
[[package]] [[package]]
name = "dirs-sys-next" name = "dirs-sys"
version = "0.1.2" version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
dependencies = [ dependencies = [
"libc", "libc",
"option-ext",
"redox_users", "redox_users",
"winapi", "windows-sys 0.48.0",
] ]
[[package]] [[package]]
@ -1371,6 +1368,12 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
[[package]]
name = "dpi"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53"
[[package]] [[package]]
name = "ecolor" name = "ecolor"
version = "0.27.2" version = "0.27.2"
@ -2407,34 +2410,6 @@ version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
[[package]]
name = "jni"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec"
dependencies = [
"cesu8",
"combine",
"jni-sys",
"log",
"thiserror",
"walkdir",
]
[[package]]
name = "jni"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c"
dependencies = [
"cesu8",
"combine",
"jni-sys",
"log",
"thiserror",
"walkdir",
]
[[package]] [[package]]
name = "jni" name = "jni"
version = "0.21.1" version = "0.21.1"
@ -2865,12 +2840,13 @@ dependencies = [
[[package]] [[package]]
name = "muda" name = "muda"
version = "0.12.2" version = "0.13.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a40c16e25abca53b401d2972e8ad344820e318cf7e00ea8a951a5ca265590295" checksum = "86b959f97c97044e4c96e32e1db292a7d594449546a3c6b77ae613dc3a5b5145"
dependencies = [ dependencies = [
"cocoa 0.25.0", "cocoa 0.25.0",
"crossbeam-channel", "crossbeam-channel",
"dpi",
"gtk", "gtk",
"keyboard-types", "keyboard-types",
"libxdo", "libxdo",
@ -2913,20 +2889,6 @@ dependencies = [
"thiserror", "thiserror",
] ]
[[package]]
name = "ndk"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0"
dependencies = [
"bitflags 1.3.2",
"jni-sys",
"ndk-sys 0.4.1+23.1.7779620",
"num_enum 0.5.11",
"raw-window-handle 0.5.2",
"thiserror",
]
[[package]] [[package]]
name = "ndk" name = "ndk"
version = "0.8.0" version = "0.8.0"
@ -2982,15 +2944,6 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121"
[[package]]
name = "ndk-sys"
version = "0.4.1+23.1.7779620"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3"
dependencies = [
"jni-sys",
]
[[package]] [[package]]
name = "ndk-sys" name = "ndk-sys"
version = "0.5.0+25.2.9519653" version = "0.5.0+25.2.9519653"
@ -3024,17 +2977,6 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "nix"
version = "0.24.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069"
dependencies = [
"bitflags 1.3.2",
"cfg-if 1.0.0",
"libc",
]
[[package]] [[package]]
name = "nix" name = "nix"
version = "0.26.4" version = "0.26.4"
@ -3074,13 +3016,13 @@ dependencies = [
[[package]] [[package]]
name = "num-derive" name = "num-derive"
version = "0.3.3" version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 1.0.109", "syn 2.0.66",
] ]
[[package]] [[package]]
@ -3335,12 +3277,12 @@ dependencies = [
[[package]] [[package]]
name = "oboe" name = "oboe"
version = "0.5.0" version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb"
dependencies = [ dependencies = [
"jni 0.20.0", "jni",
"ndk 0.7.0", "ndk 0.8.0",
"ndk-context", "ndk-context",
"num-derive", "num-derive",
"num-traits", "num-traits",
@ -3349,9 +3291,9 @@ dependencies = [
[[package]] [[package]]
name = "oboe-sys" name = "oboe-sys"
version = "0.5.0" version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2" checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d"
dependencies = [ dependencies = [
"cc", "cc",
] ]
@ -3371,6 +3313,12 @@ version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
[[package]]
name = "option-ext"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
[[package]] [[package]]
name = "orbclient" name = "orbclient"
version = "0.3.47" version = "0.3.47"
@ -3838,15 +3786,16 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832"
[[package]] [[package]]
name = "rodio" name = "rodio"
version = "0.17.1" version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bdf1d4dea18dff2e9eb6dca123724f8b60ef44ad74a9ad283cdfe025df7e73fa" checksum = "d1fceb9d127d515af1586d8d0cc601e1245bdb0af38e75c865a156290184f5b3"
dependencies = [ dependencies = [
"claxon", "claxon",
"cpal", "cpal",
"hound", "hound",
"lewton", "lewton",
"symphonia", "symphonia",
"thiserror",
] ]
[[package]] [[package]]
@ -4568,14 +4517,14 @@ dependencies = [
[[package]] [[package]]
name = "tray-icon" name = "tray-icon"
version = "0.12.0" version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "454035ff34b8430638c894e6197748578d6b4d449c6edaf8ea854d94e2dd862b" checksum = "3ad8319cca93189ea9ab1b290de0595960529750b6b8b501a399ed1ec3775d60"
dependencies = [ dependencies = [
"cocoa 0.25.0", "cocoa 0.25.0",
"core-graphics 0.23.1", "core-graphics 0.23.1",
"crossbeam-channel", "crossbeam-channel",
"dirs-next", "dirs",
"libappindicator", "libappindicator",
"muda", "muda",
"objc", "objc",
@ -5034,7 +4983,7 @@ checksum = "db67ae75a9405634f5882791678772c94ff5f16a66535aae186e26aa0841fc8b"
dependencies = [ dependencies = [
"core-foundation 0.9.3", "core-foundation 0.9.3",
"home", "home",
"jni 0.21.1", "jni",
"log", "log",
"ndk-context", "ndk-context",
"objc", "objc",
@ -5182,15 +5131,6 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows"
version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25"
dependencies = [
"windows-targets 0.42.2",
]
[[package]] [[package]]
name = "windows" name = "windows"
version = "0.48.0" version = "0.48.0"
@ -5212,6 +5152,16 @@ dependencies = [
"windows-targets 0.48.5", "windows-targets 0.48.5",
] ]
[[package]]
name = "windows"
version = "0.54.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49"
dependencies = [
"windows-core 0.54.0",
"windows-targets 0.52.5",
]
[[package]] [[package]]
name = "windows" name = "windows"
version = "0.56.0" version = "0.56.0"
@ -5231,6 +5181,16 @@ dependencies = [
"windows-targets 0.48.5", "windows-targets 0.48.5",
] ]
[[package]]
name = "windows-core"
version = "0.54.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65"
dependencies = [
"windows-result",
"windows-targets 0.52.5",
]
[[package]] [[package]]
name = "windows-core" name = "windows-core"
version = "0.56.0" version = "0.56.0"

View File

@ -17,7 +17,7 @@ minijinja = { version = "1.0.3", features = ["loader"] }
minimp3 = "0.5.1" minimp3 = "0.5.1"
mp3-duration = "0.1.10" mp3-duration = "0.1.10"
regex = "1.9.0" regex = "1.9.0"
rodio = "0.17.1" rodio = "0.18.1"
serde = { version = "1.0.171", features = ["derive"] } serde = { version = "1.0.171", features = ["derive"] }
tokio = { version = "1.29.1", features = ["full"] } tokio = { version = "1.29.1", features = ["full"] }
xxhash-rust = { version = "0.8.6", features = ["xxh3", "const_xxh3"] } xxhash-rust = { version = "0.8.6", features = ["xxh3", "const_xxh3"] }
@ -26,7 +26,7 @@ eframe = "0.27.2"
tray-item = "0.10" tray-item = "0.10"
winit = "0.25" winit = "0.25"
once_cell = "1.19.0" once_cell = "1.19.0"
tray-icon = "0.12" tray-icon = "0.14.3"
raw-window-handle = "0.6.2" raw-window-handle = "0.6.2"
[build-dependencies] [build-dependencies]

View File

@ -1,21 +1,13 @@
use axum::extract::State; use axum_template::engine::Engine;
use axum::{routing, routing::get, Router};
use axum_template::{engine::Engine, Key, RenderHtml};
use minijinja::{path_loader, Environment}; use minijinja::{path_loader, Environment};
use state::{AppState, TemplateEngine}; use state::AppState;
use log::info;
use serde::{Deserialize, Serialize};
use std::env; use std::env;
use std::{ use std::sync::{Arc, Mutex};
net::SocketAddr,
sync::{Arc, Mutex},
thread,
};
use tokio::sync::mpsc; use tokio::sync::mpsc;
use dotenvy::dotenv; use dotenvy::dotenv;
use vbplay::{example_handler, AudioThread, DeviceSelection, PlaybackAction, SoundDecoder}; use vbplay::{example_handler, DeviceSelection, SoundDecoder};
mod handlers; mod handlers;
mod server; mod server;
@ -24,9 +16,9 @@ mod state;
mod ui; mod ui;
mod vbplay; mod vbplay;
#[tokio::main] fn main() {
async fn main() {
dotenv().ok(); dotenv().ok();
let rt = tokio::runtime::Runtime::new().unwrap();
let device_pattern = env::var("DEVICE_PATTERN").expect("Need a device pattern"); 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 folder = env::var("DIRECTORY").expect("Need a directory in env file.");
@ -60,19 +52,24 @@ async fn main() {
let (ui_to_server_tx, ui_to_server_rx) = mpsc::channel(32); let (ui_to_server_tx, ui_to_server_rx) = mpsc::channel(32);
// Run the server in a separate thread let server_handle = rt.spawn(async move {
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; server::run_server(app_state, ui_to_server_rx).await;
}); });
});
// Run the UI on the main thread // Run the UI on the main thread
ui::run_ui(server_settings, should_run, ui_to_server_tx); ui::run_ui(server_settings, should_run, ui_to_server_tx);
// Wait for the server thread to finish if let Err(e) = rt.block_on(server_handle) {
server_thread.join().unwrap(); eprintln!("Server task error: {:?}", e);
} else {
println!("Server task completed successfully");
}
rt.shutdown_timeout(tokio::time::Duration::from_secs(5));
audio.lock().unwrap().exit(); audio.lock().unwrap().exit();
drop(audio);
eprintln!("Reached end of program."); eprintln!("Reached end of program.");
std::process::exit(0);
} }

View File

@ -2,12 +2,8 @@ use crate::handlers;
use crate::state::AppState; use crate::state::AppState;
use axum::{routing, Router}; use axum::{routing, Router};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::{ use std::net::SocketAddr;
net::SocketAddr,
sync::{Arc, Mutex},
};
use tokio::sync::mpsc; use tokio::sync::mpsc;
use tokio::task::JoinHandle;
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerSettings { pub struct ServerSettings {
@ -19,58 +15,20 @@ pub enum ServerMessage {
UpdateSettings(ServerSettings), UpdateSettings(ServerSettings),
Interact, Interact,
Shutdown, Shutdown,
// Add other message types here
} }
pub async fn run_server(app_state: AppState, mut rx: mpsc::Receiver<ServerMessage>) { pub async fn run_server(app_state: AppState, mut rx: mpsc::Receiver<ServerMessage>) {
let mut server_handle = start_server(&app_state);
loop { loop {
tokio::select! { let should_run = {
_ = &mut server_handle => { let guard = app_state.should_run.lock().unwrap();
// Server has stopped *guard
eprintln!("Server stopped."); };
break;
},
Some(message) = rx.recv() => {
match message {
// This is the message type that actually restarts the server.
ServerMessage::UpdateSettings(new_settings) => {
println!("Received new settings: {:?}", new_settings);
let mut settings_guard = app_state.settings.lock().unwrap();
*settings_guard = new_settings;
// Restart the server with new settings if !should_run {
println!("Aborting current server..."); eprintln!("Should run is false.");
server_handle.abort(); // Cancel the previous server task
println!("Starting new server...");
drop(settings_guard); // Ensure the lock is released before starting the new server
server_handle = start_server(&app_state);
println!("Server started.");
},
ServerMessage::Shutdown => {
// Handle server shutdown
println!("Shutting down server...");
let mut should_run_guard = app_state.should_run.lock().unwrap();
*should_run_guard = false;
server_handle.abort();
println!("Server shutdown.");
break; break;
},
// Handle other message types here
ServerMessage::Interact => {
// Example interaction: print current settings
let settings_guard = app_state.settings.lock().unwrap();
println!("Current settings: {:?}", *settings_guard);
},
} }
}
}
}
}
fn start_server(app_state: &AppState) -> JoinHandle<()> {
// Compute the address before entering the async block
let addr = { let addr = {
let settings = app_state.settings.lock().unwrap(); let settings = app_state.settings.lock().unwrap();
let port: u16 = settings.port.parse().unwrap_or(3311); let port: u16 = settings.port.parse().unwrap_or(3311);
@ -81,31 +39,58 @@ fn start_server(app_state: &AppState) -> JoinHandle<()> {
println!("listening on {}", addr); println!("listening on {}", addr);
tokio::spawn(async move { let server_handle = tokio::spawn(async move {
let app = Router::new() let app = Router::new()
.route("/", routing::get(handlers::home)) .route("/", routing::get(handlers::home))
.route("/play/:hash", routing::get(handlers::play_handler)) .route("/play/:hash", routing::get(handlers::play_handler))
.route("/stop", routing::get(handlers::stop_handler)) .route("/stop", routing::get(handlers::stop_handler))
.with_state(server_app_state.clone()); .with_state(server_app_state.clone());
let server = axum::Server::bind(&addr).serve(app.into_make_service()); axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
});
let server_abort_handle = server_handle.abort_handle();
// Run the server and monitor the should_run flag
tokio::select! { tokio::select! {
_ = server => { _ = server_handle => {
eprintln!("Server..."); // Server has stopped
eprintln!("Server stopped.");
let mut should_run_guard = app_state.should_run.lock().unwrap();
*should_run_guard = false;
drop(should_run_guard);
break;
},
Some(message) = rx.recv() => {
match message {
ServerMessage::UpdateSettings(new_settings) => {
println!("Received new settings: {:?}", new_settings);
let mut settings_guard = app_state.settings.lock().unwrap();
*settings_guard = new_settings;
drop(settings_guard); // Ensure the lock is released before starting the new server
// Restart the server with new settings
println!("Aborting current server...");
server_abort_handle.abort();
},
ServerMessage::Shutdown => {
// Handle server shutdown
println!("Shutting down server...");
let mut should_run_guard = app_state.should_run.lock().unwrap();
*should_run_guard = false;
drop(should_run_guard);
server_abort_handle.abort();
println!("Server shutdown.");
break;
},
ServerMessage::Interact => {
// Example interaction: print current settings
let settings_guard = app_state.settings.lock().unwrap();
println!("Current settings: {:?}", *settings_guard);
server_abort_handle.abort();
}, },
_ = monitor_shutdown(server_app_state.should_run.clone()) => {
println!("Server shutdown signal received");
} }
} }
}) }
} }
eprintln!("Exiting run_server.");
async fn monitor_shutdown(should_run: Arc<Mutex<bool>>) {
eprintln!("Monitoring shutdown...");
while *should_run.lock().unwrap() {
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
}
eprintln!("Shutdown completed.");
} }

View File

@ -24,7 +24,7 @@ pub fn run_ui(
let window_handle = cc.window_handle().unwrap(); let window_handle = cc.window_handle().unwrap();
let window_handle = window_handle.as_raw(); let window_handle = window_handle.as_raw();
let mut tray = let mut tray =
TrayItem::new("App Name", tray_item::IconSource::Resource("icon-red")).unwrap(); TrayItem::new("Soundboard", tray_item::IconSource::Resource("icon-red")).unwrap();
if let RawWindowHandle::Win32(handle) = window_handle { if let RawWindowHandle::Win32(handle) = window_handle {
// Windows Only. // Windows Only.
use windows::Win32::Foundation::HWND; use windows::Win32::Foundation::HWND;
@ -59,8 +59,10 @@ pub fn run_ui(
println!("Unsupported platform for tray icon."); println!("Unsupported platform for tray icon.");
} }
let my_tx = tx.clone();
tray.add_menu_item("Quit", move || { tray.add_menu_item("Quit", move || {
std::process::exit(0); my_tx.try_send(ServerMessage::Shutdown).unwrap();
//std::process::exit(0);
}) })
.unwrap(); .unwrap();
@ -119,6 +121,7 @@ impl eframe::App for NativeApp {
eprintln!("Failed to send shutdown message"); eprintln!("Failed to send shutdown message");
} }
} }
drop(settings);
}); });
} }

View File

@ -182,6 +182,10 @@ pub fn audio_thread(
match command { match command {
Command::Exit => { Command::Exit => {
eprintln!("Exiting Soundloop."); eprintln!("Exiting Soundloop.");
if let Ok(sink) = sink_mutex.lock() {
sink.stop();
}
drop(stream_handle);
break; break;
} }
Command::Play(file_name) => { Command::Play(file_name) => {
@ -224,6 +228,7 @@ pub fn audio_thread(
} }
} }
} }
eprintln!("Exiting audio_thread");
}); });
tx tx