diff options
author | David Robillard <d@drobilla.net> | 2020-11-28 22:23:54 +0100 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-11-28 22:49:10 +0100 |
commit | 924775a79c07a4f5798fcefddb523b189e473080 (patch) | |
tree | 6a201df93b109d10cb5c5cab018ee89448c00e00 /src/AlsaDriver.cpp | |
parent | 5128bfab7ddb9504abf17375e910e5bc94af291e (diff) | |
download | patchage-924775a79c07a4f5798fcefddb523b189e473080.tar.gz patchage-924775a79c07a4f5798fcefddb523b189e473080.tar.bz2 patchage-924775a79c07a4f5798fcefddb523b189e473080.zip |
Abstract out sending of events
This removes the details of how events are handled from drivers, so the owner
can set them up to do anything. For example, a driver could be run in the GUI
thread and have its events simply dispatched immediately, but here everything
is enqueued to the same queue which is drained later for simplicity.
Diffstat (limited to 'src/AlsaDriver.cpp')
-rw-r--r-- | src/AlsaDriver.cpp | 34 |
1 files changed, 10 insertions, 24 deletions
diff --git a/src/AlsaDriver.cpp b/src/AlsaDriver.cpp index 6e1cebb..a417469 100644 --- a/src/AlsaDriver.cpp +++ b/src/AlsaDriver.cpp @@ -23,7 +23,6 @@ #include "PortInfo.hpp" #include "PortType.hpp" #include "SignalDirection.hpp" -#include "handle_event.hpp" PATCHAGE_DISABLE_FMT_WARNINGS #include <fmt/core.h> @@ -84,8 +83,9 @@ port_info(const snd_seq_port_info_t* const pinfo) } // namespace -AlsaDriver::AlsaDriver(ILog& log) - : _log(log) +AlsaDriver::AlsaDriver(ILog& log, EventSink emit_event) + : Driver{std::move(emit_event)} + , _log(log) , _seq(nullptr) , _refresh_thread{} {} @@ -425,19 +425,17 @@ AlsaDriver::_refresh_main() while (snd_seq_event_input(_seq, &ev) > 0) { assert(ev); - std::lock_guard<std::mutex> lock{_events_mutex}; - switch (ev->type) { case SND_SEQ_EVENT_CLIENT_START: snd_seq_get_any_client_info(_seq, ev->data.addr.client, cinfo); - _events.emplace(ClientCreationEvent{ + _emit_event(ClientCreationEvent{ ClientID::alsa(ev->data.addr.client), client_info(cinfo), }); break; case SND_SEQ_EVENT_CLIENT_EXIT: - _events.emplace(ClientDestructionEvent{ + _emit_event(ClientDestructionEvent{ ClientID::alsa(ev->data.addr.client), }); break; @@ -452,7 +450,7 @@ AlsaDriver::_refresh_main() caps = snd_seq_port_info_get_capability(pinfo); if (!ignore(ev->data.addr)) { - _events.emplace(PortCreationEvent{ + _emit_event(PortCreationEvent{ addr_to_id(ev->data.addr, (caps & SND_SEQ_PORT_CAP_READ)), port_info(pinfo), }); @@ -463,9 +461,9 @@ AlsaDriver::_refresh_main() if (!ignore(ev->data.addr, false)) { // Note: getting caps at this point does not work // Delete both inputs and outputs (to handle duplex ports) - _events.emplace( + _emit_event( PortDestructionEvent{addr_to_id(ev->data.addr, true)}); - _events.emplace( + _emit_event( PortDestructionEvent{addr_to_id(ev->data.addr, false)}); } break; @@ -476,7 +474,7 @@ AlsaDriver::_refresh_main() case SND_SEQ_EVENT_PORT_SUBSCRIBED: if (!ignore(ev->data.connect.sender) && !ignore(ev->data.connect.dest)) { - _events.emplace( + _emit_event( ConnectionEvent{addr_to_id(ev->data.connect.sender, false), addr_to_id(ev->data.connect.dest, true)}); } @@ -485,7 +483,7 @@ AlsaDriver::_refresh_main() case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: if (!ignore(ev->data.connect.sender) && !ignore(ev->data.connect.dest)) { - _events.emplace(DisconnectionEvent{ + _emit_event(DisconnectionEvent{ addr_to_id(ev->data.connect.sender, false), addr_to_id(ev->data.connect.dest, true)}); } @@ -497,15 +495,3 @@ AlsaDriver::_refresh_main() } } } - -void -AlsaDriver::process_events(Patchage* app) -{ - std::lock_guard<std::mutex> lock{_events_mutex}; - - while (!_events.empty()) { - PatchageEvent& ev = _events.front(); - handle_event(*app, ev); - _events.pop(); - } -} |