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