audio_device/windows/
event.rs1use 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#[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 pub fn set(&self) {
37 unsafe {
38 ss::SetEvent(self.handle);
39 }
40 }
41
42 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 let _ = wp::CloseHandle(self.handle).ok();
61 }
62 }
63}
64
65unsafe impl Send for Event {}
66unsafe impl Sync for Event {}