aboutsummaryrefslogtreecommitdiff
path: root/src/utils/volume.rs
blob: 472d5cd0267bd565cd3d435d32e70dec67f8c6cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use crate::config::CONFIG;
use crate::types::ThreadsData;
use alsa::mixer::{Mixer, SelemChannelId, SelemId};

// getting volume percentage
pub async fn get_volume() -> ThreadsData {
    let card = if CONFIG.volume.card == "PULSE" {
        "pulse"
    } else {
        "default"
    };

    let mixer = Mixer::new(card, false).expect("Failed to open mixer");
    let selem_id = SelemId::new("Master", 0);
    let selem = mixer.find_selem(&selem_id).expect("Couldn't find selem");
    let selem_chan_id = SelemChannelId::FrontLeft;

    let (min, max) = selem.get_playback_volume_range();
    let mut raw_volume = selem
        .get_playback_volume(selem_chan_id)
        .expect("Failed to get raw_volume");

    let muted = selem
        .get_playback_switch(selem_chan_id)
        .expect("Failed to get playback state") 
        == 0;

    let range = max - min;
    let vol = if muted || range == 0 {
        0
    } else {
        raw_volume -= min;
        ((raw_volume as f64 / range as f64) * 100.) as u64
    };

    let icon = match muted {
        true => &CONFIG.volume.icon_muted,
        false => if vol < 50 { &CONFIG.volume.icon_low } else { &CONFIG.volume.icon_high }
    };


    let data = format!(" {} {:>2}%  {}", icon, vol, CONFIG.seperator);
    ThreadsData::Sound(data)
}