| @@ -200,6 +200,7 @@ clean: | |||||
| doc: | doc: | ||||
| $(MAKE) doc -C c++/carla-backend | $(MAKE) doc -C c++/carla-backend | ||||
| $(MAKE) doc -C c++/carla-bridge | |||||
| install: | install: | ||||
| # Create directories | # Create directories | ||||
| @@ -182,7 +182,7 @@ SERVER_BASED_SEARCH = NO | |||||
| #--------------------------------------------------------------------------- | #--------------------------------------------------------------------------- | ||||
| # configuration options related to the LaTeX output | # configuration options related to the LaTeX output | ||||
| #--------------------------------------------------------------------------- | #--------------------------------------------------------------------------- | ||||
| GENERATE_LATEX = YES | |||||
| GENERATE_LATEX = NO | |||||
| LATEX_OUTPUT = latex | LATEX_OUTPUT = latex | ||||
| LATEX_CMD_NAME = latex | LATEX_CMD_NAME = latex | ||||
| MAKEINDEX_CMD_NAME = makeindex | MAKEINDEX_CMD_NAME = makeindex | ||||
| @@ -241,7 +241,7 @@ EXPAND_ONLY_PREDEF = NO | |||||
| SEARCH_INCLUDES = YES | SEARCH_INCLUDES = YES | ||||
| INCLUDE_PATH = | INCLUDE_PATH = | ||||
| INCLUDE_FILE_PATTERNS = | INCLUDE_FILE_PATTERNS = | ||||
| PREDEFINED = CARLA_BACKEND_NO_NAMESPACE CARLA_ENGINE_JACK CARLA_ENGINE_RTAUDIO CARLA_ENGINE_VST WANT_FLUIDSYNTH WANT_LINUXSAMPLER | |||||
| PREDEFINED = CARLA_ENGINE_JACK CARLA_ENGINE_RTAUDIO WANT_FLUIDSYNTH WANT_LINUXSAMPLER | |||||
| EXPAND_AS_DEFINED = | EXPAND_AS_DEFINED = | ||||
| SKIP_FUNCTION_MACROS = YES | SKIP_FUNCTION_MACROS = YES | ||||
| #--------------------------------------------------------------------------- | #--------------------------------------------------------------------------- | ||||
| @@ -241,7 +241,7 @@ const PluginInfo* get_plugin_info(unsigned short plugin_id) | |||||
| } | } | ||||
| if (! carlaEngine->isRunning()) | if (! carlaEngine->isRunning()) | ||||
| return nullptr; | |||||
| return &info; | |||||
| CarlaBackend::CarlaPlugin* const plugin = carlaEngine->getPlugin(plugin_id); | CarlaBackend::CarlaPlugin* const plugin = carlaEngine->getPlugin(plugin_id); | ||||
| @@ -355,7 +355,7 @@ const ParameterInfo* get_parameter_info(unsigned short plugin_id, quint32 parame | |||||
| } | } | ||||
| if (! carlaEngine->isRunning()) | if (! carlaEngine->isRunning()) | ||||
| return nullptr; | |||||
| return &info; | |||||
| CarlaBackend::CarlaPlugin* const plugin = carlaEngine->getPlugin(plugin_id); | CarlaBackend::CarlaPlugin* const plugin = carlaEngine->getPlugin(plugin_id); | ||||
| @@ -401,7 +401,7 @@ const ScalePointInfo* get_parameter_scalepoint_info(unsigned short plugin_id, qu | |||||
| } | } | ||||
| if (! carlaEngine->isRunning()) | if (! carlaEngine->isRunning()) | ||||
| return nullptr; | |||||
| return &info; | |||||
| CarlaBackend::CarlaPlugin* const plugin = carlaEngine->getPlugin(plugin_id); | CarlaBackend::CarlaPlugin* const plugin = carlaEngine->getPlugin(plugin_id); | ||||
| @@ -24,20 +24,20 @@ CARLA_BACKEND_START_NAMESPACE | |||||
| CarlaEngine::CarlaEngine() | CarlaEngine::CarlaEngine() | ||||
| : m_checkThread(this), | : m_checkThread(this), | ||||
| #ifndef BUILD_BRIDGE | |||||
| #ifndef BUILD_BRIDGE | |||||
| m_osc(this), | m_osc(this), | ||||
| m_oscData(nullptr), | m_oscData(nullptr), | ||||
| #endif | |||||
| #endif | |||||
| m_callback(nullptr), | m_callback(nullptr), | ||||
| #ifdef Q_COMPILER_INITIALIZER_LISTS | |||||
| #ifdef Q_COMPILER_INITIALIZER_LISTS | |||||
| m_callbackPtr(nullptr), | m_callbackPtr(nullptr), | ||||
| m_carlaPlugins{nullptr}, | m_carlaPlugins{nullptr}, | ||||
| m_uniqueNames{nullptr}, | m_uniqueNames{nullptr}, | ||||
| m_insPeak{0.0}, | m_insPeak{0.0}, | ||||
| m_outsPeak{0.0} | m_outsPeak{0.0} | ||||
| #else | |||||
| #else | |||||
| m_callbackPtr(nullptr) | m_callbackPtr(nullptr) | ||||
| #endif | |||||
| #endif | |||||
| { | { | ||||
| qDebug("CarlaEngine::CarlaEngine()"); | qDebug("CarlaEngine::CarlaEngine()"); | ||||
| @@ -99,8 +99,10 @@ bool CarlaEngine::init(const char* const clientName) | |||||
| { | { | ||||
| qDebug("CarlaEngine::init(\"%s\")", clientName); | qDebug("CarlaEngine::init(\"%s\")", clientName); | ||||
| #ifndef BUILD_BRIDGE | |||||
| m_osc.init(clientName); | m_osc.init(clientName); | ||||
| m_oscData = m_osc.getControllerData(); | m_oscData = m_osc.getControllerData(); | ||||
| #endif | |||||
| return true; | return true; | ||||
| } | } | ||||
| @@ -111,8 +113,10 @@ bool CarlaEngine::close() | |||||
| m_checkThread.stopNow(); | m_checkThread.stopNow(); | ||||
| #ifndef BUILD_BRIDGE | |||||
| m_oscData = nullptr; | m_oscData = nullptr; | ||||
| m_osc.close(); | m_osc.close(); | ||||
| #endif | |||||
| maxPluginNumber = 0; | maxPluginNumber = 0; | ||||
| @@ -284,6 +288,12 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con | |||||
| case PLUGIN_VST: | case PLUGIN_VST: | ||||
| plugin = CarlaPlugin::newVST(init); | plugin = CarlaPlugin::newVST(init); | ||||
| break; | break; | ||||
| #ifdef BUILD_BRIDGE | |||||
| case PLUGIN_GIG: | |||||
| case PLUGIN_SF2: | |||||
| case PLUGIN_SFZ: | |||||
| break; | |||||
| #else | |||||
| case PLUGIN_GIG: | case PLUGIN_GIG: | ||||
| plugin = CarlaPlugin::newGIG(init); | plugin = CarlaPlugin::newGIG(init); | ||||
| break; | break; | ||||
| @@ -293,6 +303,7 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con | |||||
| case PLUGIN_SFZ: | case PLUGIN_SFZ: | ||||
| plugin = CarlaPlugin::newSFZ(init); | plugin = CarlaPlugin::newSFZ(init); | ||||
| break; | break; | ||||
| #endif | |||||
| } | } | ||||
| } | } | ||||
| @@ -332,6 +343,7 @@ bool CarlaEngine::removePlugin(const unsigned short id) | |||||
| m_carlaPlugins[id] = nullptr; | m_carlaPlugins[id] = nullptr; | ||||
| m_uniqueNames[id] = nullptr; | m_uniqueNames[id] = nullptr; | ||||
| #ifndef BUILD_BRIDGE | |||||
| if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) | if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) | ||||
| { | { | ||||
| for (unsigned short i=id; i < maxPluginNumber-1; i++) | for (unsigned short i=id; i < maxPluginNumber-1; i++) | ||||
| @@ -343,6 +355,7 @@ bool CarlaEngine::removePlugin(const unsigned short id) | |||||
| m_carlaPlugins[i]->setId(i); | m_carlaPlugins[i]->setId(i); | ||||
| } | } | ||||
| } | } | ||||
| #endif | |||||
| if (isRunning()) | if (isRunning()) | ||||
| m_checkThread.startNow(maxPluginNumber); | m_checkThread.startNow(maxPluginNumber); | ||||
| @@ -499,19 +512,28 @@ void CarlaEngine::midiUnlock() | |||||
| m_midiLock.unlock(); | m_midiLock.unlock(); | ||||
| } | } | ||||
| #ifndef BUILD_BRIDGE | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // OSC Stuff | // OSC Stuff | ||||
| bool CarlaEngine::isOscControllerRegisted() const | bool CarlaEngine::isOscControllerRegisted() const | ||||
| { | { | ||||
| #ifdef BUILD_BRIDGE | |||||
| return (bool)m_oscData; | |||||
| #else | |||||
| return m_osc.isControllerRegistered(); | return m_osc.isControllerRegistered(); | ||||
| #endif | |||||
| } | } | ||||
| #ifndef BUILD_BRIDGE | |||||
| const char* CarlaEngine::getOscServerPath() const | const char* CarlaEngine::getOscServerPath() const | ||||
| { | { | ||||
| return m_osc.getServerPath(); | return m_osc.getServerPath(); | ||||
| } | } | ||||
| #else | |||||
| void CarlaEngine::setOscBridgeData(const CarlaOscData* const oscData) | |||||
| { | |||||
| m_oscData = oscData; | |||||
| } | |||||
| #endif | #endif | ||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| @@ -802,9 +824,10 @@ const CarlaEngineControlEvent* CarlaEngineControlPort::getEvent(uint32_t index) | |||||
| return nullptr; | return nullptr; | ||||
| Q_ASSERT(buffer); | Q_ASSERT(buffer); | ||||
| Q_ASSERT(index < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS); | |||||
| #ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
| Q_ASSERT(index < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS); | |||||
| if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) | if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) | ||||
| { | { | ||||
| const CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer; | const CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer; | ||||
| @@ -1012,9 +1035,10 @@ const CarlaEngineMidiEvent* CarlaEngineMidiPort::getEvent(uint32_t index) | |||||
| return nullptr; | return nullptr; | ||||
| Q_ASSERT(buffer); | Q_ASSERT(buffer); | ||||
| Q_ASSERT(index < CarlaEngine::MAX_ENGINE_MIDI_EVENTS); | |||||
| #ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
| Q_ASSERT(index < CarlaEngine::MAX_ENGINE_MIDI_EVENTS); | |||||
| if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) | if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) | ||||
| { | { | ||||
| const CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer; | const CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer; | ||||
| @@ -1082,6 +1106,7 @@ void CarlaEngineMidiPort::writeEvent(uint32_t time, const uint8_t* data, uint8_t | |||||
| // ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
| // Carla Engine OSC stuff | // Carla Engine OSC stuff | ||||
| #ifndef BUILD_BRIDGE | |||||
| void CarlaEngine::osc_send_add_plugin(const int32_t pluginId, const char* const pluginName) | void CarlaEngine::osc_send_add_plugin(const int32_t pluginId, const char* const pluginName) | ||||
| { | { | ||||
| qDebug("CarlaEngine::osc_send_add_plugin(%i, \"%s\")", pluginId, pluginName); | qDebug("CarlaEngine::osc_send_add_plugin(%i, \"%s\")", pluginId, pluginName); | ||||
| @@ -1424,5 +1449,6 @@ void CarlaEngine::osc_send_exit() | |||||
| lo_send(m_oscData->target, target_path, ""); | lo_send(m_oscData->target, target_path, ""); | ||||
| } | } | ||||
| } | } | ||||
| #endif | |||||
| CARLA_BACKEND_END_NAMESPACE | CARLA_BACKEND_END_NAMESPACE | ||||
| @@ -202,6 +202,7 @@ public: | |||||
| virtual bool isOnAudioThread() = 0; | virtual bool isOnAudioThread() = 0; | ||||
| virtual bool isOffline() = 0; | virtual bool isOffline() = 0; | ||||
| virtual bool isRunning() = 0; | virtual bool isRunning() = 0; | ||||
| virtual CarlaEngineClient* addClient(CarlaPlugin* const plugin) = 0; | virtual CarlaEngineClient* addClient(CarlaPlugin* const plugin) = 0; | ||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| @@ -254,13 +255,26 @@ public: | |||||
| void midiLock(); | void midiLock(); | ||||
| void midiUnlock(); | void midiUnlock(); | ||||
| #ifndef BUILD_BRIDGE | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // OSC Stuff | // OSC Stuff | ||||
| bool isOscControllerRegisted() const; | bool isOscControllerRegisted() const; | ||||
| #ifndef BUILD_BRIDGE | |||||
| const char* getOscServerPath() const; | const char* getOscServerPath() const; | ||||
| #else | |||||
| void setOscBridgeData(const CarlaOscData* const oscData); | |||||
| #endif | |||||
| void osc_send_set_default_value(const int32_t pluginId, const int32_t index, const double value); | |||||
| void osc_send_set_parameter_value(const int32_t pluginId, const int32_t index, const double value); | |||||
| void osc_send_set_program(const int32_t pluginId, const int32_t index); | |||||
| void osc_send_set_midi_program(const int32_t pluginId, const int32_t index); | |||||
| void osc_send_note_on(const int32_t pluginId, const int32_t channel, const int32_t note, const int32_t velo); | |||||
| void osc_send_note_off(const int32_t pluginId, const int32_t channel, const int32_t note); | |||||
| void osc_send_set_input_peak_value(const int32_t pluginId, const int32_t portId, const double value); | |||||
| void osc_send_set_output_peak_value(const int32_t pluginId, const int32_t portId, const double value); | |||||
| #ifndef BUILD_BRIDGE | |||||
| void osc_send_add_plugin(const int32_t pluginId, const char* const pluginName); | void osc_send_add_plugin(const int32_t pluginId, const char* const pluginName); | ||||
| void osc_send_remove_plugin(const int32_t pluginId); | void osc_send_remove_plugin(const int32_t pluginId); | ||||
| void osc_send_set_plugin_data(const int32_t pluginId, const int32_t type, const int32_t category, const int32_t hints, const char* const realName, const char* const label, const char* const maker, const char* const copyright, const int64_t uniqueId); | void osc_send_set_plugin_data(const int32_t pluginId, const int32_t type, const int32_t category, const int32_t hints, const char* const realName, const char* const label, const char* const maker, const char* const copyright, const int64_t uniqueId); | ||||
| @@ -269,20 +283,29 @@ public: | |||||
| void osc_send_set_parameter_ranges(const int32_t pluginId, const int32_t index, const double min, const double max, const double def, const double step, const double stepSmall, const double stepLarge); | void osc_send_set_parameter_ranges(const int32_t pluginId, const int32_t index, const double min, const double max, const double def, const double step, const double stepSmall, const double stepLarge); | ||||
| void osc_send_set_parameter_midi_cc(const int32_t pluginId, const int32_t index, const int32_t cc); | void osc_send_set_parameter_midi_cc(const int32_t pluginId, const int32_t index, const int32_t cc); | ||||
| void osc_send_set_parameter_midi_channel(const int32_t pluginId, const int32_t index, const int32_t channel); | void osc_send_set_parameter_midi_channel(const int32_t pluginId, const int32_t index, const int32_t channel); | ||||
| void osc_send_set_parameter_value(const int32_t pluginId, const int32_t index, const double value); | |||||
| void osc_send_set_default_value(const int32_t pluginId, const int32_t index, const double value); | |||||
| void osc_send_set_program(const int32_t pluginId, const int32_t index); | |||||
| void osc_send_set_program_count(const int32_t pluginId, const int32_t count); | void osc_send_set_program_count(const int32_t pluginId, const int32_t count); | ||||
| void osc_send_set_program_name(const int32_t pluginId, const int32_t index, const char* const name); | void osc_send_set_program_name(const int32_t pluginId, const int32_t index, const char* const name); | ||||
| void osc_send_set_midi_program(const int32_t pluginId, const int32_t index); | |||||
| void osc_send_set_midi_program_count(const int32_t pluginId, const int32_t count); | void osc_send_set_midi_program_count(const int32_t pluginId, const int32_t count); | ||||
| void osc_send_set_midi_program_data(const int32_t pluginId, const int32_t index, const int32_t bank, const int32_t program, const char* const name); | void osc_send_set_midi_program_data(const int32_t pluginId, const int32_t index, const int32_t bank, const int32_t program, const char* const name); | ||||
| void osc_send_set_input_peak_value(const int32_t pluginId, const int32_t portId, const double value); | |||||
| void osc_send_set_output_peak_value(const int32_t pluginId, const int32_t portId, const double value); | |||||
| void osc_send_note_on(const int32_t pluginId, const int32_t channel, const int32_t note, const int32_t velo); | |||||
| void osc_send_note_off(const int32_t pluginId, const int32_t channel, const int32_t note); | |||||
| void osc_send_exit(); | void osc_send_exit(); | ||||
| #else | |||||
| void osc_send_bridge_audio_count(const int32_t ins, const int32_t outs, const int32_t total); | |||||
| void osc_send_bridge_midi_count(const int32_t ins, const int32_t outs, const int32_t total); | |||||
| void osc_send_bridge_param_count(const int32_t ins, const int32_t outs, const int32_t total); | |||||
| void osc_send_bridge_program_count(const int32_t count); | |||||
| void osc_send_bridge_midi_program_count(const int32_t count); | |||||
| void osc_send_bridge_plugin_info(const int32_t category, const int32_t hints, const char* const name, const char* const label, const char* const maker, const char* const copyright, const long uniqueId); | |||||
| void osc_send_bridge_param_info(const int32_t index, const char* const name, const char* const unit); | |||||
| void osc_send_bridge_param_data(const int32_t index, const int32_t type, const int32_t rindex, const int32_t hints, const int32_t midiChannel, const int32_t midiCC); | |||||
| void osc_send_bridge_param_ranges(const int32_t index, const double def, const double min, const double max, const double step, const double stepSmall, const double stepLarge); | |||||
| void osc_send_bridge_program_info(const int32_t index, const char* const name); | |||||
| void osc_send_bridge_midi_program_info(const int32_t index, const int32_t bank, const int32_t program, const char* const label); | |||||
| void osc_send_bridge_custom_data(const char* const stype, const char* const key, const char* const value); | |||||
| void osc_send_bridge_chunk_data(const char* const stringData); | |||||
| void osc_send_bridge_update(); | |||||
| #endif | |||||
| #ifndef BUILD_BRIDGE | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Rack mode | // Rack mode | ||||
| @@ -346,10 +369,11 @@ protected: | |||||
| private: | private: | ||||
| CarlaCheckThread m_checkThread; | CarlaCheckThread m_checkThread; | ||||
| #ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
| CarlaOsc m_osc; | CarlaOsc m_osc; | ||||
| const CarlaOscData* m_oscData; | |||||
| #endif | #endif | ||||
| const CarlaOscData* m_oscData; | |||||
| QMutex m_procLock; | QMutex m_procLock; | ||||
| QMutex m_midiLock; | QMutex m_midiLock; | ||||
| @@ -77,11 +77,9 @@ static void carla_jack_shutdown_callback(void* arg) | |||||
| // Carla Engine (JACK) | // Carla Engine (JACK) | ||||
| CarlaEngineJack::CarlaEngineJack() | CarlaEngineJack::CarlaEngineJack() | ||||
| #ifdef Q_COMPILER_INITIALIZER_LISTS | |||||
| : CarlaEngine(), | |||||
| rackJackPorts{nullptr} | |||||
| #else | |||||
| : CarlaEngine() | : CarlaEngine() | ||||
| #ifdef Q_COMPILER_INITIALIZER_LISTS | |||||
| , rackJackPorts{nullptr} | |||||
| #endif | #endif | ||||
| { | { | ||||
| qDebug("CarlaEngineJack::CarlaEngineJack()"); | qDebug("CarlaEngineJack::CarlaEngineJack()"); | ||||
| @@ -1439,7 +1439,7 @@ public: | |||||
| getCopyright(bufCopyright); | getCopyright(bufCopyright); | ||||
| #ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
| osc_send_bridge_plugin_info(category(), m_hints, bufName, bufLabel, bufMaker, bufCopyright, uniqueId()); | |||||
| x_engine->osc_send_bridge_plugin_info(category(), m_hints, bufName, bufLabel, bufMaker, bufCopyright, uniqueId()); | |||||
| #else | #else | ||||
| x_engine->osc_send_set_plugin_data(m_id, m_type, category(), m_hints, bufName, bufLabel, bufMaker, bufCopyright, uniqueId()); | x_engine->osc_send_set_plugin_data(m_id, m_type, category(), m_hints, bufName, bufLabel, bufMaker, bufCopyright, uniqueId()); | ||||
| #endif | #endif | ||||
| @@ -1451,9 +1451,9 @@ public: | |||||
| getParameterCountInfo(&cIns, &cOuts, &cTotals); | getParameterCountInfo(&cIns, &cOuts, &cTotals); | ||||
| #ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
| osc_send_bridge_audio_count(audioInCount(), audioOutCount(), audioInCount() + audioOutCount()); | |||||
| osc_send_bridge_midi_count(midiInCount(), midiOutCount(), midiInCount() + midiOutCount()); | |||||
| osc_send_bridge_param_count(cIns, cOuts, cTotals); | |||||
| x_engine->osc_send_bridge_audio_count(audioInCount(), audioOutCount(), audioInCount() + audioOutCount()); | |||||
| x_engine->osc_send_bridge_midi_count(midiInCount(), midiOutCount(), midiInCount() + midiOutCount()); | |||||
| x_engine->osc_send_bridge_param_count(cIns, cOuts, cTotals); | |||||
| #else | #else | ||||
| x_engine->osc_send_set_plugin_ports(m_id, audioInCount(), audioOutCount(), midiInCount(), midiOutCount(), cIns, cOuts, cTotals); | x_engine->osc_send_set_plugin_ports(m_id, audioInCount(), audioOutCount(), midiInCount(), midiOutCount(), cIns, cOuts, cTotals); | ||||
| #endif | #endif | ||||
| @@ -1471,7 +1471,12 @@ public: | |||||
| } | } | ||||
| // Plugin Parameters | // Plugin Parameters | ||||
| if (param.count > 0 && param.count < carlaOptions.maxParameters) | |||||
| #ifdef BUILD_BRIDGE | |||||
| uint32_t maxParameters = MAX_PARAMETERS; | |||||
| #else | |||||
| uint32_t maxParameters = carlaOptions.maxParameters; | |||||
| #endif | |||||
| if (param.count > 0 && param.count < maxParameters) | |||||
| { | { | ||||
| char bufName[STR_MAX], bufUnit[STR_MAX]; | char bufName[STR_MAX], bufUnit[STR_MAX]; | ||||
| @@ -1481,9 +1486,9 @@ public: | |||||
| getParameterUnit(i, bufUnit); | getParameterUnit(i, bufUnit); | ||||
| #ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
| osc_send_bridge_param_info(i, bufName, bufUnit); | |||||
| osc_send_bridge_param_data(i, param.data[i].type, param.data[i].rindex, param.data[i].hints, param.data[i].midiChannel, param.data[i].midiCC); | |||||
| osc_send_bridge_param_ranges(i, param.ranges[i].def, param.ranges[i].min, param.ranges[i].max, param.ranges[i].step, param.ranges[i].stepSmall, param.ranges[i].stepLarge); | |||||
| x_engine->osc_send_bridge_param_info(i, bufName, bufUnit); | |||||
| x_engine->osc_send_bridge_param_data(i, param.data[i].type, param.data[i].rindex, param.data[i].hints, param.data[i].midiChannel, param.data[i].midiCC); | |||||
| x_engine->osc_send_bridge_param_ranges(i, param.ranges[i].def, param.ranges[i].min, param.ranges[i].max, param.ranges[i].step, param.ranges[i].stepSmall, param.ranges[i].stepLarge); | |||||
| setParameterValue(i, param.ranges[i].def, false, false, true); // FIXME? | setParameterValue(i, param.ranges[i].def, false, false, true); // FIXME? | ||||
| #else | #else | ||||
| x_engine->osc_send_set_parameter_data(m_id, i, param.data[i].type, param.data[i].hints, bufName, bufUnit, getParameterValue(i)); | x_engine->osc_send_set_parameter_data(m_id, i, param.data[i].type, param.data[i].hints, bufName, bufUnit, getParameterValue(i)); | ||||
| @@ -1495,12 +1500,12 @@ public: | |||||
| // Programs | // Programs | ||||
| { | { | ||||
| #ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
| osc_send_bridge_program_count(prog.count); | |||||
| x_engine->osc_send_bridge_program_count(prog.count); | |||||
| for (uint32_t i=0; i < prog.count; i++) | for (uint32_t i=0; i < prog.count; i++) | ||||
| osc_send_bridge_program_info(i, prog.names[i]); | |||||
| x_engine->osc_send_bridge_program_info(i, prog.names[i]); | |||||
| osc_send_program(prog.current); | |||||
| //x_engine->osc_send_program(prog.current); | |||||
| #else | #else | ||||
| x_engine->osc_send_set_program_count(m_id, prog.count); | x_engine->osc_send_set_program_count(m_id, prog.count); | ||||
| @@ -1514,12 +1519,12 @@ public: | |||||
| // MIDI Programs | // MIDI Programs | ||||
| { | { | ||||
| #ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
| osc_send_bridge_midi_program_count(midiprog.count); | |||||
| x_engine->osc_send_bridge_midi_program_count(midiprog.count); | |||||
| for (uint32_t i=0; i < midiprog.count; i++) | for (uint32_t i=0; i < midiprog.count; i++) | ||||
| osc_send_bridge_midi_program_info(i, midiprog.data[i].bank, midiprog.data[i].program, midiprog.data[i].name); | |||||
| x_engine->osc_send_bridge_midi_program_info(i, midiprog.data[i].bank, midiprog.data[i].program, midiprog.data[i].name); | |||||
| osc_send_midi_program(midiprog.current); | |||||
| //x_engine->osc_send_midi_program(midiprog.current); | |||||
| #else | #else | ||||
| x_engine->osc_send_set_midi_program_count(m_id, midiprog.count); | x_engine->osc_send_set_midi_program_count(m_id, midiprog.count); | ||||
| @@ -138,6 +138,8 @@ void CarlaCheckThread::run() | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // CarlaPluginThread | // CarlaPluginThread | ||||
| #ifndef BUILD_BRIDGE | |||||
| const char* PluginThreadMode2str(const CarlaPluginThread::PluginThreadMode mode) | const char* PluginThreadMode2str(const CarlaPluginThread::PluginThreadMode mode) | ||||
| { | { | ||||
| switch (mode) | switch (mode) | ||||
| @@ -280,3 +282,5 @@ void CarlaPluginThread::run() | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| #endif | |||||
| @@ -68,6 +68,8 @@ private: | |||||
| // -------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------- | ||||
| // CarlaPluginThread | // CarlaPluginThread | ||||
| #ifndef BUILD_BRIDGE | |||||
| class QProcess; | class QProcess; | ||||
| class CarlaPluginThread : public QThread | class CarlaPluginThread : public QThread | ||||
| @@ -100,4 +102,6 @@ private: | |||||
| QProcess* m_process; | QProcess* m_process; | ||||
| }; | }; | ||||
| #endif | |||||
| #endif // CARLA_THREADS_H | #endif // CARLA_THREADS_H | ||||
| @@ -369,6 +369,7 @@ public: | |||||
| params += 1; | params += 1; | ||||
| } | } | ||||
| #ifndef BUILD_BRIDGE | |||||
| if (carlaOptions.forceStereo && (aIns == 1 || aOuts == 1) && ! h2) | if (carlaOptions.forceStereo && (aIns == 1 || aOuts == 1) && ! h2) | ||||
| { | { | ||||
| h2 = ldescriptor->instantiate(ldescriptor, sampleRate); | h2 = ldescriptor->instantiate(ldescriptor, sampleRate); | ||||
| @@ -385,6 +386,7 @@ public: | |||||
| forcedStereoOut = true; | forcedStereoOut = true; | ||||
| } | } | ||||
| } | } | ||||
| #endif | |||||
| if (descriptor->run_synth || descriptor->run_multiple_synths) | if (descriptor->run_synth || descriptor->run_multiple_synths) | ||||
| mIns = 1; | mIns = 1; | ||||
| @@ -1336,6 +1338,7 @@ public: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Post-poned events | // Post-poned events | ||||
| #ifndef BUILD_BRIDGE | |||||
| void uiParameterChange(const uint32_t index, const double value) | void uiParameterChange(const uint32_t index, const double value) | ||||
| { | { | ||||
| Q_ASSERT(index < param.count); | Q_ASSERT(index < param.count); | ||||
| @@ -1389,6 +1392,7 @@ public: | |||||
| midiData[2] = note; | midiData[2] = note; | ||||
| osc_send_midi(&osc.data, midiData); | osc_send_midi(&osc.data, midiData); | ||||
| } | } | ||||
| #endif | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Cleanup | // Cleanup | ||||
| @@ -371,6 +371,7 @@ public: | |||||
| params += 1; | params += 1; | ||||
| } | } | ||||
| #ifndef BUILD_BRIDGE | |||||
| if (carlaOptions.forceStereo && (aIns == 1 || aOuts == 1) && ! h2) | if (carlaOptions.forceStereo && (aIns == 1 || aOuts == 1) && ! h2) | ||||
| { | { | ||||
| h2 = descriptor->instantiate(descriptor, sampleRate); | h2 = descriptor->instantiate(descriptor, sampleRate); | ||||
| @@ -387,6 +388,7 @@ public: | |||||
| forcedStereoOut = true; | forcedStereoOut = true; | ||||
| } | } | ||||
| } | } | ||||
| #endif | |||||
| if (aIns > 0) | if (aIns > 0) | ||||
| { | { | ||||
| @@ -302,15 +302,15 @@ public: | |||||
| case GUI_EXTERNAL_LV2: | case GUI_EXTERNAL_LV2: | ||||
| break; | break; | ||||
| #if defined(HAVE_SUIL) && ! defined(__WINE__) | |||||
| case GUI_EXTERNAL_SUIL: | case GUI_EXTERNAL_SUIL: | ||||
| #if defined(HAVE_SUIL) && ! defined(__WINE__) | |||||
| if (ui.widget) | if (ui.widget) | ||||
| ((QWidget*)ui.widget)->close(); | ((QWidget*)ui.widget)->close(); | ||||
| break; | |||||
| #endif | #endif | ||||
| break; | |||||
| #ifndef BUILD_BRIDGE | |||||
| case GUI_EXTERNAL_OSC: | case GUI_EXTERNAL_OSC: | ||||
| #ifndef BUILD_BRIDGE | |||||
| if (osc.thread) | if (osc.thread) | ||||
| { | { | ||||
| // Wait a bit first, try safe quit, then force kill | // Wait a bit first, try safe quit, then force kill | ||||
| @@ -322,8 +322,8 @@ public: | |||||
| delete osc.thread; | delete osc.thread; | ||||
| } | } | ||||
| break; | |||||
| #endif | #endif | ||||
| break; | |||||
| } | } | ||||
| #ifdef HAVE_SUIL | #ifdef HAVE_SUIL | ||||
| @@ -967,8 +967,8 @@ public: | |||||
| break; | break; | ||||
| #if defined(HAVE_SUIL) && ! defined(__WINE__) | |||||
| case GUI_EXTERNAL_SUIL: | case GUI_EXTERNAL_SUIL: | ||||
| #if defined(HAVE_SUIL) && ! defined(__WINE__) | |||||
| if (ui.widget) | if (ui.widget) | ||||
| { | { | ||||
| QWidget* const widget = (QWidget*)ui.widget; | QWidget* const widget = (QWidget*)ui.widget; | ||||
| @@ -983,11 +983,11 @@ public: | |||||
| widget->setVisible(yesNo); | widget->setVisible(yesNo); | ||||
| } | } | ||||
| break; | |||||
| #endif | #endif | ||||
| break; | |||||
| #ifndef BUILD_BRIDGE | |||||
| case GUI_EXTERNAL_OSC: | case GUI_EXTERNAL_OSC: | ||||
| #ifndef BUILD_BRIDGE | |||||
| Q_ASSERT(osc.thread); | Q_ASSERT(osc.thread); | ||||
| if (! osc.thread) | if (! osc.thread) | ||||
| @@ -1012,8 +1012,8 @@ public: | |||||
| if (! osc.thread->wait(500)) | if (! osc.thread->wait(500)) | ||||
| osc.thread->quit(); | osc.thread->quit(); | ||||
| } | } | ||||
| break; | |||||
| #endif | #endif | ||||
| break; | |||||
| } | } | ||||
| } | } | ||||
| @@ -1099,6 +1099,7 @@ public: | |||||
| params += 1; | params += 1; | ||||
| } | } | ||||
| #ifndef BUILD_BRIDGE | |||||
| if (carlaOptions.forceStereo && (aIns == 1 || aOuts == 1) && ! h2) | if (carlaOptions.forceStereo && (aIns == 1 || aOuts == 1) && ! h2) | ||||
| { | { | ||||
| h2 = descriptor->instantiate(descriptor, sampleRate, rdf_descriptor->Bundle, features); | h2 = descriptor->instantiate(descriptor, sampleRate, rdf_descriptor->Bundle, features); | ||||
| @@ -1115,6 +1116,7 @@ public: | |||||
| forcedStereoOut = true; | forcedStereoOut = true; | ||||
| } | } | ||||
| } | } | ||||
| #endif | |||||
| if (aIns > 0) | if (aIns > 0) | ||||
| { | { | ||||
| @@ -90,6 +90,7 @@ public: | |||||
| if (gui.type == GUI_EXTERNAL_OSC) | if (gui.type == GUI_EXTERNAL_OSC) | ||||
| { | { | ||||
| #ifndef BUILD_BRIDGE | |||||
| if (osc.thread) | if (osc.thread) | ||||
| { | { | ||||
| // Wait a bit first, try safe quit, then force kill | // Wait a bit first, try safe quit, then force kill | ||||
| @@ -101,6 +102,7 @@ public: | |||||
| delete osc.thread; | delete osc.thread; | ||||
| } | } | ||||
| #endif | |||||
| } | } | ||||
| else | else | ||||
| effect->dispatcher(effect, effEditClose, 0, 0, nullptr, 0.0f); | effect->dispatcher(effect, effEditClose, 0, 0, nullptr, 0.0f); | ||||
| @@ -372,6 +374,7 @@ public: | |||||
| { | { | ||||
| if (gui.type == GUI_EXTERNAL_OSC) | if (gui.type == GUI_EXTERNAL_OSC) | ||||
| { | { | ||||
| #ifndef BUILD_BRIDGE | |||||
| Q_ASSERT(osc.thread); | Q_ASSERT(osc.thread); | ||||
| if (! osc.thread) | if (! osc.thread) | ||||
| @@ -396,6 +399,7 @@ public: | |||||
| if (! osc.thread->wait(500)) | if (! osc.thread->wait(500)) | ||||
| osc.thread->quit(); | osc.thread->quit(); | ||||
| } | } | ||||
| #endif | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| @@ -954,7 +958,7 @@ public: | |||||
| if (progId < prog.count) | if (progId < prog.count) | ||||
| { | { | ||||
| setProgram(progId, false, false, false, false); | setProgram(progId, false, false, false, false); | ||||
| postponeEvent(PluginPostEventMidiProgramChange, progId, 0, 0.0); | |||||
| postponeEvent(PluginPostEventProgramChange, progId, 0, 0.0); | |||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| @@ -1317,6 +1321,7 @@ public: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Post-poned events | // Post-poned events | ||||
| #ifndef BUILD_BRIDGE | |||||
| void uiParameterChange(const uint32_t index, const double value) | void uiParameterChange(const uint32_t index, const double value) | ||||
| { | { | ||||
| Q_ASSERT(index < param.count); | Q_ASSERT(index < param.count); | ||||
| @@ -1368,6 +1373,7 @@ public: | |||||
| osc_send_midi(&osc.data, midiData); | osc_send_midi(&osc.data, midiData); | ||||
| } | } | ||||
| } | } | ||||
| #endif | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| @@ -2017,7 +2023,7 @@ public: | |||||
| { | { | ||||
| m_hints |= PLUGIN_HAS_GUI; | m_hints |= PLUGIN_HAS_GUI; | ||||
| #ifdef Q_OS_LINUX | |||||
| #if defined(Q_OS_LINUX) && ! defined(BUILD_BRIDGE) | |||||
| if (carlaOptions.bridge_vstx11 && carlaOptions.preferUiBridges && ! (effect->flags & effFlagsProgramChunks)) | if (carlaOptions.bridge_vstx11 && carlaOptions.preferUiBridges && ! (effect->flags & effFlagsProgramChunks)) | ||||
| { | { | ||||
| osc.thread = new CarlaPluginThread(x_engine, this, CarlaPluginThread::PLUGIN_THREAD_VST_GUI); | osc.thread = new CarlaPluginThread(x_engine, this, CarlaPluginThread::PLUGIN_THREAD_VST_GUI); | ||||
| @@ -2095,7 +2101,7 @@ CarlaPlugin* CarlaPlugin::newVST(const initializer& init) | |||||
| const bool stereoInput = ins == 0 || ins == 2; | const bool stereoInput = ins == 0 || ins == 2; | ||||
| const bool stereoOutput = outs == 0 || outs == 2; | const bool stereoOutput = outs == 0 || outs == 2; | ||||
| if (! (stereoInput || stereoOutput)) | |||||
| if (! (stereoInput && stereoOutput)) | |||||
| { | { | ||||
| setLastError("Carla's rack mode can only work with Stereo VST plugins, sorry!"); | setLastError("Carla's rack mode can only work with Stereo VST plugins, sorry!"); | ||||
| delete plugin; | delete plugin; | ||||
| @@ -287,6 +287,9 @@ vst__wine64.o: ../carla-backend/vst.cpp | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| doc: carla_bridge.doxygen | |||||
| doxygen $< | |||||
| clean: | clean: | ||||
| rm -f *.o *.so *.exe | rm -f *.o *.so *.exe | ||||
| rm -f carla-bridge-lv2-gtk2 carla-bridge-lv2-qt4 carla-bridge-lv2-x11 carla-bridge-vst-x11 | rm -f carla-bridge-lv2-gtk2 carla-bridge-lv2-qt4 carla-bridge-lv2-x11 carla-bridge-vst-x11 | ||||
| @@ -0,0 +1,287 @@ | |||||
| # Doxyfile 1.7.6.1 | |||||
| #--------------------------------------------------------------------------- | |||||
| # Project related configuration options | |||||
| #--------------------------------------------------------------------------- | |||||
| DOXYFILE_ENCODING = UTF-8 | |||||
| PROJECT_NAME = "Carla Bridge UI" | |||||
| PROJECT_NUMBER = | |||||
| PROJECT_BRIEF = | |||||
| PROJECT_LOGO = | |||||
| OUTPUT_DIRECTORY = doxygen | |||||
| CREATE_SUBDIRS = NO | |||||
| OUTPUT_LANGUAGE = English | |||||
| BRIEF_MEMBER_DESC = YES | |||||
| REPEAT_BRIEF = YES | |||||
| ABBREVIATE_BRIEF = | |||||
| ALWAYS_DETAILED_SEC = NO | |||||
| INLINE_INHERITED_MEMB = NO | |||||
| FULL_PATH_NAMES = YES | |||||
| STRIP_FROM_PATH = | |||||
| STRIP_FROM_INC_PATH = | |||||
| SHORT_NAMES = NO | |||||
| JAVADOC_AUTOBRIEF = NO | |||||
| QT_AUTOBRIEF = NO | |||||
| MULTILINE_CPP_IS_BRIEF = NO | |||||
| INHERIT_DOCS = YES | |||||
| SEPARATE_MEMBER_PAGES = NO | |||||
| TAB_SIZE = 4 | |||||
| ALIASES = | |||||
| TCL_SUBST = | |||||
| OPTIMIZE_OUTPUT_FOR_C = NO | |||||
| OPTIMIZE_OUTPUT_JAVA = NO | |||||
| OPTIMIZE_FOR_FORTRAN = NO | |||||
| OPTIMIZE_OUTPUT_VHDL = NO | |||||
| EXTENSION_MAPPING = | |||||
| BUILTIN_STL_SUPPORT = NO | |||||
| CPP_CLI_SUPPORT = NO | |||||
| SIP_SUPPORT = NO | |||||
| IDL_PROPERTY_SUPPORT = YES | |||||
| DISTRIBUTE_GROUP_DOC = NO | |||||
| SUBGROUPING = YES | |||||
| INLINE_GROUPED_CLASSES = NO | |||||
| INLINE_SIMPLE_STRUCTS = NO | |||||
| TYPEDEF_HIDES_STRUCT = NO | |||||
| SYMBOL_CACHE_SIZE = 0 | |||||
| LOOKUP_CACHE_SIZE = 0 | |||||
| #--------------------------------------------------------------------------- | |||||
| # Build related configuration options | |||||
| #--------------------------------------------------------------------------- | |||||
| EXTRACT_ALL = YES | |||||
| EXTRACT_PRIVATE = NO | |||||
| EXTRACT_STATIC = NO | |||||
| EXTRACT_LOCAL_CLASSES = YES | |||||
| EXTRACT_LOCAL_METHODS = NO | |||||
| EXTRACT_ANON_NSPACES = NO | |||||
| HIDE_UNDOC_MEMBERS = NO | |||||
| HIDE_UNDOC_CLASSES = NO | |||||
| HIDE_FRIEND_COMPOUNDS = NO | |||||
| HIDE_IN_BODY_DOCS = NO | |||||
| INTERNAL_DOCS = NO | |||||
| CASE_SENSE_NAMES = YES | |||||
| HIDE_SCOPE_NAMES = NO | |||||
| SHOW_INCLUDE_FILES = YES | |||||
| FORCE_LOCAL_INCLUDES = NO | |||||
| INLINE_INFO = YES | |||||
| SORT_MEMBER_DOCS = NO | |||||
| SORT_BRIEF_DOCS = NO | |||||
| SORT_MEMBERS_CTORS_1ST = NO | |||||
| SORT_GROUP_NAMES = NO | |||||
| SORT_BY_SCOPE_NAME = NO | |||||
| STRICT_PROTO_MATCHING = NO | |||||
| GENERATE_TODOLIST = YES | |||||
| GENERATE_TESTLIST = YES | |||||
| GENERATE_BUGLIST = YES | |||||
| GENERATE_DEPRECATEDLIST= YES | |||||
| ENABLED_SECTIONS = | |||||
| MAX_INITIALIZER_LINES = 30 | |||||
| SHOW_USED_FILES = YES | |||||
| SHOW_DIRECTORIES = NO | |||||
| SHOW_FILES = YES | |||||
| SHOW_NAMESPACES = YES | |||||
| FILE_VERSION_FILTER = | |||||
| LAYOUT_FILE = | |||||
| CITE_BIB_FILES = | |||||
| #--------------------------------------------------------------------------- | |||||
| # configuration options related to warning and progress messages | |||||
| #--------------------------------------------------------------------------- | |||||
| QUIET = NO | |||||
| WARNINGS = YES | |||||
| WARN_IF_UNDOCUMENTED = YES | |||||
| WARN_IF_DOC_ERROR = YES | |||||
| WARN_NO_PARAMDOC = NO | |||||
| WARN_FORMAT = "$file:$line: $text" | |||||
| WARN_LOGFILE = | |||||
| #--------------------------------------------------------------------------- | |||||
| # configuration options related to the input files | |||||
| #--------------------------------------------------------------------------- | |||||
| INPUT = | |||||
| INPUT_ENCODING = UTF-8 | |||||
| FILE_PATTERNS = | |||||
| RECURSIVE = NO | |||||
| EXCLUDE = | |||||
| EXCLUDE_SYMLINKS = NO | |||||
| EXCLUDE_PATTERNS = | |||||
| EXCLUDE_SYMBOLS = | |||||
| EXAMPLE_PATH = | |||||
| EXAMPLE_PATTERNS = | |||||
| EXAMPLE_RECURSIVE = NO | |||||
| IMAGE_PATH = | |||||
| INPUT_FILTER = | |||||
| FILTER_PATTERNS = | |||||
| FILTER_SOURCE_FILES = NO | |||||
| FILTER_SOURCE_PATTERNS = | |||||
| #--------------------------------------------------------------------------- | |||||
| # configuration options related to source browsing | |||||
| #--------------------------------------------------------------------------- | |||||
| SOURCE_BROWSER = NO | |||||
| INLINE_SOURCES = NO | |||||
| STRIP_CODE_COMMENTS = YES | |||||
| REFERENCED_BY_RELATION = NO | |||||
| REFERENCES_RELATION = NO | |||||
| REFERENCES_LINK_SOURCE = YES | |||||
| USE_HTAGS = NO | |||||
| VERBATIM_HEADERS = YES | |||||
| #--------------------------------------------------------------------------- | |||||
| # configuration options related to the alphabetical class index | |||||
| #--------------------------------------------------------------------------- | |||||
| ALPHABETICAL_INDEX = YES | |||||
| COLS_IN_ALPHA_INDEX = 5 | |||||
| IGNORE_PREFIX = | |||||
| #--------------------------------------------------------------------------- | |||||
| # configuration options related to the HTML output | |||||
| #--------------------------------------------------------------------------- | |||||
| GENERATE_HTML = YES | |||||
| HTML_OUTPUT = html | |||||
| HTML_FILE_EXTENSION = .html | |||||
| HTML_HEADER = | |||||
| HTML_FOOTER = | |||||
| HTML_STYLESHEET = | |||||
| HTML_EXTRA_FILES = | |||||
| HTML_COLORSTYLE_HUE = 220 | |||||
| HTML_COLORSTYLE_SAT = 100 | |||||
| HTML_COLORSTYLE_GAMMA = 80 | |||||
| HTML_TIMESTAMP = YES | |||||
| HTML_ALIGN_MEMBERS = YES | |||||
| HTML_DYNAMIC_SECTIONS = NO | |||||
| GENERATE_DOCSET = NO | |||||
| DOCSET_FEEDNAME = "Doxygen generated docs" | |||||
| DOCSET_BUNDLE_ID = org.doxygen.Project | |||||
| DOCSET_PUBLISHER_ID = org.doxygen.Publisher | |||||
| DOCSET_PUBLISHER_NAME = Publisher | |||||
| GENERATE_HTMLHELP = NO | |||||
| CHM_FILE = | |||||
| HHC_LOCATION = | |||||
| GENERATE_CHI = NO | |||||
| CHM_INDEX_ENCODING = | |||||
| BINARY_TOC = NO | |||||
| TOC_EXPAND = NO | |||||
| GENERATE_QHP = NO | |||||
| QCH_FILE = | |||||
| QHP_NAMESPACE = org.doxygen.Project | |||||
| QHP_VIRTUAL_FOLDER = doc | |||||
| QHP_CUST_FILTER_NAME = | |||||
| QHP_CUST_FILTER_ATTRS = | |||||
| QHP_SECT_FILTER_ATTRS = | |||||
| QHG_LOCATION = | |||||
| GENERATE_ECLIPSEHELP = NO | |||||
| ECLIPSE_DOC_ID = org.doxygen.Project | |||||
| DISABLE_INDEX = NO | |||||
| GENERATE_TREEVIEW = NO | |||||
| ENUM_VALUES_PER_LINE = 4 | |||||
| USE_INLINE_TREES = NO | |||||
| TREEVIEW_WIDTH = 250 | |||||
| EXT_LINKS_IN_WINDOW = NO | |||||
| FORMULA_FONTSIZE = 10 | |||||
| FORMULA_TRANSPARENT = YES | |||||
| USE_MATHJAX = NO | |||||
| MATHJAX_RELPATH = http://www.mathjax.org/mathjax | |||||
| MATHJAX_EXTENSIONS = | |||||
| SEARCHENGINE = YES | |||||
| SERVER_BASED_SEARCH = NO | |||||
| #--------------------------------------------------------------------------- | |||||
| # configuration options related to the LaTeX output | |||||
| #--------------------------------------------------------------------------- | |||||
| GENERATE_LATEX = NO | |||||
| LATEX_OUTPUT = latex | |||||
| LATEX_CMD_NAME = latex | |||||
| MAKEINDEX_CMD_NAME = makeindex | |||||
| COMPACT_LATEX = NO | |||||
| PAPER_TYPE = a4 | |||||
| EXTRA_PACKAGES = | |||||
| LATEX_HEADER = | |||||
| LATEX_FOOTER = | |||||
| PDF_HYPERLINKS = YES | |||||
| USE_PDFLATEX = YES | |||||
| LATEX_BATCHMODE = NO | |||||
| LATEX_HIDE_INDICES = NO | |||||
| LATEX_SOURCE_CODE = NO | |||||
| LATEX_BIB_STYLE = plain | |||||
| #--------------------------------------------------------------------------- | |||||
| # configuration options related to the RTF output | |||||
| #--------------------------------------------------------------------------- | |||||
| GENERATE_RTF = NO | |||||
| RTF_OUTPUT = rtf | |||||
| COMPACT_RTF = NO | |||||
| RTF_HYPERLINKS = NO | |||||
| RTF_STYLESHEET_FILE = | |||||
| RTF_EXTENSIONS_FILE = | |||||
| #--------------------------------------------------------------------------- | |||||
| # configuration options related to the man page output | |||||
| #--------------------------------------------------------------------------- | |||||
| GENERATE_MAN = NO | |||||
| MAN_OUTPUT = man | |||||
| MAN_EXTENSION = .3 | |||||
| MAN_LINKS = NO | |||||
| #--------------------------------------------------------------------------- | |||||
| # configuration options related to the XML output | |||||
| #--------------------------------------------------------------------------- | |||||
| GENERATE_XML = NO | |||||
| XML_OUTPUT = xml | |||||
| XML_SCHEMA = | |||||
| XML_DTD = | |||||
| XML_PROGRAMLISTING = YES | |||||
| #--------------------------------------------------------------------------- | |||||
| # configuration options for the AutoGen Definitions output | |||||
| #--------------------------------------------------------------------------- | |||||
| GENERATE_AUTOGEN_DEF = NO | |||||
| #--------------------------------------------------------------------------- | |||||
| # configuration options related to the Perl module output | |||||
| #--------------------------------------------------------------------------- | |||||
| GENERATE_PERLMOD = NO | |||||
| PERLMOD_LATEX = NO | |||||
| PERLMOD_PRETTY = YES | |||||
| PERLMOD_MAKEVAR_PREFIX = | |||||
| #--------------------------------------------------------------------------- | |||||
| # Configuration options related to the preprocessor | |||||
| #--------------------------------------------------------------------------- | |||||
| ENABLE_PREPROCESSING = YES | |||||
| MACRO_EXPANSION = NO | |||||
| EXPAND_ONLY_PREDEF = NO | |||||
| SEARCH_INCLUDES = YES | |||||
| INCLUDE_PATH = | |||||
| INCLUDE_FILE_PATTERNS = | |||||
| PREDEFINED = BUILD_BRIDGE BUILD_BRIDGE_UI BUILD_BRIDGE_LV2 BUILD_BRIDGE_VST BRIDGE_LV2_GTK2 BRIDGE_LV2_QT4 BRIDGE_LV2_X11 BRIDGE_VST_X11 | |||||
| EXPAND_AS_DEFINED = | |||||
| SKIP_FUNCTION_MACROS = YES | |||||
| #--------------------------------------------------------------------------- | |||||
| # Configuration::additions related to external references | |||||
| #--------------------------------------------------------------------------- | |||||
| TAGFILES = | |||||
| GENERATE_TAGFILE = | |||||
| ALLEXTERNALS = NO | |||||
| EXTERNAL_GROUPS = YES | |||||
| PERL_PATH = /usr/bin/perl | |||||
| #--------------------------------------------------------------------------- | |||||
| # Configuration options related to the dot tool | |||||
| #--------------------------------------------------------------------------- | |||||
| CLASS_DIAGRAMS = YES | |||||
| MSCGEN_PATH = | |||||
| HIDE_UNDOC_RELATIONS = YES | |||||
| HAVE_DOT = NO | |||||
| DOT_NUM_THREADS = 0 | |||||
| DOT_FONTNAME = Helvetica | |||||
| DOT_FONTSIZE = 10 | |||||
| DOT_FONTPATH = | |||||
| CLASS_GRAPH = YES | |||||
| COLLABORATION_GRAPH = YES | |||||
| GROUP_GRAPHS = YES | |||||
| UML_LOOK = NO | |||||
| TEMPLATE_RELATIONS = NO | |||||
| INCLUDE_GRAPH = YES | |||||
| INCLUDED_BY_GRAPH = YES | |||||
| CALL_GRAPH = NO | |||||
| CALLER_GRAPH = NO | |||||
| GRAPHICAL_HIERARCHY = YES | |||||
| DIRECTORY_GRAPH = YES | |||||
| DOT_IMAGE_FORMAT = png | |||||
| INTERACTIVE_SVG = NO | |||||
| DOT_PATH = | |||||
| DOTFILE_DIRS = | |||||
| MSCFILE_DIRS = | |||||
| DOT_GRAPH_MAX_NODES = 50 | |||||
| MAX_DOT_GRAPH_DEPTH = 0 | |||||
| DOT_TRANSPARENT = NO | |||||
| DOT_MULTI_TARGETS = YES | |||||
| GENERATE_LEGEND = YES | |||||
| DOT_CLEANUP = YES | |||||
| @@ -64,8 +64,8 @@ struct Message { | |||||
| /**@}*/ | /**@}*/ | ||||
| class CarlaBridgeClient; | |||||
| class CarlaBridgeToolkit; | |||||
| class CarlaClient; | |||||
| class CarlaToolkit; | |||||
| CARLA_BRIDGE_END_NAMESPACE | CARLA_BRIDGE_END_NAMESPACE | ||||
| @@ -18,11 +18,12 @@ | |||||
| #ifndef CARLA_BRIDGE_CLIENT_H | #ifndef CARLA_BRIDGE_CLIENT_H | ||||
| #define CARLA_BRIDGE_CLIENT_H | #define CARLA_BRIDGE_CLIENT_H | ||||
| #include "carla_bridge.h" | |||||
| #include "carla_bridge_osc.h" | #include "carla_bridge_osc.h" | ||||
| #include "carla_bridge_toolkit.h" | #include "carla_bridge_toolkit.h" | ||||
| #ifdef BUILD_BRIDGE_UI | |||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| #include "carla_engine.h" | |||||
| #else | |||||
| #include "carla_lib_includes.h" | #include "carla_lib_includes.h" | ||||
| #endif | #endif | ||||
| @@ -33,16 +34,23 @@ | |||||
| CARLA_BRIDGE_START_NAMESPACE | CARLA_BRIDGE_START_NAMESPACE | ||||
| class CarlaBridgeClient | |||||
| /*! | |||||
| * @defgroup CarlaBridgeClient Carla Bridge Client | |||||
| * | |||||
| * The Carla Bridge Client. | |||||
| * @{ | |||||
| */ | |||||
| class CarlaClient | |||||
| { | { | ||||
| public: | public: | ||||
| CarlaBridgeClient(CarlaBridgeToolkit* const toolkit) : | |||||
| m_toolkit(toolkit), | |||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| m_osc(this, "lv2-plugin-bridge") | |||||
| #else | |||||
| m_osc(this, "lv2-ui-bridge") | |||||
| #endif | |||||
| CarlaClient(CarlaToolkit* const toolkit) | |||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| : m_osc(this, "carla-bridge-plugin"), | |||||
| #else | |||||
| : m_osc(this, "carla-bridge-ui"), | |||||
| #endif | |||||
| m_toolkit(toolkit) | |||||
| { | { | ||||
| #ifdef BUILD_BRIDGE_UI | #ifdef BUILD_BRIDGE_UI | ||||
| m_filename = nullptr; | m_filename = nullptr; | ||||
| @@ -50,7 +58,7 @@ public: | |||||
| #endif | #endif | ||||
| } | } | ||||
| virtual ~CarlaBridgeClient() | |||||
| virtual ~CarlaClient() | |||||
| { | { | ||||
| #ifdef BUILD_BRIDGE_UI | #ifdef BUILD_BRIDGE_UI | ||||
| if (m_filename) | if (m_filename) | ||||
| @@ -60,57 +68,7 @@ public: | |||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| bool oscInit(const char* const url) | |||||
| { | |||||
| return m_osc.init(url); | |||||
| } | |||||
| void oscClose() | |||||
| { | |||||
| m_osc.close(); | |||||
| } | |||||
| void sendOscConfigure(const char* const key, const char* const value) | |||||
| { | |||||
| qDebug("sendOscConfigure(\"%s\", \"%s\")", key, value); | |||||
| m_osc.sendOscConfigure(key, value); | |||||
| } | |||||
| void sendOscControl(int32_t index, float value) | |||||
| { | |||||
| qDebug("sendOscConfigure(%i, %f)", index, value); | |||||
| m_osc.sendOscControl(index, value); | |||||
| } | |||||
| void sendOscUpdate() | |||||
| { | |||||
| qDebug("sendOscUpdate()"); | |||||
| m_osc.sendOscUpdate(); | |||||
| } | |||||
| void sendOscExiting() | |||||
| { | |||||
| qDebug("sendOscExiting()"); | |||||
| m_osc.sendOscExiting(); | |||||
| } | |||||
| #ifdef BRIDGE_LV2 | |||||
| void sendOscLv2TransferAtom(const char* const type, const char* const value) | |||||
| { | |||||
| qDebug("sendOscLv2TransferAtom(\"%s\", \"%s\")", type, value); | |||||
| m_osc.sendOscLv2TransferAtom(type, value); | |||||
| } | |||||
| void sendOscLv2TransferEvent(const char* const type, const char* const value) | |||||
| { | |||||
| qDebug("sendOscLv2TransferEvent(\"%s\", \"%s\")", type, value); | |||||
| m_osc.sendOscLv2TransferEvent(type, value); | |||||
| } | |||||
| #endif | |||||
| // --------------------------------------------------------------------- | |||||
| void quequeMessage(MessageType type, int32_t value1, int32_t value2, double value3) | |||||
| void quequeMessage(const MessageType type, const int32_t value1, const int32_t value2, const double value3) | |||||
| { | { | ||||
| const QMutexLocker locker(&m_messages.lock); | const QMutexLocker locker(&m_messages.lock); | ||||
| @@ -155,11 +113,11 @@ public: | |||||
| break; | break; | ||||
| case MESSAGE_NOTE_ON: | case MESSAGE_NOTE_ON: | ||||
| noteOn(m->value1, m->value2); | |||||
| noteOn(m->value1, m->value2, rint(m->value3)); | |||||
| break; | break; | ||||
| case MESSAGE_NOTE_OFF: | case MESSAGE_NOTE_OFF: | ||||
| noteOff(m->value1); | |||||
| noteOff(m->value1, m->value2); | |||||
| break; | break; | ||||
| case MESSAGE_SHOW_GUI: | case MESSAGE_SHOW_GUI: | ||||
| @@ -196,25 +154,85 @@ public: | |||||
| // ui initialization | // ui initialization | ||||
| virtual bool init(const char* const, const char* const) = 0; | virtual bool init(const char* const, const char* const) = 0; | ||||
| virtual void close() = 0; | virtual void close() = 0; | ||||
| // ui management | |||||
| virtual void* getWidget() const = 0; | |||||
| virtual bool isResizable() const = 0; | |||||
| virtual bool needsReparent() const = 0; | |||||
| #endif | #endif | ||||
| // processing | // processing | ||||
| virtual void setParameter(const int32_t rindex, const double value) = 0; | virtual void setParameter(const int32_t rindex, const double value) = 0; | ||||
| virtual void setProgram(const uint32_t index) = 0; | virtual void setProgram(const uint32_t index) = 0; | ||||
| virtual void setMidiProgram(const uint32_t bank, const uint32_t program) = 0; | virtual void setMidiProgram(const uint32_t bank, const uint32_t program) = 0; | ||||
| virtual void noteOn(const uint8_t note, const uint8_t velocity) = 0; | |||||
| virtual void noteOff(const uint8_t note) = 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; | |||||
| #ifdef BUILD_BRIDGE_PLUGIN | #ifdef BUILD_BRIDGE_PLUGIN | ||||
| // plugin | // plugin | ||||
| virtual void saveNow() = 0; | virtual void saveNow() = 0; | ||||
| virtual void setCustomData(const char* const type, const char* const key, const char* const value) = 0; | virtual void setCustomData(const char* const type, const char* const key, const char* const value) = 0; | ||||
| virtual void setChunkData(const char* const filePath) = 0; | virtual void setChunkData(const char* const filePath) = 0; | ||||
| #else | |||||
| // gui | |||||
| virtual void* getWidget() const = 0; | |||||
| virtual bool isResizable() const = 0; | |||||
| virtual bool needsReparent() const = 0; | |||||
| #endif | |||||
| // --------------------------------------------------------------------- | |||||
| bool oscInit(const char* const url) | |||||
| { | |||||
| qDebug("CarlaClient::oscInit(\"%s\")", url); | |||||
| return m_osc.init(url); | |||||
| } | |||||
| void oscClose() | |||||
| { | |||||
| qDebug("CarlaClient::oscClose()"); | |||||
| m_osc.close(); | |||||
| } | |||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| void registerOscEngine(CarlaBackend::CarlaEngine* const engine) | |||||
| { | |||||
| qDebug("CarlaClient::registerOscEngine(%p)", engine); | |||||
| engine->setOscBridgeData(m_osc.getControllerData()); | |||||
| } | |||||
| #endif | |||||
| void sendOscConfigure(const char* const key, const char* const value) | |||||
| { | |||||
| qDebug("CarlaClient::sendOscConfigure(\"%s\", \"%s\")", key, value); | |||||
| m_osc.sendOscConfigure(key, value); | |||||
| } | |||||
| void sendOscControl(const int32_t index, const float value) | |||||
| { | |||||
| qDebug("CarlaClient::sendOscControl(%i, %f)", index, value); | |||||
| m_osc.sendOscControl(index, value); | |||||
| } | |||||
| void sendOscUpdate() | |||||
| { | |||||
| qDebug("CarlaClient::sendOscUpdate()"); | |||||
| m_osc.sendOscUpdate(); | |||||
| } | |||||
| void sendOscExiting() | |||||
| { | |||||
| qDebug("CarlaClient::sendOscExiting()"); | |||||
| m_osc.sendOscExiting(); | |||||
| } | |||||
| #ifdef BRIDGE_LV2 | |||||
| void sendOscLv2TransferAtom(const char* const type, const char* const value) | |||||
| { | |||||
| qDebug("CarlaClient::sendOscLv2TransferAtom(\"%s\", \"%s\")", type, value); | |||||
| m_osc.sendOscLv2TransferAtom(type, value); | |||||
| } | |||||
| void sendOscLv2TransferEvent(const char* const type, const char* const value) | |||||
| { | |||||
| qDebug("CarlaClient::sendOscLv2TransferEvent(\"%s\", \"%s\")", type, value); | |||||
| m_osc.sendOscLv2TransferEvent(type, value); | |||||
| } | |||||
| #endif | #endif | ||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| @@ -223,8 +241,14 @@ public: | |||||
| protected: | protected: | ||||
| bool libOpen(const char* const filename) | bool libOpen(const char* const filename) | ||||
| { | { | ||||
| Q_ASSERT(filename); | |||||
| if (m_filename) | |||||
| free(m_filename); | |||||
| m_lib = lib_open(filename); | m_lib = lib_open(filename); | ||||
| m_filename = strdup(filename); | |||||
| m_filename = strdup(filename ? filename : ""); | |||||
| return bool(m_lib); | return bool(m_lib); | ||||
| } | } | ||||
| @@ -236,6 +260,7 @@ protected: | |||||
| m_lib = nullptr; | m_lib = nullptr; | ||||
| return closed; | return closed; | ||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| @@ -243,20 +268,21 @@ protected: | |||||
| { | { | ||||
| if (m_lib) | if (m_lib) | ||||
| return lib_symbol(m_lib, symbol); | return lib_symbol(m_lib, symbol); | ||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| const char* libError() | const char* libError() | ||||
| { | { | ||||
| return lib_error(m_filename ? m_filename : ""); | |||||
| return lib_error(m_filename); | |||||
| } | } | ||||
| #endif | #endif | ||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| private: | private: | ||||
| CarlaBridgeToolkit* const m_toolkit; | |||||
| CarlaBridgeOsc m_osc; | |||||
| CarlaOsc m_osc; | |||||
| CarlaToolkit* const m_toolkit; | |||||
| struct { | struct { | ||||
| Message data[MAX_BRIDGE_MESSAGES]; | Message data[MAX_BRIDGE_MESSAGES]; | ||||
| @@ -269,6 +295,8 @@ private: | |||||
| #endif | #endif | ||||
| }; | }; | ||||
| /**@}*/ | |||||
| CARLA_BRIDGE_END_NAMESPACE | CARLA_BRIDGE_END_NAMESPACE | ||||
| #endif // CARLA_BRIDGE_CLIENT_H | #endif // CARLA_BRIDGE_CLIENT_H | ||||
| @@ -17,13 +17,18 @@ | |||||
| #include "carla_bridge_osc.h" | #include "carla_bridge_osc.h" | ||||
| #include "carla_bridge_client.h" | #include "carla_bridge_client.h" | ||||
| #include "carla_plugin.h" | |||||
| #include "carla_midi.h" | |||||
| #include <QtCore/QString> | #include <QtCore/QString> | ||||
| #include <QtCore/QStringList> | #include <QtCore/QStringList> | ||||
| CARLA_BRIDGE_START_NAMESPACE | CARLA_BRIDGE_START_NAMESPACE | ||||
| unsigned int uintMin(unsigned int value1, unsigned int value2) | |||||
| { | |||||
| return value1 < value2 ? value1 : value2; | |||||
| } | |||||
| void osc_error_handler(const int num, const char* const msg, const char* const path) | void osc_error_handler(const int num, const char* const msg, const char* const path) | ||||
| { | { | ||||
| qCritical("osc_error_handler(%i, \"%s\", \"%s\")", num, msg, path); | qCritical("osc_error_handler(%i, \"%s\", \"%s\")", num, msg, path); | ||||
| @@ -31,11 +36,11 @@ void osc_error_handler(const int num, const char* const msg, const char* const p | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| CarlaBridgeOsc::CarlaBridgeOsc(CarlaBridgeClient* const client_, const char* const name) : | |||||
| client(client_) | |||||
| CarlaOsc::CarlaOsc(CarlaClient* const client_, const char* const name) | |||||
| : client(client_) | |||||
| { | { | ||||
| qDebug("CarlaBridgeOsc::CarlaBridgeOsc(%p, \"%s\")", client_, name); | |||||
| Q_ASSERT(client_); | |||||
| qDebug("CarlaOsc::CarlaOsc(%p, \"%s\")", client, name); | |||||
| Q_ASSERT(client); | |||||
| Q_ASSERT(name); | Q_ASSERT(name); | ||||
| m_serverPath = nullptr; | m_serverPath = nullptr; | ||||
| @@ -44,20 +49,22 @@ CarlaBridgeOsc::CarlaBridgeOsc(CarlaBridgeClient* const client_, const char* con | |||||
| m_controlData.source = nullptr; // unused | m_controlData.source = nullptr; // unused | ||||
| m_controlData.target = nullptr; | m_controlData.target = nullptr; | ||||
| m_name = strdup(name); | |||||
| m_nameSize = strlen(name); | |||||
| m_name = strdup(name ? name : ""); | |||||
| m_nameSize = strlen(m_name); | |||||
| } | } | ||||
| CarlaBridgeOsc::~CarlaBridgeOsc() | |||||
| CarlaOsc::~CarlaOsc() | |||||
| { | { | ||||
| qDebug("CarlaBridgeOsc::~CarlaBridgeOsc()"); | |||||
| qDebug("CarlaOsc::~CarlaOsc()"); | |||||
| free(m_name); | |||||
| if (m_name) | |||||
| free(m_name); | |||||
| } | } | ||||
| bool CarlaBridgeOsc::init(const char* const url) | |||||
| bool CarlaOsc::init(const char* const url) | |||||
| { | { | ||||
| qDebug("CarlaBridgeOsc::init(\"%s\")", url); | |||||
| qDebug("CarlaOsc::init(\"%s\")", url); | |||||
| Q_ASSERT(! m_serverPath); | |||||
| Q_ASSERT(! m_serverThread); | Q_ASSERT(! m_serverThread); | ||||
| Q_ASSERT(url); | Q_ASSERT(url); | ||||
| @@ -72,7 +79,7 @@ bool CarlaBridgeOsc::init(const char* const url) | |||||
| if (! m_controlData.path) | if (! m_controlData.path) | ||||
| { | { | ||||
| qWarning("CarlaBridgeOsc::init(\"%s\") - failed to init OSC", url); | |||||
| qCritical("CarlaOsc::init(\"%s\") - failed to init OSC", url); | |||||
| return false; | return false; | ||||
| } | } | ||||
| @@ -91,9 +98,10 @@ bool CarlaBridgeOsc::init(const char* const url) | |||||
| return true; | return true; | ||||
| } | } | ||||
| void CarlaBridgeOsc::close() | |||||
| void CarlaOsc::close() | |||||
| { | { | ||||
| qDebug("CarlaBridgeOsc::close()"); | |||||
| qDebug("CarlaOsc::close()"); | |||||
| Q_ASSERT(m_serverPath); | |||||
| Q_ASSERT(m_serverThread); | Q_ASSERT(m_serverThread); | ||||
| osc_clear_data(&m_controlData); | osc_clear_data(&m_controlData); | ||||
| @@ -106,45 +114,51 @@ void CarlaBridgeOsc::close() | |||||
| m_serverPath = nullptr; | m_serverPath = nullptr; | ||||
| } | } | ||||
| int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg) | |||||
| // ----------------------------------------------------------------------- | |||||
| int CarlaOsc::handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg) | |||||
| { | { | ||||
| qDebug("CarlaBridgeOsc::handleMessage(\"%s\", %i, %p, \"%s\", %p)", path, argc, argv, types, msg); | |||||
| qDebug("CarlaOsc::handleMessage(\"%s\", %i, %p, \"%s\", %p)", path, argc, argv, types, msg); | |||||
| Q_ASSERT(m_serverPath); | |||||
| Q_ASSERT(m_serverThread); | Q_ASSERT(m_serverThread); | ||||
| Q_ASSERT(path); | Q_ASSERT(path); | ||||
| // Check if message is for this client | // Check if message is for this client | ||||
| if (strlen(path) <= m_nameSize || strncmp(path+1, m_name, m_nameSize) != 0) | |||||
| if ((! path) || strlen(path) <= m_nameSize || strncmp(path+1, m_name, m_nameSize) != 0) | |||||
| { | { | ||||
| qWarning("CarlaBridgeOsc::handleMessage() - message not for this client -> '%s' != '/%s/'", path, m_name); | |||||
| qWarning("CarlaOsc::handleMessage() - message not for this client: '%s' != '/%s/'", path, m_name); | |||||
| return 1; | return 1; | ||||
| } | } | ||||
| char method[32] = { 0 }; | char method[32] = { 0 }; | ||||
| memcpy(method, path + (m_nameSize + 1), 32); | |||||
| memcpy(method, path + (m_nameSize + 1), uintMin(strlen(path), 32)); | |||||
| if (method[0] == 0) | |||||
| return 1; | |||||
| // Common OSC methods | // Common OSC methods | ||||
| if (strcmp(method, "/configure") == 0) | if (strcmp(method, "/configure") == 0) | ||||
| return handle_configure(argc, argv, types); | |||||
| return handleMsgConfigure(argc, argv, types); | |||||
| if (strcmp(method, "/control") == 0) | if (strcmp(method, "/control") == 0) | ||||
| return handle_control(argc, argv, types); | |||||
| return handleMsgControl(argc, argv, types); | |||||
| if (strcmp(method, "/program") == 0) | if (strcmp(method, "/program") == 0) | ||||
| return handle_program(argc, argv, types); | |||||
| return handleMsgProgram(argc, argv, types); | |||||
| if (strcmp(method, "/midi_program") == 0) | if (strcmp(method, "/midi_program") == 0) | ||||
| return handle_midi_program(argc, argv, types); | |||||
| return handleMsgMidiProgram(argc, argv, types); | |||||
| if (strcmp(method, "/midi") == 0) | if (strcmp(method, "/midi") == 0) | ||||
| return handle_midi(argc, argv, types); | |||||
| return handleMsgMidi(argc, argv, types); | |||||
| if (strcmp(method, "/show") == 0) | if (strcmp(method, "/show") == 0) | ||||
| return handle_show(); | |||||
| return handleMsgShow(); | |||||
| if (strcmp(method, "/hide") == 0) | if (strcmp(method, "/hide") == 0) | ||||
| return handle_hide(); | |||||
| return handleMsgHide(); | |||||
| if (strcmp(method, "/quit") == 0) | if (strcmp(method, "/quit") == 0) | ||||
| return handle_quit(); | |||||
| return handleMsgQuit(); | |||||
| #ifdef BRIDGE_LV2 | #ifdef BRIDGE_LV2 | ||||
| if (strcmp(method, "/lv2_atom_transfer") == 0) | if (strcmp(method, "/lv2_atom_transfer") == 0) | ||||
| return handle_lv2_transfer_atom(argc, argv, types); | |||||
| return handleMsgLv2TransferAtom(argc, argv, types); | |||||
| if (strcmp(method, "/lv2_event_transfer") == 0) | if (strcmp(method, "/lv2_event_transfer") == 0) | ||||
| return handle_lv2_transfer_event(argc, argv, types); | |||||
| return handleMsgLv2TransferEvent(argc, argv, types); | |||||
| #endif | #endif | ||||
| #if 0 | #if 0 | ||||
| @@ -154,13 +168,13 @@ int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const | |||||
| return osc_set_parameter_midi_channel_handler(argv); | return osc_set_parameter_midi_channel_handler(argv); | ||||
| #endif | #endif | ||||
| qWarning("CarlaBridgeOsc::handleMessage(\"%s\", ...) - Got unsupported OSC method '%s'", path, method); | |||||
| qWarning("CarlaOsc::handleMessage(\"%s\", ...) - got unsupported OSC method '%s'", path, method); | |||||
| return 1; | return 1; | ||||
| } | } | ||||
| int CarlaBridgeOsc::handle_configure(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| int CarlaOsc::handleMsgConfigure(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | { | ||||
| qDebug("CarlaOsc::handle_configure()"); | |||||
| qDebug("CarlaOsc::handleMsgConfigure()"); | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ss"); | CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ss"); | ||||
| if (! client) | if (! client) | ||||
| @@ -170,15 +184,15 @@ int CarlaBridgeOsc::handle_configure(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| const char* const key = (const char*)&argv[0]->s; | const char* const key = (const char*)&argv[0]->s; | ||||
| const char* const value = (const char*)&argv[1]->s; | const char* const value = (const char*)&argv[1]->s; | ||||
| if (strcmp(key, CARLA_BRIDGE_MSG_SAVE_NOW) == 0) | |||||
| if (strcmp(key, CarlaBackend::CARLA_BRIDGE_MSG_SAVE_NOW) == 0) | |||||
| { | { | ||||
| client->quequeMessage(BRIDGE_MESSAGE_SAVE_NOW, 0, 0, 0.0); | |||||
| client->quequeMessage(MESSAGE_SAVE_NOW, 0, 0, 0.0); | |||||
| } | } | ||||
| else if (strcmp(key, CARLA_BRIDGE_MSG_SET_CHUNK) == 0) | |||||
| else if (strcmp(key, CarlaBackend::CARLA_BRIDGE_MSG_SET_CHUNK) == 0) | |||||
| { | { | ||||
| client->setChunkData(value); | client->setChunkData(value); | ||||
| } | } | ||||
| else if (strcmp(key, CARLA_BRIDGE_MSG_SET_CUSTOM) == 0) | |||||
| else if (strcmp(key, CarlaBackend::CARLA_BRIDGE_MSG_SET_CUSTOM) == 0) | |||||
| { | { | ||||
| QStringList vList = QString(value).split("·", QString::KeepEmptyParts); | QStringList vList = QString(value).split("·", QString::KeepEmptyParts); | ||||
| @@ -188,7 +202,7 @@ int CarlaBridgeOsc::handle_configure(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| const char* const cKey = vList.at(1).toUtf8().constData(); | const char* const cKey = vList.at(1).toUtf8().constData(); | ||||
| const char* const cValue = vList.at(2).toUtf8().constData(); | const char* const cValue = vList.at(2).toUtf8().constData(); | ||||
| client->set_custom_data(cType, cKey, cValue); | |||||
| client->setCustomData(cType, cKey, cValue); | |||||
| } | } | ||||
| } | } | ||||
| #else | #else | ||||
| @@ -198,9 +212,9 @@ int CarlaBridgeOsc::handle_configure(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int CarlaBridgeOsc::handle_control(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| int CarlaOsc::handleMsgControl(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | { | ||||
| qDebug("CarlaOsc::handle_control()"); | |||||
| qDebug("CarlaOsc::handleMsgControl()"); | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "if"); | CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "if"); | ||||
| if (! client) | if (! client) | ||||
| @@ -213,9 +227,9 @@ int CarlaBridgeOsc::handle_control(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int CarlaBridgeOsc::handle_program(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| int CarlaOsc::handleMsgProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | { | ||||
| qDebug("CarlaOsc::handle_program()"); | |||||
| qDebug("CarlaOsc::handleMsgProgram()"); | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "i"); | CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "i"); | ||||
| if (! client) | if (! client) | ||||
| @@ -227,9 +241,9 @@ int CarlaBridgeOsc::handle_program(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int CarlaBridgeOsc::handle_midi_program(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| int CarlaOsc::handleMsgMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | { | ||||
| qDebug("CarlaOsc::handle_midi_program()"); | |||||
| qDebug("CarlaOsc::handleMsgMidiProgram()"); | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii"); | CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii"); | ||||
| if (! client) | if (! client) | ||||
| @@ -242,9 +256,9 @@ int CarlaBridgeOsc::handle_midi_program(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int CarlaBridgeOsc::handle_midi(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| int CarlaOsc::handleMsgMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | { | ||||
| qDebug("CarlaOsc::handle_midi()"); | |||||
| qDebug("CarlaOsc::handleMsgMidi()"); | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "m"); | CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "m"); | ||||
| if (! client) | if (! client) | ||||
| @@ -253,7 +267,8 @@ int CarlaBridgeOsc::handle_midi(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| const uint8_t* const mdata = argv[0]->m; | const uint8_t* const mdata = argv[0]->m; | ||||
| const uint8_t data[4] = { mdata[0], mdata[1], mdata[2], mdata[3] }; | const uint8_t data[4] = { mdata[0], mdata[1], mdata[2], mdata[3] }; | ||||
| uint8_t status = data[1]; | |||||
| uint8_t status = data[1]; | |||||
| uint8_t channel = status & 0x0F; | |||||
| // Fix bad note-off | // Fix bad note-off | ||||
| if (MIDI_IS_STATUS_NOTE_ON(status) && data[3] == 0) | if (MIDI_IS_STATUS_NOTE_ON(status) && data[3] == 0) | ||||
| @@ -262,19 +277,19 @@ int CarlaBridgeOsc::handle_midi(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| if (MIDI_IS_STATUS_NOTE_OFF(status)) | if (MIDI_IS_STATUS_NOTE_OFF(status)) | ||||
| { | { | ||||
| uint8_t note = data[2]; | uint8_t note = data[2]; | ||||
| client->quequeMessage(MESSAGE_NOTE_OFF, note, 0, 0.0); | |||||
| client->quequeMessage(MESSAGE_NOTE_OFF, channel, note, 0); | |||||
| } | } | ||||
| else if (MIDI_IS_STATUS_NOTE_ON(status)) | else if (MIDI_IS_STATUS_NOTE_ON(status)) | ||||
| { | { | ||||
| uint8_t note = data[2]; | uint8_t note = data[2]; | ||||
| uint8_t velo = data[3]; | uint8_t velo = data[3]; | ||||
| client->quequeMessage(MESSAGE_NOTE_ON, note, velo, 0.0); | |||||
| client->quequeMessage(MESSAGE_NOTE_ON, channel, note, velo); | |||||
| } | } | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| int CarlaBridgeOsc::handle_show() | |||||
| int CarlaOsc::handleMsgShow() | |||||
| { | { | ||||
| if (! client) | if (! client) | ||||
| return 1; | return 1; | ||||
| @@ -284,7 +299,7 @@ int CarlaBridgeOsc::handle_show() | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int CarlaBridgeOsc::handle_hide() | |||||
| int CarlaOsc::handleMsgHide() | |||||
| { | { | ||||
| if (! client) | if (! client) | ||||
| return 1; | return 1; | ||||
| @@ -294,7 +309,7 @@ int CarlaBridgeOsc::handle_hide() | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int CarlaBridgeOsc::handle_quit() | |||||
| int CarlaOsc::handleMsgQuit() | |||||
| { | { | ||||
| if (! client) | if (! client) | ||||
| return 1; | return 1; | ||||
| @@ -24,10 +24,12 @@ | |||||
| #define CARLA_BRIDGE_OSC_HANDLE_ARGS const int argc, const lo_arg* const* const argv, const char* const types | #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) \ | #define CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(/* argc, types, */ argcToCompare, typesToCompare) \ | ||||
| Q_ASSERT(m_serverPath); \ | |||||
| Q_ASSERT(m_serverThread); \ | |||||
| /* check argument count */ \ | /* check argument count */ \ | ||||
| if (argc != argcToCompare) \ | if (argc != argcToCompare) \ | ||||
| { \ | { \ | ||||
| qCritical("CarlaBridgeOsc::%s() - argument count mismatch: %i != %i", __FUNCTION__, argc, argcToCompare); \ | |||||
| qCritical("CarlaOsc::%s() - argument count mismatch: %i != %i", __FUNCTION__, argc, argcToCompare); \ | |||||
| return 1; \ | return 1; \ | ||||
| } \ | } \ | ||||
| if (argc > 0) \ | if (argc > 0) \ | ||||
| @@ -35,28 +37,37 @@ | |||||
| /* check for nullness */ \ | /* check for nullness */ \ | ||||
| if (! (types && typesToCompare)) \ | if (! (types && typesToCompare)) \ | ||||
| { \ | { \ | ||||
| qCritical("CarlaBridgeOsc::%s() - argument types are null", __FUNCTION__); \ | |||||
| qCritical("CarlaOsc::%s() - argument types are null", __FUNCTION__); \ | |||||
| return 1; \ | return 1; \ | ||||
| } \ | } \ | ||||
| /* check argument types */ \ | /* check argument types */ \ | ||||
| if (strcmp(types, typesToCompare) != 0) \ | if (strcmp(types, typesToCompare) != 0) \ | ||||
| { \ | { \ | ||||
| qCritical("CarlaBridgeOsc::%s() - argument types mismatch: '%s' != '%s'", __FUNCTION__, types, typesToCompare); \ | |||||
| qCritical("CarlaOsc::%s() - argument types mismatch: '%s' != '%s'", __FUNCTION__, types, typesToCompare); \ | |||||
| return 1; \ | return 1; \ | ||||
| } \ | } \ | ||||
| } | } | ||||
| CARLA_BRIDGE_START_NAMESPACE | CARLA_BRIDGE_START_NAMESPACE | ||||
| class CarlaBridgeOsc | |||||
| /*! | |||||
| * @defgroup CarlaBridgeOSC Carla Bridge OSC | |||||
| * | |||||
| * The Carla Bridge OSC. | |||||
| * @{ | |||||
| */ | |||||
| class CarlaOsc | |||||
| { | { | ||||
| public: | public: | ||||
| CarlaBridgeOsc(CarlaBridgeClient* const client, const char* const name); | |||||
| ~CarlaBridgeOsc(); | |||||
| CarlaOsc(CarlaClient* const client, const char* const name); | |||||
| ~CarlaOsc(); | |||||
| bool init(const char* const url); | bool init(const char* const url); | ||||
| void close(); | void close(); | ||||
| // ------------------------------------------------------------------- | |||||
| const CarlaOscData* getControllerData() const | const CarlaOscData* getControllerData() const | ||||
| { | { | ||||
| return &m_controlData; | return &m_controlData; | ||||
| @@ -82,6 +93,7 @@ public: | |||||
| osc_send_exiting(&m_controlData); | osc_send_exiting(&m_controlData); | ||||
| } | } | ||||
| #ifdef BRIDGE_LV2 | |||||
| void sendOscLv2TransferAtom(const char* const type, const char* const value) | void sendOscLv2TransferAtom(const char* const type, const char* const value) | ||||
| { | { | ||||
| osc_send_lv2_transfer_atom(&m_controlData, type, value); | osc_send_lv2_transfer_atom(&m_controlData, type, value); | ||||
| @@ -91,9 +103,30 @@ public: | |||||
| { | { | ||||
| osc_send_lv2_transfer_event(&m_controlData, type, value); | osc_send_lv2_transfer_event(&m_controlData, type, value); | ||||
| } | } | ||||
| #endif | |||||
| // ------------------------------------------------------------------- | |||||
| protected: | |||||
| int handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg); | |||||
| int handleMsgConfigure(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handleMsgControl(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handleMsgProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handleMsgMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handleMsgMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handleMsgShow(); | |||||
| int handleMsgHide(); | |||||
| int handleMsgQuit(); | |||||
| #ifdef BRIDGE_LV2 | |||||
| int handleMsgLv2TransferAtom(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handleMsgLv2TransferEvent(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| #endif | |||||
| // ------------------------------------------------------------------- | |||||
| private: | private: | ||||
| CarlaBridgeClient* const client; | |||||
| CarlaClient* const client; | |||||
| const char* m_serverPath; | const char* m_serverPath; | ||||
| lo_server_thread m_serverThread; | lo_server_thread m_serverThread; | ||||
| @@ -106,49 +139,12 @@ private: | |||||
| static int osc_message_handler(const char* const path, const char* const types, lo_arg** const argv, const int argc, const lo_message msg, void* const user_data) | static int osc_message_handler(const char* const path, const char* const types, lo_arg** const argv, const int argc, const lo_message msg, void* const user_data) | ||||
| { | { | ||||
| CarlaBridgeOsc* const _this_ = (CarlaBridgeOsc*)user_data; | |||||
| if (! _this_->client) | |||||
| return 1; | |||||
| CarlaOsc* const _this_ = (CarlaOsc*)user_data; | |||||
| return _this_->handleMessage(path, argc, argv, types, msg); | return _this_->handleMessage(path, argc, argv, types, msg); | ||||
| } | } | ||||
| int handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg); | |||||
| int handle_configure(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handle_control(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handle_program(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handle_midi_program(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handle_midi(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handle_show(); | |||||
| int handle_hide(); | |||||
| int handle_quit(); | |||||
| #ifdef BRIDGE_LV2 | |||||
| int handle_lv2_transfer_atom(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| int handle_lv2_transfer_event(CARLA_BRIDGE_OSC_HANDLE_ARGS); | |||||
| #endif | |||||
| }; | }; | ||||
| #ifdef BUILD_BRIDGE_PLUGIN | |||||
| void osc_send_bridge_ains_peak(int index, double value); | |||||
| void osc_send_bridge_aouts_peak(int index, double value); | |||||
| void osc_send_bridge_audio_count(int ins, int outs, int total); | |||||
| void osc_send_bridge_midi_count(int ins, int outs, int total); | |||||
| void osc_send_bridge_param_count(int ins, int outs, int total); | |||||
| void osc_send_bridge_program_count(int count); | |||||
| void osc_send_bridge_midi_program_count(int count); | |||||
| void osc_send_bridge_plugin_info(int category, int hints, const char* name, const char* label, const char* maker, const char* copyright, long uniqueId); | |||||
| void osc_send_bridge_param_info(int index, const char* name, const char* unit); | |||||
| void osc_send_bridge_param_data(int index, int type, int rindex, int hints, int midi_channel, int midi_cc); | |||||
| void osc_send_bridge_param_ranges(int index, double def, double min, double max, double step, double step_small, double step_large); | |||||
| void osc_send_bridge_program_info(int index, const char* name); | |||||
| void osc_send_bridge_midi_program_info(int index, int bank, int program, const char* label); | |||||
| void osc_send_bridge_custom_data(const char* stype, const char* key, const char* value); | |||||
| void osc_send_bridge_chunk_data(const char* string_data); | |||||
| void osc_send_bridge_update(); | |||||
| #endif | |||||
| /**@}*/ | |||||
| CARLA_BRIDGE_END_NAMESPACE | CARLA_BRIDGE_END_NAMESPACE | ||||
| @@ -15,36 +15,400 @@ | |||||
| * For a full copy of the GNU General Public License see the COPYING file | * For a full copy of the GNU General Public License see the COPYING file | ||||
| */ | */ | ||||
| #include "carla_bridge.h" | |||||
| #include "carla_bridge_client.h" | |||||
| #include "carla_plugin.h" | #include "carla_plugin.h" | ||||
| //#include "carla_plugin.h" | |||||
| #include <QtCore/QFile> | #include <QtCore/QFile> | ||||
| #ifndef __WINE__ | |||||
| #include <QtCore/QTimer> | |||||
| #include <QtGui/QApplication> | |||||
| #include <QtGui/QDialog> | |||||
| //#ifndef __WINE__ | |||||
| //#include <QtCore/QTimer> | |||||
| //#include <QtGui/QApplication> | |||||
| //#include <QtGui/QDialog> | |||||
| //#endif | |||||
| CARLA_BRIDGE_START_NAMESPACE | |||||
| // ------------------------------------------------------------------------- | |||||
| // client | |||||
| class CarlaBridgePluginClient : public CarlaClient | |||||
| { | |||||
| public: | |||||
| CarlaBridgePluginClient(CarlaToolkit* const toolkit) | |||||
| : CarlaClient(toolkit) | |||||
| { | |||||
| engine = nullptr; | |||||
| plugin = nullptr; | |||||
| } | |||||
| ~CarlaBridgePluginClient() | |||||
| { | |||||
| } | |||||
| void setStuff(CarlaBackend::CarlaEngine* const engine_, CarlaBackend::CarlaPlugin* const plugin_) | |||||
| { | |||||
| engine = engine_; | |||||
| plugin = plugin_; | |||||
| } | |||||
| // --------------------------------------------------------------------- | |||||
| // processing | |||||
| void setParameter(const int32_t rindex, const double value) | |||||
| { | |||||
| Q_ASSERT(plugin); | |||||
| if (! plugin) | |||||
| return; | |||||
| plugin->setParameterValueByRIndex(rindex, value, true, true, false); | |||||
| } | |||||
| void setProgram(const uint32_t index) | |||||
| { | |||||
| Q_ASSERT(plugin && index < plugin->programCount()); | |||||
| if (! plugin) | |||||
| return; | |||||
| if (index >= plugin->programCount()) | |||||
| return; | |||||
| plugin->setProgram(index, true, true, false, true); | |||||
| } | |||||
| void setMidiProgram(const uint32_t bank, const uint32_t program) | |||||
| { | |||||
| Q_ASSERT(plugin); | |||||
| if (! plugin) | |||||
| return; | |||||
| plugin->setMidiProgramById(bank, program, true, true, false, true); | |||||
| } | |||||
| void noteOn(const uint8_t channel, const uint8_t note, const uint8_t velo) | |||||
| { | |||||
| Q_ASSERT(plugin); | |||||
| Q_ASSERT(velo != 0); | |||||
| if (! plugin) | |||||
| return; | |||||
| plugin->sendMidiSingleNote(channel, note, velo, true, true, false); | |||||
| } | |||||
| void noteOff(const uint8_t channel, const uint8_t note) | |||||
| { | |||||
| Q_ASSERT(plugin); | |||||
| if (! plugin) | |||||
| return; | |||||
| plugin->sendMidiSingleNote(channel, note, 0, true, true, false); | |||||
| } | |||||
| // --------------------------------------------------------------------- | |||||
| // plugin | |||||
| void saveNow() | |||||
| { | |||||
| Q_ASSERT(plugin); | |||||
| if (! plugin) | |||||
| return; | |||||
| plugin->prepareForSave(); | |||||
| #if 0 | |||||
| for (uint32_t i=0; i < CARLA_PLUGIN->customDataCount(); i++) | |||||
| { | |||||
| const CustomData* const cdata = CARLA_PLUGIN->customData(i); | |||||
| osc_send_bridge_custom_data(customdatatype2str(cdata->type), cdata->key, cdata->value); | |||||
| } | |||||
| if (CARLA_PLUGIN->hints() & PLUGIN_USES_CHUNKS) | |||||
| { | |||||
| void* data = nullptr; | |||||
| int32_t dataSize = CARLA_PLUGIN->chunkData(&data); | |||||
| if (data && dataSize >= 4) | |||||
| { | |||||
| QString filePath; | |||||
| filePath += "/tmp/.CarlaChunk_"; | |||||
| filePath += CARLA_PLUGIN->name(); | |||||
| QFile file(filePath); | |||||
| if (file.open(QIODevice::WriteOnly)) | |||||
| { | |||||
| QByteArray chunk((const char*)data, dataSize); | |||||
| file.write(chunk); | |||||
| file.close(); | |||||
| osc_send_bridge_chunk_data(filePath.toUtf8().constData()); | |||||
| } | |||||
| } | |||||
| } | |||||
| osc_send_configure(CARLA_BRIDGE_MSG_SAVED, ""); | |||||
| #endif | #endif | ||||
| } | |||||
| #define CARLA_PLUGIN CarlaBackend::CarlaPlugins[0] | |||||
| void setCustomData(const char* const type, const char* const key, const char* const value) | |||||
| { | |||||
| Q_ASSERT(plugin); | |||||
| void toolkit_plugin_idle(); | |||||
| if (! plugin) | |||||
| return; | |||||
| ClientData* client = nullptr; | |||||
| plugin->setCustomData(CarlaBackend::getCustomDataStringType(type), key, value, true); | |||||
| } | |||||
| void setChunkData(const char* const filePath) | |||||
| { | |||||
| Q_ASSERT(plugin); | |||||
| if (! plugin) | |||||
| return; | |||||
| #if 0 | |||||
| nextChunkFilePath = strdup(filePath); | |||||
| while (nextChunkFilePath) | |||||
| carla_msleep(25); | |||||
| #endif | |||||
| } | |||||
| // --------------------------------------------------------------------- | |||||
| // ... | |||||
| void handleCallback(const CarlaBackend::CallbackType action, const int value1, const int value2, const double value3) | |||||
| { | |||||
| switch (action) | |||||
| { | |||||
| case CarlaBackend::CALLBACK_PARAMETER_VALUE_CHANGED: | |||||
| //osc_send_control(value1, value3); | |||||
| break; | |||||
| case CarlaBackend::CALLBACK_PROGRAM_CHANGED: | |||||
| //osc_send_program(value1); | |||||
| break; | |||||
| case CarlaBackend::CALLBACK_MIDI_PROGRAM_CHANGED: | |||||
| //osc_send_midi_program(value1, value2, false); | |||||
| break; | |||||
| case CarlaBackend::CALLBACK_NOTE_ON: | |||||
| { | |||||
| //uint8_t mdata[4] = { 0, MIDI_STATUS_NOTE_ON, (uint8_t)value1, (uint8_t)value2 }; | |||||
| //osc_send_midi(mdata); | |||||
| break; | |||||
| } | |||||
| case CarlaBackend::CALLBACK_NOTE_OFF: | |||||
| { | |||||
| //uint8_t mdata[4] = { 0, MIDI_STATUS_NOTE_OFF, (uint8_t)value1, (uint8_t)value2 }; | |||||
| //osc_send_midi(mdata); | |||||
| break; | |||||
| } | |||||
| case CarlaBackend::CALLBACK_SHOW_GUI: | |||||
| //if (value1 == 0) | |||||
| // osc_send_configure(CARLA_BRIDGE_MSG_HIDE_GUI, ""); | |||||
| break; | |||||
| case CarlaBackend::CALLBACK_RESIZE_GUI: | |||||
| //if (client) | |||||
| // client->queque_message(BRIDGE_MESSAGE_RESIZE_GUI, value1, value2, 0.0); | |||||
| break; | |||||
| case CarlaBackend::CALLBACK_RELOAD_PARAMETERS: | |||||
| //if (CARLA_PLUGIN) | |||||
| //{ | |||||
| // for (uint32_t i=0; i < CARLA_PLUGIN->parameterCount(); i++) | |||||
| // { | |||||
| // osc_send_control(i, CARLA_PLUGIN->getParameterValue(i)); | |||||
| // } | |||||
| //} | |||||
| break; | |||||
| case CarlaBackend::CALLBACK_QUIT: | |||||
| quequeMessage(MESSAGE_QUIT, 0, 0, 0.0); | |||||
| break; | |||||
| } | |||||
| } | |||||
| // --------------------------------------------------------------------- | |||||
| static void callback(void* const ptr, CarlaBackend::CallbackType const action, const unsigned short, const int value1, const int value2, const double value3) | |||||
| { | |||||
| Q_ASSERT(ptr); | |||||
| if (! ptr) | |||||
| return; | |||||
| CarlaBridgePluginClient* const client = (CarlaBridgePluginClient*)ptr; | |||||
| client->handleCallback(action, value1, value2, value3); | |||||
| } | |||||
| private: | |||||
| CarlaBackend::CarlaEngine* engine; | |||||
| CarlaBackend::CarlaPlugin* plugin; | |||||
| }; | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| // backend stuff | |||||
| // toolkit | |||||
| CARLA_BACKEND_START_NAMESPACE | |||||
| class CarlaBridgeToolkitPlugin : public CarlaToolkit | |||||
| { | |||||
| public: | |||||
| CarlaBridgeToolkitPlugin(const char* const title) | |||||
| : CarlaToolkit(title) | |||||
| { | |||||
| qDebug("CarlaBridgeToolkitPlugin::CarlaBridgeToolkitPlugin(%s)", title); | |||||
| } | |||||
| short add_plugin_ladspa(const char* const filename, const char* const name, const char* const label, const void* const extra_stuff); | |||||
| short add_plugin_dssi(const char* const filename, const char* const name, const char* const label, const void* const extra_stuff); | |||||
| short add_plugin_lv2(const char* const filename, const char* const name, const char* const label); | |||||
| short add_plugin_vst(const char* const filename, const char* const name, const char* const label); | |||||
| ~CarlaBridgeToolkitPlugin() | |||||
| { | |||||
| qDebug("CarlaBridgeToolkitPlugin::~CarlaBridgeToolkitPlugin()"); | |||||
| } | |||||
| CARLA_BACKEND_END_NAMESPACE | |||||
| void init() | |||||
| { | |||||
| } | |||||
| void exec(CarlaClient* const client) | |||||
| { | |||||
| m_client = client; | |||||
| } | |||||
| void quit() | |||||
| { | |||||
| } | |||||
| using namespace CarlaBackend; | |||||
| void show() | |||||
| { | |||||
| } | |||||
| void hide() | |||||
| { | |||||
| } | |||||
| void resize(int width, int height) | |||||
| { | |||||
| } | |||||
| }; | |||||
| CarlaToolkit* CarlaToolkit::createNew(const char* const title) | |||||
| { | |||||
| return new CarlaBridgeToolkitPlugin(title); | |||||
| } | |||||
| CARLA_BRIDGE_END_NAMESPACE | |||||
| int main(int argc, char* argv[]) | |||||
| { | |||||
| if (argc != 6) | |||||
| { | |||||
| qWarning("%s :: bad arguments", argv[0]); | |||||
| return 1; | |||||
| } | |||||
| const char* const oscUrl = argv[1]; | |||||
| const char* const stype = argv[2]; | |||||
| const char* const filename = argv[3]; | |||||
| const char* name = argv[4]; | |||||
| const char* const label = argv[5]; | |||||
| if (strcmp(name, "(none)") == 0) | |||||
| name = nullptr; | |||||
| CarlaBackend::PluginType itype; | |||||
| if (strcmp(stype, "LADSPA") == 0) | |||||
| itype = CarlaBackend::PLUGIN_LADSPA; | |||||
| else if (strcmp(stype, "DSSI") == 0) | |||||
| itype = CarlaBackend::PLUGIN_DSSI; | |||||
| else if (strcmp(stype, "LV2") == 0) | |||||
| itype = CarlaBackend::PLUGIN_LV2; | |||||
| else if (strcmp(stype, "VST") == 0) | |||||
| itype = CarlaBackend::PLUGIN_VST; | |||||
| else | |||||
| { | |||||
| itype = CarlaBackend::PLUGIN_NONE; | |||||
| qWarning("Invalid plugin type '%s'", stype); | |||||
| return 1; | |||||
| } | |||||
| // Init toolkit | |||||
| CarlaBridge::CarlaBridgeToolkitPlugin toolkit(name); | |||||
| toolkit.init(); | |||||
| // Init client | |||||
| CarlaBridge::CarlaBridgePluginClient client(&toolkit); | |||||
| // Init OSC | |||||
| if (! client.oscInit(oscUrl)) | |||||
| { | |||||
| toolkit.quit(); | |||||
| return -1; | |||||
| } | |||||
| // Init backend engine | |||||
| CarlaBackend::CarlaEngineJack engine; | |||||
| engine.setCallback(client.callback, &client); | |||||
| // bridge client <-> engine | |||||
| client.registerOscEngine(&engine); | |||||
| /// Init plugin | |||||
| short id = engine.addPlugin(itype, filename, name, label); | |||||
| if (id >= 0 && id < CarlaBackend::MAX_PLUGINS) | |||||
| { | |||||
| CarlaBackend::CarlaPlugin* const plugin = engine.getPlugin(id); | |||||
| client.setStuff(&engine, plugin); | |||||
| } | |||||
| else | |||||
| { | |||||
| qWarning("Plugin failed to load, error was:\n%s", CarlaBackend::getLastError()); | |||||
| return 1; | |||||
| } | |||||
| // Init engine | |||||
| //QString engName = QString("%1 (master)").arg(label); | |||||
| //engName.truncate(CarlaEngine::maxClientNameSize()); | |||||
| //CarlaEngine engine; | |||||
| //engine.init(engName.toUtf8().constData()); | |||||
| // Init toolkit | |||||
| //toolkit_init(); | |||||
| // Init plugin client | |||||
| //client = new PluginData; | |||||
| // Init OSC | |||||
| //osc_init(osc_url); | |||||
| //osc_send_update(); | |||||
| toolkit.exec(&client); | |||||
| // Close OSC | |||||
| client.sendOscExiting(); | |||||
| client.oscClose(); | |||||
| // Close client | |||||
| //client.close(); | |||||
| // Close toolkit | |||||
| toolkit.quit(); | |||||
| return 0; | |||||
| } | |||||
| #if 0 | |||||
| #define CARLA_PLUGIN CarlaBackend::CarlaPlugins[0] | |||||
| void toolkit_plugin_idle(); | |||||
| ClientData* client = nullptr; | |||||
| // ------------------------------------------------------------------------- | |||||
| // backend stuff | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| // toolkit classes | // toolkit classes | ||||
| @@ -262,162 +626,8 @@ void toolkit_window_resize(int width, int height) | |||||
| } | } | ||||
| } | } | ||||
| // ------------------------------------------------------------------------- | |||||
| // client stuff | |||||
| class PluginData : public ClientData | |||||
| { | |||||
| public: | |||||
| PluginData() : ClientData("") | |||||
| { | |||||
| } | |||||
| ~PluginData() | |||||
| { | |||||
| } | |||||
| // --------------------------------------------------------------------- | |||||
| // processing | |||||
| void set_parameter(int32_t rindex, double value) | |||||
| { | |||||
| if (CARLA_PLUGIN) | |||||
| CARLA_PLUGIN->setParameterValueByRIndex(rindex, value, true, true, false); | |||||
| } | |||||
| void set_program(uint32_t index) | |||||
| { | |||||
| if (CARLA_PLUGIN && index < CARLA_PLUGIN->programCount()) | |||||
| CARLA_PLUGIN->setProgram(index, true, true, false, true); | |||||
| callback_action(CALLBACK_RELOAD_PARAMETERS, 0, 0, 0, 0.0); | |||||
| } | |||||
| void set_midi_program(uint32_t bank, uint32_t program) | |||||
| { | |||||
| if (CARLA_PLUGIN) | |||||
| CARLA_PLUGIN->setMidiProgramById(bank, program, true, true, false, true); | |||||
| callback_action(CALLBACK_RELOAD_PARAMETERS, 0, 0, 0, 0.0); | |||||
| } | |||||
| void note_on(uint8_t note, uint8_t velocity) | |||||
| { | |||||
| if (CARLA_PLUGIN) | |||||
| CARLA_PLUGIN->sendMidiSingleNote(note, velocity, true, true, false); | |||||
| } | |||||
| void note_off(uint8_t note) | |||||
| { | |||||
| if (CARLA_PLUGIN) | |||||
| CARLA_PLUGIN->sendMidiSingleNote(note, 0, true, true, false); | |||||
| } | |||||
| // plugin | |||||
| void save_now() | |||||
| { | |||||
| CARLA_PLUGIN->prepareForSave(); | |||||
| for (uint32_t i=0; i < CARLA_PLUGIN->customDataCount(); i++) | |||||
| { | |||||
| const CustomData* const cdata = CARLA_PLUGIN->customData(i); | |||||
| osc_send_bridge_custom_data(customdatatype2str(cdata->type), cdata->key, cdata->value); | |||||
| } | |||||
| if (CARLA_PLUGIN->hints() & PLUGIN_USES_CHUNKS) | |||||
| { | |||||
| void* data = nullptr; | |||||
| int32_t dataSize = CARLA_PLUGIN->chunkData(&data); | |||||
| if (data && dataSize >= 4) | |||||
| { | |||||
| QString filePath; | |||||
| filePath += "/tmp/.CarlaChunk_"; | |||||
| filePath += CARLA_PLUGIN->name(); | |||||
| QFile file(filePath); | |||||
| if (file.open(QIODevice::WriteOnly)) | |||||
| { | |||||
| QByteArray chunk((const char*)data, dataSize); | |||||
| file.write(chunk); | |||||
| file.close(); | |||||
| osc_send_bridge_chunk_data(filePath.toUtf8().constData()); | |||||
| } | |||||
| } | |||||
| } | |||||
| osc_send_configure(CARLA_BRIDGE_MSG_SAVED, ""); | |||||
| } | |||||
| void set_custom_data(const char* const type, const char* const key, const char* const value) | |||||
| { | |||||
| if (CARLA_PLUGIN) | |||||
| CARLA_PLUGIN->setCustomData(customdatastr2type(type), key, value, false); | |||||
| } | |||||
| void set_chunk_data(const char* const filePath) | |||||
| { | |||||
| nextChunkFilePath = strdup(filePath); | |||||
| while (nextChunkFilePath) | |||||
| carla_msleep(25); | |||||
| } | |||||
| }; | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| void plugin_bridge_callback(CallbackType action, unsigned short, int value1, int value2, double value3) | |||||
| { | |||||
| switch (action) | |||||
| { | |||||
| case CALLBACK_PARAMETER_CHANGED: | |||||
| osc_send_control(value1, value3); | |||||
| break; | |||||
| case CALLBACK_PROGRAM_CHANGED: | |||||
| osc_send_program(value1); | |||||
| break; | |||||
| case CALLBACK_MIDI_PROGRAM_CHANGED: | |||||
| osc_send_midi_program(value1, value2, false); | |||||
| break; | |||||
| case CALLBACK_NOTE_ON: | |||||
| { | |||||
| uint8_t mdata[4] = { 0, MIDI_STATUS_NOTE_ON, (uint8_t)value1, (uint8_t)value2 }; | |||||
| osc_send_midi(mdata); | |||||
| break; | |||||
| } | |||||
| case CALLBACK_NOTE_OFF: | |||||
| { | |||||
| uint8_t mdata[4] = { 0, MIDI_STATUS_NOTE_OFF, (uint8_t)value1, (uint8_t)value2 }; | |||||
| osc_send_midi(mdata); | |||||
| break; | |||||
| } | |||||
| case CALLBACK_SHOW_GUI: | |||||
| if (value1 == 0) | |||||
| osc_send_configure(CARLA_BRIDGE_MSG_HIDE_GUI, ""); | |||||
| break; | |||||
| case CALLBACK_RESIZE_GUI: | |||||
| if (client) | |||||
| client->queque_message(BRIDGE_MESSAGE_RESIZE_GUI, value1, value2, 0.0); | |||||
| break; | |||||
| case CALLBACK_RELOAD_PARAMETERS: | |||||
| if (CARLA_PLUGIN) | |||||
| { | |||||
| for (uint32_t i=0; i < CARLA_PLUGIN->parameterCount(); i++) | |||||
| { | |||||
| osc_send_control(i, CARLA_PLUGIN->getParameterValue(i)); | |||||
| } | |||||
| } | |||||
| break; | |||||
| case CALLBACK_QUIT: | |||||
| if (client) | |||||
| client->queque_message(BRIDGE_MESSAGE_QUIT, 0, 0, 0.0); | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| } | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| #ifdef __WINE__ | #ifdef __WINE__ | ||||
| @@ -651,3 +861,5 @@ int main(int argc, char* argv[]) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| #endif | |||||
| @@ -28,14 +28,14 @@ CARLA_BRIDGE_START_NAMESPACE | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| class CarlaBridgeToolkitGtk2: public CarlaBridgeToolkit | |||||
| class CarlaToolkitGtk2 : public CarlaToolkit | |||||
| { | { | ||||
| public: | public: | ||||
| CarlaBridgeToolkitGtk2(const char* const title) | |||||
| : CarlaBridgeToolkit(title), | |||||
| CarlaToolkitGtk2(const char* const title) | |||||
| : CarlaToolkit(title), | |||||
| settings("Cadence", "Carla-Gtk2UIs") | settings("Cadence", "Carla-Gtk2UIs") | ||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitGtk2::CarlaBridgeToolkitGtk2(%s)", title); | |||||
| qDebug("CarlaToolkitGtk2::CarlaToolkitGtk2(%s)", title); | |||||
| window = nullptr; | window = nullptr; | ||||
| @@ -43,23 +43,23 @@ public: | |||||
| lastWidth = lastHeight = 0; | lastWidth = lastHeight = 0; | ||||
| } | } | ||||
| ~CarlaBridgeToolkitGtk2() | |||||
| ~CarlaToolkitGtk2() | |||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitGtk2::~CarlaBridgeToolkitGtk2()"); | |||||
| qDebug("CarlaToolkitGtk2::~CarlaToolkitGtk2()"); | |||||
| } | } | ||||
| void init() | void init() | ||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitGtk2::init()"); | |||||
| qDebug("CarlaToolkitGtk2::init()"); | |||||
| static int argc = 0; | static int argc = 0; | ||||
| static char** argv = { nullptr }; | static char** argv = { nullptr }; | ||||
| gtk_init(&argc, &argv); | gtk_init(&argc, &argv); | ||||
| } | } | ||||
| void exec(CarlaBridgeClient* const client) | |||||
| void exec(CarlaClient* const client) | |||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitGtk2::exec(%p)", client); | |||||
| qDebug("CarlaToolkitGtk2::exec(%p)", client); | |||||
| Q_ASSERT(client); | Q_ASSERT(client); | ||||
| window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | ||||
| @@ -101,7 +101,7 @@ public: | |||||
| void quit() | void quit() | ||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitGtk2::quit()"); | |||||
| qDebug("CarlaToolkitGtk2::quit()"); | |||||
| if (window) | if (window) | ||||
| { | { | ||||
| @@ -116,7 +116,7 @@ public: | |||||
| void show() | void show() | ||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitGtk2::show()"); | |||||
| qDebug("CarlaToolkitGtk2::show()"); | |||||
| Q_ASSERT(window); | Q_ASSERT(window); | ||||
| if (window) | if (window) | ||||
| @@ -125,7 +125,7 @@ public: | |||||
| void hide() | void hide() | ||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitGtk2::hide()"); | |||||
| qDebug("CarlaToolkitGtk2::hide()"); | |||||
| Q_ASSERT(window); | Q_ASSERT(window); | ||||
| if (window) | if (window) | ||||
| @@ -134,37 +134,20 @@ public: | |||||
| void resize(int width, int height) | void resize(int width, int height) | ||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitGtk2::resize(%i, %i)", width, height); | |||||
| qDebug("CarlaToolkitGtk2::resize(%i, %i)", width, height); | |||||
| Q_ASSERT(window); | Q_ASSERT(window); | ||||
| if (window) | if (window) | ||||
| gtk_window_resize(GTK_WINDOW(window), width, height); | gtk_window_resize(GTK_WINDOW(window), width, height); | ||||
| } | } | ||||
| private: | |||||
| GtkWidget* window; | |||||
| QSettings settings; | |||||
| gint lastX, lastY, lastWidth, lastHeight; | |||||
| static void gtk_ui_destroy(GtkWidget*, gpointer data) | |||||
| { | |||||
| CarlaBridgeToolkitGtk2* const _this_ = (CarlaBridgeToolkitGtk2*)data; | |||||
| _this_->handleDestroy(); | |||||
| gtk_main_quit(); | |||||
| } | |||||
| static gboolean gtk_ui_timeout(gpointer data) | |||||
| { | |||||
| CarlaBridgeToolkitGtk2* const _this_ = (CarlaBridgeToolkitGtk2*)data; | |||||
| return _this_->handleTimeout(); | |||||
| } | |||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| protected: | |||||
| void handleDestroy() | void handleDestroy() | ||||
| { | { | ||||
| qDebug("CarlaToolkitGtk2::handleDestroy()"); | |||||
| window = nullptr; | window = nullptr; | ||||
| m_client = nullptr; | m_client = nullptr; | ||||
| @@ -185,13 +168,35 @@ private: | |||||
| return m_client ? m_client->runMessages() : false; | return m_client ? m_client->runMessages() : false; | ||||
| } | } | ||||
| // --------------------------------------------------------------------- | |||||
| private: | |||||
| GtkWidget* window; | |||||
| QSettings settings; | |||||
| gint lastX, lastY, lastWidth, lastHeight; | |||||
| static void gtk_ui_destroy(GtkWidget*, gpointer data) | |||||
| { | |||||
| CarlaToolkitGtk2* const _this_ = (CarlaToolkitGtk2*)data; | |||||
| _this_->handleDestroy(); | |||||
| gtk_main_quit(); | |||||
| } | |||||
| static gboolean gtk_ui_timeout(gpointer data) | |||||
| { | |||||
| CarlaToolkitGtk2* const _this_ = (CarlaToolkitGtk2*)data; | |||||
| return _this_->handleTimeout(); | |||||
| } | |||||
| }; | }; | ||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| CarlaBridgeToolkit* CarlaBridgeToolkit::createNew(const char* const title) | |||||
| CarlaToolkit* CarlaToolkit::createNew(const char* const title) | |||||
| { | { | ||||
| return new CarlaBridgeToolkitGtk2(title); | |||||
| return new CarlaToolkitGtk2(title); | |||||
| } | } | ||||
| CARLA_BRIDGE_END_NAMESPACE | CARLA_BRIDGE_END_NAMESPACE | ||||
| @@ -24,15 +24,14 @@ | |||||
| #include <QtGui/QDialog> | #include <QtGui/QDialog> | ||||
| #include <QtGui/QVBoxLayout> | #include <QtGui/QVBoxLayout> | ||||
| //CARLA_BRIDGE_START_NAMESPACE | |||||
| namespace CarlaBridge { | |||||
| CARLA_BRIDGE_START_NAMESPACE | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| class MessageChecker : public QTimer | class MessageChecker : public QTimer | ||||
| { | { | ||||
| public: | public: | ||||
| MessageChecker(CarlaBridgeClient* const client_) | |||||
| MessageChecker(CarlaClient* const client_) | |||||
| : client(client_) | : client(client_) | ||||
| { | { | ||||
| Q_ASSERT(client); | Q_ASSERT(client); | ||||
| @@ -45,34 +44,34 @@ public: | |||||
| } | } | ||||
| private: | private: | ||||
| CarlaBridgeClient* const client; | |||||
| CarlaClient* const client; | |||||
| }; | }; | ||||
| class CarlaBridgeToolkitQt4: public CarlaBridgeToolkit | |||||
| class CarlaToolkitQt4: public CarlaToolkit | |||||
| { | { | ||||
| public: | public: | ||||
| CarlaBridgeToolkitQt4(const char* const title) | |||||
| : CarlaBridgeToolkit(title), | |||||
| #ifdef BRIDGE_LV2_X11 | |||||
| CarlaToolkitQt4(const char* const title) | |||||
| : CarlaToolkit(title), | |||||
| #ifdef BRIDGE_LV2_X11 | |||||
| settings("Cadence", "Carla-X11UIs") | settings("Cadence", "Carla-X11UIs") | ||||
| #else | |||||
| #else | |||||
| settings("Cadence", "Carla-Qt4UIs") | settings("Cadence", "Carla-Qt4UIs") | ||||
| #endif | |||||
| #endif | |||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitQt4::CarlaBridgeToolkitQt4(%s)", title); | |||||
| qDebug("CarlaToolkitQt4::CarlaToolkitQt4(%s)", title); | |||||
| app = nullptr; | app = nullptr; | ||||
| window = nullptr; | window = nullptr; | ||||
| } | } | ||||
| ~CarlaBridgeToolkitQt4() | |||||
| ~CarlaToolkitQt4() | |||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitQt4::~CarlaBridgeToolkitQt4()"); | |||||
| qDebug("CarlaToolkitQt4::~CarlaToolkitQt4()"); | |||||
| } | } | ||||
| void init() | void init() | ||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitQt4::init()"); | |||||
| qDebug("CarlaToolkitQt4::init()"); | |||||
| Q_ASSERT(! app); | Q_ASSERT(! app); | ||||
| static int argc = 0; | static int argc = 0; | ||||
| @@ -80,9 +79,9 @@ public: | |||||
| app = new QApplication(argc, argv, true); | app = new QApplication(argc, argv, true); | ||||
| } | } | ||||
| void exec(CarlaBridgeClient* const client) | |||||
| void exec(CarlaClient* const client) | |||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitQt4::exec(%p)", client); | |||||
| qDebug("CarlaToolkitQt4::exec(%p)", client); | |||||
| Q_ASSERT(app); | Q_ASSERT(app); | ||||
| Q_ASSERT(client); | Q_ASSERT(client); | ||||
| @@ -143,7 +142,7 @@ public: | |||||
| void quit() | void quit() | ||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitQt4::quit()"); | |||||
| qDebug("CarlaToolkitQt4::quit()"); | |||||
| Q_ASSERT(app); | Q_ASSERT(app); | ||||
| if (window) | if (window) | ||||
| @@ -176,7 +175,7 @@ public: | |||||
| void show() | void show() | ||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitQt4::show()"); | |||||
| qDebug("CarlaToolkitQt4::show()"); | |||||
| Q_ASSERT(window); | Q_ASSERT(window); | ||||
| if (window) | if (window) | ||||
| @@ -185,7 +184,7 @@ public: | |||||
| void hide() | void hide() | ||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitQt4::hide()"); | |||||
| qDebug("CarlaToolkitQt4::hide()"); | |||||
| Q_ASSERT(window); | Q_ASSERT(window); | ||||
| if (window) | if (window) | ||||
| @@ -194,7 +193,7 @@ public: | |||||
| void resize(int width, int height) | void resize(int width, int height) | ||||
| { | { | ||||
| qDebug("CarlaBridgeToolkitQt4::resize(%i, %i)", width, height); | |||||
| qDebug("CarlaToolkitQt4::resize(%i, %i)", width, height); | |||||
| Q_ASSERT(window); | Q_ASSERT(window); | ||||
| if (window) | if (window) | ||||
| @@ -209,9 +208,9 @@ private: | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| CarlaBridgeToolkit* CarlaBridgeToolkit::createNew(const char* const title) | |||||
| CarlaToolkit* CarlaToolkit::createNew(const char* const title) | |||||
| { | { | ||||
| return new CarlaBridgeToolkitQt4(title); | |||||
| return new CarlaToolkitQt4(title); | |||||
| } | } | ||||
| CARLA_BRIDGE_END_NAMESPACE | CARLA_BRIDGE_END_NAMESPACE | ||||
| @@ -25,37 +25,47 @@ | |||||
| CARLA_BRIDGE_START_NAMESPACE | CARLA_BRIDGE_START_NAMESPACE | ||||
| class CarlaBridgeToolkit | |||||
| /*! | |||||
| * @defgroup CarlaBridgeToolkit Carla Bridge Toolkit | |||||
| * | |||||
| * The Carla Bridge Toolkit. | |||||
| * @{ | |||||
| */ | |||||
| class CarlaToolkit | |||||
| { | { | ||||
| public: | public: | ||||
| CarlaBridgeToolkit(const char* const title) | |||||
| CarlaToolkit(const char* const title) | |||||
| { | { | ||||
| Q_ASSERT(title); | Q_ASSERT(title); | ||||
| m_title = strdup(title); | |||||
| m_title = strdup(title ? title : "(null)"); | |||||
| m_client = nullptr; | m_client = nullptr; | ||||
| } | } | ||||
| virtual ~CarlaBridgeToolkit() | |||||
| virtual ~CarlaToolkit() | |||||
| { | { | ||||
| free(m_title); | |||||
| if (m_title) | |||||
| free(m_title); | |||||
| } | } | ||||
| virtual void init() = 0; | virtual void init() = 0; | ||||
| virtual void exec(CarlaBridgeClient* const client) = 0; | |||||
| virtual void exec(CarlaClient* const client) = 0; | |||||
| virtual void quit() = 0; | virtual void quit() = 0; | ||||
| virtual void show() = 0; | virtual void show() = 0; | ||||
| virtual void hide() = 0; | virtual void hide() = 0; | ||||
| virtual void resize(int width, int height) = 0; | virtual void resize(int width, int height) = 0; | ||||
| static CarlaBridgeToolkit* createNew(const char* const title); | |||||
| static CarlaToolkit* createNew(const char* const title); | |||||
| protected: | protected: | ||||
| char* m_title; | char* m_title; | ||||
| CarlaBridgeClient* m_client; | |||||
| CarlaClient* m_client; | |||||
| }; | }; | ||||
| /**@}*/ | |||||
| CARLA_BRIDGE_END_NAMESPACE | CARLA_BRIDGE_END_NAMESPACE | ||||
| #endif // CARLA_BRIDGE_TOOLKIT_H | #endif // CARLA_BRIDGE_TOOLKIT_H | ||||
| @@ -15,6 +15,8 @@ | |||||
| * For a full copy of the GNU General Public License see the COPYING file | * For a full copy of the GNU General Public License see the COPYING file | ||||
| */ | */ | ||||
| #ifdef BRIDGE_LV2 | |||||
| #include "carla_bridge_client.h" | #include "carla_bridge_client.h" | ||||
| #include "carla_lv2.h" | #include "carla_lv2.h" | ||||
| #include "carla_midi.h" | #include "carla_midi.h" | ||||
| @@ -23,11 +25,10 @@ | |||||
| #include <QtCore/QDir> | #include <QtCore/QDir> | ||||
| #ifdef BRIDGE_LV2_X11 | #ifdef BRIDGE_LV2_X11 | ||||
| #include <QtGui/QDialog> | |||||
| # include <QtGui/QDialog> | |||||
| #endif | #endif | ||||
| //CARLA_BRIDGE_START_NAMESPACE; | |||||
| namespace CarlaBridge { | |||||
| CARLA_BRIDGE_START_NAMESPACE | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| @@ -63,10 +64,11 @@ const uint32_t CARLA_URI_MAP_ID_COUNT = 12; | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| class CarlaBridgeLv2Client : public CarlaBridgeClient | |||||
| class CarlaLv2Client : public CarlaClient | |||||
| { | { | ||||
| public: | public: | ||||
| CarlaBridgeLv2Client(CarlaBridgeToolkit* const toolkit) : CarlaBridgeClient(toolkit) | |||||
| CarlaLv2Client(CarlaToolkit* const toolkit) | |||||
| : CarlaClient(toolkit) | |||||
| { | { | ||||
| handle = nullptr; | handle = nullptr; | ||||
| widget = nullptr; | widget = nullptr; | ||||
| @@ -189,7 +191,7 @@ public: | |||||
| features[lv2_feature_id_ui_resize]->data = UI_Resize_Feature; | features[lv2_feature_id_ui_resize]->data = UI_Resize_Feature; | ||||
| } | } | ||||
| ~CarlaBridgeLv2Client() | |||||
| ~CarlaLv2Client() | |||||
| { | { | ||||
| if (rdf_descriptor) | if (rdf_descriptor) | ||||
| lv2_rdf_free(rdf_descriptor); | lv2_rdf_free(rdf_descriptor); | ||||
| @@ -221,7 +223,7 @@ public: | |||||
| } | } | ||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| // initialization | |||||
| // ui initialization | |||||
| bool init(const char* plugin_uri, const char* ui_uri) | bool init(const char* plugin_uri, const char* ui_uri) | ||||
| { | { | ||||
| @@ -326,7 +328,7 @@ public: | |||||
| void setParameter(int32_t rindex, double value) | void setParameter(int32_t rindex, double value) | ||||
| { | { | ||||
| assert(handle && descriptor); | |||||
| Q_ASSERT(handle && descriptor); | |||||
| if (handle && descriptor && descriptor->port_event) | if (handle && descriptor && descriptor->port_event) | ||||
| { | { | ||||
| @@ -341,32 +343,30 @@ public: | |||||
| void setMidiProgram(uint32_t bank, uint32_t program) | void setMidiProgram(uint32_t bank, uint32_t program) | ||||
| { | { | ||||
| assert(handle); | |||||
| Q_ASSERT(handle); | |||||
| if (handle && programs) | if (handle && programs) | ||||
| programs->select_program(handle, bank, program); | programs->select_program(handle, bank, program); | ||||
| } | } | ||||
| void noteOn(uint8_t note, uint8_t velo) | |||||
| void noteOn(const uint8_t channel, const uint8_t note, const uint8_t velo) | |||||
| { | { | ||||
| assert(handle && descriptor); | |||||
| Q_ASSERT(handle && descriptor); | |||||
| // FIXME | |||||
| if (handle && descriptor && descriptor->port_event) | if (handle && descriptor && descriptor->port_event) | ||||
| { | { | ||||
| uint8_t buf[3] = { 0x90, note, velo }; | |||||
| uint8_t buf[3] = { uint8_t(0x90 + channel), note, velo }; | |||||
| descriptor->port_event(handle, 0, 3, CARLA_URI_MAP_ID_MIDI_EVENT, buf); | descriptor->port_event(handle, 0, 3, CARLA_URI_MAP_ID_MIDI_EVENT, buf); | ||||
| } | } | ||||
| } | } | ||||
| void noteOff(uint8_t note) | |||||
| void noteOff(const uint8_t channel, const uint8_t note) | |||||
| { | { | ||||
| assert(handle && descriptor); | |||||
| Q_ASSERT(handle && descriptor); | |||||
| // FIXME | |||||
| if (handle && descriptor && descriptor->port_event) | if (handle && descriptor && descriptor->port_event) | ||||
| { | { | ||||
| uint8_t buf[3] = { 0x80, note, 0 }; | |||||
| uint8_t buf[3] = { uint8_t(0x80 + channel), note, 0 }; | |||||
| descriptor->port_event(handle, 0, 3, CARLA_URI_MAP_ID_MIDI_EVENT, buf); | descriptor->port_event(handle, 0, 3, CARLA_URI_MAP_ID_MIDI_EVENT, buf); | ||||
| } | } | ||||
| } | } | ||||
| @@ -401,8 +401,8 @@ public: | |||||
| uint32_t getCustomURID(const char* const uri) | uint32_t getCustomURID(const char* const uri) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::getCustomURID(%s)", uri); | |||||
| assert(uri); | |||||
| qDebug("CarlaLv2Client::getCustomURID(%s)", uri); | |||||
| Q_ASSERT(uri); | |||||
| for (size_t i=0; i < customURIDs.size(); i++) | for (size_t i=0; i < customURIDs.size(); i++) | ||||
| { | { | ||||
| @@ -416,8 +416,8 @@ public: | |||||
| const char* getCustomURIString(LV2_URID urid) | const char* getCustomURIString(LV2_URID urid) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::getCustomURIString(%i)", urid); | |||||
| assert(urid != 0); | |||||
| qDebug("CarlaLv2Client::getCustomURIString(%i)", urid); | |||||
| Q_ASSERT(urid != 0); | |||||
| if (urid < customURIDs.size()) | if (urid < customURIDs.size()) | ||||
| return customURIDs[urid]; | return customURIDs[urid]; | ||||
| @@ -427,14 +427,14 @@ public: | |||||
| void handleTransferAtom(const char* const type, const char* const value) | void handleTransferAtom(const char* const type, const char* const value) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::handleTransferEvent(%s, %s)", type, value); | |||||
| qDebug("CarlaLv2Client::handleTransferEvent(%s, %s)", type, value); | |||||
| Q_ASSERT(type); | Q_ASSERT(type); | ||||
| Q_ASSERT(value); | Q_ASSERT(value); | ||||
| } | } | ||||
| void handleTransferEvent(const char* const type, const char* const value) | void handleTransferEvent(const char* const type, const char* const value) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::handleTransferEvent(%s, %s)", type, value); | |||||
| qDebug("CarlaLv2Client::handleTransferEvent(%s, %s)", type, value); | |||||
| Q_ASSERT(type); | Q_ASSERT(type); | ||||
| Q_ASSERT(value); | Q_ASSERT(value); | ||||
| @@ -486,7 +486,7 @@ public: | |||||
| uint32_t handleUiPortMap(const char* const symbol) | uint32_t handleUiPortMap(const char* const symbol) | ||||
| { | { | ||||
| assert(symbol); | |||||
| Q_ASSERT(symbol); | |||||
| for (uint32_t i=0; i < rdf_descriptor->PortCount; i++) | for (uint32_t i=0; i < rdf_descriptor->PortCount; i++) | ||||
| { | { | ||||
| @@ -500,8 +500,8 @@ public: | |||||
| int handleUiResize(int width, int height) | int handleUiResize(int width, int height) | ||||
| { | { | ||||
| assert(width > 0); | |||||
| assert(height > 0); | |||||
| Q_ASSERT(width > 0); | |||||
| Q_ASSERT(height > 0); | |||||
| quequeMessage(MESSAGE_RESIZE_GUI, width, height, 0.0); | quequeMessage(MESSAGE_RESIZE_GUI, width, height, 0.0); | ||||
| @@ -513,7 +513,7 @@ public: | |||||
| { | { | ||||
| if (format == 0) | if (format == 0) | ||||
| { | { | ||||
| assert(bufferSize == sizeof(float)); | |||||
| Q_ASSERT(bufferSize == sizeof(float)); | |||||
| if (bufferSize == sizeof(float)) | if (bufferSize == sizeof(float)) | ||||
| { | { | ||||
| @@ -548,18 +548,18 @@ public: | |||||
| static uint32_t carla_lv2_event_ref(LV2_Event_Callback_Data callback_data, LV2_Event* event) | static uint32_t carla_lv2_event_ref(LV2_Event_Callback_Data callback_data, LV2_Event* event) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_event_ref(%p, %p)", callback_data, event); | |||||
| assert(callback_data); | |||||
| assert(event); | |||||
| qDebug("CarlaLv2Client::carla_lv2_event_ref(%p, %p)", callback_data, event); | |||||
| Q_ASSERT(callback_data); | |||||
| Q_ASSERT(event); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static uint32_t carla_lv2_event_unref(LV2_Event_Callback_Data callback_data, LV2_Event* event) | static uint32_t carla_lv2_event_unref(LV2_Event_Callback_Data callback_data, LV2_Event* event) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_event_unref(%p, %p)", callback_data, event); | |||||
| assert(callback_data); | |||||
| assert(event); | |||||
| qDebug("CarlaLv2Client::carla_lv2_event_unref(%p, %p)", callback_data, event); | |||||
| Q_ASSERT(callback_data); | |||||
| Q_ASSERT(event); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -568,9 +568,9 @@ public: | |||||
| static int carla_lv2_log_printf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...) | static int carla_lv2_log_printf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_log_printf(%p, %i, %s, ...)", handle, type, fmt); | |||||
| assert(handle); | |||||
| assert(type > 0); | |||||
| qDebug("CarlaLv2Client::carla_lv2_log_printf(%p, %i, %s, ...)", handle, type, fmt); | |||||
| Q_ASSERT(handle); | |||||
| Q_ASSERT(type > 0); | |||||
| #ifndef DEBUG | #ifndef DEBUG | ||||
| if (type == CARLA_URI_MAP_ID_LOG_TRACE) | if (type == CARLA_URI_MAP_ID_LOG_TRACE) | ||||
| @@ -587,9 +587,9 @@ public: | |||||
| static int carla_lv2_log_vprintf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, va_list ap) | static int carla_lv2_log_vprintf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, va_list ap) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_log_vprintf(%p, %i, %s, ...)", handle, type, fmt); | |||||
| assert(handle); | |||||
| assert(type > 0); | |||||
| qDebug("CarlaLv2Client::carla_lv2_log_vprintf(%p, %i, %s, ...)", handle, type, fmt); | |||||
| Q_ASSERT(handle); | |||||
| Q_ASSERT(type > 0); | |||||
| #ifndef DEBUG | #ifndef DEBUG | ||||
| if (type == CARLA_URI_MAP_ID_LOG_TRACE) | if (type == CARLA_URI_MAP_ID_LOG_TRACE) | ||||
| @@ -627,10 +627,10 @@ public: | |||||
| static void carla_lv2_program_changed(LV2_Programs_Handle handle, int32_t index) | static void carla_lv2_program_changed(LV2_Programs_Handle handle, int32_t index) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_program_changed(%p, %i)", handle, index); | |||||
| assert(handle); | |||||
| qDebug("CarlaLv2Client::carla_lv2_program_changed(%p, %i)", handle, index); | |||||
| Q_ASSERT(handle); | |||||
| CarlaBridgeLv2Client* const client = (CarlaBridgeLv2Client*)handle; | |||||
| CarlaLv2Client* const client = (CarlaLv2Client*)handle; | |||||
| client->handleProgramChanged(index); | client->handleProgramChanged(index); | ||||
| } | } | ||||
| @@ -638,9 +638,9 @@ public: | |||||
| static char* carla_lv2_state_make_path(LV2_State_Make_Path_Handle handle, const char* path) | static char* carla_lv2_state_make_path(LV2_State_Make_Path_Handle handle, const char* path) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_state_make_path(%p, %p)", handle, path); | |||||
| assert(handle); | |||||
| assert(path); | |||||
| qDebug("CarlaLv2Client::carla_lv2_state_make_path(%p, %p)", handle, path); | |||||
| Q_ASSERT(handle); | |||||
| Q_ASSERT(path); | |||||
| QDir dir; | QDir dir; | ||||
| dir.mkpath(path); | dir.mkpath(path); | ||||
| @@ -649,9 +649,9 @@ public: | |||||
| static char* carla_lv2_state_map_abstract_path(LV2_State_Map_Path_Handle handle, const char* absolute_path) | static char* carla_lv2_state_map_abstract_path(LV2_State_Map_Path_Handle handle, const char* absolute_path) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_state_map_abstract_path(%p, %p)", handle, absolute_path); | |||||
| assert(handle); | |||||
| assert(absolute_path); | |||||
| qDebug("CarlaLv2Client::carla_lv2_state_map_abstract_path(%p, %p)", handle, absolute_path); | |||||
| Q_ASSERT(handle); | |||||
| Q_ASSERT(absolute_path); | |||||
| QDir dir(absolute_path); | QDir dir(absolute_path); | ||||
| return strdup(dir.canonicalPath().toUtf8().constData()); | return strdup(dir.canonicalPath().toUtf8().constData()); | ||||
| @@ -659,9 +659,9 @@ public: | |||||
| static char* carla_lv2_state_map_absolute_path(LV2_State_Map_Path_Handle handle, const char* abstract_path) | static char* carla_lv2_state_map_absolute_path(LV2_State_Map_Path_Handle handle, const char* abstract_path) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_state_map_absolute_path(%p, %p)", handle, abstract_path); | |||||
| assert(handle); | |||||
| assert(abstract_path); | |||||
| qDebug("CarlaLv2Client::carla_lv2_state_map_absolute_path(%p, %p)", handle, abstract_path); | |||||
| Q_ASSERT(handle); | |||||
| Q_ASSERT(abstract_path); | |||||
| QDir dir(abstract_path); | QDir dir(abstract_path); | ||||
| return strdup(dir.absolutePath().toUtf8().constData()); | return strdup(dir.absolutePath().toUtf8().constData()); | ||||
| @@ -671,7 +671,7 @@ public: | |||||
| static uint32_t carla_lv2_uri_to_id(LV2_URI_Map_Callback_Data data, const char* map, const char* uri) | static uint32_t carla_lv2_uri_to_id(LV2_URI_Map_Callback_Data data, const char* map, const char* uri) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_uri_to_id(%p, %s, %s)", data, map, uri); | |||||
| qDebug("CarlaLv2Client::carla_lv2_uri_to_id(%p, %s, %s)", data, map, uri); | |||||
| return carla_lv2_urid_map(data, uri); | return carla_lv2_urid_map(data, uri); | ||||
| } | } | ||||
| @@ -679,9 +679,9 @@ public: | |||||
| static LV2_URID carla_lv2_urid_map(LV2_URID_Map_Handle handle, const char* uri) | static LV2_URID carla_lv2_urid_map(LV2_URID_Map_Handle handle, const char* uri) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_urid_map(%p, %s)", handle, uri); | |||||
| assert(handle); | |||||
| assert(uri); | |||||
| qDebug("CarlaLv2Client::carla_lv2_urid_map(%p, %s)", handle, uri); | |||||
| Q_ASSERT(handle); | |||||
| Q_ASSERT(uri); | |||||
| // Atom types | // Atom types | ||||
| if (strcmp(uri, LV2_ATOM__Chunk) == 0) | if (strcmp(uri, LV2_ATOM__Chunk) == 0) | ||||
| @@ -712,15 +712,15 @@ public: | |||||
| return CARLA_URI_MAP_ID_MIDI_EVENT; | return CARLA_URI_MAP_ID_MIDI_EVENT; | ||||
| // Custom types | // Custom types | ||||
| CarlaBridgeLv2Client* const client = (CarlaBridgeLv2Client*)handle; | |||||
| CarlaLv2Client* const client = (CarlaLv2Client*)handle; | |||||
| return client->getCustomURID(uri); | return client->getCustomURID(uri); | ||||
| } | } | ||||
| static const char* carla_lv2_urid_unmap(LV2_URID_Map_Handle handle, LV2_URID urid) | static const char* carla_lv2_urid_unmap(LV2_URID_Map_Handle handle, LV2_URID urid) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_urid_unmap(%p, %i)", handle, urid); | |||||
| assert(handle); | |||||
| assert(urid > 0); | |||||
| qDebug("CarlaLv2Client::carla_lv2_urid_unmap(%p, %i)", handle, urid); | |||||
| Q_ASSERT(handle); | |||||
| Q_ASSERT(urid > 0); | |||||
| // Atom types | // Atom types | ||||
| if (urid == CARLA_URI_MAP_ID_ATOM_CHUNK) | if (urid == CARLA_URI_MAP_ID_ATOM_CHUNK) | ||||
| @@ -751,7 +751,7 @@ public: | |||||
| return LV2_MIDI__MidiEvent; | return LV2_MIDI__MidiEvent; | ||||
| // Custom types | // Custom types | ||||
| CarlaBridgeLv2Client* const client = (CarlaBridgeLv2Client*)handle; | |||||
| CarlaLv2Client* const client = (CarlaLv2Client*)handle; | |||||
| return client->getCustomURIString(urid); | return client->getCustomURIString(urid); | ||||
| } | } | ||||
| @@ -759,10 +759,10 @@ public: | |||||
| static uint32_t carla_lv2_ui_port_map(LV2UI_Feature_Handle handle, const char* symbol) | static uint32_t carla_lv2_ui_port_map(LV2UI_Feature_Handle handle, const char* symbol) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_ui_port_map(%p, %s)", handle, symbol); | |||||
| assert(handle); | |||||
| qDebug("CarlaLv2Client::carla_lv2_ui_port_map(%p, %s)", handle, symbol); | |||||
| Q_ASSERT(handle); | |||||
| CarlaBridgeLv2Client* const client = (CarlaBridgeLv2Client*)handle; | |||||
| CarlaLv2Client* const client = (CarlaLv2Client*)handle; | |||||
| return client->handleUiPortMap(symbol); | return client->handleUiPortMap(symbol); | ||||
| } | } | ||||
| @@ -771,10 +771,10 @@ public: | |||||
| static int carla_lv2_ui_resize(LV2UI_Feature_Handle handle, int width, int height) | static int carla_lv2_ui_resize(LV2UI_Feature_Handle handle, int width, int height) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_ui_resize(%p, %i, %i)", handle, width, height); | |||||
| assert(handle); | |||||
| qDebug("CarlaLv2Client::carla_lv2_ui_resize(%p, %i, %i)", handle, width, height); | |||||
| Q_ASSERT(handle); | |||||
| CarlaBridgeLv2Client* const client = (CarlaBridgeLv2Client*)handle; | |||||
| CarlaLv2Client* const client = (CarlaLv2Client*)handle; | |||||
| return client->handleUiResize(width, height); | return client->handleUiResize(width, height); | ||||
| } | } | ||||
| @@ -782,10 +782,10 @@ public: | |||||
| static void carla_lv2_ui_write_function(LV2UI_Controller controller, uint32_t port_index, uint32_t buffer_size, uint32_t format, const void* buffer) | static void carla_lv2_ui_write_function(LV2UI_Controller controller, uint32_t port_index, uint32_t buffer_size, uint32_t format, const void* buffer) | ||||
| { | { | ||||
| qDebug("CarlaBridgeLv2Client::carla_lv2_ui_write_function(%p, %i, %i, %i, %p)", controller, port_index, buffer_size, format, buffer); | |||||
| assert(controller); | |||||
| qDebug("CarlaLv2Client::carla_lv2_ui_write_function(%p, %i, %i, %i, %p)", controller, port_index, buffer_size, format, buffer); | |||||
| Q_ASSERT(controller); | |||||
| CarlaBridgeLv2Client* const client = (CarlaBridgeLv2Client*)controller; | |||||
| CarlaLv2Client* const client = (CarlaLv2Client*)controller; | |||||
| client->handleUiWrite(port_index, buffer_size, format, buffer); | client->handleUiWrite(port_index, buffer_size, format, buffer); | ||||
| } | } | ||||
| @@ -808,9 +808,9 @@ private: | |||||
| std::vector<const char*> customURIDs; | std::vector<const char*> customURIDs; | ||||
| }; | }; | ||||
| int CarlaBridgeOsc::handle_lv2_transfer_atom(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| int CarlaOsc::handleMsgLv2TransferAtom(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | { | ||||
| qDebug("CarlaBridgeOsc::handle_lv2_atom_transfer()"); | |||||
| qDebug("CarlaOsc::handle_lv2_atom_transfer()"); | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ss"); | CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ss"); | ||||
| if (! client) | if (! client) | ||||
| @@ -819,15 +819,15 @@ int CarlaBridgeOsc::handle_lv2_transfer_atom(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| const char* type = (const char*)&argv[0]->s; | const char* type = (const char*)&argv[0]->s; | ||||
| const char* value = (const char*)&argv[2]->s; | const char* value = (const char*)&argv[2]->s; | ||||
| CarlaBridgeLv2Client* const lv2client = (CarlaBridgeLv2Client*)client; | |||||
| CarlaLv2Client* const lv2client = (CarlaLv2Client*)client; | |||||
| lv2client->handleTransferAtom(type, value); | lv2client->handleTransferAtom(type, value); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| int CarlaBridgeOsc::handle_lv2_transfer_event(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| int CarlaOsc::handleMsgLv2TransferEvent(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| { | { | ||||
| qDebug("CarlaBridgeOsc::handle_lv2_event_transfer()"); | |||||
| qDebug("CarlaOsc::handle_lv2_event_transfer()"); | |||||
| CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ss"); | CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ss"); | ||||
| if (! client) | if (! client) | ||||
| @@ -836,7 +836,7 @@ int CarlaBridgeOsc::handle_lv2_transfer_event(CARLA_BRIDGE_OSC_HANDLE_ARGS) | |||||
| const char* type = (const char*)&argv[0]->s; | const char* type = (const char*)&argv[0]->s; | ||||
| const char* value = (const char*)&argv[2]->s; | const char* value = (const char*)&argv[2]->s; | ||||
| CarlaBridgeLv2Client* lv2client = (CarlaBridgeLv2Client*)client; | |||||
| CarlaLv2Client* const lv2client = (CarlaLv2Client*)client; | |||||
| lv2client->handleTransferEvent(type, value); | lv2client->handleTransferEvent(type, value); | ||||
| return 0; | return 0; | ||||
| @@ -860,11 +860,11 @@ int main(int argc, char* argv[]) | |||||
| using namespace CarlaBridge; | using namespace CarlaBridge; | ||||
| // Init toolkit | // Init toolkit | ||||
| CarlaBridgeToolkit* const toolkit = CarlaBridgeToolkit::createNew(ui_title); | |||||
| CarlaToolkit* const toolkit = CarlaToolkit::createNew(ui_title); | |||||
| toolkit->init(); | toolkit->init(); | ||||
| // Init LV2-UI | // Init LV2-UI | ||||
| CarlaBridgeLv2Client client(toolkit); | |||||
| CarlaLv2Client client(toolkit); | |||||
| // Init OSC | // Init OSC | ||||
| if (! client.oscInit(osc_url)) | if (! client.oscInit(osc_url)) | ||||
| @@ -901,3 +901,5 @@ int main(int argc, char* argv[]) | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| #endif | |||||
| @@ -15,24 +15,35 @@ | |||||
| * For a full copy of the GNU General Public License see the COPYING file | * For a full copy of the GNU General Public License see the COPYING file | ||||
| */ | */ | ||||
| #ifdef BRIDGE_VST | |||||
| #include "carla_bridge_client.h" | #include "carla_bridge_client.h" | ||||
| #include "carla_vst.h" | #include "carla_vst.h" | ||||
| #include "carla_midi.h" | #include "carla_midi.h" | ||||
| #include <QtGui/QDialog> | #include <QtGui/QDialog> | ||||
| CARLA_BRIDGE_START_NAMESPACE; | |||||
| CARLA_BRIDGE_START_NAMESPACE | |||||
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- | ||||
| #define FAKE_SAMPLE_RATE 44100.0 | #define FAKE_SAMPLE_RATE 44100.0 | ||||
| #define FAKE_BUFFER_SIZE 512 | #define FAKE_BUFFER_SIZE 512 | ||||
| class CarlaBridgeVstClient : public CarlaBridgeClient | |||||
| void* getPointer(const quintptr addr) | |||||
| { | |||||
| Q_ASSERT(addr != 0); | |||||
| qDebug("getPointer(" P_UINTPTR ")", addr); | |||||
| quintptr* const ptr = (quintptr*)addr; | |||||
| return (void*)ptr; | |||||
| } | |||||
| class CarlaVstClient : public CarlaClient | |||||
| { | { | ||||
| public: | public: | ||||
| CarlaBridgeVstClient(CarlaBridgeToolkit* const toolkit) | |||||
| : CarlaBridgeClient(toolkit) | |||||
| CarlaVstClient(CarlaToolkit* const toolkit) | |||||
| : CarlaClient(toolkit) | |||||
| { | { | ||||
| effect = nullptr; | effect = nullptr; | ||||
| widget = new QDialog; | widget = new QDialog; | ||||
| @@ -41,14 +52,14 @@ public: | |||||
| unique1 = unique2 = rand(); | unique1 = unique2 = rand(); | ||||
| } | } | ||||
| ~CarlaBridgeVstClient() | |||||
| ~CarlaVstClient() | |||||
| { | { | ||||
| // make client invalid | // make client invalid | ||||
| unique2 += 1; | unique2 += 1; | ||||
| } | } | ||||
| // --------------------------------------------------------------------- | // --------------------------------------------------------------------- | ||||
| // initialization | |||||
| // ui initialization | |||||
| bool init(const char* binary, const char*) | bool init(const char* binary, const char*) | ||||
| { | { | ||||
| @@ -135,15 +146,15 @@ public: | |||||
| effect->dispatcher(effect, effSetProgram, 0, index, nullptr, 0.0f); | effect->dispatcher(effect, effSetProgram, 0, index, nullptr, 0.0f); | ||||
| } | } | ||||
| void setMidiProgram(uint32_t, uint32_t) | |||||
| void setMidiProgram(const uint32_t, const uint32_t) | |||||
| { | { | ||||
| } | } | ||||
| void noteOn(uint8_t, uint8_t) | |||||
| void noteOn(const uint8_t, const uint8_t, const uint8_t) | |||||
| { | { | ||||
| } | } | ||||
| void noteOff(uint8_t) | |||||
| void noteOff(const uint8_t, const uint8_t) | |||||
| { | { | ||||
| } | } | ||||
| @@ -170,16 +181,16 @@ public: | |||||
| static intptr_t VstHostCallback(AEffect* effect, int32_t opcode, int32_t index, intptr_t value, void* ptr, float opt) | static intptr_t VstHostCallback(AEffect* effect, int32_t opcode, int32_t index, intptr_t value, void* ptr, float opt) | ||||
| { | { | ||||
| // Check if 'resvd1' points to this client | // Check if 'resvd1' points to this client | ||||
| CarlaBridgeVstClient* self = nullptr; | |||||
| CarlaVstClient* self = nullptr; | |||||
| #ifdef VESTIGE_HEADER | #ifdef VESTIGE_HEADER | ||||
| if (effect && effect->ptr1) | if (effect && effect->ptr1) | ||||
| { | { | ||||
| self = (CarlaBridgeVstClient*)effect->ptr1; | |||||
| self = (CarlaVstClient*)effect->ptr1; | |||||
| #else | #else | ||||
| if (effect && effect->resvd1) | if (effect && effect->resvd1) | ||||
| { | { | ||||
| self = (CarlaBridgeVstClient*)getPointer(effect->resvd1); | |||||
| self = (CarlaVstClient*)getPointer(effect->resvd1); | |||||
| #endif | #endif | ||||
| if (self->unique1 != self->unique2) | if (self->unique1 != self->unique2) | ||||
| self = nullptr; | self = nullptr; | ||||
| @@ -319,7 +330,7 @@ public: | |||||
| default: | default: | ||||
| #if DEBUG | #if DEBUG | ||||
| qDebug("VstHostCallback() - code: %s, index: %i, value: " P_INTPTR ", opt: %f", VstOpcode2str(opcode), index, value, opt); | |||||
| qDebug("VstHostCallback() - code: %s, index: %i, value: " P_INTPTR ", opt: %f", VstMasterOpcode2str(opcode), index, value, opt); | |||||
| #endif | #endif | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -351,11 +362,11 @@ int main(int argc, char* argv[]) | |||||
| using namespace CarlaBridge; | using namespace CarlaBridge; | ||||
| // Init toolkit | // Init toolkit | ||||
| CarlaBridgeToolkit* const toolkit = CarlaBridgeToolkit::createNew(ui_title); | |||||
| CarlaToolkit* const toolkit = CarlaToolkit::createNew(ui_title); | |||||
| toolkit->init(); | toolkit->init(); | ||||
| // Init VST-UI | // Init VST-UI | ||||
| CarlaBridgeVstClient client(toolkit); | |||||
| CarlaVstClient client(toolkit); | |||||
| // Init OSC | // Init OSC | ||||
| if (! client.oscInit(osc_url)) | if (! client.oscInit(osc_url)) | ||||
| @@ -392,3 +403,5 @@ int main(int argc, char* argv[]) | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| #endif | |||||
| @@ -32,8 +32,9 @@ INCLUDEPATH = .. \ | |||||
| LIBS = \ | LIBS = \ | ||||
| ../../carla-lilv/carla_lilv.a | ../../carla-lilv/carla_lilv.a | ||||
| DEFINES = DEBUG | |||||
| DEFINES = QTCREATOR_TEST | |||||
| DEFINES += BUILD_BRIDGE BUILD_BRIDGE_UI BRIDGE_LV2 BRIDGE_LV2_GTK2 | DEFINES += BUILD_BRIDGE BUILD_BRIDGE_UI BRIDGE_LV2 BRIDGE_LV2_GTK2 | ||||
| DEFINES += QTCREATOR_TEST | |||||
| DEFINES += DEBUG | |||||
| QMAKE_CXXFLAGS *= -std=c++0x | QMAKE_CXXFLAGS *= -std=c++0x | ||||