use crate::event::MidiEvent;
use std::collections::HashMap;
pub type MidiHandler = Box<dyn Fn(&MidiEvent) + Send + Sync>;
pub struct MidiRouter {
handlers: HashMap<u8, Vec<MidiHandler>>,
}
impl MidiRouter {
pub fn new() -> Self {
Self {
handlers: HashMap::new(),
}
}
pub fn register(&mut self, channel: u8, handler: MidiHandler) {
self.handlers.entry(channel).or_default().push(handler);
}
pub fn dispatch(&self, event: &MidiEvent) {
if let Some(handlers) = self.handlers.get(&event.channel) {
for h in handlers {
h(event);
}
}
if let Some(handlers) = self.handlers.get(&255) {
for h in handlers {
h(event);
}
}
}
pub fn clear_channel(&mut self, channel: u8) {
self.handlers.remove(&channel);
}
}
impl Default for MidiRouter {
fn default() -> Self {
Self::new()
}
}