aboutsummaryrefslogtreecommitdiffstats
path: root/daemon/src/connection_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/src/connection_manager.cpp')
-rw-r--r--daemon/src/connection_manager.cpp74
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
+