| @@ -1,35 +0,0 @@ | |||||
| /* | |||||
| * Carla Bridge | |||||
| * Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | |||||
| * 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 the Free Software Foundation; either version 2 of | |||||
| * the License, or any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||||
| */ | |||||
| #ifndef CARLA_BRIDGE_HPP_INCLUDED | |||||
| #define CARLA_BRIDGE_HPP_INCLUDED | |||||
| #include "CarlaDefines.h" | |||||
| #define CARLA_BRIDGE_START_NAMESPACE namespace CarlaBridge { | |||||
| #define CARLA_BRIDGE_END_NAMESPACE } | |||||
| #define CARLA_BRIDGE_USE_NAMESPACE using namespace CarlaBridge; | |||||
| CARLA_BRIDGE_START_NAMESPACE | |||||
| // forward declarations of commonly used Carla-Bridge classes | |||||
| class CarlaBridgeClient; | |||||
| class CarlaBridgeToolkit; | |||||
| CARLA_BRIDGE_END_NAMESPACE | |||||
| #endif // CARLA_BRIDGE_HPP_INCLUDED | |||||
| @@ -1,294 +0,0 @@ | |||||
| /* | |||||
| * Carla Bridge Client | |||||
| * Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | |||||
| * 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 the Free Software Foundation; either version 2 of | |||||
| * the License, or any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||||
| */ | |||||
| #include "CarlaBridgeClient.hpp" | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| # include "CarlaLibUtils.hpp" | |||||
| #endif | |||||
| CARLA_BRIDGE_START_NAMESPACE | |||||
| // --------------------------------------------------------------------- | |||||
| CarlaBridgeClient::CarlaBridgeClient(const char* const uiTitle) | |||||
| : fOsc(this), | |||||
| fOscData(fOsc.getControlData()) | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| , fUI(CarlaBridgeToolkit::createNew(this, uiTitle)) | |||||
| #endif | |||||
| { | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| CARLA_ASSERT(uiTitle != nullptr && uiTitle[0] != '\0'); | |||||
| #endif | |||||
| carla_debug("CarlaBridgeClient::CarlaBridgeClient(\"%s\")", uiTitle); | |||||
| #ifndef BUILD_BRIDGE_UI | |||||
| return; (void)uiTitle; // unused | |||||
| #endif | |||||
| } | |||||
| CarlaBridgeClient::~CarlaBridgeClient() | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::~CarlaBridgeClient()"); | |||||
| } | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| // --------------------------------------------------------------------- | |||||
| // ui initialization | |||||
| bool CarlaBridgeClient::uiInit(const char* const, const char* const) | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::uiInit()"); | |||||
| fUI.init(); | |||||
| return true; | |||||
| } | |||||
| void CarlaBridgeClient::uiClose() | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::uiClose()"); | |||||
| if (isOscControlRegistered() && ! fUI.quit) | |||||
| sendOscExiting(); | |||||
| fUI.close(); | |||||
| } | |||||
| // --------------------------------------------------------------------- | |||||
| // ui toolkit | |||||
| void CarlaBridgeClient::toolkitShow() | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(fUI.toolkit != nullptr,); | |||||
| carla_debug("CarlaBridgeClient::toolkitShow()"); | |||||
| fUI.toolkit->show(); | |||||
| } | |||||
| void CarlaBridgeClient::toolkitHide() | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(fUI.toolkit != nullptr,); | |||||
| carla_debug("CarlaBridgeClient::toolkitHide()"); | |||||
| fUI.toolkit->hide(); | |||||
| } | |||||
| void CarlaBridgeClient::toolkitResize(const int width, const int height) | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(fUI.toolkit != nullptr,); | |||||
| carla_debug("CarlaBridgeClient::toolkitResize(%i, %i)", width, height); | |||||
| fUI.toolkit->resize(width, height); | |||||
| } | |||||
| void CarlaBridgeClient::toolkitExec(const bool showGui) | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(fUI.toolkit != nullptr,); | |||||
| carla_debug("CarlaBridgeClient::toolkitExec(%s)", bool2str(showGui)); | |||||
| fUI.toolkit->exec(showGui); | |||||
| } | |||||
| void CarlaBridgeClient::toolkitQuit() | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::toolkitQuit()"); | |||||
| fUI.close(); | |||||
| } | |||||
| #endif | |||||
| // --------------------------------------------------------------------- | |||||
| // osc stuff | |||||
| void CarlaBridgeClient::oscInit(const char* const url) | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::oscInit(\"%s\")", url); | |||||
| fOsc.init(url); | |||||
| } | |||||
| bool CarlaBridgeClient::oscIdle() const | |||||
| { | |||||
| fOsc.idle(); | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| return ! fUI.quit; | |||||
| #else | |||||
| return true; | |||||
| #endif | |||||
| } | |||||
| void CarlaBridgeClient::oscClose() | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::oscClose()"); | |||||
| fOsc.close(); | |||||
| } | |||||
| bool CarlaBridgeClient::isOscControlRegistered() const noexcept | |||||
| { | |||||
| return fOsc.isControlRegistered(); | |||||
| } | |||||
| void CarlaBridgeClient::sendOscUpdate() const | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::sendOscUpdate()"); | |||||
| if (fOscData.target != nullptr) | |||||
| osc_send_update(fOscData, fOsc.getServerPath()); | |||||
| } | |||||
| // --------------------------------------------------------------------- | |||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| void CarlaBridgeClient::sendOscBridgeUpdate() const | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::sendOscBridgeUpdate()"); | |||||
| if (fOscData.target != nullptr) | |||||
| osc_send_bridge_update(fOscData, fOscData.path); | |||||
| } | |||||
| void CarlaBridgeClient::sendOscBridgeError(const char* const error) const | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::sendOscBridgeError(\"%s\")", error); | |||||
| if (fOscData.target != nullptr) | |||||
| osc_send_bridge_error(fOscData, error); | |||||
| } | |||||
| #endif | |||||
| // --------------------------------------------------------------------- | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| void CarlaBridgeClient::sendOscConfigure(const char* const key, const char* const value) const | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::sendOscConfigure(\"%s\", \"%s\")", key, value); | |||||
| if (fOscData.target != nullptr) | |||||
| osc_send_configure(fOscData, key, value); | |||||
| } | |||||
| void CarlaBridgeClient::sendOscControl(const int32_t index, const float value) const | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::sendOscControl(%i, %f)", index, value); | |||||
| if (fOscData.target != nullptr) | |||||
| osc_send_control(fOscData, index, value); | |||||
| } | |||||
| void CarlaBridgeClient::sendOscProgram(const uint32_t index) const | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::sendOscProgram(%i)", index); | |||||
| if (fOscData.target != nullptr) | |||||
| osc_send_program(fOscData, index); | |||||
| } | |||||
| void CarlaBridgeClient::sendOscMidiProgram(const uint32_t index) const | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::sendOscMidiProgram(%i)", index); | |||||
| if (fOscData.target != nullptr) | |||||
| osc_send_midi_program(fOscData, index); | |||||
| } | |||||
| void CarlaBridgeClient::sendOscMidi(const uint8_t midiBuf[4]) const | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::sendOscMidi(%p)", midiBuf); | |||||
| if (fOscData.target != nullptr) | |||||
| osc_send_midi(fOscData, midiBuf); | |||||
| } | |||||
| void CarlaBridgeClient::sendOscExiting() const | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::sendOscExiting()"); | |||||
| if (fOscData.target != nullptr) | |||||
| osc_send_exiting(fOscData); | |||||
| } | |||||
| #ifdef BRIDGE_LV2 | |||||
| void CarlaBridgeClient::sendOscLv2AtomTransfer(const int32_t portIndex, const char* const atomBuf) const | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::sendOscLv2TransferAtom(%i, \"%s\")", portIndex, atomBuf); | |||||
| if (fOscData.target != nullptr) | |||||
| osc_send_lv2_atom_transfer(fOscData, portIndex, atomBuf); | |||||
| } | |||||
| void CarlaBridgeClient::sendOscLv2UridMap(const uint32_t urid, const char* const uri) const | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::sendOscLv2UridMap(%i, \"%s\")", urid, uri); | |||||
| if (fOscData.target != nullptr) | |||||
| osc_send_lv2_urid_map(fOscData, urid, uri); | |||||
| } | |||||
| #endif | |||||
| // --------------------------------------------------------------------- | |||||
| void* CarlaBridgeClient::getContainerId() | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::getContainerId()"); | |||||
| return fUI.toolkit->getContainerId(); | |||||
| } | |||||
| bool CarlaBridgeClient::uiLibOpen(const char* const filename) | |||||
| { | |||||
| CARLA_ASSERT(fUI.lib == nullptr); | |||||
| CARLA_ASSERT(filename != nullptr); | |||||
| carla_debug("CarlaBridgeClient::uiLibOpen(\"%s\")", filename); | |||||
| fUI.lib = lib_open(filename); | |||||
| fUI.filename = filename; | |||||
| return (fUI.lib != nullptr); | |||||
| } | |||||
| bool CarlaBridgeClient::uiLibClose() | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(fUI.lib != nullptr, false); | |||||
| carla_debug("CarlaBridgeClient::uiLibClose()"); | |||||
| const bool closed = lib_close(fUI.lib); | |||||
| fUI.lib = nullptr; | |||||
| return closed; | |||||
| } | |||||
| void* CarlaBridgeClient::uiLibSymbol(const char* const symbol) | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(fUI.lib != nullptr, nullptr); | |||||
| carla_debug("CarlaBridgeClient::uiLibSymbol(\"%s\")", symbol); | |||||
| return lib_symbol(fUI.lib, symbol); | |||||
| } | |||||
| const char* CarlaBridgeClient::uiLibError() | |||||
| { | |||||
| carla_debug("CarlaBridgeClient::uiLibError()"); | |||||
| return lib_error(fUI.filename); | |||||
| } | |||||
| #endif // BUILD_BRIDGE_UI | |||||
| // --------------------------------------------------------------------- | |||||
| CARLA_BRIDGE_END_NAMESPACE | |||||
| @@ -1,167 +0,0 @@ | |||||
| /* | |||||
| * Carla Bridge Client | |||||
| * Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | |||||
| * 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 the Free Software Foundation; either version 2 of | |||||
| * the License, or any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||||
| */ | |||||
| #ifndef CARLA_BRIDGE_CLIENT_HPP_INCLUDED | |||||
| #define CARLA_BRIDGE_CLIENT_HPP_INCLUDED | |||||
| #include "CarlaBridgeOsc.hpp" | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| # include "CarlaBridgeToolkit.hpp" | |||||
| #endif | |||||
| CARLA_BRIDGE_START_NAMESPACE | |||||
| // ----------------------------------------------------------------------- | |||||
| class CarlaBridgeClient | |||||
| { | |||||
| public: | |||||
| CarlaBridgeClient(const char* const uiTitle); | |||||
| virtual ~CarlaBridgeClient(); | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| // --------------------------------------------------------------------- | |||||
| // ui initialization | |||||
| virtual bool uiInit(const char* const, const char* const); | |||||
| virtual void uiIdle() {} | |||||
| virtual void uiClose(); | |||||
| // --------------------------------------------------------------------- | |||||
| // ui management | |||||
| virtual void* getWidget() const = 0; | |||||
| virtual bool isResizable() const = 0; | |||||
| virtual bool needsReparent() const = 0; | |||||
| // --------------------------------------------------------------------- | |||||
| // ui processing | |||||
| virtual void setParameter(const int32_t rindex, const float value) = 0; | |||||
| virtual void setProgram(const uint32_t index) = 0; | |||||
| virtual void setMidiProgram(const uint32_t bank, const uint32_t program) = 0; | |||||
| virtual void noteOn(const uint8_t channel, const uint8_t note, const uint8_t velo) = 0; | |||||
| virtual void noteOff(const uint8_t channel, const uint8_t note) = 0; | |||||
| // --------------------------------------------------------------------- | |||||
| // ui toolkit | |||||
| void toolkitShow(); | |||||
| void toolkitHide(); | |||||
| void toolkitResize(const int width, const int height); | |||||
| void toolkitExec(const bool showGui); | |||||
| void toolkitQuit(); | |||||
| #endif | |||||
| // --------------------------------------------------------------------- | |||||
| // osc stuff | |||||
| void oscInit(const char* const url); | |||||
| bool oscIdle() const; | |||||
| void oscClose(); | |||||
| bool isOscControlRegistered() const noexcept; | |||||
| void sendOscUpdate() const; | |||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| void sendOscBridgeUpdate() const; | |||||
| void sendOscBridgeError(const char* const error) const; | |||||
| #endif | |||||
| // --------------------------------------------------------------------- | |||||
| protected: | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| void sendOscConfigure(const char* const key, const char* const value) const; | |||||
| void sendOscControl(const int32_t index, const float value) const; | |||||
| void sendOscProgram(const uint32_t index) const; | |||||
| void sendOscMidiProgram(const uint32_t index) const; | |||||
| void sendOscMidi(const uint8_t midiBuf[4]) const; | |||||
| void sendOscExiting() const; | |||||
| # ifdef BRIDGE_LV2 | |||||
| void sendOscLv2AtomTransfer(const int32_t portIndex, const char* const atomBuf) const; | |||||
| void sendOscLv2UridMap(const uint32_t urid, const char* const uri) const; | |||||
| # endif | |||||
| // --------------------------------------------------------------------- | |||||
| void* getContainerId(); | |||||
| bool uiLibOpen(const char* const filename); | |||||
| bool uiLibClose(); | |||||
| void* uiLibSymbol(const char* const symbol); | |||||
| const char* uiLibError(); | |||||
| #endif | |||||
| // --------------------------------------------------------------------- | |||||
| private: | |||||
| CarlaBridgeOsc fOsc; | |||||
| const CarlaOscData& fOscData; | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| struct UI { | |||||
| CarlaBridgeToolkit* const toolkit; | |||||
| CarlaString filename; | |||||
| void* lib; | |||||
| bool quit; | |||||
| UI(CarlaBridgeToolkit* const toolkit_) | |||||
| : toolkit(toolkit_), | |||||
| lib(nullptr), | |||||
| quit(false) | |||||
| { | |||||
| CARLA_ASSERT(toolkit != nullptr); | |||||
| } | |||||
| ~UI() | |||||
| { | |||||
| delete toolkit; | |||||
| } | |||||
| void init() | |||||
| { | |||||
| toolkit->init(); | |||||
| quit = false; | |||||
| } | |||||
| void close() | |||||
| { | |||||
| quit = true; | |||||
| toolkit->quit(); | |||||
| } | |||||
| # ifdef CARLA_PROPER_CPP11_SUPPORT | |||||
| UI() = delete; | |||||
| UI(UI&) = delete; | |||||
| UI(const UI&) = delete; | |||||
| # endif | |||||
| } fUI; | |||||
| #else | |||||
| friend class CarlaPluginClient; | |||||
| #endif | |||||
| CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaBridgeClient) | |||||
| }; | |||||
| // ----------------------------------------------------------------------- | |||||
| CARLA_BRIDGE_END_NAMESPACE | |||||
| #endif // CARLA_BRIDGE_CLIENT_HPP_INCLUDED | |||||
| @@ -1,319 +0,0 @@ | |||||
| /* | |||||
| * Carla Bridge OSC | |||||
| * Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | |||||
| * 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 the Free Software Foundation; either version 2 of | |||||
| * the License, or any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||||
| */ | |||||
| #include "CarlaBridgeClient.hpp" | |||||
| #include "CarlaMIDI.h" | |||||
| CARLA_BRIDGE_START_NAMESPACE | |||||
| // ----------------------------------------------------------------------- | |||||
| CarlaBridgeOsc::CarlaBridgeOsc(CarlaBridgeClient* const client) | |||||
| : fClient(client), | |||||
| fServer(nullptr) | |||||
| { | |||||
| CARLA_ASSERT(client != nullptr); | |||||
| carla_debug("CarlaBridgeOsc::CarlaBridgeOsc(%p)", client); | |||||
| } | |||||
| CarlaBridgeOsc::~CarlaBridgeOsc() | |||||
| { | |||||
| CARLA_ASSERT(fControlData.source == nullptr); // must never be used | |||||
| CARLA_ASSERT(fName.isEmpty()); | |||||
| CARLA_ASSERT(fServerPath.isEmpty()); | |||||
| CARLA_ASSERT(fServer == nullptr); | |||||
| carla_debug("CarlaBridgeOsc::~CarlaBridgeOsc()"); | |||||
| } | |||||
| void CarlaBridgeOsc::init(const char* const url) | |||||
| { | |||||
| CARLA_ASSERT(fName.isEmpty()); | |||||
| CARLA_ASSERT(fServerPath.isEmpty()); | |||||
| CARLA_ASSERT(fServer == nullptr); | |||||
| CARLA_ASSERT(url != nullptr); | |||||
| carla_debug("CarlaBridgeOsc::init(\"%s\")", url); | |||||
| std::srand((uint)(uintptr_t)this); | |||||
| std::srand((uint)(uintptr_t)&url); | |||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| fName = "plug-"; | |||||
| fName += CarlaString(std::rand() % 99999); | |||||
| #else | |||||
| fName = "ui-"; | |||||
| fName += CarlaString(std::rand() % 99999); | |||||
| #endif | |||||
| fServer = lo_server_new_with_proto(nullptr, LO_UDP, osc_error_handler); | |||||
| CARLA_SAFE_ASSERT_RETURN(fServer != nullptr,) | |||||
| { | |||||
| char* const host = lo_url_get_hostname(url); | |||||
| char* const port = lo_url_get_port(url); | |||||
| fControlData.path = carla_strdup_free(lo_url_get_path(url)); | |||||
| fControlData.target = lo_address_new_with_proto(LO_UDP, host, port); | |||||
| std::free(host); | |||||
| std::free(port); | |||||
| } | |||||
| if (char* const tmpServerPath = lo_server_get_url(fServer)) | |||||
| { | |||||
| fServerPath = tmpServerPath; | |||||
| fServerPath += fName; | |||||
| std::free(tmpServerPath); | |||||
| } | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| lo_server_add_method(fServer, nullptr, nullptr, osc_message_handler, this); | |||||
| #endif | |||||
| CARLA_ASSERT(fName.isNotEmpty()); | |||||
| CARLA_ASSERT(fServerPath.isNotEmpty()); | |||||
| } | |||||
| void CarlaBridgeOsc::idle() const | |||||
| { | |||||
| if (fServer == nullptr) | |||||
| return; | |||||
| for (; lo_server_recv_noblock(fServer, 0) != 0;) {} | |||||
| } | |||||
| void CarlaBridgeOsc::close() | |||||
| { | |||||
| CARLA_ASSERT(fControlData.source == nullptr); // must never be used | |||||
| CARLA_ASSERT(fName.isNotEmpty()); | |||||
| CARLA_ASSERT(fServerPath.isNotEmpty()); | |||||
| CARLA_ASSERT(fServer != nullptr); | |||||
| carla_debug("CarlaBridgeOsc::close()"); | |||||
| fName.clear(); | |||||
| if (fServer != nullptr) | |||||
| { | |||||
| lo_server_del_method(fServer, nullptr, nullptr); | |||||
| lo_server_free(fServer); | |||||
| fServer = nullptr; | |||||
| } | |||||
| fServerPath.clear(); | |||||
| fControlData.clear(); | |||||
| CARLA_ASSERT(fName.isEmpty()); | |||||
| CARLA_ASSERT(fServerPath.isEmpty()); | |||||
| CARLA_ASSERT(fServer == nullptr); | |||||
| } | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| // ----------------------------------------------------------------------- | |||||
| int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg) | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(fName.isNotEmpty(), 1); | |||||
| CARLA_SAFE_ASSERT_RETURN(fServerPath.isNotEmpty(), 1); | |||||
| CARLA_SAFE_ASSERT_RETURN(fServer != nullptr, 1); | |||||
| CARLA_SAFE_ASSERT_RETURN(path != nullptr, 1); | |||||
| CARLA_SAFE_ASSERT_RETURN(msg != nullptr, 1); | |||||
| carla_debug("CarlaBridgeOsc::handleMessage(\"%s\", %i, %p, \"%s\", %p)", path, argc, argv, types, msg); | |||||
| const size_t nameSize(fName.length()); | |||||
| // Check if message is for this client | |||||
| if (std::strlen(path) <= nameSize || std::strncmp(path+1, fName, nameSize) != 0) | |||||
| { | |||||
| carla_stderr("CarlaBridgeOsc::handleMessage() - message not for this client -> '%s' != '/%s/'", path, fName.buffer()); | |||||
| return 1; | |||||
| } | |||||
| // Get method from path | |||||
| char method[32+1] = { '\0' }; | |||||
| std::strncpy(method, path + (nameSize + 2), 32); | |||||
| if (method[0] == '\0') | |||||
| { | |||||
| carla_stderr("CarlaBridgeOsc::handleMessage(\"%s\", ...) - received message without method", path); | |||||
| return 1; | |||||
| } | |||||
| // Common methods | |||||
| if (std::strcmp(method, "show") == 0) | |||||
| return handleMsgShow(); | |||||
| if (std::strcmp(method, "hide") == 0) | |||||
| return handleMsgHide(); | |||||
| if (std::strcmp(method, "quit") == 0) | |||||
| return handleMsgQuit(); | |||||
| // UI methods | |||||
| if (std::strcmp(method, "configure") == 0) | |||||
| return handleMsgUiConfigure(argc, argv, types); | |||||
| if (std::strcmp(method, "control") == 0) | |||||
| return handleMsgUiControl(argc, argv, types); | |||||
| if (std::strcmp(method, "program") == 0) | |||||
| return handleMsgUiProgram(argc, argv, types); | |||||
| if (std::strcmp(method, "midi-program") == 0) | |||||
| return handleMsgUiMidiProgram(argc, argv, types); | |||||
| if (std::strcmp(method, "midi") == 0) | |||||
| return handleMsgUiMidi(argc, argv, types); | |||||
| if (std::strcmp(method, "sample-rate") == 0) | |||||
| return 0; // unused | |||||
| # ifdef BRIDGE_LV2 | |||||
| // LV2 methods | |||||
| if (std::strcmp(method, "lv2_atom_transfer") == 0) | |||||
| return handleMsgLv2UiAtomTransfer(argc, argv, types); | |||||
| if (std::strcmp(method, "lv2_urid_map") == 0) | |||||
| return handleMsgLv2UiUridMap(argc, argv, types); | |||||
| # endif | |||||
| carla_stderr("CarlaBridgeOsc::handleMessage(\"%s\", ...) - received unsupported OSC method '%s'", path, method); | |||||
| return 1; | |||||
| } | |||||
| int CarlaBridgeOsc::handleMsgShow() | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||||
| carla_debug("CarlaBridgeOsc::handleMsgShow()"); | |||||
| fClient->toolkitShow(); | |||||
| return 0; | |||||
| } | |||||
| int CarlaBridgeOsc::handleMsgHide() | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||||
| carla_debug("CarlaBridgeOsc::handleMsgHide()"); | |||||
| fClient->toolkitHide(); | |||||
| return 0; | |||||
| } | |||||
| int CarlaBridgeOsc::handleMsgQuit() | |||||
| { | |||||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||||
| carla_debug("CarlaBridgeOsc::handleMsgQuit()"); | |||||
| fClient->toolkitQuit(); | |||||
| return 0; | |||||
| } | |||||
| int CarlaBridgeOsc::handleMsgUiConfigure(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ss"); | |||||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||||
| carla_debug("CarlaBridgeOsc::handleMsgConfigure()"); | |||||
| // nothing here for now | |||||
| return 0; | |||||
| // unused | |||||
| (void)argv; | |||||
| } | |||||
| int CarlaBridgeOsc::handleMsgUiControl(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "if"); | |||||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||||
| carla_debug("CarlaBridgeOsc::handleMsgControl()"); | |||||
| const int32_t index = argv[0]->i; | |||||
| const float value = argv[1]->f; | |||||
| CARLA_SAFE_ASSERT_RETURN(index != -1, 1); | |||||
| fClient->setParameter(index, value); | |||||
| return 0; | |||||
| } | |||||
| int CarlaBridgeOsc::handleMsgUiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "i"); | |||||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||||
| carla_debug("CarlaBridgeOsc::handleMsgProgram()"); | |||||
| const int32_t index = argv[0]->i; | |||||
| CARLA_SAFE_ASSERT_RETURN(index >= 0, 1); | |||||
| fClient->setProgram(static_cast<uint32_t>(index)); | |||||
| return 0; | |||||
| } | |||||
| int CarlaBridgeOsc::handleMsgUiMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii"); | |||||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||||
| carla_debug("CarlaBridgeOsc::handleMsgMidiProgram()"); | |||||
| const int32_t bank = argv[0]->i; | |||||
| const int32_t program = argv[1]->i; | |||||
| CARLA_SAFE_ASSERT_RETURN(bank >= 0, 1); | |||||
| CARLA_SAFE_ASSERT_RETURN(program >= 0, 1); | |||||
| fClient->setMidiProgram(static_cast<uint32_t>(bank), static_cast<uint32_t>(program)); | |||||
| return 0; | |||||
| } | |||||
| int CarlaBridgeOsc::handleMsgUiMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "m"); | |||||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||||
| carla_debug("CarlaBridgeOsc::handleMsgMidi()"); | |||||
| const uint8_t* const data = argv[0]->m; | |||||
| uint8_t status = data[1]; | |||||
| uint8_t channel = status & 0x0F; | |||||
| // Fix bad note-off | |||||
| if (MIDI_IS_STATUS_NOTE_ON(status) && data[3] == 0) | |||||
| status -= 0x10; | |||||
| if (MIDI_IS_STATUS_NOTE_OFF(status)) | |||||
| { | |||||
| const uint8_t note = data[2]; | |||||
| CARLA_SAFE_ASSERT_RETURN(note < MAX_MIDI_NOTE, 1); | |||||
| fClient->noteOff(channel, note); | |||||
| } | |||||
| else if (MIDI_IS_STATUS_NOTE_ON(status)) | |||||
| { | |||||
| const uint8_t note = data[2]; | |||||
| const uint8_t velo = data[3]; | |||||
| CARLA_SAFE_ASSERT_RETURN(note < MAX_MIDI_NOTE, 1); | |||||
| CARLA_SAFE_ASSERT_RETURN(velo < MAX_MIDI_VALUE, 1); | |||||
| fClient->noteOn(channel, note, velo); | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| #endif // BUILD_BRIDGE_UI | |||||
| // ----------------------------------------------------------------------- | |||||
| CARLA_BRIDGE_END_NAMESPACE | |||||
| @@ -1,131 +0,0 @@ | |||||
| /* | |||||
| * Carla Bridge OSC | |||||
| * Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||||
| * | |||||
| * 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 the Free Software Foundation; either version 2 of | |||||
| * the License, or any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||||
| */ | |||||
| #ifndef CARLA_BRIDGE_OSC_HPP_INCLUDED | |||||
| #define CARLA_BRIDGE_OSC_HPP_INCLUDED | |||||
| #include "CarlaBridge.hpp" | |||||
| #include "CarlaOscUtils.hpp" | |||||
| #include "CarlaString.hpp" | |||||
| #define CARLA_BRIDGE_OSC_HANDLE_ARGS const int argc, const lo_arg* const* const argv, const char* const types | |||||
| #define CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(/* argc, types, */ argcToCompare, typesToCompare) \ | |||||
| /* check argument count */ \ | |||||
| if (argc != argcToCompare) \ | |||||
| { \ | |||||
| carla_stderr("CarlaBridgeOsc::%s() - argument count mismatch: %i != %i", __FUNCTION__, argc, argcToCompare); \ | |||||
| return 1; \ | |||||
| } \ | |||||
| if (argc > 0) \ | |||||
| { \ | |||||
| /* check for nullness */ \ | |||||
| if (types == nullptr || typesToCompare == nullptr) \ | |||||
| { \ | |||||
| carla_stderr("CarlaBridgeOsc::%s() - argument types are null", __FUNCTION__); \ | |||||
| return 1; \ | |||||
| } \ | |||||
| /* check argument types */ \ | |||||
| if (std::strcmp(types, typesToCompare) != 0) \ | |||||
| { \ | |||||
| carla_stderr("CarlaBridgeOsc::%s() - argument types mismatch: '%s' != '%s'", __FUNCTION__, types, typesToCompare); \ | |||||
| return 1; \ | |||||
| } \ | |||||
| } | |||||
| CARLA_BRIDGE_START_NAMESPACE | |||||
| // ----------------------------------------------------------------------- | |||||
| class CarlaBridgeOsc | |||||
| { | |||||
| public: | |||||
| CarlaBridgeOsc(CarlaBridgeClient* const client); | |||||
| ~CarlaBridgeOsc(); | |||||
| void init(const char* const url); | |||||
| void idle() const; | |||||
| void close(); | |||||
| // ------------------------------------------------------------------- | |||||
| bool isControlRegistered() const noexcept | |||||
| { | |||||
| return (fControlData.target != nullptr); | |||||
| } | |||||
| const CarlaOscData& getControlData() const noexcept | |||||
| { | |||||
| return fControlData; | |||||
| } | |||||
| const char* getServerPath() const noexcept | |||||
| { | |||||
| return fServerPath; | |||||
| } | |||||
| // ------------------------------------------------------------------- | |||||
| private: | |||||
| CarlaBridgeClient* const fClient; | |||||
| CarlaOscData fControlData; | |||||
| CarlaString fName; | |||||
| CarlaString fServerPath; | |||||
| lo_server fServer; | |||||
| #ifdef BUILD_BRIDGE_UI | |||||
| // ------------------------------------------------------------------- | |||||
| int handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg); | |||||
| int handleMsgShow(); | |||||
| int handleMsgHide(); | |||||
| int handleMsgQuit(); | |||||
| int handleMsgUiConfigure(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handleMsgUiControl(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handleMsgUiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handleMsgUiMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handleMsgUiMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| # ifdef BRIDGE_LV2 | |||||
| int handleMsgLv2UiAtomTransfer(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handleMsgLv2UiUridMap(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| # endif | |||||
| // ------------------------------------------------------------------- | |||||
| static int osc_message_handler(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg, void* userData) | |||||
| { | |||||
| return ((CarlaBridgeOsc*)userData)->handleMessage(path, argc, argv, types, msg); | |||||
| } | |||||
| #endif | |||||
| static void osc_error_handler(int num, const char* msg, const char* path) | |||||
| { | |||||
| carla_stderr("CarlaBridgeOsc::osc_error_handler(%i, \"%s\", \"%s\")", num, msg, path); | |||||
| } | |||||
| CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaBridgeOsc) | |||||
| }; | |||||
| // ----------------------------------------------------------------------- | |||||
| CARLA_BRIDGE_END_NAMESPACE | |||||
| #endif // CARLA_BRIDGE_OSC_HPP_INCLUDED | |||||
| @@ -15,13 +15,11 @@ | |||||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | * For a full copy of the GNU General Public License see the doc/GPL.txt file. | ||||
| */ | */ | ||||
| #include "CarlaBridgeClient.hpp" | |||||
| #include "CarlaEngine.hpp" | #include "CarlaEngine.hpp" | ||||
| #include "CarlaHost.h" | #include "CarlaHost.h" | ||||
| #include "CarlaBackendUtils.hpp" | #include "CarlaBackendUtils.hpp" | ||||
| #include "CarlaBridgeUtils.hpp" | |||||
| #include "CarlaOscUtils.hpp" | |||||
| #include "CarlaMIDI.h" | #include "CarlaMIDI.h" | ||||
| #ifdef CARLA_OS_UNIX | #ifdef CARLA_OS_UNIX | ||||
| @@ -102,16 +100,12 @@ static void initSignalHandler() | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| static CarlaBridge::CarlaBridgeClient* gBridgeClient = nullptr; | |||||
| static CarlaString gProjectFilename; | static CarlaString gProjectFilename; | ||||
| static void gIdle() | static void gIdle() | ||||
| { | { | ||||
| carla_engine_idle(); | carla_engine_idle(); | ||||
| if (gBridgeClient != nullptr) | |||||
| gBridgeClient->oscIdle(); | |||||
| if (gSaveNow) | if (gSaveNow) | ||||
| { | { | ||||
| gSaveNow = false; | gSaveNow = false; | ||||
| @@ -172,19 +166,15 @@ static JUCEApplicationBase* juce_CreateApplication() { return new CarlaJuceApp() | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| CARLA_BRIDGE_START_NAMESPACE | |||||
| // ------------------------------------------------------------------------- | |||||
| class CarlaPluginClient : public CarlaBridgeClient | |||||
| class CarlaBridgePlugin | |||||
| { | { | ||||
| public: | public: | ||||
| CarlaPluginClient(const bool useBridge, const char* const clientName, const char* const audioBaseName, const char* const controlBaseName, const char* const timeBaseName) | |||||
| : CarlaBridgeClient(nullptr), | |||||
| fEngine(nullptr) | |||||
| CarlaBridgePlugin(const bool useBridge, const char* const clientName, const char* const audioBaseName, const char* const controlBaseName, const char* const timeBaseName) | |||||
| : fEngine(nullptr), | |||||
| fOscServerThread(nullptr) | |||||
| { | { | ||||
| CARLA_ASSERT(clientName != nullptr && clientName[0] != '\0'); | CARLA_ASSERT(clientName != nullptr && clientName[0] != '\0'); | ||||
| carla_debug("CarlaPluginClient::CarlaPluginClient(%s, \"%s\", %s, %s, %s)", bool2str(useBridge), clientName, audioBaseName, controlBaseName, timeBaseName); | |||||
| carla_debug("CarlaBridgePlugin::CarlaBridgePlugin(%s, \"%s\", %s, %s, %s)", bool2str(useBridge), clientName, audioBaseName, controlBaseName, timeBaseName); | |||||
| carla_set_engine_callback(callback, this); | carla_set_engine_callback(callback, this); | ||||
| @@ -196,9 +186,9 @@ public: | |||||
| fEngine = carla_get_engine(); | fEngine = carla_get_engine(); | ||||
| } | } | ||||
| ~CarlaPluginClient() override | |||||
| ~CarlaBridgePlugin() | |||||
| { | { | ||||
| carla_debug("CarlaPluginClient::~CarlaPluginClient()"); | |||||
| carla_debug("CarlaBridgePlugin::~CarlaBridgePlugin()"); | |||||
| carla_engine_close(); | carla_engine_close(); | ||||
| } | } | ||||
| @@ -208,12 +198,75 @@ public: | |||||
| return (fEngine != nullptr); | return (fEngine != nullptr); | ||||
| } | } | ||||
| // --------------------------------------------------------------------- | |||||
| void oscInit(const char* const url) | void oscInit(const char* const url) | ||||
| { | { | ||||
| CarlaBridgeClient::oscInit(url); | |||||
| fEngine->setOscBridgeData(&fOscData); | |||||
| fOscServerThread = lo_server_thread_new_with_proto(nullptr, LO_UDP, osc_error_handler); | |||||
| CARLA_SAFE_ASSERT_RETURN(fOscServerThread != nullptr,) | |||||
| { | |||||
| char* const host = lo_url_get_hostname(url); | |||||
| char* const port = lo_url_get_port(url); | |||||
| fOscControlData.path = carla_strdup_free(lo_url_get_path(url)); | |||||
| fOscControlData.target = lo_address_new_with_proto(LO_UDP, host, port); | |||||
| std::free(host); | |||||
| std::free(port); | |||||
| } | |||||
| if (char* const tmpServerPath = lo_server_thread_get_url(fOscServerThread)) | |||||
| { | |||||
| std::srand((uint)(uintptr_t)this); | |||||
| std::srand((uint)(uintptr_t)&url); | |||||
| CarlaString oscName("plug-" + CarlaString(std::rand() % 99999)); | |||||
| fOscServerPath = tmpServerPath; | |||||
| fOscServerPath += oscName; | |||||
| std::free(tmpServerPath); | |||||
| } | |||||
| fEngine->setOscBridgeData(&fOscControlData); | |||||
| } | } | ||||
| void oscClose() | |||||
| { | |||||
| fEngine->setOscBridgeData(nullptr); | |||||
| if (fOscServerThread != nullptr) | |||||
| { | |||||
| lo_server_thread_free(fOscServerThread); | |||||
| fOscServerThread = nullptr; | |||||
| } | |||||
| fOscControlData.clear(); | |||||
| fOscServerPath.clear(); | |||||
| } | |||||
| // --------------------------------------------------------------------- | |||||
| void sendOscUpdate() const noexcept | |||||
| { | |||||
| if (fOscControlData.target != nullptr) | |||||
| osc_send_update(fOscControlData, fOscServerPath); | |||||
| } | |||||
| void sendOscBridgeUpdate() const noexcept | |||||
| { | |||||
| if (fOscControlData.target != nullptr) | |||||
| osc_send_bridge_update(fOscControlData, fOscControlData.path); | |||||
| } | |||||
| void sendOscBridgeError(const char* const error) const noexcept | |||||
| { | |||||
| if (fOscControlData.target != nullptr) | |||||
| osc_send_bridge_error(fOscControlData, error); | |||||
| } | |||||
| // --------------------------------------------------------------------- | |||||
| void exec(const bool useOsc, int argc, char* argv[]) | void exec(const bool useOsc, int argc, char* argv[]) | ||||
| { | { | ||||
| if (! useOsc) | if (! useOsc) | ||||
| @@ -231,7 +284,6 @@ public: | |||||
| carla_stderr("Plugin preset load failed, error was:\n%s", carla_get_last_error()); | carla_stderr("Plugin preset load failed, error was:\n%s", carla_get_last_error()); | ||||
| } | } | ||||
| gBridgeClient = this; | |||||
| gIsInitiated = true; | gIsInitiated = true; | ||||
| #if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN) | #if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN) | ||||
| @@ -244,7 +296,6 @@ public: | |||||
| carla_msleep(25); | carla_msleep(25); | ||||
| } | } | ||||
| #endif | #endif | ||||
| gBridgeClient = nullptr; | |||||
| carla_set_engine_about_to_close(); | carla_set_engine_about_to_close(); | ||||
| carla_remove_plugin(0); | carla_remove_plugin(0); | ||||
| @@ -270,7 +321,7 @@ protected: | |||||
| break; | break; | ||||
| case ENGINE_CALLBACK_UI_STATE_CHANGED: | case ENGINE_CALLBACK_UI_STATE_CHANGED: | ||||
| if (gIsInitiated && value1 != 1 && ! isOscControlRegistered()) | |||||
| if (gIsInitiated && value1 != 1 && fOscControlData.target == nullptr) | |||||
| gCloseNow = true; | gCloseNow = true; | ||||
| break; | break; | ||||
| @@ -288,65 +339,26 @@ private: | |||||
| const CarlaEngine* fEngine; | const CarlaEngine* fEngine; | ||||
| String fProjFilename; | String fProjFilename; | ||||
| CarlaOscData fOscControlData; | |||||
| CarlaString fOscServerPath; | |||||
| lo_server_thread fOscServerThread; | |||||
| static void callback(void* ptr, EngineCallbackOpcode action, unsigned int pluginId, int value1, int value2, float value3, const char* valueStr) | static void callback(void* ptr, EngineCallbackOpcode action, unsigned int pluginId, int value1, int value2, float value3, const char* valueStr) | ||||
| { | { | ||||
| carla_debug("CarlaPluginClient::callback(%p, %i:%s, %i, %i, %i, %f, \"%s\")", ptr, action, EngineCallbackOpcode2Str(action), pluginId, value1, value2, value3, valueStr); | |||||
| carla_debug("CarlaBridgePlugin::callback(%p, %i:%s, %i, %i, %i, %f, \"%s\")", ptr, action, EngineCallbackOpcode2Str(action), pluginId, value1, value2, value3, valueStr); | |||||
| CARLA_SAFE_ASSERT_RETURN(ptr != nullptr,); | CARLA_SAFE_ASSERT_RETURN(ptr != nullptr,); | ||||
| CARLA_SAFE_ASSERT_RETURN(pluginId == 0,); | CARLA_SAFE_ASSERT_RETURN(pluginId == 0,); | ||||
| return ((CarlaPluginClient*)ptr)->handleCallback(action, value1, value2, value3, valueStr); | |||||
| return ((CarlaBridgePlugin*)ptr)->handleCallback(action, value1, value2, value3, valueStr); | |||||
| } | |||||
| static void osc_error_handler(int num, const char* msg, const char* path) | |||||
| { | |||||
| carla_stderr("CarlaBridgePlugin::osc_error_handler(%i, \"%s\", \"%s\")", num, msg, path); | |||||
| } | } | ||||
| }; | }; | ||||
| #if 0 | #if 0 | ||||
| // ------------------------------------------------------------------------- | |||||
| int CarlaBridgeOsc::handleMsgPluginSetParameterMidiChannel(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii"); | |||||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||||
| carla_debug("CarlaBridgeOsc::handleMsgPluginSetParameterMidiChannel()"); | |||||
| const int32_t index = argv[0]->i; | |||||
| const int32_t channel = argv[1]->i; | |||||
| CARLA_SAFE_ASSERT_RETURN(index >= 0, 0); | |||||
| CARLA_SAFE_ASSERT_RETURN(channel >= 0 && channel < MAX_MIDI_CHANNELS, 0); | |||||
| carla_set_parameter_midi_channel(0, static_cast<uint32_t>(index), static_cast<uint8_t>(channel)); | |||||
| return 0; | |||||
| } | |||||
| int CarlaBridgeOsc::handleMsgPluginSetParameterMidiCC(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii"); | |||||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||||
| carla_debug("CarlaBridgeOsc::handleMsgPluginSetParameterMidiCC()"); | |||||
| const int32_t index = argv[0]->i; | |||||
| const int32_t cc = argv[1]->i; | |||||
| CARLA_SAFE_ASSERT_RETURN(index >= 0, 0); | |||||
| CARLA_SAFE_ASSERT_RETURN(cc >= 1 && cc < 0x5F, 0); | |||||
| carla_set_parameter_midi_cc(0, static_cast<uint32_t>(index), static_cast<int16_t>(cc)); | |||||
| return 0; | |||||
| } | |||||
| int CarlaBridgeOsc::handleMsgPluginSetCustomData(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(3, "sss"); | |||||
| CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, 1); | |||||
| carla_debug("CarlaBridgeOsc::handleMsgPluginSetCustomData()"); | |||||
| const char* const type = (const char*)&argv[0]->s; | |||||
| const char* const key = (const char*)&argv[1]->s; | |||||
| const char* const value = (const char*)&argv[2]->s; | |||||
| carla_set_custom_data(0, type, key, value); | |||||
| return 0; | |||||
| } | |||||
| int CarlaBridgeOsc::handleMsgPluginSetChunk(CARLA_BRIDGE_OSC_HANDLE_ARGS) | int CarlaBridgeOsc::handleMsgPluginSetChunk(CARLA_BRIDGE_OSC_HANDLE_ARGS) | ||||
| { | { | ||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "s"); | CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "s"); | ||||
| @@ -380,14 +392,10 @@ int CarlaBridgeOsc::handleMsgPluginSetChunk(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| } | } | ||||
| #endif | #endif | ||||
| CARLA_BRIDGE_END_NAMESPACE | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| int main(int argc, char* argv[]) | int main(int argc, char* argv[]) | ||||
| { | { | ||||
| CARLA_BRIDGE_USE_NAMESPACE; | |||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| // Check argument count | // Check argument count | ||||
| @@ -479,11 +487,11 @@ int main(int argc, char* argv[]) | |||||
| } | } | ||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| // Init plugin client | |||||
| // Init plugin bridge | |||||
| CarlaPluginClient client(useBridge, clientName, bridgeBaseAudioName, bridgeBaseControlName, bridgeBaseTimeName); | |||||
| CarlaBridgePlugin bridge(useBridge, clientName, bridgeBaseAudioName, bridgeBaseControlName, bridgeBaseTimeName); | |||||
| if (! client.isOk()) | |||||
| if (! bridge.isOk()) | |||||
| { | { | ||||
| carla_stderr("Failed to init engine, error was:\n%s", carla_get_last_error()); | carla_stderr("Failed to init engine, error was:\n%s", carla_get_last_error()); | ||||
| return 1; | return 1; | ||||
| @@ -493,7 +501,7 @@ int main(int argc, char* argv[]) | |||||
| // Init OSC | // Init OSC | ||||
| if (useOsc) | if (useOsc) | ||||
| client.oscInit(oscUrl); | |||||
| bridge.oscInit(oscUrl); | |||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| // Listen for ctrl+c or sigint/sigterm events | // Listen for ctrl+c or sigint/sigterm events | ||||
| @@ -511,8 +519,8 @@ int main(int argc, char* argv[]) | |||||
| if (useOsc) | if (useOsc) | ||||
| { | { | ||||
| client.sendOscUpdate(); | |||||
| client.sendOscBridgeUpdate(); | |||||
| bridge.sendOscUpdate(); | |||||
| bridge.sendOscBridgeUpdate(); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| @@ -525,7 +533,7 @@ int main(int argc, char* argv[]) | |||||
| } | } | ||||
| } | } | ||||
| client.exec(useOsc, argc, argv); | |||||
| bridge.exec(useOsc, argc, argv); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| @@ -535,14 +543,14 @@ int main(int argc, char* argv[]) | |||||
| carla_stderr("Plugin failed to load, error was:\n%s", lastError); | carla_stderr("Plugin failed to load, error was:\n%s", lastError); | ||||
| if (useOsc) | if (useOsc) | ||||
| client.sendOscBridgeError(lastError); | |||||
| bridge.sendOscBridgeError(lastError); | |||||
| } | } | ||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| // Close OSC | // Close OSC | ||||
| if (useOsc) | if (useOsc) | ||||
| client.oscClose(); | |||||
| bridge.oscClose(); | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| @@ -7,9 +7,8 @@ | |||||
| include ../Makefile.mk | include ../Makefile.mk | ||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # Common | |||||
| BUILD_CXX_FLAGS += -DBUILD_BRIDGE | |||||
| BUILD_CXX_FLAGS += -DBUILD_BRIDGE -DBUILD_BRIDGE_PLUGIN | |||||
| BUILD_CXX_FLAGS += -I. -I../backend -I../includes -I../utils -isystem ../modules | BUILD_CXX_FLAGS += -I. -I../backend -I../includes -I../utils -isystem ../modules | ||||
| BUILD_CXX_FLAGS += $(LIBLO_FLAGS) | BUILD_CXX_FLAGS += $(LIBLO_FLAGS) | ||||
| LINK_FLAGS += $(LIBLO_LIBS) | LINK_FLAGS += $(LIBLO_LIBS) | ||||
| @@ -17,7 +16,7 @@ LINK_FLAGS += $(LIBLO_LIBS) | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # Plugin bridges | # Plugin bridges | ||||
| BUILD_PLUGIN_FLAGS = $(BUILD_CXX_FLAGS) -DBUILD_BRIDGE_PLUGIN | |||||
| BUILD_PLUGIN_FLAGS = $(BUILD_CXX_FLAGS) | |||||
| BUILD_PLUGIN_FLAGS += -I../backend/engine -I../backend/plugin | BUILD_PLUGIN_FLAGS += -I../backend/engine -I../backend/plugin | ||||
| LINK_PLUGIN_FLAGS = $(LINK_FLAGS) | LINK_PLUGIN_FLAGS = $(LINK_FLAGS) | ||||
| @@ -106,10 +105,7 @@ win64: ../../bin/carla-bridge-win64.exe | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # native | # native | ||||
| OBJS_NATIVE = \ | |||||
| CarlaBridgePlugin__native.o \ | |||||
| CarlaBridgeClient__native.o \ | |||||
| CarlaBridgeOsc__native.o | |||||
| OBJS_NATIVE = CarlaBridgePlugin__native.o | |||||
| # carla-engine | # carla-engine | ||||
| OBJS_NATIVE += \ | OBJS_NATIVE += \ | ||||
| @@ -173,8 +169,7 @@ endif | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # posix32 | # posix32 | ||||
| OBJS_POSIX32 = CarlaBridgePlugin__posix32.o \ | |||||
| CarlaBridgeClient__posix32.o CarlaBridgeOsc__posix32.o | |||||
| OBJS_POSIX32 = CarlaBridgePlugin__posix32.o | |||||
| # carla-engine | # carla-engine | ||||
| OBJS_POSIX32 += \ | OBJS_POSIX32 += \ | ||||
| @@ -232,8 +227,7 @@ endif | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # posix64 | # posix64 | ||||
| OBJS_POSIX64 = CarlaBridgePlugin__posix64.o \ | |||||
| CarlaBridgeClient__posix64.o CarlaBridgeOsc__posix64.o | |||||
| OBJS_POSIX64 = CarlaBridgePlugin__posix64.o | |||||
| # carla-engine | # carla-engine | ||||
| OBJS_POSIX64 += \ | OBJS_POSIX64 += \ | ||||
| @@ -291,8 +285,7 @@ endif | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # win32 | # win32 | ||||
| OBJS_WIN32 = CarlaBridgePlugin__win32.o \ | |||||
| CarlaBridgeClient__win32.o CarlaBridgeOsc__win32.o | |||||
| OBJS_WIN32 = CarlaBridgePlugin__win32.o | |||||
| # carla-engine | # carla-engine | ||||
| OBJS_WIN32 += \ | OBJS_WIN32 += \ | ||||
| @@ -347,8 +340,7 @@ LIBS_WIN32 += \ | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # win64 | # win64 | ||||
| OBJS_WIN64 = CarlaBridgePlugin__win64.o \ | |||||
| CarlaBridgeClient__win64.o CarlaBridgeOsc__win64.o | |||||
| OBJS_WIN64 = CarlaBridgePlugin__win64.o | |||||
| # carla-engine | # carla-engine | ||||
| OBJS_WIN64 += \ | OBJS_WIN64 += \ | ||||