From 8e2c5e18e67dea3662fe0fd37b68f22af6c3aff4 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sun, 19 Aug 2012 22:14:19 +0100 Subject: [PATCH] Carla: Fix remove-all in rack mode, more RtAudio work --- .../carla_backend_standalone.cpp | 6 +- c++/carla-backend/carla_engine.cpp | 93 ++++++++++++------- c++/carla-backend/carla_engine.h | 31 +++++-- c++/carla-backend/carla_engine_jack.cpp | 8 +- c++/carla-backend/carla_engine_rtaudio.cpp | 2 +- src/carla.py | 7 +- src/ui/cadence.ui | 20 ++-- 7 files changed, 104 insertions(+), 63 deletions(-) diff --git a/c++/carla-backend/carla_backend_standalone.cpp b/c++/carla-backend/carla_backend_standalone.cpp index 5635d5d..237a6ec 100644 --- a/c++/carla-backend/carla_backend_standalone.cpp +++ b/c++/carla-backend/carla_backend_standalone.cpp @@ -1268,7 +1268,7 @@ void run_tests_standalone(short idMax) set_midi_program(id, 0); qDebug("------------------- TEST @%i: set extra data --------------------", id); - set_custom_data(id, CarlaBackend::CUSTOM_DATA_INVALID, nullptr, nullptr); + //set_custom_data(id, CarlaBackend::CUSTOM_DATA_INVALID, nullptr, nullptr); set_custom_data(id, CarlaBackend::CUSTOM_DATA_INVALID, "", ""); set_chunk_data(id, nullptr); set_gui_data(id, 0, 0); @@ -1308,7 +1308,7 @@ int main(int argc, char* argv[]) //set_option(OPTION_PROCESS_MODE, PROCESS_MODE_CONTINUOUS_RACK, nullptr); // start engine - if (! engine_init("JACK", "carla_demo")) + if (! engine_init("PulseAudio", "carla_demo")) { qCritical("failed to start backend engine, reason:\n%s", get_last_error()); delete vstGui; @@ -1350,7 +1350,7 @@ int main(int argc, char* argv[]) run_tests_standalone(id_dssi+1); // lock - app.exec(); + //app.exec(); remove_plugin(id_ladspa); remove_plugin(id_dssi); diff --git a/c++/carla-backend/carla_engine.cpp b/c++/carla-backend/carla_engine.cpp index 30cecfb..7bc3664 100644 --- a/c++/carla-backend/carla_engine.cpp +++ b/c++/carla-backend/carla_engine.cpp @@ -368,8 +368,9 @@ void CarlaEngine::bufferSizeChanged(uint32_t newBufferSize) // ------------------------------------------------------------------------------------------------------------------- // Carla Engine Client -CarlaEngineClient::CarlaEngineClient(const CarlaEngineClientNativeHandle& handle_) - : handle(handle_) +CarlaEngineClient::CarlaEngineClient(const CarlaEngineType& type_, const CarlaEngineClientNativeHandle& handle_) + : type(type_), + handle(handle_) { qDebug("CarlaEngineClient::CarlaEngineClient()"); @@ -381,15 +382,19 @@ CarlaEngineClient::~CarlaEngineClient() qDebug("CarlaEngineClient::~CarlaEngineClient()"); Q_ASSERT(! m_active); -#ifdef CARLA_ENGINE_JACK -# ifndef BUILD_BRIDGE +#ifndef BUILD_BRIDGE if (carlaOptions.process_mode == PROCESS_MODE_MULTIPLE_CLIENTS) -# endif +#endif { - if (handle.client) - jack_client_close(handle.client); - } +#ifdef CARLA_ENGINE_JACK + if (handle.jackClient) + jack_client_close(handle.jackClient); +#endif +#ifdef CARLA_ENGINE_RTAUDIO + if (handle.rtAudioPtr) + delete handle.rtAudioPtr; #endif + } } void CarlaEngineClient::activate() @@ -397,15 +402,22 @@ void CarlaEngineClient::activate() qDebug("CarlaEngineClient::activate()"); Q_ASSERT(! m_active); -#ifdef CARLA_ENGINE_JACK -# ifndef BUILD_BRIDGE +#ifndef BUILD_BRIDGE if (carlaOptions.process_mode == PROCESS_MODE_MULTIPLE_CLIENTS) -# endif +#endif { - if (handle.client && ! m_active) - jack_activate(handle.client); - } + if (! m_active) + { +#ifdef CARLA_ENGINE_JACK + if (handle.jackClient) + jack_activate(handle.jackClient); +#endif +#ifdef CARLA_ENGINE_RTAUDIO + if (handle.rtAudioPtr) + handle.rtAudioPtr->startStream(); #endif + } + } m_active = true; } @@ -415,15 +427,22 @@ void CarlaEngineClient::deactivate() qDebug("CarlaEngineClient::deactivate()"); Q_ASSERT(m_active); -#ifdef CARLA_ENGINE_JACK -# ifndef BUILD_BRIDGE +#ifndef BUILD_BRIDGE if (carlaOptions.process_mode == PROCESS_MODE_MULTIPLE_CLIENTS) -# endif +#endif { - if (handle.client && m_active) - jack_deactivate(handle.client); - } + if (m_active) + { +#ifdef CARLA_ENGINE_JACK + if (handle.jackClient) + jack_deactivate(handle.jackClient); #endif +#ifdef CARLA_ENGINE_RTAUDIO + if (handle.rtAudioPtr) + handle.rtAudioPtr->stopStream(); +#endif + } + } m_active = false; } @@ -439,12 +458,16 @@ bool CarlaEngineClient::isOk() const { qDebug("CarlaEngineClient::isOk()"); -#ifdef CARLA_ENGINE_JACK -# ifndef BUILD_BRIDGE +#ifndef BUILD_BRIDGE if (carlaOptions.process_mode != PROCESS_MODE_CONTINUOUS_RACK) -# endif - return bool(handle.client); #endif + { +#ifdef CARLA_ENGINE_JACK + return bool(handle.jackClient); + // FIXME +#endif + } + return true; } @@ -454,7 +477,7 @@ const CarlaEngineBasePort* CarlaEngineClient::addPort(const CarlaEnginePortType CarlaEnginePortNativeHandle portHandle; #ifdef CARLA_ENGINE_JACK - portHandle.client = handle.client; + portHandle.jackClient = handle.jackClient; #endif #ifdef CARLA_ENGINE_JACK @@ -465,11 +488,11 @@ const CarlaEngineBasePort* CarlaEngineClient::addPort(const CarlaEnginePortType switch (type) { case CarlaEnginePortTypeAudio: - portHandle.port = jack_port_register(handle.client, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0); + portHandle.jackPort = jack_port_register(handle.jackClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0); break; case CarlaEnginePortTypeControl: case CarlaEnginePortTypeMIDI: - portHandle.port = jack_port_register(handle.client, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0); + portHandle.jackPort = jack_port_register(handle.jackClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0); break; } } @@ -511,8 +534,8 @@ CarlaEngineBasePort::~CarlaEngineBasePort() if (carlaOptions.process_mode != PROCESS_MODE_CONTINUOUS_RACK) # endif { - if (handle.client && handle.port) - jack_port_unregister(handle.client, handle.port); + if (handle.jackClient && handle.jackPort) + jack_port_unregister(handle.jackClient, handle.jackPort); } #endif } @@ -537,8 +560,8 @@ float* CarlaEngineAudioPort::getJackAudioBuffer(uint32_t nframes) if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) return nullptr; # endif - Q_ASSERT(handle.port); - return (float*)jack_port_get_buffer(handle.port, nframes); + Q_ASSERT(handle.jackPort); + return (float*)jack_port_get_buffer(handle.jackPort, nframes); } #endif @@ -564,9 +587,9 @@ void CarlaEngineControlPort::initBuffer(CarlaEngine* const engine) #endif #ifdef CARLA_ENGINE_JACK - if (handle.port) + if (handle.jackPort) { - buffer = jack_port_get_buffer(handle.port, engine->getBufferSize()); + buffer = jack_port_get_buffer(handle.jackPort, engine->getBufferSize()); if (! isInput) jack_midi_clear_buffer(buffer); @@ -774,9 +797,9 @@ void CarlaEngineMidiPort::initBuffer(CarlaEngine* const engine) #endif #ifdef CARLA_ENGINE_JACK - if (handle.port) + if (handle.jackPort) { - buffer = jack_port_get_buffer(handle.port, engine->getBufferSize()); + buffer = jack_port_get_buffer(handle.jackPort, engine->getBufferSize()); if (! isInput) jack_midi_clear_buffer(buffer); diff --git a/c++/carla-backend/carla_engine.h b/c++/carla-backend/carla_engine.h index bd43ea3..d5cb2c3 100644 --- a/c++/carla-backend/carla_engine.h +++ b/c++/carla-backend/carla_engine.h @@ -22,8 +22,6 @@ #include "carla_shared.h" #include "carla_threads.h" -#include - #ifdef CARLA_ENGINE_JACK #include #include @@ -138,22 +136,36 @@ struct CarlaTimeInfo { struct CarlaEngineClientNativeHandle { #ifdef CARLA_ENGINE_JACK - jack_client_t* client; + jack_client_t* jackClient; +#endif +#ifdef CARLA_ENGINE_JACK + RtAudio* rtAudioPtr; +#endif CarlaEngineClientNativeHandle() - : client(nullptr) {} + { +#ifdef CARLA_ENGINE_JACK + jackClient = nullptr; #endif +#ifdef CARLA_ENGINE_JACK + rtAudioPtr = nullptr; +#endif + } }; struct CarlaEnginePortNativeHandle { #ifdef CARLA_ENGINE_JACK - jack_client_t* client; - jack_port_t* port; + jack_client_t* jackClient; + jack_port_t* jackPort; +#endif CarlaEnginePortNativeHandle() - : client(nullptr), - port(nullptr) {} + { +#ifdef CARLA_ENGINE_JACK + jackClient = nullptr; + jackPort = nullptr; #endif + } }; // ----------------------------------------------------------------------- @@ -449,7 +461,7 @@ private: class CarlaEngineClient { public: - CarlaEngineClient(const CarlaEngineClientNativeHandle& handle); + CarlaEngineClient(const CarlaEngineType& type, const CarlaEngineClientNativeHandle& handle); ~CarlaEngineClient(); void activate(); @@ -462,6 +474,7 @@ public: private: bool m_active; + const CarlaEngineType type; const CarlaEngineClientNativeHandle handle; }; diff --git a/c++/carla-backend/carla_engine_jack.cpp b/c++/carla-backend/carla_engine_jack.cpp index de36298..376da84 100644 --- a/c++/carla-backend/carla_engine_jack.cpp +++ b/c++/carla-backend/carla_engine_jack.cpp @@ -240,19 +240,19 @@ CarlaEngineClient* CarlaEngineJack::addClient(CarlaPlugin* const plugin) #ifndef BUILD_BRIDGE if (carlaOptions.process_mode == PROCESS_MODE_SINGLE_CLIENT) { - handle.client = client; + handle.jackClient = client; } else if (carlaOptions.process_mode == PROCESS_MODE_MULTIPLE_CLIENTS) #endif { - handle.client = jack_client_open(plugin->name(), JackNullOption, nullptr); - jack_set_process_callback(handle.client, carla_jack_process_callback_plugin, plugin); + handle.jackClient = jack_client_open(plugin->name(), JackNullOption, nullptr); + jack_set_process_callback(handle.jackClient, carla_jack_process_callback_plugin, plugin); } //else if (carla_options.process_mode == PROCESS_MODE_CONTINUOUS_RACK) //{ //} - return new CarlaEngineClient(handle); + return new CarlaEngineClient(CarlaEngineTypeJack, handle); } // ------------------------------------------------------------------------------------------------------------------- diff --git a/c++/carla-backend/carla_engine_rtaudio.cpp b/c++/carla-backend/carla_engine_rtaudio.cpp index 4107c6f..e492703 100644 --- a/c++/carla-backend/carla_engine_rtaudio.cpp +++ b/c++/carla-backend/carla_engine_rtaudio.cpp @@ -147,7 +147,7 @@ CarlaEngineClient* CarlaEngineRtAudio::addClient(CarlaPlugin* const plugin) { CarlaEngineClientNativeHandle handle; - return new CarlaEngineClient(handle); + return new CarlaEngineClient(CarlaEngineTypeRtAudio, handle); Q_UNUSED(plugin); } diff --git a/src/carla.py b/src/carla.py index bc2ee15..ee7cde6 100755 --- a/src/carla.py +++ b/src/carla.py @@ -1608,23 +1608,28 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): @pyqtSlot() def slot_remove_all(self): + h = 0 for i in range(MAX_PLUGINS): pwidget = self.m_plugin_list[i] if not pwidget: continue + pwidget.setId(i-h) pwidget.edit_dialog.close() if pwidget.gui_dialog: pwidget.gui_dialog.close() - if Carla.Host.remove_plugin(i): + if Carla.Host.remove_plugin(i-h): pwidget.close() pwidget.deleteLater() self.w_plugins.layout().removeWidget(pwidget) self.m_plugin_list[i] = None + if Carla.processMode == PROCESS_MODE_CONTINUOUS_RACK: + h += 1 + self.act_plugin_remove_all.setEnabled(False) @pyqtSlot() diff --git a/src/ui/cadence.ui b/src/ui/cadence.ui index b2d50a8..dc0475d 100644 --- a/src/ui/cadence.ui +++ b/src/ui/cadence.ui @@ -983,7 +983,7 @@ - 1 + 0 @@ -1043,8 +1043,8 @@ 0 0 - 94 - 76 + 395 + 256 @@ -1061,8 +1061,8 @@ 0 0 - 94 - 76 + 98 + 96 @@ -1079,8 +1079,8 @@ 0 0 - 94 - 76 + 98 + 96 @@ -1097,8 +1097,8 @@ 0 0 - 94 - 76 + 98 + 96 @@ -1377,7 +1377,7 @@ 0 0 732 - 19 + 20