use std::sync::
{
LazyLock,
atomic::
{
AtomicBool,
AtomicUsize,
Ordering,
},
};
use crate::config;
pub const VOLUME_MAX: u32 = 200;
static SEQ: AtomicUsize = AtomicUsize::new(0);
static SERVER_SEQ: AtomicUsize = AtomicUsize::new(0);
static USE_VOICE: AtomicBool = AtomicBool::new(false);
static INPUT_VOLUME: LazyLock<AtomicUsize> = LazyLock::new(|| AtomicUsize::new(clamp_volume(config::read_config::<u32>("input_volume")) as usize));
static OUTPUT_VOLUME: LazyLock<AtomicUsize> = LazyLock::new(|| AtomicUsize::new(clamp_volume(config::read_config::<u32>("output_volume")) as usize));
static NOISE_SUPPRESSION: LazyLock<AtomicBool> = LazyLock::new(|| AtomicBool::new(config::read_config::<bool>("noise_suppression")));
static AUTOMATIC_GAIN: LazyLock<AtomicBool> = LazyLock::new(|| AtomicBool::new(config::read_config::<bool>("automatic_gain")));
static DEVICE_GENERATION: AtomicUsize = AtomicUsize::new(0);
pub fn get_seq() -> usize {
SEQ.load(Ordering::Relaxed)
}
pub fn set_seq(value: usize) {
SEQ.store(value, Ordering::Relaxed)
}
pub fn get_server_seq() -> usize {
SERVER_SEQ.load(Ordering::Relaxed)
}
pub fn set_server_seq(value: usize) {
SERVER_SEQ.store(value, Ordering::Relaxed)
}
pub fn get_use_voice() -> bool {
USE_VOICE.load(Ordering::Relaxed)
}
pub fn set_use_voice(value: bool) {
USE_VOICE.store(value, Ordering::Relaxed)
}
pub fn clamp_volume(percent: u32) -> u32 {
percent.min(VOLUME_MAX)
}
pub fn init_audio() {
get_input_volume();
get_output_volume();
noise_suppression();
automatic_gain();
}
pub fn get_input_volume() -> u32 {
INPUT_VOLUME.load(Ordering::Relaxed) as u32
}
pub fn set_input_volume(percent: u32)
{
INPUT_VOLUME.store(clamp_volume(percent) as usize, Ordering::Relaxed);
}
pub fn get_output_volume() -> u32 {
OUTPUT_VOLUME.load(Ordering::Relaxed) as u32
}
pub fn set_output_volume(percent: u32)
{
OUTPUT_VOLUME.store(clamp_volume(percent) as usize, Ordering::Relaxed);
}
pub fn get_input_gain() -> f32 {
get_input_volume() as f32 / 100.
}
pub fn get_output_gain() -> f32 {
get_output_volume() as f32 / 100.
}
pub fn noise_suppression() -> bool {
NOISE_SUPPRESSION.load(Ordering::Relaxed)
}
pub fn set_noise_suppression(value: bool)
{
NOISE_SUPPRESSION.store(value, Ordering::Relaxed);
}
pub fn automatic_gain() -> bool {
AUTOMATIC_GAIN.load(Ordering::Relaxed)
}
pub fn set_automatic_gain(value: bool)
{
AUTOMATIC_GAIN.store(value, Ordering::Relaxed);
}
pub fn device_generation() -> usize {
DEVICE_GENERATION.load(Ordering::Relaxed)
}
pub fn mark_devices_changed() {
DEVICE_GENERATION.fetch_add(1, Ordering::Relaxed);
}