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 wait_ready_blocking(&mut self) -> Option<Vec<i32>> {
17        None
18    }
19    fn read_events_for_fds(&mut self, _ready_fds: &[i32], out: &mut Vec<HwMidiEvent>) {
20        self.read_events_into(out);
21    }
22    fn wake_input_waiter(&mut self) {}
23    fn close_input_waiter(&mut self) {}
24    fn write_events(&mut self, events: &[HwMidiEvent]);
25}
26
27pub trait HwDevice {
28    fn input_channels(&self) -> usize;
29    fn output_channels(&self) -> usize;
30    fn sample_rate(&self) -> i32;
31    fn latency_ranges(&self) -> ((usize, usize), (usize, usize));
32}
33
34#[macro_export]
35macro_rules! impl_hw_worker_traits_for_driver {
36    ($driver:ty) => {
37        impl $crate::hw::traits::HwWorkerDriver for $driver {
38            fn cycle_samples(&self) -> usize {
39                self.cycle_samples()
40            }
41
42            fn sample_rate(&self) -> i32 {
43                self.sample_rate()
44            }
45
46            fn run_cycle_for_worker(&mut self) -> Result<(), String> {
47                self.channel().run_cycle().map_err(|e| e.to_string())
48            }
49
50            fn run_assist_step_for_worker(&mut self) -> Result<bool, String> {
51                self.channel().run_assist_step().map_err(|e| e.to_string())
52            }
53        }
54    };
55}
56
57#[macro_export]
58macro_rules! impl_hw_device_for_driver {
59    ($driver:ty) => {
60        impl $crate::hw::traits::HwDevice for $driver {
61            fn input_channels(&self) -> usize {
62                self.input_channels()
63            }
64
65            fn output_channels(&self) -> usize {
66                self.output_channels()
67            }
68
69            fn sample_rate(&self) -> i32 {
70                self.sample_rate()
71            }
72
73            fn latency_ranges(&self) -> ((usize, usize), (usize, usize)) {
74                self.latency_ranges()
75            }
76        }
77    };
78}
79
80#[macro_export]
81macro_rules! impl_hw_midi_hub_traits {
82    ($hub:ty) => {
83        impl $crate::hw::traits::HwMidiHub for $hub {
84            fn read_events_into(&mut self, out: &mut Vec<$crate::message::HwMidiEvent>) {
85                <$hub>::read_events_into(self, out);
86            }
87
88            fn read_events_blocking_into(&mut self, out: &mut Vec<$crate::message::HwMidiEvent>) {
89                <$hub>::read_events_blocking_into(self, out);
90            }
91
92            fn wait_ready_blocking(&mut self) -> Option<Vec<i32>> {
93                <$hub>::wait_ready_blocking(self)
94            }
95
96            fn read_events_for_fds(
97                &mut self,
98                ready_fds: &[i32],
99                out: &mut Vec<$crate::message::HwMidiEvent>,
100            ) {
101                <$hub>::read_events_for_fds(self, ready_fds, out)
102            }
103
104            fn wake_input_waiter(&mut self) {
105                <$hub>::wake_input_waiter(self);
106            }
107
108            fn close_input_waiter(&mut self) {
109                <$hub>::close_input_waiter(self);
110            }
111
112            fn write_events(&mut self, events: &[$crate::message::HwMidiEvent]) {
113                <$hub>::write_events(self, events);
114            }
115        }
116    };
117}