| @@ -18,16 +18,12 @@ | |||||
| #include "carla_bridge_client.hpp" | #include "carla_bridge_client.hpp" | ||||
| #include "carla_bridge_toolkit.hpp" | #include "carla_bridge_toolkit.hpp" | ||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| # include "carla_engine.hpp" | |||||
| #else | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| # include "carla_lib_utils.hpp" | # include "carla_lib_utils.hpp" | ||||
| #endif | #endif | ||||
| #include <cmath> | |||||
| #include <cstdio> | |||||
| #include <cstdint> | |||||
| #include <cstdlib> | #include <cstdlib> | ||||
| #include <cstring> | |||||
| CARLA_BRIDGE_START_NAMESPACE | CARLA_BRIDGE_START_NAMESPACE | ||||
| @@ -46,8 +42,6 @@ CarlaBridgeClient::CarlaBridgeClient(const char* const uiTitle) | |||||
| m_uiLib = nullptr; | m_uiLib = nullptr; | ||||
| m_uiQuit = false; | m_uiQuit = false; | ||||
| #endif | #endif | ||||
| m_toolkit->init(); | |||||
| } | } | ||||
| CarlaBridgeClient::~CarlaBridgeClient() | CarlaBridgeClient::~CarlaBridgeClient() | ||||
| @@ -58,6 +52,8 @@ CarlaBridgeClient::~CarlaBridgeClient() | |||||
| if (m_uiFilename) | if (m_uiFilename) | ||||
| free(m_uiFilename); | free(m_uiFilename); | ||||
| #endif | #endif | ||||
| delete m_toolkit; | |||||
| } | } | ||||
| #ifdef BUILD_BRIDGE_UI | #ifdef BUILD_BRIDGE_UI | ||||
| @@ -68,7 +64,17 @@ bool CarlaBridgeClient::init(const char* const, const char* const) | |||||
| { | { | ||||
| qDebug("CarlaBridgeClient::init()"); | qDebug("CarlaBridgeClient::init()"); | ||||
| // Test for single init | |||||
| { | |||||
| static bool initiated = false; | |||||
| CARLA_ASSERT(! initiated); | |||||
| initiated = true; | |||||
| } | |||||
| m_uiQuit = false; | m_uiQuit = false; | ||||
| m_toolkit->init(); | |||||
| return false; | return false; | ||||
| } | } | ||||
| @@ -95,7 +101,7 @@ bool CarlaBridgeClient::oscInit(const char* const url) | |||||
| { | { | ||||
| qDebug("CarlaBridgeClient::oscInit(\"%s\")", url); | qDebug("CarlaBridgeClient::oscInit(\"%s\")", url); | ||||
| bool ret = m_osc.init(url); | |||||
| const bool ret = m_osc.init(url); | |||||
| m_oscData = m_osc.getControlData(); | m_oscData = m_osc.getControlData(); | ||||
| return ret; | return ret; | ||||
| @@ -103,7 +109,7 @@ bool CarlaBridgeClient::oscInit(const char* const url) | |||||
| bool CarlaBridgeClient::oscIdle() | bool CarlaBridgeClient::oscIdle() | ||||
| { | { | ||||
| m_osc .idle(); | |||||
| m_osc.idle(); | |||||
| #ifdef BUILD_BRIDGE_UI | #ifdef BUILD_BRIDGE_UI | ||||
| return ! m_uiQuit; | return ! m_uiQuit; | ||||
| @@ -136,6 +142,15 @@ void CarlaBridgeClient::sendOscUpdate() | |||||
| } | } | ||||
| #ifdef BUILD_BRIDGE_PLUGIN | #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) | void CarlaBridgeClient::sendOscBridgeError(const char* const error) | ||||
| { | { | ||||
| qDebug("CarlaBridgeClient::sendOscBridgeError(\"%s\")", error); | qDebug("CarlaBridgeClient::sendOscBridgeError(\"%s\")", error); | ||||
| @@ -145,12 +160,6 @@ void CarlaBridgeClient::sendOscBridgeError(const char* const error) | |||||
| if (m_oscData && m_oscData->target) | if (m_oscData && m_oscData->target) | ||||
| osc_send_bridge_error(m_oscData, error); | osc_send_bridge_error(m_oscData, error); | ||||
| } | } | ||||
| void CarlaBridgeClient::registerOscEngine(CarlaBackend::CarlaEngine* const engine) | |||||
| { | |||||
| qDebug("CarlaBridgeClient::registerOscEngine(%p)", engine); | |||||
| engine->setOscBridgeData(m_oscData); | |||||
| } | |||||
| #endif | #endif | ||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| @@ -250,18 +259,6 @@ void CarlaBridgeClient::sendOscExiting() | |||||
| osc_send_exiting(m_oscData); | 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 | #ifdef BRIDGE_LV2 | ||||
| void CarlaBridgeClient::sendOscLv2TransferAtom(const int32_t portIndex, const char* const typeStr, const char* const atomBuf) | 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 | #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 | #ifdef BUILD_BRIDGE_UI | ||||
| @@ -292,6 +301,7 @@ void* CarlaBridgeClient::getContainerId() | |||||
| bool CarlaBridgeClient::uiLibOpen(const char* const filename) | bool CarlaBridgeClient::uiLibOpen(const char* const filename) | ||||
| { | { | ||||
| CARLA_ASSERT(! m_uiLib); | |||||
| CARLA_ASSERT(filename); | CARLA_ASSERT(filename); | ||||
| if (m_uiFilename) | if (m_uiFilename) | ||||
| @@ -305,6 +315,8 @@ bool CarlaBridgeClient::uiLibOpen(const char* const filename) | |||||
| bool CarlaBridgeClient::uiLibClose() | bool CarlaBridgeClient::uiLibClose() | ||||
| { | { | ||||
| CARLA_ASSERT(m_uiLib); | |||||
| if (m_uiLib) | if (m_uiLib) | ||||
| { | { | ||||
| const bool closed = lib_close(m_uiLib); | const bool closed = lib_close(m_uiLib); | ||||
| @@ -317,6 +329,8 @@ bool CarlaBridgeClient::uiLibClose() | |||||
| void* CarlaBridgeClient::uiLibSymbol(const char* const symbol) | void* CarlaBridgeClient::uiLibSymbol(const char* const symbol) | ||||
| { | { | ||||
| CARLA_ASSERT(m_uiLib); | |||||
| if (m_uiLib) | if (m_uiLib) | ||||
| return lib_symbol(m_uiLib, symbol); | return lib_symbol(m_uiLib, symbol); | ||||
| @@ -20,8 +20,6 @@ | |||||
| #include "carla_bridge_osc.hpp" | #include "carla_bridge_osc.hpp" | ||||
| #include <QtCore/QMutex> | |||||
| #ifdef BUILD_BRIDGE_PLUGIN | #ifdef BUILD_BRIDGE_PLUGIN | ||||
| namespace CarlaBackend { | namespace CarlaBackend { | ||||
| class CarlaEngine; | class CarlaEngine; | ||||
| @@ -98,8 +96,8 @@ public: | |||||
| void sendOscUpdate(); | void sendOscUpdate(); | ||||
| #ifdef BUILD_BRIDGE_PLUGIN | #ifdef BUILD_BRIDGE_PLUGIN | ||||
| void sendOscBridgeError(const char* const error); | |||||
| void registerOscEngine(CarlaBackend::CarlaEngine* const engine); | void registerOscEngine(CarlaBackend::CarlaEngine* const engine); | ||||
| void sendOscBridgeError(const char* const error); | |||||
| #endif | #endif | ||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| @@ -121,15 +119,15 @@ protected: | |||||
| void sendOscMidi(const uint8_t midiBuf[4]); | void sendOscMidi(const uint8_t midiBuf[4]); | ||||
| void sendOscExiting(); | void sendOscExiting(); | ||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| void sendOscBridgeUpdate(); | |||||
| #endif | |||||
| #ifdef BRIDGE_LV2 | #ifdef BRIDGE_LV2 | ||||
| void sendOscLv2TransferAtom(const int32_t portIndex, const char* const typeStr, const char* const atomBuf); | 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); | void sendOscLv2TransferEvent(const int32_t portIndex, const char* const typeStr, const char* const atomBuf); | ||||
| #endif | #endif | ||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| void sendOscBridgeUpdate(); | |||||
| #endif | |||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| #ifdef BUILD_BRIDGE_UI | #ifdef BUILD_BRIDGE_UI | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * Carla Bridge OSC | * Carla Bridge OSC | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or modify | * 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 | * 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); | return handleMsgLv2TransferEvent(argc, argv, types); | ||||
| #endif | #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 | #if 0 | ||||
| // TODO | // TODO | ||||
| else if (strcmp(method, "set_parameter_midi_channel") == 0) | else if (strcmp(method, "set_parameter_midi_channel") == 0) | ||||
| @@ -254,36 +264,11 @@ int CarlaBridgeOsc::handleMsgConfigure(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| if (! client) | if (! client) | ||||
| return 1; | 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); | Q_UNUSED(argv); | ||||
| #endif | |||||
| return 0; | |||||
| } | } | ||||
| int CarlaBridgeOsc::handleMsgControl(CARLA_BRIDGE_OSC_HANDLE_ARGS) | 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 int32_t index = argv[0]->i; | ||||
| const float value = argv[1]->f; | const float value = argv[1]->f; | ||||
| client->setParameter(index, value); | client->setParameter(index, value); | ||||
| return 0; | return 0; | ||||
| @@ -310,34 +296,44 @@ int CarlaBridgeOsc::handleMsgProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| return 1; | return 1; | ||||
| const int32_t index = argv[0]->i; | const int32_t index = argv[0]->i; | ||||
| client->setProgram(index); | client->setProgram(index); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| int CarlaBridgeOsc::handleMsgMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) | int CarlaBridgeOsc::handleMsgMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) | ||||
| { | { | ||||
| qDebug("CarlaBridgeOsc::handleMsgMidiProgram()"); | qDebug("CarlaBridgeOsc::handleMsgMidiProgram()"); | ||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "i"); | CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "i"); | ||||
| #else | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii"); | |||||
| #endif | |||||
| if (! client) | if (! client) | ||||
| return 1; | return 1; | ||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| const int32_t index = argv[0]->i; | const int32_t index = argv[0]->i; | ||||
| client->setMidiProgram(index); | client->setMidiProgram(index); | ||||
| return 0; | |||||
| } | |||||
| #else | #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 bank = argv[0]->i; | ||||
| const int32_t program = argv[1]->i; | const int32_t program = argv[1]->i; | ||||
| client->setMidiProgram(bank, program); | client->setMidiProgram(bank, program); | ||||
| #endif | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| #endif | |||||
| int CarlaBridgeOsc::handleMsgMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS) | 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)) | if (MIDI_IS_STATUS_NOTE_OFF(status)) | ||||
| { | { | ||||
| uint8_t note = data[2]; | |||||
| const uint8_t note = data[2]; | |||||
| client->noteOff(channel, note); | client->noteOff(channel, note); | ||||
| } | } | ||||
| else if (MIDI_IS_STATUS_NOTE_ON(status)) | 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); | client->noteOn(channel, note, velo); | ||||
| } | } | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * Carla Bridge OSC | * Carla Bridge OSC | ||||
| * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or modify | * 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 | * 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); | int handleMsgLv2TransferEvent(CARLA_BRIDGE_OSC_HANDLE_ARGS); | ||||
| #endif | #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) | static void osc_error_handler(const int num, const char* const msg, const char* const path) | ||||
| @@ -53,13 +53,18 @@ public: | |||||
| window = nullptr; | window = nullptr; | ||||
| lastX = lastY = 0; | |||||
| lastWidth = lastHeight = 0; | |||||
| lastX = 0; | |||||
| lastY = 0; | |||||
| lastWidth = 0; | |||||
| lastHeight = 0; | |||||
| } | } | ||||
| ~CarlaToolkitGtk() | ~CarlaToolkitGtk() | ||||
| { | { | ||||
| qDebug("CarlaToolkitGtk::~CarlaToolkitGtk()"); | qDebug("CarlaToolkitGtk::~CarlaToolkitGtk()"); | ||||
| if (window) | |||||
| gtk_widget_destroy(window); | |||||
| } | } | ||||
| void init() | void init() | ||||
| @@ -68,44 +73,61 @@ public: | |||||
| CARLA_ASSERT(! window); | CARLA_ASSERT(! window); | ||||
| gtk_init(&gargc, &gargv); | 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) | void exec(const bool showGui) | ||||
| { | { | ||||
| qDebug("CarlaToolkitGtk::exec(%s)", bool2str(showGui)); | qDebug("CarlaToolkitGtk::exec(%s)", bool2str(showGui)); | ||||
| CARLA_ASSERT(window); | |||||
| CARLA_ASSERT(client); | 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_resizable(GTK_WINDOW(window), client->isResizable()); | ||||
| gtk_window_set_title(GTK_WINDOW(window), uiTitle); | 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))) | 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()) | 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) | if (showGui) | ||||
| show(); | show(); | ||||
| else | else | ||||
| client->sendOscUpdate(); | 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 | // Main loop | ||||
| gtk_main(); | gtk_main(); | ||||
| } | } | ||||
| @@ -159,6 +181,11 @@ public: | |||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| protected: | protected: | ||||
| GtkWidget* window; | |||||
| QSettings settings; | |||||
| gint lastX, lastY, lastWidth, lastHeight; | |||||
| void handleDestroy() | void handleDestroy() | ||||
| { | { | ||||
| qDebug("CarlaToolkitGtk::handleDestroy()"); | qDebug("CarlaToolkitGtk::handleDestroy()"); | ||||
| @@ -180,30 +207,31 @@ protected: | |||||
| gtk_window_get_size(GTK_WINDOW(window), &lastWidth, &lastHeight); | gtk_window_get_size(GTK_WINDOW(window), &lastWidth, &lastHeight); | ||||
| } | } | ||||
| // FIXME | |||||
| // FIXME? | |||||
| return client->isOscControlRegistered() ? client->oscIdle() : false; | return client->isOscControlRegistered() ? client->oscIdle() : false; | ||||
| } | } | ||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| private: | private: | ||||
| GtkWidget* window; | |||||
| QSettings settings; | |||||
| gint lastX, lastY, lastWidth, lastHeight; | |||||
| static void gtk_ui_destroy(GtkWidget*, gpointer data) | 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(); | gtk_main_quit(); | ||||
| } | } | ||||
| static gboolean gtk_ui_timeout(gpointer data) | 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; | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -184,6 +184,9 @@ public: | |||||
| // Timer | // Timer | ||||
| msgTimer = startTimer(50); | msgTimer = startTimer(50); | ||||
| // First idle | |||||
| handleTimeout(); | |||||
| // Main loop | // Main loop | ||||
| app->exec(); | app->exec(); | ||||
| } | } | ||||
| @@ -201,14 +204,11 @@ public: | |||||
| if (window) | 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(); | window->close(); | ||||
| @@ -300,22 +300,29 @@ protected: | |||||
| QEmbedContainer* embedContainer; | QEmbedContainer* embedContainer; | ||||
| #endif | #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); | QObject::timerEvent(event); | ||||
| } | } | ||||
| @@ -26,7 +26,7 @@ CARLA_BRIDGE_START_NAMESPACE | |||||
| CarlaBridgeToolkit::CarlaBridgeToolkit(CarlaBridgeClient* const client_, const char* const newTitle) | CarlaBridgeToolkit::CarlaBridgeToolkit(CarlaBridgeClient* const client_, const char* const newTitle) | ||||
| : client(client_) | : client(client_) | ||||
| { | { | ||||
| qDebug("CarlaBridgeToolkit::CarlaBridgeToolkit(\"%s\")", newTitle); | |||||
| qDebug("CarlaBridgeToolkit::CarlaBridgeToolkit(%p, \"%s\")", client, newTitle); | |||||
| CARLA_ASSERT(client); | CARLA_ASSERT(client); | ||||
| CARLA_ASSERT(newTitle); | CARLA_ASSERT(newTitle); | ||||
| @@ -618,7 +618,8 @@ public: | |||||
| void handleProgramChanged(int32_t /*index*/) | void handleProgramChanged(int32_t /*index*/) | ||||
| { | { | ||||
| sendOscConfigure("reloadprograms", ""); | |||||
| if (isOscControlRegistered()) | |||||
| sendOscConfigure("reloadprograms", ""); | |||||
| } | } | ||||
| uint32_t handleUiPortMap(const char* const symbol) | uint32_t handleUiPortMap(const char* const symbol) | ||||
| @@ -651,10 +652,9 @@ public: | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| void handleUiWrite(uint32_t portIndex, uint32_t bufferSize, uint32_t format, const void* buffer) | void handleUiWrite(uint32_t portIndex, uint32_t bufferSize, uint32_t format, const void* buffer) | ||||
| { | { | ||||
| if (! buffer) | |||||
| if (! (buffer && isOscControlRegistered())) | |||||
| return; | return; | ||||
| if (format == 0) | if (format == 0) | ||||
| @@ -35,6 +35,11 @@ struct CarlaOscData { | |||||
| source(nullptr), | source(nullptr), | ||||
| target(nullptr) {} | target(nullptr) {} | ||||
| ~CarlaOscData() | |||||
| { | |||||
| free(); | |||||
| } | |||||
| void free() | void free() | ||||
| { | { | ||||
| if (path) | if (path) | ||||
| @@ -300,6 +305,7 @@ void osc_send_bridge_error(const CarlaOscData* const oscData, const char* const | |||||
| } | } | ||||
| #endif | #endif | ||||
| #if defined(BRIDGE_LV2) || defined(WANT_LV2) | |||||
| static inline | static inline | ||||
| void osc_send_lv2_transfer_atom(const CarlaOscData* const oscData, const int32_t portIndex, const char* const typeStr, const char* const atomBuf) | 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); | lo_send(oscData->target, targetPath, "iss", portIndex, typeStr, atomBuf); | ||||
| } | } | ||||
| } | } | ||||
| #endif | |||||
| // ------------------------------------------------------------------------------------------------ | // ------------------------------------------------------------------------------------------------ | ||||