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