1use std::collections::HashMap;
4use crate::event::MidiEvent;
5
6pub type MidiHandler = Box<dyn Fn(&MidiEvent) + Send + Sync>;
8
9pub struct MidiRouter {
11 handlers: HashMap<u8, Vec<MidiHandler>>,
13}
14
15impl MidiRouter {
16 pub fn new() -> Self {
17 Self { handlers: HashMap::new() }
18 }
19
20 pub fn register(&mut self, channel: u8, handler: MidiHandler) {
23 self.handlers.entry(channel).or_default().push(handler);
24 }
25
26 pub fn dispatch(&self, event: &MidiEvent) {
28 if let Some(handlers) = self.handlers.get(&event.channel) {
30 for h in handlers { h(event); }
31 }
32 if let Some(handlers) = self.handlers.get(&255) {
34 for h in handlers { h(event); }
35 }
36 }
37
38 pub fn clear_channel(&mut self, channel: u8) {
40 self.handlers.remove(&channel);
41 }
42}
43
44impl Default for MidiRouter {
45 fn default() -> Self { Self::new() }
46}