listen/
listen.rs

1use windows::Win32::Media::Audio::{Endpoints::{IAudioEndpointVolumeCallback, IAudioEndpointVolumeCallback_Impl}, AUDIO_VOLUME_NOTIFICATION_DATA};
2use windows_volume_control::AudioController;
3
4#[windows::core::implement(IAudioEndpointVolumeCallback)]
5struct VolumeChangeCallback;
6
7impl IAudioEndpointVolumeCallback_Impl for VolumeChangeCallback {
8    fn OnNotify(&self, pnotify: *mut AUDIO_VOLUME_NOTIFICATION_DATA) -> ::windows::core::Result<()> {
9        unsafe {
10            println!("volume changed: {}", (*pnotify).fMasterVolume);
11        }
12        return Ok(());
13    }
14}
15
16fn main() {
17    unsafe {
18        let mut controller = AudioController::init(None);
19        controller.GetSessions();
20        controller.GetDefaultAudioEnpointVolumeControl();
21        controller.GetAllProcessSessions();
22
23        let session = controller.get_session_by_name("master".to_string()).unwrap();
24
25        if let Some(session_endpoint_volume) = session.getAudioEndpointVolume() {
26            let volume_callback: IAudioEndpointVolumeCallback = VolumeChangeCallback {}.into();
27            session_endpoint_volume.RegisterControlChangeNotify(&volume_callback).unwrap();
28            println!("Initialised audio event listener for session 'master'");
29            loop {};
30        }
31    }
32}