diff options
author | Eddy Pedroni <epedroni@pm.me> | 2025-07-24 07:27:51 +0200 |
---|---|---|
committer | Eddy Pedroni <epedroni@pm.me> | 2025-07-24 07:27:51 +0200 |
commit | 49880b85de3d18f21792b9333571a396975697a0 (patch) | |
tree | 0e287353e6705b72f98e73d967bf3b91d9bc15b8 /daemon/src/connection_manager.cpp | |
parent | c5c195ff5318f00d544c0fbceb133abcc4ba7a5a (diff) |
Add udev notification support for connecting/disconnecting devices
Diffstat (limited to 'daemon/src/connection_manager.cpp')
-rw-r--r-- | daemon/src/connection_manager.cpp | 69 |
1 files changed, 15 insertions, 54 deletions
diff --git a/daemon/src/connection_manager.cpp b/daemon/src/connection_manager.cpp index 6de1800..ac4c6cb 100644 --- a/daemon/src/connection_manager.cpp +++ b/daemon/src/connection_manager.cpp @@ -1,41 +1,15 @@ #include "connection_manager.h" -#include "sender.h" +#include "device_connection.h" + +#include "udevw/include/udevw.hpp" #include <iostream> -#include <rtmidi/RtMidi.h> +#include <chrono> namespace midi_router { -struct Device_Connection : public Sender -{ - Device_Connection(Device_Id const & source_id, Submitter & submitter): - source_id(source_id), - submitter(submitter) - {} - - Device_Id const & source_id; - Submitter & submitter; - RtMidiIn midi_in {}; - RtMidiOut midi_out {}; - - void - send(std::vector<std::uint8_t> const & payload) override - { - if (midi_out.isPortOpen()) - { - midi_out.sendMessage(&payload); - } - } - - std::string - get_id() const override - { - return source_id; - } -}; - static void callback(double time_stamp, std::vector<unsigned char> *raw, void *user_data) { @@ -56,26 +30,13 @@ callback(double time_stamp, std::vector<unsigned char> *raw, void *user_data) Connection_Manager::Connection_Manager(Device_Map const & device_map, Submitter & submitter): m_device_map(device_map), m_submitter(submitter), - m_connections{} + m_connections{}, + m_detector(std::bind(&Connection_Manager::detect_devices, this)) { for (auto const & [name, id] : device_map) { - m_connections[id] = std::make_unique<Device_Connection>(id, submitter); - auto & connection = m_connections[id]; - - connection->midi_in.setCallback(&callback, connection.get()); - connection->midi_in.ignoreTypes(true, false, 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"; - } - + m_connections[id] = std::make_unique<Device_Connection>(id, name, submitter, callback); + m_connections[id]->open(); } } @@ -87,18 +48,18 @@ Connection_Manager::get_sender(Device_Id const & device) const return *m_connections.at(device); } -bool -Connection_Manager::open_port(RtMidi* const midi, std::string const & name) +void +Connection_Manager::detect_devices() { - for (std::size_t i = 0; i < midi->getPortCount(); ++i) + while (true) { - if (midi->getPortName(i).contains(name)) + std::cout << "Polling for devices\n"; + std::this_thread::sleep_for(std::chrono::seconds(1)); + for (auto && [id, connection] : m_connections) { - midi->openPort(i); - return true; + connection->open(); } } - return false; } } // namespace midi_router |