#include "connection_manager.h" #include #include namespace midi_router { struct Device_Connection { Device_Id source_id; std::function const & submit; RtMidiIn midi_in {}; RtMidiOut midi_out {}; }; static void callback(double time_stamp, std::vector *raw, void *user_data) { Device_Connection* device = static_cast(user_data); if (raw->size() != 3) { std::cerr << "Received message with wrong size from " << device->source_id << ", dropping\n"; } Message message { device->source_id, {raw->at(0), raw->at(1), raw->at(2)} }; device->submit(message); } Connection_Manager::Connection_Manager(Device_Map const & device_map, std::function const & submit): m_device_map(device_map), m_submit(submit), m_connections{} { for (auto const & [name, id] : device_map) { m_connections[id] = std::make_unique(id, submit); auto & connection = m_connections[id]; connection->midi_in.setCallback(&callback, connection.get()); connection->midi_in.ignoreTypes(true, true, true); if (!open_port(&connection->midi_in, name)) { std::cerr << "Input port not found for device " << name << "\n"; } if (!open_port(&connection->midi_out, name)) { std::cerr << "Output port not found for device " << name << "\n"; } } } Connection_Manager::~Connection_Manager() = default; bool Connection_Manager::open_port(RtMidi* const midi, std::string const & name) { for (std::size_t i = 0; i < midi->getPortCount(); ++i) { if (midi->getPortName(i).contains(name)) { midi->openPort(i); return true; } } return false; } } // namespace midi_router