/* * Carla Bridge Client * Copyright (C) 2011-2013 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 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 GPL.txt file */ #include "CarlaBridgeClient.hpp" #ifdef BUILD_BRIDGE_UI # include "CarlaBridgeToolkit.hpp" # include "CarlaLibUtils.hpp" #endif CARLA_BRIDGE_START_NAMESPACE // --------------------------------------------------------------------- CarlaBridgeClient::CarlaBridgeClient(const char* const uiTitle) : kOsc(this), #ifdef BUILD_BRIDGE_UI kUiToolkit(CarlaBridgeToolkit::createNew(this, uiTitle)), fUiFilename(nullptr), fUiLib(nullptr), fUiQuit(false), #endif fOscData(nullptr) { carla_debug("CarlaBridgeClient::CarlaBridgeClient(\"%s\")", uiTitle); } CarlaBridgeClient::~CarlaBridgeClient() { carla_debug("CarlaBridgeClient::~CarlaBridgeClient()"); #ifdef BUILD_BRIDGE_UI if (fUiFilename != nullptr) delete[] fUiFilename; delete kUiToolkit; #endif } #ifdef BUILD_BRIDGE_UI // --------------------------------------------------------------------- // ui initialization bool CarlaBridgeClient::uiInit(const char* const, const char* const) { carla_debug("CarlaBridgeClient::uiInit()"); // Test for single init { static bool initiated = false; CARLA_ASSERT(! initiated); initiated = true; } fUiQuit = false; kUiToolkit->init(); return false; } void CarlaBridgeClient::uiClose() { carla_debug("CarlaBridgeClient::uiClose()"); if (! fUiQuit) { fUiQuit = true; if (isOscControlRegistered()) sendOscExiting(); } kUiToolkit->quit(); } #endif // --------------------------------------------------------------------- // osc stuff void CarlaBridgeClient::oscInit(const char* const url) { carla_debug("CarlaBridgeClient::oscInit(\"%s\")", url); kOsc.init(url); fOscData = kOsc.getControlData(); } bool CarlaBridgeClient::oscIdle() { kOsc.idle(); #ifdef BUILD_BRIDGE_UI return ! fUiQuit; #else return true; #endif } void CarlaBridgeClient::oscClose() { carla_debug("CarlaBridgeClient::oscClose()"); CARLA_ASSERT(fOscData != nullptr); kOsc.close(); fOscData = nullptr; } bool CarlaBridgeClient::isOscControlRegistered() const { return kOsc.isControlRegistered(); } void CarlaBridgeClient::sendOscUpdate() { carla_debug("CarlaBridgeClient::sendOscUpdate()"); CARLA_ASSERT(fOscData != nullptr); if (fOscData != nullptr && fOscData->target != nullptr) osc_send_update(fOscData, kOsc.getServerPath()); } #ifdef BUILD_BRIDGE_PLUGIN void CarlaBridgeClient::sendOscBridgeUpdate() { carla_debug("CarlaBridgeClient::sendOscBridgeUpdate()"); CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData->target != nullptr && fOscData->path != nullptr); if (fOscData != nullptr && fOscData->target != nullptr && fOscData->path != nullptr) osc_send_bridge_update(fOscData, fOscData->path); } void CarlaBridgeClient::sendOscBridgeError(const char* const error) { carla_debug("CarlaBridgeClient::sendOscBridgeError(\"%s\")", error); CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(error != nullptr); if (fOscData != nullptr && fOscData->target != nullptr && error != nullptr) osc_send_bridge_error(fOscData, error); } #endif #ifdef BUILD_BRIDGE_UI // --------------------------------------------------------------------- // toolkit void CarlaBridgeClient::toolkitShow() { carla_debug("CarlaBridgeClient::toolkitShow()"); kUiToolkit->show(); } void CarlaBridgeClient::toolkitHide() { carla_debug("CarlaBridgeClient::toolkitHide()"); kUiToolkit->hide(); } void CarlaBridgeClient::toolkitResize(const int width, const int height) { carla_debug("CarlaBridgeClient::toolkitResize(%i, %i)", width, height); kUiToolkit->resize(width, height); } void CarlaBridgeClient::toolkitExec(const bool showGui) { carla_debug("CarlaBridgeClient::toolkitExec(%s)", bool2str(showGui)); kUiToolkit->exec(showGui); } void CarlaBridgeClient::toolkitQuit() { carla_debug("CarlaBridgeClient::toolkitQuit()"); fUiQuit = true; kUiToolkit->quit(); } #endif // --------------------------------------------------------------------- void CarlaBridgeClient::sendOscConfigure(const char* const key, const char* const value) { carla_debug("CarlaBridgeClient::sendOscConfigure(\"%s\", \"%s\")", key, value); CARLA_ASSERT(fOscData != nullptr); if (fOscData != nullptr && fOscData->target != nullptr) osc_send_configure(fOscData, key, value); } void CarlaBridgeClient::sendOscControl(const int32_t index, const float value) { carla_debug("CarlaBridgeClient::sendOscControl(%i, %f)", index, value); CARLA_ASSERT(fOscData != nullptr); if (fOscData != nullptr && fOscData->target != nullptr) osc_send_control(fOscData, index, value); } void CarlaBridgeClient::sendOscProgram(const int32_t index) { carla_debug("CarlaBridgeClient::sendOscProgram(%i)", index); CARLA_ASSERT(fOscData != nullptr); if (fOscData != nullptr && fOscData->target != nullptr) osc_send_program(fOscData, index); } #ifdef BUILD_BRIDGE_PLUGIN void CarlaBridgeClient::sendOscMidiProgram(const int32_t index) { carla_debug("CarlaBridgeClient::sendOscMidiProgram(%i)", index); CARLA_ASSERT(fOscData != nullptr); if (fOscData != nullptr && fOscData->target != nullptr) osc_send_midi_program(fOscData, index); } #endif void CarlaBridgeClient::sendOscMidi(const uint8_t midiBuf[4]) { carla_debug("CarlaBridgeClient::sendOscMidi(%p)", midiBuf); CARLA_ASSERT(fOscData != nullptr); if (fOscData != nullptr && fOscData->target != nullptr) osc_send_midi(fOscData, midiBuf); } void CarlaBridgeClient::sendOscExiting() { carla_debug("CarlaBridgeClient::sendOscExiting()"); CARLA_ASSERT(fOscData != nullptr); if (fOscData != nullptr && fOscData->target != nullptr) osc_send_exiting(fOscData); } #ifdef BRIDGE_LV2 void CarlaBridgeClient::sendOscLv2TransferAtom(const int32_t portIndex, const char* const typeStr, const char* const atomBuf) { carla_debug("CarlaBridgeClient::sendOscLv2TransferAtom(%i, \"%s\", \"%s\")", portIndex, typeStr, atomBuf); CARLA_ASSERT(fOscData != nullptr); if (fOscData != nullptr && fOscData->target != nullptr) osc_send_lv2_transfer_atom(fOscData, portIndex, typeStr, atomBuf); } void CarlaBridgeClient::sendOscLv2TransferEvent(const int32_t portIndex, const char* const typeStr, const char* const atomBuf) { carla_debug("CarlaBridgeClient::sendOscLv2TransferEvent(%i, \"%s\", \"%s\")", portIndex, typeStr, atomBuf); CARLA_ASSERT(fOscData != nullptr); if (fOscData != nullptr && fOscData->target != nullptr) osc_send_lv2_transfer_event(fOscData, portIndex, typeStr, atomBuf); } #endif // --------------------------------------------------------------------- #ifdef BUILD_BRIDGE_UI void* CarlaBridgeClient::getContainerId() { return kUiToolkit->getContainerId(); } bool CarlaBridgeClient::uiLibOpen(const char* const filename) { CARLA_ASSERT(fUiLib == nullptr); CARLA_ASSERT(fUiFilename == nullptr); if (fUiFilename != nullptr) delete[] fUiFilename; fUiLib = lib_open(filename); fUiFilename = carla_strdup(filename ? filename : ""); return (fUiLib != nullptr); } bool CarlaBridgeClient::uiLibClose() { CARLA_ASSERT(fUiLib != nullptr); if (fUiLib != nullptr) { const bool closed = lib_close(fUiLib); fUiLib = nullptr; return closed; } return false; } void* CarlaBridgeClient::uiLibSymbol(const char* const symbol) { CARLA_ASSERT(fUiLib != nullptr); if (fUiLib != nullptr) return lib_symbol(fUiLib, symbol); return nullptr; } const char* CarlaBridgeClient::uiLibError() { return lib_error(fUiFilename); } #endif CARLA_BRIDGE_END_NAMESPACE