summaryrefslogtreecommitdiffstats
path: root/src/AlsaDriver.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-11-28 19:31:25 +0100
committerDavid Robillard <d@drobilla.net>2020-11-28 22:49:10 +0100
commit1c5decf5f85b7808a70885c820596fac013cf644 (patch)
tree34f873fc6099df1e08af0dd7898f67404622b1f0 /src/AlsaDriver.cpp
parent37a33e5549354b6142ce4aeacd6a7c627e772f48 (diff)
downloadpatchage-1c5decf5f85b7808a70885c820596fac013cf644.tar.gz
patchage-1c5decf5f85b7808a70885c820596fac013cf644.tar.bz2
patchage-1c5decf5f85b7808a70885c820596fac013cf644.zip
Factor out getting client and port metadata and send it with events
Diffstat (limited to 'src/AlsaDriver.cpp')
-rw-r--r--src/AlsaDriver.cpp60
1 files changed, 57 insertions, 3 deletions
diff --git a/src/AlsaDriver.cpp b/src/AlsaDriver.cpp
index 0b32fe9..293ee63 100644
--- a/src/AlsaDriver.cpp
+++ b/src/AlsaDriver.cpp
@@ -17,10 +17,12 @@
#include "AlsaDriver.hpp"
#include "ClientID.hpp"
+#include "ClientInfo.hpp"
#include "Patchage.hpp"
#include "PatchageCanvas.hpp"
#include "PatchageModule.hpp"
#include "PatchagePort.hpp"
+#include "PortInfo.hpp"
#include "PortType.hpp"
#include "SignalDirection.hpp"
#include "handle_event.hpp"
@@ -37,12 +39,50 @@ PATCHAGE_RESTORE_WARNINGS
namespace {
-inline PortID
-addr_to_id(const snd_seq_addr_t& addr, bool is_input)
+PortID
+addr_to_id(const snd_seq_addr_t& addr, const bool is_input)
{
return PortID::alsa(addr.client, addr.port, is_input);
}
+SignalDirection
+port_direction(const snd_seq_port_info_t* const pinfo)
+{
+ const int caps = snd_seq_port_info_get_capability(pinfo);
+
+ if ((caps & SND_SEQ_PORT_CAP_READ) && (caps & SND_SEQ_PORT_CAP_WRITE)) {
+ return SignalDirection::duplex;
+ }
+
+ if (caps & SND_SEQ_PORT_CAP_READ) {
+ return SignalDirection::output;
+ }
+
+ if (caps & SND_SEQ_PORT_CAP_WRITE) {
+ return SignalDirection::input;
+ }
+
+ return SignalDirection::duplex;
+}
+
+ClientInfo
+client_info(snd_seq_client_info_t* const cinfo)
+{
+ return {snd_seq_client_info_get_name(cinfo)};
+}
+
+PortInfo
+port_info(const snd_seq_port_info_t* const pinfo)
+{
+ const int type = snd_seq_port_info_get_type(pinfo);
+
+ return {snd_seq_port_info_get_name(pinfo),
+ PortType::alsa_midi,
+ port_direction(pinfo),
+ snd_seq_port_info_get_port(pinfo),
+ (type & SND_SEQ_PORT_TYPE_APPLICATION) == 0};
+}
+
} // namespace
AlsaDriver::AlsaDriver(Patchage* app, ILog& log)
@@ -568,7 +608,19 @@ AlsaDriver::_refresh_main()
switch (ev->type) {
case SND_SEQ_EVENT_CLIENT_START:
+ snd_seq_get_any_client_info(_seq, ev->data.addr.client, cinfo);
+ _events.emplace(ClientCreationEvent{
+ ClientID::alsa(ev->data.addr.client),
+ client_info(cinfo),
+ });
+ break;
+
case SND_SEQ_EVENT_CLIENT_EXIT:
+ _events.emplace(ClientDestructionEvent{
+ ClientID::alsa(ev->data.addr.client),
+ });
+ break;
+
case SND_SEQ_EVENT_CLIENT_CHANGE:
break;
@@ -580,7 +632,9 @@ AlsaDriver::_refresh_main()
if (!ignore(ev->data.addr)) {
_events.emplace(PortCreationEvent{
- addr_to_id(ev->data.addr, (caps & SND_SEQ_PORT_CAP_READ))});
+ addr_to_id(ev->data.addr, (caps & SND_SEQ_PORT_CAP_READ)),
+ port_info(pinfo),
+ });
}
break;