maolan_engine/hw/
traits.rs1use 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}