diff options
Diffstat (limited to 'daemon/src/connection_manager.cpp')
-rw-r--r-- | daemon/src/connection_manager.cpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/daemon/src/connection_manager.cpp b/daemon/src/connection_manager.cpp new file mode 100644 index 0000000..820f1d2 --- /dev/null +++ b/daemon/src/connection_manager.cpp @@ -0,0 +1,74 @@ +#include "connection_manager.h" + +#include <iostream> +#include <rtmidi/RtMidi.h> + +namespace midi_router +{ + +struct Device_Connection +{ + Device_Id source_id; + std::function<void(Message const &)> const & submit; + RtMidiIn midi_in {}; + RtMidiOut midi_out {}; +}; + +static void +callback(double time_stamp, std::vector<unsigned char> *raw, void *user_data) +{ + Device_Connection* device = static_cast<Device_Connection*>(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<void(Message const &)> 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<Device_Connection>(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 + |