rsmixer 0.5.5

PulseAudio volume mixer written in rust
use pulse::volume;

pub fn volume_to_percent(volume: volume::ChannelVolumes) -> u16 {
	let avg = volume.avg().0;

	let base_delta = (volume::Volume::NORMAL.0 as f32 - volume::Volume::MUTED.0 as f32) / 100.0;

	((avg - volume::Volume::MUTED.0) as f32 / base_delta).round() as u16
}

pub fn percent_to_volume(target_percent: i16) -> u32 {
	let base_delta = (volume::Volume::NORMAL.0 as f32 - volume::Volume::MUTED.0 as f32) / 100.0;

	if target_percent < 0 {
		volume::Volume::MUTED.0
	} else if target_percent == 100 {
		volume::Volume::NORMAL.0
	} else if target_percent >= 150 {
		(volume::Volume::NORMAL.0 as f32 * 1.5) as u32
	} else if target_percent < 100 {
		volume::Volume::MUTED.0 + target_percent as u32 * base_delta as u32
	} else {
		volume::Volume::NORMAL.0 + (target_percent - 100) as u32 * base_delta as u32
	}
}

#[macro_export]
macro_rules! unwrap_or_return {
	($x:expr, $y:expr) => {
		match $x {
			Some(x) => x,
			None => {
				return $y;
			}
		}
	};
	($x:expr) => {
		unwrap_or_return!($x, ())
	};
}

#[macro_export]
macro_rules! error {
    ($($x:expr),*) => {
        log::error!("[{}] {}", LOGGING_MODULE, format!($($x),*));
    }
}

#[macro_export]
macro_rules! debug {
    ($($x:expr),*) => {
        log::debug!("[{}] {}", LOGGING_MODULE, format!($($x),*));
    }
}

#[macro_export]
macro_rules! info {
    ($($x:expr),*) => {
        log::info!("[{}] {}", LOGGING_MODULE, format!($($x),*));
    }
}

#[macro_export]
macro_rules! warn {
    ($($x:expr),*) => {
        log::warn!("[{}] {}", LOGGING_MODULE, format!($($x),*));
    }
}