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 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}