Skip to main content

maolan_engine/hw/
traits.rs

1use crate::message::HwMidiEvent;
2
3pub trait HwWorkerDriver {
4    fn cycle_samples(&self) -> usize;
5    fn sample_rate(&self) -> i32;
6    fn request_stop(&mut self) {}
7    fn run_cycle_for_worker(&mut self) -> Result<(), String>;
8    fn run_assist_step_for_worker(&mut self) -> Result<bool, String>;
9}
10
11pub trait HwMidiHub {
12    fn read_events_into(&mut self, out: &mut Vec<HwMidiEvent>);
13    fn read_events_blocking_into(&mut self, out: &mut Vec<HwMidiEvent>) {
14        self.read_events_into(out);
15    }
16    fn wake_input_waiter(&mut self) {}
17    fn write_events(&mut self, events: &[HwMidiEvent]);
18}
19
20pub trait HwDevice {
21    fn input_channels(&self) -> usize;
22    fn output_channels(&self) -> usize;
23    fn sample_rate(&self) -> i32;
24    fn latency_ranges(&self) -> ((usize, usize), (usize, usize));
25}
26
27#[macro_export]
28macro_rules! impl_hw_worker_traits_for_driver {
29    ($driver:ty) => {
30        impl $crate::hw::traits::HwWorkerDriver for $driver {
31            fn cycle_samples(&self) -> usize {
32                self.cycle_samples()
33            }
34
35            fn sample_rate(&self) -> i32 {
36                self.sample_rate()
37            }
38
39            fn run_cycle_for_worker(&mut self) -> Result<(), String> {
40                self.channel().run_cycle().map_err(|e| e.to_string())
41            }
42
43            fn run_assist_step_for_worker(&mut self) -> Result<bool, String> {
44                self.channel().run_assist_step().map_err(|e| e.to_string())
45            }
46        }
47    };
48}
49
50#[macro_export]
51macro_rules! impl_hw_device_for_driver {
52    ($driver:ty) => {
53        impl $crate::hw::traits::HwDevice for $driver {
54            fn input_channels(&self) -> usize {
55                self.input_channels()
56            }
57
58            fn output_channels(&self) -> usize {
59                self.output_channels()
60            }
61
62            fn sample_rate(&self) -> i32 {
63                self.sample_rate()
64            }
65
66            fn latency_ranges(&self) -> ((usize, usize), (usize, usize)) {
67                self.latency_ranges()
68            }
69        }
70    };
71}
72
73#[macro_export]
74macro_rules! impl_hw_midi_hub_traits {
75    ($hub:ty) => {
76        impl $crate::hw::traits::HwMidiHub for $hub {
77            fn read_events_into(&mut self, out: &mut Vec<$crate::message::HwMidiEvent>) {
78                <$hub>::read_events_into(self, out);
79            }
80
81            fn read_events_blocking_into(&mut self, out: &mut Vec<$crate::message::HwMidiEvent>) {
82                <$hub>::read_events_blocking_into(self, out);
83            }
84
85            fn wake_input_waiter(&mut self) {
86                <$hub>::wake_input_waiter(self);
87            }
88
89            fn write_events(&mut self, events: &[$crate::message::HwMidiEvent]) {
90                <$hub>::write_events(self, events);
91            }
92        }
93    };
94}