diff options
author | David Robillard <d@drobilla.net> | 2020-11-28 11:18:08 +0100 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-11-28 12:45:57 +0100 |
commit | 4ac8e622bb4ef5841435fc0815efb6bb756f76da (patch) | |
tree | 156fed5580687bca59fed337c9701acbcaf469f5 /src/AlsaDriver.cpp | |
parent | 4988d75f19e81c58e2cfdc068c5638b95ae9e314 (diff) | |
download | patchage-4ac8e622bb4ef5841435fc0815efb6bb756f76da.tar.gz patchage-4ac8e622bb4ef5841435fc0815efb6bb756f76da.tar.bz2 patchage-4ac8e622bb4ef5841435fc0815efb6bb756f76da.zip |
Always index Jack ports and refer to them by name
The Jack API annoyingly doesn't provide a way to get an ID from a port name.
Since notification callbacks apparently don't have to worry about realtime
concerns anymore, simply use the full name string as an ID everywhere.
This means that every Jack port has a non-null ID, and all ports are always
indexed, so the kludges for this in the canvas can be removed.
Diffstat (limited to 'src/AlsaDriver.cpp')
-rw-r--r-- | src/AlsaDriver.cpp | 71 |
1 files changed, 46 insertions, 25 deletions
diff --git a/src/AlsaDriver.cpp b/src/AlsaDriver.cpp index 7cd4f8d..b8dcdc6 100644 --- a/src/AlsaDriver.cpp +++ b/src/AlsaDriver.cpp @@ -31,6 +31,16 @@ PATCHAGE_RESTORE_WARNINGS #include <string> #include <utility> +namespace { + +inline PortID +addr_to_id(const snd_seq_addr_t& addr, bool is_input) +{ + return PortID::alsa(addr.client, addr.port, is_input); +} + +} // namespace + AlsaDriver::AlsaDriver(Patchage* app, ILog& log) : _app(app) , _log(log) @@ -153,8 +163,8 @@ AlsaDriver::refresh() continue; } - PatchagePort* port1 = - _app->canvas()->find_port(PortID(*addr, false)); + PatchagePort* const port1 = _app->canvas()->find_port( + PortID::alsa(addr->client, addr->port, false)); if (!port1) { continue; } @@ -167,7 +177,8 @@ AlsaDriver::refresh() const snd_seq_addr_t* addr2 = snd_seq_query_subscribe_get_addr(subsinfo); if (addr2) { - const PortID id2(*addr2, true); + const PortID id2 = + PortID::alsa(addr2->client, addr2->port, true); PatchagePort* port2 = _app->canvas()->find_port(id2); if (port2 && !_app->canvas()->get_edge(port1, port2)) { _app->canvas()->make_connection(port1, port2); @@ -186,7 +197,8 @@ AlsaDriver::create_port_view(Patchage*, const PortID& id) { PatchageModule* parent = nullptr; PatchagePort* port = nullptr; - create_port_view_internal(id.id.alsa_addr, parent, port); + create_port_view_internal({id.alsa_client(), id.alsa_port()}, parent, port); + return port; } @@ -324,7 +336,7 @@ AlsaDriver::create_port(PatchageModule& parent, bool is_input, snd_seq_addr_t addr) { - const PortID id{addr, is_input}; + const PortID id = PortID::alsa(addr.client, addr.port, is_input); auto* ret = new PatchagePort(parent, @@ -401,14 +413,18 @@ AlsaDriver::connect(const PortID tail_id, const std::string& head_client_name, const std::string& head_port_name) { - if (tail_id.type != PortID::Type::alsa_addr || - head_id.type != PortID::Type::alsa_addr) { + if (tail_id.type() != PortID::Type::alsa || + head_id.type() != PortID::Type::alsa) { _log.error("[ALSA] Attempt to connect non-ALSA ports"); return false; } - const auto& tail_addr = tail_id.id.alsa_addr; - const auto& head_addr = head_id.id.alsa_addr; + const snd_seq_addr_t tail_addr = {tail_id.alsa_client(), + tail_id.alsa_port()}; + + const snd_seq_addr_t head_addr = {head_id.alsa_client(), + head_id.alsa_port()}; + if (tail_addr.client == head_addr.client && tail_addr.port == head_addr.port) { _log.warning("[ALSA] Refusing to connect port to itself"); @@ -467,14 +483,17 @@ AlsaDriver::disconnect(const PortID tail_id, const std::string& head_client_name, const std::string& head_port_name) { - if (tail_id.type != PortID::Type::alsa_addr || - head_id.type != PortID::Type::alsa_addr) { + if (tail_id.type() != PortID::Type::alsa || + head_id.type() != PortID::Type::alsa) { _log.error("[ALSA] Attempt to disconnect non-ALSA ports"); return false; } - const auto& tail_addr = tail_id.id.alsa_addr; - const auto& head_addr = head_id.id.alsa_addr; + const snd_seq_addr_t tail_addr = {tail_id.alsa_client(), + tail_id.alsa_port()}; + + const snd_seq_addr_t head_addr = {head_id.alsa_client(), + head_id.alsa_port()}; snd_seq_port_subscribe_t* subs = nullptr; snd_seq_port_subscribe_malloc(&subs); @@ -581,17 +600,19 @@ AlsaDriver::_refresh_main() case SND_SEQ_EVENT_PORT_SUBSCRIBED: if (!ignore(ev->data.connect.sender) && !ignore(ev->data.connect.dest)) { - _events.push(PatchageEvent(PatchageEvent::Type::connection, - ev->data.connect.sender, - ev->data.connect.dest)); + _events.push( + PatchageEvent(PatchageEvent::Type::connection, + addr_to_id(ev->data.connect.sender, false), + addr_to_id(ev->data.connect.dest, true))); } break; case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: if (!ignore(ev->data.connect.sender) && !ignore(ev->data.connect.dest)) { - _events.push(PatchageEvent(PatchageEvent::Type::disconnection, - ev->data.connect.sender, - ev->data.connect.dest)); + _events.push( + PatchageEvent(PatchageEvent::Type::disconnection, + addr_to_id(ev->data.connect.sender, false), + addr_to_id(ev->data.connect.dest, true))); } break; case SND_SEQ_EVENT_PORT_START: @@ -603,7 +624,7 @@ AlsaDriver::_refresh_main() if (!ignore(ev->data.addr)) { _events.push(PatchageEvent( PatchageEvent::Type::port_creation, - PortID(ev->data.addr, (caps & SND_SEQ_PORT_CAP_READ)))); + addr_to_id(ev->data.addr, (caps & SND_SEQ_PORT_CAP_READ)))); } break; case SND_SEQ_EVENT_PORT_EXIT: @@ -612,15 +633,15 @@ AlsaDriver::_refresh_main() // Delete both inputs and outputs (to handle duplex ports) _events.push( PatchageEvent(PatchageEvent::Type::port_destruction, - PortID(ev->data.addr, true))); + addr_to_id(ev->data.addr, true))); _events.push( PatchageEvent(PatchageEvent::Type::port_destruction, - PortID(ev->data.addr, false))); + addr_to_id(ev->data.addr, false))); + _port_addrs.erase(_app->canvas()->find_port( + addr_to_id(ev->data.addr, false))); _port_addrs.erase( - _app->canvas()->find_port(PortID(ev->data.addr, false))); - _port_addrs.erase( - _app->canvas()->find_port(PortID(ev->data.addr, true))); + _app->canvas()->find_port(addr_to_id(ev->data.addr, true))); } break; case SND_SEQ_EVENT_CLIENT_CHANGE: |