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}