From 5128bfab7ddb9504abf17375e910e5bc94af291e Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 28 Nov 2020 21:41:26 +0100 Subject: Refresh by emitting events This decouples drivers from the rest of the application, in particular the horrible situation where they were working with the canvas directly, by having them always communicate changes by emitting events. --- src/Patchage.cpp | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'src/Patchage.cpp') diff --git a/src/Patchage.cpp b/src/Patchage.cpp index 7613935..e0b5dc7 100644 --- a/src/Patchage.cpp +++ b/src/Patchage.cpp @@ -22,6 +22,8 @@ #include "PatchageEvent.hpp" #include "PatchagePort.hpp" #include "UIFile.hpp" +#include "event_to_string.hpp" +#include "handle_event.hpp" #include "patchage_config.h" #include "warnings.hpp" @@ -342,7 +344,7 @@ Patchage::Patchage(int argc, char** argv) #endif #if defined(PATCHAGE_LIBJACK) || defined(HAVE_JACK_DBUS) - _jack_driver = new JackDriver(this, _log); + _jack_driver = new JackDriver(_log); _connector.add_driver(PortID::Type::jack, _jack_driver); _jack_driver->signal_detached.connect( @@ -355,7 +357,7 @@ Patchage::Patchage(int argc, char** argv) #endif #ifdef HAVE_ALSA - _alsa_driver = new AlsaDriver(this, _log); + _alsa_driver = new AlsaDriver(_log); _connector.add_driver(PortID::Type::alsa, _alsa_driver); #endif @@ -461,12 +463,19 @@ Patchage::idle_callback() } else if (_driver_detached) { #if defined(PATCHAGE_LIBJACK) || defined(HAVE_JACK_DBUS) if (_jack_driver && !_jack_driver->is_attached()) { - _jack_driver->destroy_all(); + _canvas->remove_ports([](const PatchagePort* port) { + return (port->type() == PortType::jack_audio || + port->type() == PortType::jack_midi || + port->type() == PortType::jack_osc || + port->type() == PortType::jack_cv); + }); } #endif #ifdef HAVE_ALSA if (_alsa_driver && !_alsa_driver->is_attached()) { - _alsa_driver->destroy_all(); + _canvas->remove_ports([](const PatchagePort* port) { + return port->type() == PortType::alsa_midi; + }); } #endif } @@ -542,18 +551,22 @@ Patchage::zoom(double z) void Patchage::refresh() { + auto sink = [this](const PatchageEvent& event) { + handle_event(*this, event); + }; + if (_canvas && _enable_refresh) { _canvas->clear(); #if defined(PATCHAGE_LIBJACK) || defined(HAVE_JACK_DBUS) if (_jack_driver) { - _jack_driver->refresh(); + _jack_driver->refresh(sink); } #endif #ifdef HAVE_ALSA if (_alsa_driver) { - _alsa_driver->refresh(); + _alsa_driver->refresh(sink); } #endif } @@ -762,7 +775,8 @@ void Patchage::menu_alsa_connect() { _alsa_driver->attach(false); - _alsa_driver->refresh(); + _alsa_driver->refresh( + [this](const PatchageEvent& event) { handle_event(*this, event); }); } void -- cgit v1.2.1