audio_device/windows/
event.rs

1use crate::windows::RawEvent;
2use std::ptr;
3use windows_sys::Windows::Win32::SystemServices as ss;
4use windows_sys::Windows::Win32::WindowsProgramming as wp;
5
6const NULL: ss::HANDLE = ss::HANDLE(0);
7
8/// A managed ewvent object.
9#[repr(transparent)]
10pub struct Event {
11    handle: ss::HANDLE,
12}
13
14impl Event {
15    pub(crate) fn new(manual_reset: bool, initial_state: bool) -> windows::Result<Self> {
16        let handle = unsafe {
17            ss::CreateEventA(
18                ptr::null_mut(),
19                manual_reset,
20                initial_state,
21                ss::PSTR::default(),
22            )
23        };
24
25        if handle == NULL {
26            return Err(windows::Error::new(
27                windows::HRESULT::from_thread(),
28                "failed to create event handle",
29            ));
30        }
31
32        Ok(Self { handle })
33    }
34
35    /// Set the event.
36    pub fn set(&self) {
37        unsafe {
38            ss::SetEvent(self.handle);
39        }
40    }
41
42    /// Reset the event.
43    pub fn reset(&self) {
44        unsafe {
45            ss::ResetEvent(self.handle);
46        }
47    }
48}
49
50impl RawEvent for Event {
51    unsafe fn raw_event(&self) -> ss::HANDLE {
52        self.handle
53    }
54}
55
56impl Drop for Event {
57    fn drop(&mut self) {
58        unsafe {
59            // NB: We intentionally ignore errors here.
60            let _ = wp::CloseHandle(self.handle).ok();
61        }
62    }
63}
64
65unsafe impl Send for Event {}
66unsafe impl Sync for Event {}