From 16de0cef40b9e3642acb647dbe16fde4a26ecad1 Mon Sep 17 00:00:00 2001 From: falkTX Date: Mon, 24 Dec 2012 16:40:06 +0000 Subject: [PATCH] More cleanup --- c++/carla-bridge/carla_bridge_client.cpp | 70 +++++++++------- c++/carla-bridge/carla_bridge_client.hpp | 12 ++- c++/carla-bridge/carla_bridge_osc.cpp | 72 ++++++++--------- c++/carla-bridge/carla_bridge_osc.hpp | 8 +- c++/carla-bridge/carla_bridge_toolkit-gtk.cpp | 80 +++++++++++++------ c++/carla-bridge/carla_bridge_toolkit-qt.cpp | 47 ++++++----- c++/carla-bridge/carla_bridge_toolkit.cpp | 2 +- c++/carla-bridge/carla_bridge_ui-lv2.cpp | 6 +- c++/carla-utils/carla_osc_utils.hpp | 7 ++ 9 files changed, 181 insertions(+), 123 deletions(-) diff --git a/c++/carla-bridge/carla_bridge_client.cpp b/c++/carla-bridge/carla_bridge_client.cpp index 926f3e0..08e1c50 100644 --- a/c++/carla-bridge/carla_bridge_client.cpp +++ b/c++/carla-bridge/carla_bridge_client.cpp @@ -18,16 +18,12 @@ #include "carla_bridge_client.hpp" #include "carla_bridge_toolkit.hpp" -#ifdef BUILD_BRIDGE_PLUGIN -# include "carla_engine.hpp" -#else +#ifdef BUILD_BRIDGE_UI # include "carla_lib_utils.hpp" #endif -#include -#include -#include #include +#include CARLA_BRIDGE_START_NAMESPACE @@ -46,8 +42,6 @@ CarlaBridgeClient::CarlaBridgeClient(const char* const uiTitle) m_uiLib = nullptr; m_uiQuit = false; #endif - - m_toolkit->init(); } CarlaBridgeClient::~CarlaBridgeClient() @@ -58,6 +52,8 @@ CarlaBridgeClient::~CarlaBridgeClient() if (m_uiFilename) free(m_uiFilename); #endif + + delete m_toolkit; } #ifdef BUILD_BRIDGE_UI @@ -68,7 +64,17 @@ bool CarlaBridgeClient::init(const char* const, const char* const) { qDebug("CarlaBridgeClient::init()"); + // Test for single init + { + static bool initiated = false; + CARLA_ASSERT(! initiated); + initiated = true; + } + m_uiQuit = false; + + m_toolkit->init(); + return false; } @@ -95,7 +101,7 @@ bool CarlaBridgeClient::oscInit(const char* const url) { qDebug("CarlaBridgeClient::oscInit(\"%s\")", url); - bool ret = m_osc.init(url); + const bool ret = m_osc.init(url); m_oscData = m_osc.getControlData(); return ret; @@ -103,7 +109,7 @@ bool CarlaBridgeClient::oscInit(const char* const url) bool CarlaBridgeClient::oscIdle() { - m_osc .idle(); + m_osc.idle(); #ifdef BUILD_BRIDGE_UI return ! m_uiQuit; @@ -136,6 +142,15 @@ void CarlaBridgeClient::sendOscUpdate() } #ifdef BUILD_BRIDGE_PLUGIN +void CarlaBridgeClient::registerOscEngine(CarlaBackend::CarlaEngine* const engine) +{ + qDebug("CarlaBridgeClient::registerOscEngine(%p)", engine); + CARLA_ASSERT(engine); + + if (engine) + engine->setOscBridgeData(m_oscData); +} + void CarlaBridgeClient::sendOscBridgeError(const char* const error) { qDebug("CarlaBridgeClient::sendOscBridgeError(\"%s\")", error); @@ -145,12 +160,6 @@ void CarlaBridgeClient::sendOscBridgeError(const char* const error) if (m_oscData && m_oscData->target) osc_send_bridge_error(m_oscData, error); } - -void CarlaBridgeClient::registerOscEngine(CarlaBackend::CarlaEngine* const engine) -{ - qDebug("CarlaBridgeClient::registerOscEngine(%p)", engine); - engine->setOscBridgeData(m_oscData); -} #endif // --------------------------------------------------------------------- @@ -250,18 +259,6 @@ void CarlaBridgeClient::sendOscExiting() osc_send_exiting(m_oscData); } -#ifdef BUILD_BRIDGE_PLUGIN -void CarlaBridgeClient::sendOscBridgeUpdate() -{ - qDebug("CarlaBridgeClient::sendOscBridgeUpdate()"); - CARLA_ASSERT(m_oscData); - CARLA_ASSERT(m_oscData->target && m_osc.m_serverPath); - - if (m_oscData && m_oscData->target && m_osc.m_serverPath) - osc_send_bridge_update(m_oscData, m_osc.m_serverPath); -} -#endif - #ifdef BRIDGE_LV2 void CarlaBridgeClient::sendOscLv2TransferAtom(const int32_t portIndex, const char* const typeStr, const char* const atomBuf) { @@ -282,6 +279,18 @@ void CarlaBridgeClient::sendOscLv2TransferEvent(const int32_t portIndex, const c } #endif +#ifdef BUILD_BRIDGE_PLUGIN +void CarlaBridgeClient::sendOscBridgeUpdate() +{ + qDebug("CarlaBridgeClient::sendOscBridgeUpdate()"); + CARLA_ASSERT(m_oscData); + CARLA_ASSERT(m_oscData->target && m_osc.m_serverPath); + + if (m_oscData && m_oscData->target && m_osc.m_serverPath) + osc_send_bridge_update(m_oscData, m_osc.m_serverPath); +} +#endif + // --------------------------------------------------------------------- #ifdef BUILD_BRIDGE_UI @@ -292,6 +301,7 @@ void* CarlaBridgeClient::getContainerId() bool CarlaBridgeClient::uiLibOpen(const char* const filename) { + CARLA_ASSERT(! m_uiLib); CARLA_ASSERT(filename); if (m_uiFilename) @@ -305,6 +315,8 @@ bool CarlaBridgeClient::uiLibOpen(const char* const filename) bool CarlaBridgeClient::uiLibClose() { + CARLA_ASSERT(m_uiLib); + if (m_uiLib) { const bool closed = lib_close(m_uiLib); @@ -317,6 +329,8 @@ bool CarlaBridgeClient::uiLibClose() void* CarlaBridgeClient::uiLibSymbol(const char* const symbol) { + CARLA_ASSERT(m_uiLib); + if (m_uiLib) return lib_symbol(m_uiLib, symbol); diff --git a/c++/carla-bridge/carla_bridge_client.hpp b/c++/carla-bridge/carla_bridge_client.hpp index 0ebcc04..5278246 100644 --- a/c++/carla-bridge/carla_bridge_client.hpp +++ b/c++/carla-bridge/carla_bridge_client.hpp @@ -20,8 +20,6 @@ #include "carla_bridge_osc.hpp" -#include - #ifdef BUILD_BRIDGE_PLUGIN namespace CarlaBackend { class CarlaEngine; @@ -98,8 +96,8 @@ public: void sendOscUpdate(); #ifdef BUILD_BRIDGE_PLUGIN - void sendOscBridgeError(const char* const error); void registerOscEngine(CarlaBackend::CarlaEngine* const engine); + void sendOscBridgeError(const char* const error); #endif // --------------------------------------------------------------------- @@ -121,15 +119,15 @@ protected: void sendOscMidi(const uint8_t midiBuf[4]); void sendOscExiting(); -#ifdef BUILD_BRIDGE_PLUGIN - void sendOscBridgeUpdate(); -#endif - #ifdef BRIDGE_LV2 void sendOscLv2TransferAtom(const int32_t portIndex, const char* const typeStr, const char* const atomBuf); void sendOscLv2TransferEvent(const int32_t portIndex, const char* const typeStr, const char* const atomBuf); #endif +#ifdef BUILD_BRIDGE_PLUGIN + void sendOscBridgeUpdate(); +#endif + // --------------------------------------------------------------------- #ifdef BUILD_BRIDGE_UI diff --git a/c++/carla-bridge/carla_bridge_osc.cpp b/c++/carla-bridge/carla_bridge_osc.cpp index 51d9562..194cc3c 100644 --- a/c++/carla-bridge/carla_bridge_osc.cpp +++ b/c++/carla-bridge/carla_bridge_osc.cpp @@ -1,6 +1,6 @@ /* * Carla Bridge OSC - * Copyright (C) 2012 Filipe Coelho + * Copyright (C) 2011-2012 Filipe Coelho * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -234,6 +234,16 @@ int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const return handleMsgLv2TransferEvent(argc, argv, types); #endif +#ifdef BUILD_BRIDGE_PLUGIN + // Plugin methods + if (strcmp(method, "plugin_save_now") == 0) + return handleMsgPluginSaveNow(); + if (strcmp(method, "plugin_set_chunk") == 0) + return handleMsgPluginSetChunk(argc, argv, types); + if (strcmp(method, "plugin_set_custom_data") == 0) + return handleMsgPluginSetCustomData(argc, argv, types); +#endif + #if 0 // TODO else if (strcmp(method, "set_parameter_midi_channel") == 0) @@ -254,36 +264,11 @@ int CarlaBridgeOsc::handleMsgConfigure(CARLA_BRIDGE_OSC_HANDLE_ARGS) if (! client) return 1; -#ifdef BUILD_BRIDGE_PLUGIN - const char* const key = (const char*)&argv[0]->s; - const char* const value = (const char*)&argv[1]->s; + // nothing here for now - if (strcmp(key, CarlaBackend::CARLA_BRIDGE_MSG_SAVE_NOW) == 0) - { - client->saveNow(); - } - else if (strcmp(key, CarlaBackend::CARLA_BRIDGE_MSG_SET_CHUNK) == 0) - { - client->setChunkData(value); - } - else if (strcmp(key, CarlaBackend::CARLA_BRIDGE_MSG_SET_CUSTOM) == 0) - { - QStringList vList = QString(value).split("ยท", QString::KeepEmptyParts); - - if (vList.size() == 3) - { - const char* const cType = vList.at(0).toUtf8().constData(); - const char* const cKey = vList.at(1).toUtf8().constData(); - const char* const cValue = vList.at(2).toUtf8().constData(); + return 0; - client->setCustomData(cType, cKey, cValue); - } - } -#else Q_UNUSED(argv); -#endif - - return 0; } int CarlaBridgeOsc::handleMsgControl(CARLA_BRIDGE_OSC_HANDLE_ARGS) @@ -296,6 +281,7 @@ int CarlaBridgeOsc::handleMsgControl(CARLA_BRIDGE_OSC_HANDLE_ARGS) const int32_t index = argv[0]->i; const float value = argv[1]->f; + client->setParameter(index, value); return 0; @@ -310,34 +296,44 @@ int CarlaBridgeOsc::handleMsgProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) return 1; const int32_t index = argv[0]->i; + client->setProgram(index); return 0; } +#ifdef BUILD_BRIDGE_PLUGIN int CarlaBridgeOsc::handleMsgMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) { qDebug("CarlaBridgeOsc::handleMsgMidiProgram()"); -#ifdef BUILD_BRIDGE_PLUGIN CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "i"); -#else - CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii"); -#endif if (! client) return 1; -#ifdef BUILD_BRIDGE_PLUGIN const int32_t index = argv[0]->i; + client->setMidiProgram(index); + + return 0; +} #else +int CarlaBridgeOsc::handleMsgMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) +{ + qDebug("CarlaBridgeOsc::handleMsgMidiProgram()"); + CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii"); + + if (! client) + return 1; + const int32_t bank = argv[0]->i; const int32_t program = argv[1]->i; + client->setMidiProgram(bank, program); -#endif return 0; } +#endif int CarlaBridgeOsc::handleMsgMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS) { @@ -359,13 +355,15 @@ int CarlaBridgeOsc::handleMsgMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS) if (MIDI_IS_STATUS_NOTE_OFF(status)) { - uint8_t note = data[2]; + const uint8_t note = data[2]; + client->noteOff(channel, note); } else if (MIDI_IS_STATUS_NOTE_ON(status)) { - uint8_t note = data[2]; - uint8_t velo = data[3]; + const uint8_t note = data[2]; + const uint8_t velo = data[3]; + client->noteOn(channel, note, velo); } diff --git a/c++/carla-bridge/carla_bridge_osc.hpp b/c++/carla-bridge/carla_bridge_osc.hpp index ec57f00..041c645 100644 --- a/c++/carla-bridge/carla_bridge_osc.hpp +++ b/c++/carla-bridge/carla_bridge_osc.hpp @@ -1,6 +1,6 @@ /* * Carla Bridge OSC - * Copyright (C) 2012 Filipe Coelho + * Copyright (C) 2011-2012 Filipe Coelho * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -110,6 +110,12 @@ private: int handleMsgLv2TransferEvent(CARLA_BRIDGE_OSC_HANDLE_ARGS); #endif +#ifdef BUILD_BRIDGE_PLUGIN + int handleMsgPluginSaveNow(); + int handleMsgPluginSetChunk(CARLA_BRIDGE_OSC_HANDLE_ARGS); + int handleMsgPluginSetCustomData(CARLA_BRIDGE_OSC_HANDLE_ARGS); +#endif + // ------------------------------------------------------------------- static void osc_error_handler(const int num, const char* const msg, const char* const path) diff --git a/c++/carla-bridge/carla_bridge_toolkit-gtk.cpp b/c++/carla-bridge/carla_bridge_toolkit-gtk.cpp index 5e9712c..1a881b7 100644 --- a/c++/carla-bridge/carla_bridge_toolkit-gtk.cpp +++ b/c++/carla-bridge/carla_bridge_toolkit-gtk.cpp @@ -53,13 +53,18 @@ public: window = nullptr; - lastX = lastY = 0; - lastWidth = lastHeight = 0; + lastX = 0; + lastY = 0; + lastWidth = 0; + lastHeight = 0; } ~CarlaToolkitGtk() { qDebug("CarlaToolkitGtk::~CarlaToolkitGtk()"); + + if (window) + gtk_widget_destroy(window); } void init() @@ -68,44 +73,61 @@ public: CARLA_ASSERT(! window); gtk_init(&gargc, &gargv); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_resize(GTK_WINDOW(window), 30, 30); + gtk_widget_hide(window); } void exec(const bool showGui) { qDebug("CarlaToolkitGtk::exec(%s)", bool2str(showGui)); + CARLA_ASSERT(window); CARLA_ASSERT(client); - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_container_add(GTK_CONTAINER(window), (GtkWidget*)client->getWidget()); + GtkWidget* const widget = (GtkWidget*)client->getWidget(); + + gtk_container_add(GTK_CONTAINER(window), widget); gtk_window_set_resizable(GTK_WINDOW(window), client->isResizable()); gtk_window_set_title(GTK_WINDOW(window), uiTitle); - gtk_window_get_position(GTK_WINDOW(window), &lastX, &lastY); - gtk_window_get_size(GTK_WINDOW(window), &lastWidth, &lastHeight); - if (settings.contains(QString("%1/pos_x").arg(uiTitle))) { - lastX = settings.value(QString("%1/pos_x").arg(uiTitle), lastX).toInt(); - lastY = settings.value(QString("%1/pos_y").arg(uiTitle), lastY).toInt(); - gtk_window_move(GTK_WINDOW(window), lastX, lastY); + gtk_window_get_position(GTK_WINDOW(window), &lastX, &lastY); + + bool hasX, hasY; + lastX = settings.value(QString("%1/pos_x").arg(uiTitle), lastX).toInt(&hasX); + lastY = settings.value(QString("%1/pos_y").arg(uiTitle), lastY).toInt(&hasY); + + if (hasX && hasY) + gtk_window_move(GTK_WINDOW(window), lastX, lastY); if (client->isResizable()) { - lastWidth = settings.value(QString("%1/width").arg(uiTitle), lastWidth).toInt(); - lastHeight = settings.value(QString("%1/height").arg(uiTitle), lastHeight).toInt(); - gtk_window_resize(GTK_WINDOW(window), lastWidth, lastHeight); + gtk_window_get_size(GTK_WINDOW(window), &lastWidth, &lastHeight); + + bool hasWidth, hasHeight; + lastWidth = settings.value(QString("%1/width").arg(uiTitle), lastWidth).toInt(&hasWidth); + lastHeight = settings.value(QString("%1/height").arg(uiTitle), lastHeight).toInt(&hasHeight); + + if (hasWidth && hasHeight) + gtk_window_resize(GTK_WINDOW(window), lastWidth, lastHeight); } } - g_timeout_add(50, gtk_ui_timeout, this); - g_signal_connect(window, "destroy", G_CALLBACK(gtk_ui_destroy), this); - if (showGui) show(); else client->sendOscUpdate(); + // Timer + g_timeout_add(50, gtk_ui_timeout, this); + g_signal_connect(window, "destroy", G_CALLBACK(gtk_ui_destroy), this); + + // First idle + handleTimeout(); + // Main loop gtk_main(); } @@ -159,6 +181,11 @@ public: // --------------------------------------------------------------------- protected: + GtkWidget* window; + QSettings settings; + + gint lastX, lastY, lastWidth, lastHeight; + void handleDestroy() { qDebug("CarlaToolkitGtk::handleDestroy()"); @@ -180,30 +207,31 @@ protected: gtk_window_get_size(GTK_WINDOW(window), &lastWidth, &lastHeight); } - // FIXME + // FIXME? return client->isOscControlRegistered() ? client->oscIdle() : false; } // --------------------------------------------------------------------- private: - GtkWidget* window; - QSettings settings; - - gint lastX, lastY, lastWidth, lastHeight; - static void gtk_ui_destroy(GtkWidget*, gpointer data) { - CarlaToolkitGtk* const _this_ = (CarlaToolkitGtk*)data; - _this_->handleDestroy(); + CARLA_ASSERT(data); + + if (CarlaToolkitGtk* const _this_ = (CarlaToolkitGtk*)data) + _this_->handleDestroy(); gtk_main_quit(); } static gboolean gtk_ui_timeout(gpointer data) { - CarlaToolkitGtk* const _this_ = (CarlaToolkitGtk*)data; - return _this_->handleTimeout(); + CARLA_ASSERT(data); + + if (CarlaToolkitGtk* const _this_ = (CarlaToolkitGtk*)data) + return _this_->handleTimeout(); + + return false; } }; diff --git a/c++/carla-bridge/carla_bridge_toolkit-qt.cpp b/c++/carla-bridge/carla_bridge_toolkit-qt.cpp index ed3a80c..c1fec05 100644 --- a/c++/carla-bridge/carla_bridge_toolkit-qt.cpp +++ b/c++/carla-bridge/carla_bridge_toolkit-qt.cpp @@ -184,6 +184,9 @@ public: // Timer msgTimer = startTimer(50); + // First idle + handleTimeout(); + // Main loop app->exec(); } @@ -201,14 +204,11 @@ public: if (window) { - if (client) - { - settings.setValue(QString("%1/pos_x").arg(uiTitle), window->x()); - settings.setValue(QString("%1/pos_y").arg(uiTitle), window->y()); - settings.setValue(QString("%1/width").arg(uiTitle), window->width()); - settings.setValue(QString("%1/height").arg(uiTitle), window->height()); - settings.sync(); - } + settings.setValue(QString("%1/pos_x").arg(uiTitle), window->x()); + settings.setValue(QString("%1/pos_y").arg(uiTitle), window->y()); + settings.setValue(QString("%1/width").arg(uiTitle), window->width()); + settings.setValue(QString("%1/height").arg(uiTitle), window->height()); + settings.sync(); window->close(); @@ -300,22 +300,29 @@ protected: QEmbedContainer* embedContainer; #endif - void timerEvent(QTimerEvent* const event) + void handleTimeout() { - if (event->timerId() == msgTimer && client) + if (! client) + return; + + if (needsResize) { - if (needsResize) - { - client->toolkitResize(nextWidth, nextHeight); - needsResize = false; - } + client->toolkitResize(nextWidth, nextHeight); + needsResize = false; + } - if (client->isOscControlRegistered() && ! client->oscIdle()) - { - killTimer(msgTimer); - msgTimer = 0; - } + if (client->isOscControlRegistered() && ! client->oscIdle()) + { + killTimer(msgTimer); + msgTimer = 0; } + } + +private: + void timerEvent(QTimerEvent* const event) + { + if (event->timerId() == msgTimer) + handleTimeout(); QObject::timerEvent(event); } diff --git a/c++/carla-bridge/carla_bridge_toolkit.cpp b/c++/carla-bridge/carla_bridge_toolkit.cpp index 575945c..de7c20d 100644 --- a/c++/carla-bridge/carla_bridge_toolkit.cpp +++ b/c++/carla-bridge/carla_bridge_toolkit.cpp @@ -26,7 +26,7 @@ CARLA_BRIDGE_START_NAMESPACE CarlaBridgeToolkit::CarlaBridgeToolkit(CarlaBridgeClient* const client_, const char* const newTitle) : client(client_) { - qDebug("CarlaBridgeToolkit::CarlaBridgeToolkit(\"%s\")", newTitle); + qDebug("CarlaBridgeToolkit::CarlaBridgeToolkit(%p, \"%s\")", client, newTitle); CARLA_ASSERT(client); CARLA_ASSERT(newTitle); diff --git a/c++/carla-bridge/carla_bridge_ui-lv2.cpp b/c++/carla-bridge/carla_bridge_ui-lv2.cpp index 576b21a..25e785b 100644 --- a/c++/carla-bridge/carla_bridge_ui-lv2.cpp +++ b/c++/carla-bridge/carla_bridge_ui-lv2.cpp @@ -618,7 +618,8 @@ public: void handleProgramChanged(int32_t /*index*/) { - sendOscConfigure("reloadprograms", ""); + if (isOscControlRegistered()) + sendOscConfigure("reloadprograms", ""); } uint32_t handleUiPortMap(const char* const symbol) @@ -651,10 +652,9 @@ public: return 0; } - void handleUiWrite(uint32_t portIndex, uint32_t bufferSize, uint32_t format, const void* buffer) { - if (! buffer) + if (! (buffer && isOscControlRegistered())) return; if (format == 0) diff --git a/c++/carla-utils/carla_osc_utils.hpp b/c++/carla-utils/carla_osc_utils.hpp index 0da1775..574e9d5 100644 --- a/c++/carla-utils/carla_osc_utils.hpp +++ b/c++/carla-utils/carla_osc_utils.hpp @@ -35,6 +35,11 @@ struct CarlaOscData { source(nullptr), target(nullptr) {} + ~CarlaOscData() + { + free(); + } + void free() { if (path) @@ -300,6 +305,7 @@ void osc_send_bridge_error(const CarlaOscData* const oscData, const char* const } #endif +#if defined(BRIDGE_LV2) || defined(WANT_LV2) static inline void osc_send_lv2_transfer_atom(const CarlaOscData* const oscData, const int32_t portIndex, const char* const typeStr, const char* const atomBuf) { @@ -335,6 +341,7 @@ void osc_send_lv2_transfer_event(const CarlaOscData* const oscData, const int32_ lo_send(oscData->target, targetPath, "iss", portIndex, typeStr, atomBuf); } } +#endif // ------------------------------------------------------------------------------------------------