From 6da14e1590935710055ebc81ba55017b457ca1ad Mon Sep 17 00:00:00 2001 From: Eddy Pedroni Date: Tue, 22 Jul 2025 22:00:00 +0200 Subject: Initial daemon implementation, no routing yet --- daemon/src/connection_manager.cpp | 74 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 daemon/src/connection_manager.cpp (limited to 'daemon/src/connection_manager.cpp') 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 +#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 + -- cgit v1.2.3