/* * Carla Bridge Client * 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 * 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 COPYING file */ #include "carla_bridge_client.hpp" #include "carla_bridge_toolkit.hpp" #ifdef BUILD_BRIDGE_UI # include "carla_lib_utils.hpp" #endif #include #include CARLA_BRIDGE_START_NAMESPACE // --------------------------------------------------------------------- CarlaBridgeClient::CarlaBridgeClient(const char* const uiTitle) : m_osc(this), m_toolkit(CarlaBridgeToolkit::createNew(this, uiTitle)) { qDebug("CarlaBridgeClient::CarlaBridgeClient(\"%s\")", uiTitle); m_oscData = nullptr; #ifdef BUILD_BRIDGE_UI m_uiFilename = nullptr; m_uiLib = nullptr; m_uiQuit = false; #endif } CarlaBridgeClient::~CarlaBridgeClient() { qDebug("CarlaBridgeClient::~CarlaBridgeClient()"); #ifdef BUILD_BRIDGE_UI if (m_uiFilename) free(m_uiFilename); #endif delete m_toolkit; } #ifdef BUILD_BRIDGE_UI // --------------------------------------------------------------------- // ui initialization 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; } void CarlaBridgeClient::close() { qDebug("CarlaBridgeClient::close()"); if (! m_uiQuit) { m_uiQuit = true; if (isOscControlRegistered()) sendOscExiting(); } m_toolkit->quit(); } #endif // --------------------------------------------------------------------- // osc stuff bool CarlaBridgeClient::oscInit(const char* const url) { qDebug("CarlaBridgeClient::oscInit(\"%s\")", url); const bool ret = m_osc.init(url); m_oscData = m_osc.getControlData(); return ret; } bool CarlaBridgeClient::oscIdle() { m_osc.idle(); #ifdef BUILD_BRIDGE_UI return ! m_uiQuit; #else return true; #endif } void CarlaBridgeClient::oscClose() { qDebug("CarlaBridgeClient::oscClose()"); CARLA_ASSERT(m_oscData); m_osc.close(); m_oscData = nullptr; } bool CarlaBridgeClient::isOscControlRegistered() const { return m_osc.isControlRegistered(); } void CarlaBridgeClient::sendOscUpdate() { qDebug("CarlaBridgeClient::sendOscUpdate()"); CARLA_ASSERT(m_oscData); if (m_oscData && m_oscData->target) osc_send_update(m_oscData, m_osc.getServerPath()); } #ifdef BUILD_BRIDGE_PLUGIN void CarlaBridgeClient::sendOscBridgeUpdate() { qDebug("CarlaBridgeClient::sendOscBridgeUpdate()"); CARLA_ASSERT(m_oscData); CARLA_ASSERT(m_oscData->target && m_oscData->path); if (m_oscData && m_oscData->target && m_oscData->path) osc_send_bridge_update(m_oscData, m_oscData->path); } void CarlaBridgeClient::sendOscBridgeError(const char* const error) { qDebug("CarlaBridgeClient::sendOscBridgeError(\"%s\")", error); CARLA_ASSERT(m_oscData); CARLA_ASSERT(error); if (m_oscData && m_oscData->target) osc_send_bridge_error(m_oscData, error); } #endif // --------------------------------------------------------------------- // toolkit void CarlaBridgeClient::toolkitShow() { qDebug("CarlaBridgeClient::toolkitShow()"); m_toolkit->show(); } void CarlaBridgeClient::toolkitHide() { qDebug("CarlaBridgeClient::toolkitHide()"); m_toolkit->hide(); } void CarlaBridgeClient::toolkitResize(const int width, const int height) { qDebug("CarlaBridgeClient::toolkitResize(%i, %i)", width, height); m_toolkit->resize(width, height); } void CarlaBridgeClient::toolkitExec(const bool showGui) { qDebug("CarlaBridgeClient::toolkitExec(%s)", bool2str(showGui)); m_toolkit->exec(showGui); } void CarlaBridgeClient::toolkitQuit() { qDebug("CarlaBridgeClient::toolkitQuit()"); #ifdef BUILD_BRIDGE_UI m_uiQuit = true; #endif m_toolkit->quit(); } // --------------------------------------------------------------------- void CarlaBridgeClient::sendOscConfigure(const char* const key, const char* const value) { qDebug("CarlaBridgeClient::sendOscConfigure(\"%s\", \"%s\")", key, value); CARLA_ASSERT(m_oscData); if (m_oscData && m_oscData->target) osc_send_configure(m_oscData, key, value); } void CarlaBridgeClient::sendOscControl(const int32_t index, const float value) { qDebug("CarlaBridgeClient::sendOscControl(%i, %f)", index, value); CARLA_ASSERT(m_oscData); if (m_oscData && m_oscData->target) osc_send_control(m_oscData, index, value); } void CarlaBridgeClient::sendOscProgram(const int32_t index) { qDebug("CarlaBridgeClient::sendOscProgram(%i)", index); CARLA_ASSERT(m_oscData); if (m_oscData && m_oscData->target) osc_send_program(m_oscData, index); } void CarlaBridgeClient::sendOscMidiProgram(const int32_t index) { qDebug("CarlaBridgeClient::sendOscMidiProgram(%i)", index); CARLA_ASSERT(m_oscData); if (m_oscData && m_oscData->target) osc_send_midi_program(m_oscData, index); } void CarlaBridgeClient::sendOscMidi(const uint8_t midiBuf[4]) { qDebug("CarlaBridgeClient::sendOscMidi(%p)", midiBuf); CARLA_ASSERT(m_oscData); if (m_oscData && m_oscData->target) osc_send_midi(m_oscData, midiBuf); } void CarlaBridgeClient::sendOscExiting() { qDebug("CarlaBridgeClient::sendOscExiting()"); CARLA_ASSERT(m_oscData); if (m_oscData && m_oscData->target) osc_send_exiting(m_oscData); } #ifdef BRIDGE_LV2 void CarlaBridgeClient::sendOscLv2TransferAtom(const int32_t portIndex, const char* const typeStr, const char* const atomBuf) { qDebug("CarlaBridgeClient::sendOscLv2TransferAtom(%i, \"%s\", \"%s\")", portIndex, typeStr, atomBuf); CARLA_ASSERT(m_oscData); if (m_oscData && m_oscData->target) osc_send_lv2_transfer_atom(m_oscData, portIndex, typeStr, atomBuf); } void CarlaBridgeClient::sendOscLv2TransferEvent(const int32_t portIndex, const char* const typeStr, const char* const atomBuf) { qDebug("CarlaBridgeClient::sendOscLv2TransferEvent(%i, \"%s\", \"%s\")", portIndex, typeStr, atomBuf); CARLA_ASSERT(m_oscData); if (m_oscData && m_oscData->target) osc_send_lv2_transfer_event(m_oscData, portIndex, typeStr, atomBuf); } #endif // --------------------------------------------------------------------- void* CarlaBridgeClient::getContainerId() { return m_toolkit->getContainerId(); } #ifdef BUILD_BRIDGE_UI bool CarlaBridgeClient::uiLibOpen(const char* const filename) { CARLA_ASSERT(! m_uiLib); CARLA_ASSERT(filename); if (m_uiFilename) free(m_uiFilename); m_uiLib = lib_open(filename); m_uiFilename = strdup(filename ? filename : ""); return bool(m_uiLib); } bool CarlaBridgeClient::uiLibClose() { CARLA_ASSERT(m_uiLib); if (m_uiLib) { const bool closed = lib_close(m_uiLib); m_uiLib = nullptr; return closed; } return false; } void* CarlaBridgeClient::uiLibSymbol(const char* const symbol) { CARLA_ASSERT(m_uiLib); if (m_uiLib) return lib_symbol(m_uiLib, symbol); return nullptr; } const char* CarlaBridgeClient::uiLibError() { return lib_error(m_uiFilename); } #endif CARLA_BRIDGE_END_NAMESPACE