summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-04-08 15:26:33 -0400
committerDavid Robillard <d@drobilla.net>2021-04-08 15:26:33 -0400
commit0b413acf900a67d4fd0336e34ba5aa99b6661989 (patch)
treee8edab7f3432c92a3c89218f47bc3f9ee3d77425 /src
parentf06a1bc9bd65ff3a34fc6fd4dc4b55056aaaaeec (diff)
downloadpatchage-0b413acf900a67d4fd0336e34ba5aa99b6661989.tar.gz
patchage-0b413acf900a67d4fd0336e34ba5aa99b6661989.tar.bz2
patchage-0b413acf900a67d4fd0336e34ba5aa99b6661989.zip
Fix ALSA sequencer port subscriptions
Diffstat (limited to 'src')
-rw-r--r--src/AlsaDriver.cpp42
1 files changed, 22 insertions, 20 deletions
diff --git a/src/AlsaDriver.cpp b/src/AlsaDriver.cpp
index 5fd038c..fcf5e2e 100644
--- a/src/AlsaDriver.cpp
+++ b/src/AlsaDriver.cpp
@@ -232,13 +232,13 @@ AlsaDriver::refresh(const EventSink& sink)
auto info = port_info(pinfo);
if (caps & SND_SEQ_PORT_CAP_READ) {
- info.direction = SignalDirection::input;
- sink({PortCreationEvent{addr_to_id(addr, true), info}});
+ info.direction = SignalDirection::output;
+ sink({PortCreationEvent{addr_to_id(addr, false), info}});
}
if (caps & SND_SEQ_PORT_CAP_WRITE) {
- info.direction = SignalDirection::output;
- sink({PortCreationEvent{addr_to_id(addr, false), info}});
+ info.direction = SignalDirection::input;
+ sink({PortCreationEvent{addr_to_id(addr, true), info}});
}
}
}
@@ -252,24 +252,26 @@ AlsaDriver::refresh(const EventSink& sink)
snd_seq_port_info_set_client(pinfo, client_id);
snd_seq_port_info_set_port(pinfo, -1);
while (snd_seq_query_next_port(_seq, pinfo) >= 0) {
- const auto tail_addr = *snd_seq_port_info_get_addr(pinfo);
- const auto tail_id = addr_to_id(tail_addr, false);
- if (ignore(tail_addr)) {
- continue;
- }
+ const auto port_addr = *snd_seq_port_info_get_addr(pinfo);
+ const auto caps = snd_seq_port_info_get_capability(pinfo);
- snd_seq_query_subscribe_t* sinfo = nullptr;
- snd_seq_query_subscribe_alloca(&sinfo);
- snd_seq_query_subscribe_set_root(sinfo, &tail_addr);
- snd_seq_query_subscribe_set_index(sinfo, 0);
- while (!snd_seq_query_port_subscribers(_seq, sinfo)) {
- const auto head_addr = *snd_seq_query_subscribe_get_addr(sinfo);
- const auto head_id = addr_to_id(head_addr, true);
+ if (!ignore(port_addr) && (caps & SND_SEQ_PORT_CAP_READ)) {
+ const auto tail_id = addr_to_id(port_addr, false);
- sink({ConnectionEvent{tail_id, head_id}});
+ snd_seq_query_subscribe_t* sinfo = nullptr;
+ snd_seq_query_subscribe_alloca(&sinfo);
+ snd_seq_query_subscribe_set_type(sinfo, SND_SEQ_QUERY_SUBS_READ);
+ snd_seq_query_subscribe_set_root(sinfo, &port_addr);
+ snd_seq_query_subscribe_set_index(sinfo, 0);
+ while (!snd_seq_query_port_subscribers(_seq, sinfo)) {
+ const auto head_addr = *snd_seq_query_subscribe_get_addr(sinfo);
+ const auto head_id = addr_to_id(head_addr, true);
- snd_seq_query_subscribe_set_index(
- sinfo, snd_seq_query_subscribe_get_index(sinfo) + 1);
+ sink({ConnectionEvent{tail_id, head_id}});
+
+ snd_seq_query_subscribe_set_index(
+ sinfo, snd_seq_query_subscribe_get_index(sinfo) + 1);
+ }
}
}
}
@@ -498,7 +500,7 @@ AlsaDriver::_refresh_main()
if (!ignore(ev->data.addr)) {
_emit_event(PortCreationEvent{
- addr_to_id(ev->data.addr, (caps & SND_SEQ_PORT_CAP_READ)),
+ addr_to_id(ev->data.addr, (caps & SND_SEQ_PORT_CAP_WRITE)),
port_info(pinfo),
});
}