@@ -845,7 +845,7 @@ public: | |||
/*! | |||
* Get plugin with id \a id. | |||
*/ | |||
CarlaPlugin* getPlugin(const unsigned int id); | |||
CarlaPlugin* getPlugin(const unsigned int id) const; | |||
/*! | |||
* Get plugin with id \a id, faster unchecked version. | |||
@@ -854,7 +854,7 @@ public: | |||
/*! | |||
* Get a unique plugin name within the engine.\n | |||
* Returned variable must NOT be free'd. | |||
* Returned variable must be deleted if non-NULL. | |||
*/ | |||
const char* getUniquePluginName(const char* const name) const; | |||
@@ -992,7 +992,7 @@ public: | |||
/*! | |||
* Set last error. | |||
*/ | |||
void setLastError(const char* const error); | |||
void setLastError(const char* const error) const; | |||
// ------------------------------------------------------------------- | |||
// Misc | |||
@@ -1045,7 +1045,7 @@ public: | |||
/*! | |||
* Set OSC bridge data. | |||
*/ | |||
void setOscBridgeData(const CarlaOscData* const oscData) noexcept; | |||
void setOscBridgeData(const CarlaOscData* const oscData) const noexcept; | |||
#endif | |||
// ------------------------------------------------------------------- | |||
@@ -1165,54 +1165,54 @@ private: | |||
// Bridge/Controller OSC stuff | |||
public: | |||
#ifdef BUILD_BRIDGE | |||
void oscSend_bridge_plugin_info1(const PluginType type, const PluginCategory category, const uint hints, const long uniqueId); | |||
void oscSend_bridge_plugin_info2(const char* const realName, const char* const label, const char* const maker, const char* const copyright); | |||
void oscSend_bridge_audio_count(const uint32_t ins, const uint32_t outs); | |||
void oscSend_bridge_midi_count(const uint32_t ins, const uint32_t outs); | |||
void oscSend_bridge_parameter_count(const uint32_t ins, const uint32_t outs); | |||
void oscSend_bridge_program_count(const uint32_t count); | |||
void oscSend_bridge_midi_program_count(const uint32_t count); | |||
void oscSend_bridge_parameter_data(const uint32_t index, const int32_t rindex, const ParameterType type, const uint hints, const char* const name, const char* const unit); | |||
void oscSend_bridge_parameter_ranges1(const uint32_t index, const float def, const float min, const float max); | |||
void oscSend_bridge_parameter_ranges2(const uint32_t index, const float step, const float stepSmall, const float stepLarge); | |||
void oscSend_bridge_set_parameter_midi_cc(const uint32_t index, const int16_t cc); | |||
void oscSend_bridge_set_parameter_midi_channel(const uint32_t index, const uint8_t channel); | |||
void oscSend_bridge_set_parameter_value(const int32_t index, const float value); // may be used for internal params (< 0) | |||
void oscSend_bridge_set_default_value(const uint32_t index, const float value); | |||
void oscSend_bridge_set_current_program(const int32_t index); | |||
void oscSend_bridge_set_current_midi_program(const int32_t index); | |||
void oscSend_bridge_program_name(const uint32_t index, const char* const name); | |||
void oscSend_bridge_midi_program_data(const uint32_t index, const uint32_t bank, const uint32_t program, const char* const name); | |||
void oscSend_bridge_configure(const char* const key, const char* const value); | |||
void oscSend_bridge_set_custom_data(const char* const type, const char* const key, const char* const value); | |||
void oscSend_bridge_set_chunk_data(const char* const chunkFile); | |||
void oscSend_bridge_set_peaks(); | |||
void oscSend_bridge_plugin_info1(const PluginCategory category, const uint hints, const long uniqueId) const; | |||
void oscSend_bridge_plugin_info2(const char* const realName, const char* const label, const char* const maker, const char* const copyright) const; | |||
void oscSend_bridge_audio_count(const uint32_t ins, const uint32_t outs) const; | |||
void oscSend_bridge_midi_count(const uint32_t ins, const uint32_t outs) const; | |||
void oscSend_bridge_parameter_count(const uint32_t ins, const uint32_t outs) const; | |||
void oscSend_bridge_program_count(const uint32_t count) const; | |||
void oscSend_bridge_midi_program_count(const uint32_t count) const; | |||
void oscSend_bridge_parameter_data(const uint32_t index, const int32_t rindex, const ParameterType type, const uint hints, const char* const name, const char* const unit) const; | |||
void oscSend_bridge_parameter_ranges1(const uint32_t index, const float def, const float min, const float max) const; | |||
void oscSend_bridge_parameter_ranges2(const uint32_t index, const float step, const float stepSmall, const float stepLarge) const; | |||
void oscSend_bridge_parameter_midi_cc(const uint32_t index, const int16_t cc) const; | |||
void oscSend_bridge_parameter_midi_channel(const uint32_t index, const uint8_t channel) const; | |||
void oscSend_bridge_parameter_value(const int32_t index, const float value) const; // may be used for internal params (< 0) | |||
void oscSend_bridge_default_value(const uint32_t index, const float value) const; | |||
void oscSend_bridge_current_program(const int32_t index) const; | |||
void oscSend_bridge_current_midi_program(const int32_t index) const; | |||
void oscSend_bridge_program_name(const uint32_t index, const char* const name) const; | |||
void oscSend_bridge_midi_program_data(const uint32_t index, const uint32_t bank, const uint32_t program, const char* const name) const; | |||
void oscSend_bridge_configure(const char* const key, const char* const value) const; | |||
void oscSend_bridge_set_custom_data(const char* const type, const char* const key, const char* const value) const; | |||
void oscSend_bridge_set_chunk_data(const char* const chunkFile) const; | |||
void oscSend_bridge_set_peaks() const; | |||
#else | |||
void oscSend_control_add_plugin_start(const uint pluginId, const char* const pluginName); | |||
void oscSend_control_add_plugin_end(const uint pluginId); | |||
void oscSend_control_remove_plugin(const uint pluginId); | |||
void oscSend_control_set_plugin_info1(const uint pluginId, const PluginType type, const PluginCategory category, const uint hints, const long uniqueId); | |||
void oscSend_control_set_plugin_info2(const uint pluginId, const char* const realName, const char* const label, const char* const maker, const char* const copyright); | |||
void oscSend_control_set_audio_count(const uint pluginId, const uint32_t ins, const uint32_t outs); | |||
void oscSend_control_set_midi_count(const uint pluginId, const uint32_t ins, const uint32_t outs); | |||
void oscSend_control_set_parameter_count(const uint pluginId, const uint32_t ins, const uint32_t outs); | |||
void oscSend_control_set_program_count(const uint pluginId, const uint32_t count); | |||
void oscSend_control_set_midi_program_count(const uint pluginId, const uint32_t count); | |||
void oscSend_control_set_parameter_data(const uint pluginId, const uint32_t index, const ParameterType type, const uint hints, const char* const name, const char* const unit); | |||
void oscSend_control_set_parameter_ranges1(const uint pluginId, const uint32_t index, const float def, const float min, const float max); | |||
void oscSend_control_set_parameter_ranges2(const uint pluginId, const uint32_t index, const float step, const float stepSmall, const float stepLarge); | |||
void oscSend_control_set_parameter_midi_cc(const uint pluginId, const uint32_t index, const int16_t cc); | |||
void oscSend_control_set_parameter_midi_channel(const uint pluginId, const uint32_t index, const uint8_t channel); | |||
void oscSend_control_set_parameter_value(const uint pluginId, const int32_t index, const float value); // may be used for internal params (< 0) | |||
void oscSend_control_set_default_value(const uint pluginId, const uint32_t index, const float value); | |||
void oscSend_control_set_current_program(const uint pluginId, const int32_t index); | |||
void oscSend_control_set_current_midi_program(const uint pluginId, const int32_t index); | |||
void oscSend_control_set_program_name(const uint pluginId, const uint32_t index, const char* const name); | |||
void oscSend_control_set_midi_program_data(const uint pluginId, const uint32_t index, const uint32_t bank, const uint32_t program, const char* const name); | |||
void oscSend_control_note_on(const uint pluginId, const uint8_t channel, const uint8_t note, const uint8_t velo); | |||
void oscSend_control_note_off(const uint pluginId, const uint8_t channel, const uint8_t note); | |||
void oscSend_control_set_peaks(const uint pluginId); | |||
void oscSend_control_exit(); | |||
void oscSend_control_add_plugin_start(const uint pluginId, const char* const pluginName) const; | |||
void oscSend_control_add_plugin_end(const uint pluginId) const; | |||
void oscSend_control_remove_plugin(const uint pluginId) const; | |||
void oscSend_control_set_plugin_info1(const uint pluginId, const PluginType type, const PluginCategory category, const uint hints, const long uniqueId) const; | |||
void oscSend_control_set_plugin_info2(const uint pluginId, const char* const realName, const char* const label, const char* const maker, const char* const copyright) const; | |||
void oscSend_control_set_audio_count(const uint pluginId, const uint32_t ins, const uint32_t outs) const; | |||
void oscSend_control_set_midi_count(const uint pluginId, const uint32_t ins, const uint32_t outs) const; | |||
void oscSend_control_set_parameter_count(const uint pluginId, const uint32_t ins, const uint32_t outs) const; | |||
void oscSend_control_set_program_count(const uint pluginId, const uint32_t count) const; | |||
void oscSend_control_set_midi_program_count(const uint pluginId, const uint32_t count) const; | |||
void oscSend_control_set_parameter_data(const uint pluginId, const uint32_t index, const ParameterType type, const uint hints, const char* const name, const char* const unit) const; | |||
void oscSend_control_set_parameter_ranges1(const uint pluginId, const uint32_t index, const float def, const float min, const float max) const; | |||
void oscSend_control_set_parameter_ranges2(const uint pluginId, const uint32_t index, const float step, const float stepSmall, const float stepLarge) const; | |||
void oscSend_control_set_parameter_midi_cc(const uint pluginId, const uint32_t index, const int16_t cc) const; | |||
void oscSend_control_set_parameter_midi_channel(const uint pluginId, const uint32_t index, const uint8_t channel) const; | |||
void oscSend_control_set_parameter_value(const uint pluginId, const int32_t index, const float value) const; // may be used for internal params (< 0) | |||
void oscSend_control_set_default_value(const uint pluginId, const uint32_t index, const float value) const; | |||
void oscSend_control_set_current_program(const uint pluginId, const int32_t index) const; | |||
void oscSend_control_set_current_midi_program(const uint pluginId, const int32_t index) const; | |||
void oscSend_control_set_program_name(const uint pluginId, const uint32_t index, const char* const name) const; | |||
void oscSend_control_set_midi_program_data(const uint pluginId, const uint32_t index, const uint32_t bank, const uint32_t program, const char* const name) const; | |||
void oscSend_control_note_on(const uint pluginId, const uint8_t channel, const uint8_t note, const uint8_t velo) const; | |||
void oscSend_control_note_off(const uint pluginId, const uint8_t channel, const uint8_t note) const; | |||
void oscSend_control_set_peaks(const uint pluginId) const; | |||
void oscSend_control_exit() const; | |||
#endif | |||
CARLA_DECLARE_NON_COPY_CLASS(CarlaEngine) | |||
@@ -616,6 +616,7 @@ CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName) | |||
if (std::strcmp(driverName, "JACK") == 0) | |||
return newJack(); | |||
#ifndef BUILD_BRIDGE | |||
// common | |||
if (std::strncmp(driverName, "JACK ", 5) == 0) | |||
return newRtAudio(AUDIO_API_JACK); | |||
@@ -637,6 +638,7 @@ CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName) | |||
return newRtAudio(AUDIO_API_ASIO); | |||
if (std::strcmp(driverName, "DirectSound") == 0) | |||
return newRtAudio(AUDIO_API_DS); | |||
#endif | |||
carla_stderr("CarlaEngine::newDriverByName(\"%s\") - invalid driver name", driverName); | |||
return nullptr; | |||
@@ -718,6 +720,9 @@ bool CarlaEngine::init(const char* const clientName) | |||
pData->plugins = new EnginePluginData[pData->maxPluginNumber]; | |||
for (uint i=0; i < pData->maxPluginNumber; ++i) | |||
pData->plugins[i].clear(); | |||
pData->osc.init(clientName); | |||
#ifndef BUILD_BRIDGE | |||
pData->oscData = pData->osc.getControlData(); | |||
@@ -1164,7 +1169,7 @@ bool CarlaEngine::switchPlugins(const unsigned int idA, const unsigned int idB) | |||
return true; | |||
} | |||
CarlaPlugin* CarlaEngine::getPlugin(const unsigned int id) | |||
CarlaPlugin* CarlaEngine::getPlugin(const unsigned int id) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN_ERRN(pData->plugins != nullptr, "Invalid engine internal data (err #38)"); | |||
CARLA_SAFE_ASSERT_RETURN_ERRN(pData->curPluginCount != 0, "Invalid engine internal data (err #39)"); | |||
@@ -1188,16 +1193,13 @@ const char* CarlaEngine::getUniquePluginName(const char* const name) const | |||
CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', nullptr); | |||
carla_debug("CarlaEngine::getUniquePluginName(\"%s\")", name); | |||
static CarlaMutex m; | |||
const CarlaMutex::ScopedLocker sl(m); | |||
static CarlaString sname; | |||
CarlaString sname; | |||
sname = name; | |||
if (sname.isEmpty()) | |||
{ | |||
sname = "(No name)"; | |||
return (const char*)sname; | |||
return sname.dup(); | |||
} | |||
sname.truncate(getMaxClientNameSize()-5-1); // 5 = strlen(" (10)") | |||
@@ -1261,7 +1263,7 @@ const char* CarlaEngine::getUniquePluginName(const char* const name) const | |||
sname += " (2)"; | |||
} | |||
return (const char*)sname; | |||
return sname.dup(); | |||
} | |||
// ----------------------------------------------------------------------- | |||
@@ -1655,7 +1657,7 @@ const char* CarlaEngine::getLastError() const noexcept | |||
return (const char*)pData->lastError; | |||
} | |||
void CarlaEngine::setLastError(const char* const error) | |||
void CarlaEngine::setLastError(const char* const error) const | |||
{ | |||
pData->lastError = error; | |||
} | |||
@@ -1675,7 +1677,7 @@ void CarlaEngine::setOption(const EngineOption option, const int value, const ch | |||
carla_debug("CarlaEngine::setOption(%i:%s, %i, \"%s\")", option, EngineOption2Str(option), value, valueStr); | |||
if (isRunning() && (option == ENGINE_OPTION_PROCESS_MODE || option == ENGINE_OPTION_AUDIO_NUM_PERIODS || option == ENGINE_OPTION_AUDIO_DEVICE)) | |||
return carla_stderr("CarlaEngine::setOption(%s, %i, \"%s\") - Cannot set this option while engine is running!", EngineOption2Str(option), value, valueStr); | |||
return carla_stderr("CarlaEngine::setOption(%i:%s, %i, \"%s\") - Cannot set this option while engine is running!", option, EngineOption2Str(option), value, valueStr); | |||
switch (option) | |||
{ | |||
@@ -1683,12 +1685,12 @@ void CarlaEngine::setOption(const EngineOption option, const int value, const ch | |||
break; | |||
case ENGINE_OPTION_PROCESS_MODE: | |||
CARLA_SAFE_ASSERT_RETURN(value >= ENGINE_PROCESS_MODE_SINGLE_CLIENT && value < ENGINE_PROCESS_MODE_BRIDGE,); | |||
CARLA_SAFE_ASSERT_RETURN(value >= ENGINE_PROCESS_MODE_SINGLE_CLIENT && value <= ENGINE_PROCESS_MODE_BRIDGE,); | |||
pData->options.processMode = static_cast<EngineProcessMode>(value); | |||
break; | |||
case ENGINE_OPTION_TRANSPORT_MODE: | |||
CARLA_SAFE_ASSERT_RETURN(value >= ENGINE_TRANSPORT_MODE_INTERNAL && value < ENGINE_TRANSPORT_MODE_BRIDGE,); | |||
CARLA_SAFE_ASSERT_RETURN(value >= ENGINE_TRANSPORT_MODE_INTERNAL && value <= ENGINE_TRANSPORT_MODE_BRIDGE,); | |||
pData->options.transportMode = static_cast<EngineTransportMode>(value); | |||
break; | |||
@@ -1797,7 +1799,7 @@ const char* CarlaEngine::getOscServerPathUDP() const noexcept | |||
} | |||
#ifdef BUILD_BRIDGE | |||
void CarlaEngine::setOscBridgeData(const CarlaOscData* const oscData) noexcept | |||
void CarlaEngine::setOscBridgeData(const CarlaOscData* const oscData) const noexcept | |||
{ | |||
pData->oscData = oscData; | |||
} | |||
@@ -2068,55 +2070,83 @@ void CarlaEngine::processPatchbay(float** inBuf, float** outBuf, const uint32_t | |||
// Bridge/Controller OSC stuff | |||
#ifdef BUILD_BRIDGE | |||
void CarlaEngine::oscSend_bridge_audio_count(const int32_t ins, const int32_t outs, const int32_t total) | |||
void CarlaEngine::oscSend_bridge_plugin_info1(const PluginCategory category, const uint hints, const long uniqueId) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_plugin_info1(%i:%s, %X, %l)", category, PluginCategory2Str(category), hints, uniqueId); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+21]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_plugin_info1"); | |||
lo_send(pData->oscData->target, targetPath, "iih", static_cast<int32_t>(category), static_cast<int32_t>(hints), static_cast<int64_t>(uniqueId)); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_plugin_info2(const char* const realName, const char* const label, const char* const maker, const char* const copyright) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(realName != nullptr && realName[0] != '\0',); | |||
CARLA_SAFE_ASSERT_RETURN(label != nullptr && label[0] != '\0',); | |||
CARLA_SAFE_ASSERT_RETURN(maker != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(copyright != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_plugin_info2(\"%s\", \"%s\", \"%s\", \"%s\")", realName, label, maker, copyright); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+21]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_plugin_info2"); | |||
lo_send(pData->oscData->target, targetPath, "ssss", realName, label, maker, copyright); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_audio_count(const uint32_t ins, const uint32_t outs) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(total >= 0 && total >= ins + outs,); | |||
carla_debug("CarlaEngine::oscSend_bridge_audio_count(%i, %i, %i)", ins, outs, total); | |||
carla_debug("CarlaEngine::oscSend_bridge_audio_count(%i, %i)", ins, outs); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+20]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_audio_count"); | |||
lo_send(pData->oscData->target, targetPath, "iii", ins, outs, total); | |||
lo_send(pData->oscData->target, targetPath, "iii", static_cast<int32_t>(ins), static_cast<int32_t>(outs)); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_midi_count(const int32_t ins, const int32_t outs, const int32_t total) | |||
void CarlaEngine::oscSend_bridge_midi_count(const uint32_t ins, const uint32_t outs) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(total >= 0 && total >= ins + outs,); | |||
carla_debug("CarlaEngine::oscSend_bridge_midi_count(%i, %i, %i)", ins, outs, total); | |||
carla_debug("CarlaEngine::oscSend_bridge_midi_count(%i, %i)", ins, outs); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+19]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_midi_count"); | |||
lo_send(pData->oscData->target, targetPath, "iii", ins, outs, total); | |||
lo_send(pData->oscData->target, targetPath, "ii", static_cast<int32_t>(ins), static_cast<int32_t>(outs)); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_parameter_count(const int32_t ins, const int32_t outs, const int32_t total) | |||
void CarlaEngine::oscSend_bridge_parameter_count(const uint32_t ins, const uint32_t outs) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(total >= 0 && total >= ins + outs,); | |||
carla_debug("CarlaEngine::oscSend_bridge_parameter_count(%i, %i, %i)", ins, outs, total); | |||
carla_debug("CarlaEngine::oscSend_bridge_parameter_count(%i, %i)", ins, outs); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+24]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_parameter_count"); | |||
lo_send(pData->oscData->target, targetPath, "iii", ins, outs, total); | |||
lo_send(pData->oscData->target, targetPath, "ii", static_cast<int32_t>(ins), static_cast<int32_t>(outs)); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_program_count(const int32_t count) | |||
void CarlaEngine::oscSend_bridge_program_count(const uint32_t count) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(count >= 0,); | |||
carla_debug("CarlaEngine::oscSend_bridge_program_count(%i)", count); | |||
if (pData->oscData->target != nullptr) | |||
@@ -2124,14 +2154,13 @@ void CarlaEngine::oscSend_bridge_program_count(const int32_t count) | |||
char targetPath[std::strlen(pData->oscData->path)+22]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_program_count"); | |||
lo_send(pData->oscData->target, targetPath, "i", count); | |||
lo_send(pData->oscData->target, targetPath, "i", static_cast<int32_t>(count)); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_midi_program_count(const int32_t count) | |||
void CarlaEngine::oscSend_bridge_midi_program_count(const uint32_t count) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(count >= 0,); | |||
carla_debug("CarlaEngine::oscSend_bridge_midi_program_count(%i)", count); | |||
if (pData->oscData->target != nullptr) | |||
@@ -2139,173 +2168,184 @@ void CarlaEngine::oscSend_bridge_midi_program_count(const int32_t count) | |||
char targetPath[std::strlen(pData->oscData->path)+27]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_midi_program_count"); | |||
lo_send(pData->oscData->target, targetPath, "i", count); | |||
lo_send(pData->oscData->target, targetPath, "i", static_cast<int32_t>(count)); | |||
} | |||
} | |||
void CarlaEngine::oscSend_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 int64_t uniqueId) | |||
void CarlaEngine::oscSend_bridge_parameter_data(const uint32_t index, const int32_t rindex, const ParameterType type, const uint hints, const char* const name, const char* const unit) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0',); | |||
CARLA_SAFE_ASSERT_RETURN(label != nullptr && label[0] != '\0',); | |||
CARLA_SAFE_ASSERT_RETURN(maker != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(copyright != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_plugin_info(%i, %i, \"%s\", \"%s\", \"%s\", \"%s\", " P_INT64 ")", category, hints, name, label, maker, copyright, uniqueId); | |||
CARLA_SAFE_ASSERT_RETURN(unit != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_parameter_data(%i, %i, %i:%s, %X, \"%s\", \"%s\")", index, rindex, type, ParameterType2Str(type), hints, name, unit); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+20]; | |||
char targetPath[std::strlen(pData->oscData->path)+23]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_plugin_info"); | |||
lo_send(pData->oscData->target, targetPath, "iissssh", category, hints, name, label, maker, copyright, uniqueId); | |||
std::strcat(targetPath, "/bridge_parameter_data"); | |||
lo_send(pData->oscData->target, targetPath, "iiiiss", static_cast<int32_t>(index), static_cast<int32_t>(rindex), static_cast<int32_t>(type), static_cast<int32_t>(hints), name, unit); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_parameter_info(const int32_t index, const char* const name, const char* const unit) | |||
void CarlaEngine::oscSend_bridge_parameter_ranges1(const uint32_t index, const float def, const float min, const float max) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0',); | |||
CARLA_SAFE_ASSERT_RETURN(unit != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_parameter_info(%i, \"%s\", \"%s\")", index, name, unit); | |||
carla_debug("CarlaEngine::oscSend_bridge_parameter_ranges(%i, %f, %f, %f)", index, def, min, max); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+23]; | |||
char targetPath[std::strlen(pData->oscData->path)+26]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_parameter_info"); | |||
lo_send(pData->oscData->target, targetPath, "iss", index, name, unit); | |||
std::strcat(targetPath, "/bridge_parameter_ranges1"); | |||
lo_send(pData->oscData->target, targetPath, "ifff", static_cast<int32_t>(index), def, min, max); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_parameter_data(const int32_t index, const int32_t rindex, const int32_t hints, const int32_t midiChannel, const int32_t midiCC) | |||
void CarlaEngine::oscSend_bridge_parameter_ranges2(const uint32_t index, const float step, const float stepSmall, const float stepLarge) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_parameter_data(%i, %i, %i, %i, %i)", index, rindex, hints, midiChannel, midiCC); | |||
carla_debug("CarlaEngine::oscSend_bridge_parameter_ranges(%i, %f, %f, %f)", index, step, stepSmall, stepLarge); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+23]; | |||
char targetPath[std::strlen(pData->oscData->path)+26]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_parameter_data"); | |||
lo_send(pData->oscData->target, targetPath, "iiiii", index, rindex, hints, midiChannel, midiCC); | |||
std::strcat(targetPath, "/bridge_parameter_ranges2"); | |||
lo_send(pData->oscData->target, targetPath, "ifff", static_cast<int32_t>(index), step, stepSmall, stepLarge); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_parameter_ranges(const int32_t index, const float def, const float min, const float max, const float step, const float stepSmall, const float stepLarge) | |||
void CarlaEngine::oscSend_bridge_parameter_midi_cc(const uint32_t index, const int16_t cc) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_parameter_ranges(%i, %f, %f, %f, %f, %f, %f)", index, def, min, max, step, stepSmall, stepLarge); | |||
carla_debug("CarlaEngine::oscSend_bridge_parameter_midi_cc(%i, %i)", index, cc); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+25]; | |||
char targetPath[std::strlen(pData->oscData->path)+26]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_parameter_ranges"); | |||
lo_send(pData->oscData->target, targetPath, "iffffff", index, def, min, max, step, stepSmall, stepLarge); | |||
std::strcat(targetPath, "/bridge_parameter_midi_cc"); | |||
lo_send(pData->oscData->target, targetPath, "ii", static_cast<int32_t>(index), static_cast<int32_t>(cc)); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_program_info(const int32_t index, const char* const name) | |||
void CarlaEngine::oscSend_bridge_parameter_midi_channel(const uint32_t index, const uint8_t channel) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_program_info(%i, \"%s\")", index, name); | |||
carla_debug("CarlaEngine::oscSend_bridge_parameter_midi_channel(%i, %i)", index, channel); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+21]; | |||
char targetPath[std::strlen(pData->oscData->path)+31]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_program_info"); | |||
lo_send(pData->oscData->target, targetPath, "is", index, name); | |||
std::strcat(targetPath, "/bridge_parameter_midi_channel"); | |||
lo_send(pData->oscData->target, targetPath, "ii", static_cast<int32_t>(index), static_cast<int32_t>(channel)); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_midi_program_info(const int32_t index, const int32_t bank, const int32_t program, const char* const label) | |||
void CarlaEngine::oscSend_bridge_parameter_value(const int32_t index, const float value) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_midi_program_info(%i, %i, %i, \"%s\")", index, bank, program, label); | |||
carla_debug("CarlaEngine::oscSend_bridge_parameter_value(%i, %f)", index, value); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+26]; | |||
char targetPath[std::strlen(pData->oscData->path)+24]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_midi_program_info"); | |||
lo_send(pData->oscData->target, targetPath, "iiis", index, bank, program, label); | |||
std::strcat(targetPath, "/bridge_parameter_value"); | |||
lo_send(pData->oscData->target, targetPath, "if", index, value); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_configure(const char* const key, const char* const value) | |||
void CarlaEngine::oscSend_bridge_default_value(const uint32_t index, const float value) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); | |||
CARLA_SAFE_ASSERT_RETURN(value != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_configure(\"%s\", \"%s\")", key, value); | |||
carla_debug("CarlaEngine::oscSend_bridge_default_value(%i, %f)", index, value); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+18]; | |||
char targetPath[std::strlen(pData->oscData->path)+22]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_configure"); | |||
lo_send(pData->oscData->target, targetPath, "ss", key, value); | |||
std::strcat(targetPath, "/bridge_default_value"); | |||
lo_send(pData->oscData->target, targetPath, "if", static_cast<int32_t>(index), value); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_set_parameter_value(const int32_t index, const float value) | |||
void CarlaEngine::oscSend_bridge_current_program(const int32_t index) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_set_parameter_value(%i, %f)", index, value); | |||
carla_debug("CarlaEngine::oscSend_bridge_current_program(%i)", index); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+28]; | |||
char targetPath[std::strlen(pData->oscData->path)+20]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_set_parameter_value"); | |||
lo_send(pData->oscData->target, targetPath, "if", index, value); | |||
std::strcat(targetPath, "/bridge_current_program"); | |||
lo_send(pData->oscData->target, targetPath, "i", index); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_set_default_value(const int32_t index, const float value) | |||
void CarlaEngine::oscSend_bridge_current_midi_program(const int32_t index) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_set_default_value(%i, %f)", index, value); | |||
carla_debug("CarlaEngine::oscSend_bridge_current_midi_program(%i)", index); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+26]; | |||
char targetPath[std::strlen(pData->oscData->path)+25]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_set_default_value"); | |||
lo_send(pData->oscData->target, targetPath, "if", index, value); | |||
std::strcat(targetPath, "/bridge_current_midi_program"); | |||
lo_send(pData->oscData->target, targetPath, "i", index); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_set_program(const int32_t index) | |||
void CarlaEngine::oscSend_bridge_program_name(const uint32_t index, const char* const name) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_set_program(%i)", index); | |||
carla_debug("CarlaEngine::oscSend_bridge_program_name(%i, \"%s\")", index, name); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+20]; | |||
char targetPath[std::strlen(pData->oscData->path)+21]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_set_program"); | |||
lo_send(pData->oscData->target, targetPath, "i", index); | |||
std::strcat(targetPath, "/bridge_program_name"); | |||
lo_send(pData->oscData->target, targetPath, "is", static_cast<int32_t>(index), name); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_set_midi_program(const int32_t index) | |||
void CarlaEngine::oscSend_bridge_midi_program_data(const uint32_t index, const uint32_t bank, const uint32_t program, const char* const name) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_set_midi_program(%i)", index); | |||
CARLA_SAFE_ASSERT_RETURN(name != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_midi_program_data(%i, %i, %i, \"%s\")", index, bank, program, name); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+25]; | |||
char targetPath[std::strlen(pData->oscData->path)+26]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_set_midi_program"); | |||
lo_send(pData->oscData->target, targetPath, "i", index); | |||
std::strcat(targetPath, "/bridge_midi_program_data"); | |||
lo_send(pData->oscData->target, targetPath, "iiis", static_cast<int32_t>(index), static_cast<int32_t>(bank), static_cast<int32_t>(program), name); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_set_custom_data(const char* const type, const char* const key, const char* const value) | |||
void CarlaEngine::oscSend_bridge_configure(const char* const key, const char* const value) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); | |||
CARLA_SAFE_ASSERT_RETURN(value != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_configure(\"%s\", \"%s\")", key, value); | |||
if (pData->oscData->target != nullptr) | |||
{ | |||
char targetPath[std::strlen(pData->oscData->path)+18]; | |||
std::strcpy(targetPath, pData->oscData->path); | |||
std::strcat(targetPath, "/bridge_configure"); | |||
lo_send(pData->oscData->target, targetPath, "ss", key, value); | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_set_custom_data(const char* const type, const char* const key, const char* const value) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_set_custom_data(\"%s\", \"%s\", \"%s\")", type, key, value); | |||
@@ -2319,7 +2359,7 @@ void CarlaEngine::oscSend_bridge_set_custom_data(const char* const type, const c | |||
} | |||
} | |||
void CarlaEngine::oscSend_bridge_set_chunk_data(const char* const chunkFile) | |||
void CarlaEngine::oscSend_bridge_set_chunk_data(const char* const chunkFile) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_bridge_set_chunk_data(\"%s\")", chunkFile); | |||
@@ -2332,8 +2372,12 @@ void CarlaEngine::oscSend_bridge_set_chunk_data(const char* const chunkFile) | |||
lo_send(pData->oscData->target, targetPath, "s", chunkFile); | |||
} | |||
} | |||
// TODO? | |||
//void oscSend_bridge_set_peaks() const; | |||
#else | |||
void CarlaEngine::oscSend_control_add_plugin_start(const uint pluginId, const char* const pluginName) | |||
void CarlaEngine::oscSend_control_add_plugin_start(const uint pluginId, const char* const pluginName) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2349,7 +2393,7 @@ void CarlaEngine::oscSend_control_add_plugin_start(const uint pluginId, const ch | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_add_plugin_end(const uint pluginId) | |||
void CarlaEngine::oscSend_control_add_plugin_end(const uint pluginId) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2364,7 +2408,7 @@ void CarlaEngine::oscSend_control_add_plugin_end(const uint pluginId) | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_remove_plugin(const uint pluginId) | |||
void CarlaEngine::oscSend_control_remove_plugin(const uint pluginId) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2379,7 +2423,7 @@ void CarlaEngine::oscSend_control_remove_plugin(const uint pluginId) | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_plugin_info1(const uint pluginId, const PluginType type, const PluginCategory category, const uint hints, const long uniqueId) | |||
void CarlaEngine::oscSend_control_set_plugin_info1(const uint pluginId, const PluginType type, const PluginCategory category, const uint hints, const long uniqueId) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2395,7 +2439,7 @@ void CarlaEngine::oscSend_control_set_plugin_info1(const uint pluginId, const Pl | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_plugin_info2(const uint pluginId, const char* const realName, const char* const label, const char* const maker, const char* const copyright) | |||
void CarlaEngine::oscSend_control_set_plugin_info2(const uint pluginId, const char* const realName, const char* const label, const char* const maker, const char* const copyright) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2414,7 +2458,7 @@ void CarlaEngine::oscSend_control_set_plugin_info2(const uint pluginId, const ch | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_audio_count(const uint pluginId, const uint32_t ins, const uint32_t outs) | |||
void CarlaEngine::oscSend_control_set_audio_count(const uint pluginId, const uint32_t ins, const uint32_t outs) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2429,7 +2473,7 @@ void CarlaEngine::oscSend_control_set_audio_count(const uint pluginId, const uin | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_midi_count(const uint pluginId, const uint32_t ins, const uint32_t outs) | |||
void CarlaEngine::oscSend_control_set_midi_count(const uint pluginId, const uint32_t ins, const uint32_t outs) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2444,7 +2488,7 @@ void CarlaEngine::oscSend_control_set_midi_count(const uint pluginId, const uint | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_parameter_count(const uint pluginId, const uint32_t ins, const uint32_t outs) | |||
void CarlaEngine::oscSend_control_set_parameter_count(const uint pluginId, const uint32_t ins, const uint32_t outs) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2459,7 +2503,7 @@ void CarlaEngine::oscSend_control_set_parameter_count(const uint pluginId, const | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_program_count(const uint pluginId, const uint32_t count) | |||
void CarlaEngine::oscSend_control_set_program_count(const uint pluginId, const uint32_t count) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2474,7 +2518,7 @@ void CarlaEngine::oscSend_control_set_program_count(const uint pluginId, const u | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_midi_program_count(const uint pluginId, const uint32_t count) | |||
void CarlaEngine::oscSend_control_set_midi_program_count(const uint pluginId, const uint32_t count) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2489,7 +2533,7 @@ void CarlaEngine::oscSend_control_set_midi_program_count(const uint pluginId, co | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_parameter_data(const uint pluginId, const uint32_t index, const ParameterType type, const uint hints, const char* const name, const char* const unit) | |||
void CarlaEngine::oscSend_control_set_parameter_data(const uint pluginId, const uint32_t index, const ParameterType type, const uint hints, const char* const name, const char* const unit) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2506,7 +2550,7 @@ void CarlaEngine::oscSend_control_set_parameter_data(const uint pluginId, const | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_parameter_ranges1(const uint pluginId, const uint32_t index, const float def, const float min, const float max) | |||
void CarlaEngine::oscSend_control_set_parameter_ranges1(const uint pluginId, const uint32_t index, const float def, const float min, const float max) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2523,7 +2567,7 @@ void CarlaEngine::oscSend_control_set_parameter_ranges1(const uint pluginId, con | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_parameter_ranges2(const uint pluginId, const uint32_t index, const float step, const float stepSmall, const float stepLarge) | |||
void CarlaEngine::oscSend_control_set_parameter_ranges2(const uint pluginId, const uint32_t index, const float step, const float stepSmall, const float stepLarge) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2540,7 +2584,7 @@ void CarlaEngine::oscSend_control_set_parameter_ranges2(const uint pluginId, con | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_parameter_midi_cc(const uint pluginId, const uint32_t index, const int16_t cc) | |||
void CarlaEngine::oscSend_control_set_parameter_midi_cc(const uint pluginId, const uint32_t index, const int16_t cc) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2556,7 +2600,7 @@ void CarlaEngine::oscSend_control_set_parameter_midi_cc(const uint pluginId, con | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_parameter_midi_channel(const uint pluginId, const uint32_t index, const uint8_t channel) | |||
void CarlaEngine::oscSend_control_set_parameter_midi_channel(const uint pluginId, const uint32_t index, const uint8_t channel) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2572,7 +2616,7 @@ void CarlaEngine::oscSend_control_set_parameter_midi_channel(const uint pluginId | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_parameter_value(const uint pluginId, const int32_t index, const float value) | |||
void CarlaEngine::oscSend_control_set_parameter_value(const uint pluginId, const int32_t index, const float value) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2587,7 +2631,7 @@ void CarlaEngine::oscSend_control_set_parameter_value(const uint pluginId, const | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_default_value(const uint pluginId, const uint32_t index, const float value) | |||
void CarlaEngine::oscSend_control_set_default_value(const uint pluginId, const uint32_t index, const float value) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2602,7 +2646,7 @@ void CarlaEngine::oscSend_control_set_default_value(const uint pluginId, const u | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_current_program(const uint pluginId, const int32_t index) | |||
void CarlaEngine::oscSend_control_set_current_program(const uint pluginId, const int32_t index) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2617,7 +2661,7 @@ void CarlaEngine::oscSend_control_set_current_program(const uint pluginId, const | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_current_midi_program(const uint pluginId, const int32_t index) | |||
void CarlaEngine::oscSend_control_set_current_midi_program(const uint pluginId, const int32_t index) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2632,7 +2676,7 @@ void CarlaEngine::oscSend_control_set_current_midi_program(const uint pluginId, | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_program_name(const uint pluginId, const uint32_t index, const char* const name) | |||
void CarlaEngine::oscSend_control_set_program_name(const uint pluginId, const uint32_t index, const char* const name) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2648,7 +2692,7 @@ void CarlaEngine::oscSend_control_set_program_name(const uint pluginId, const ui | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_midi_program_data(const uint pluginId, const uint32_t index, const uint32_t bank, const uint32_t program, const char* const name) | |||
void CarlaEngine::oscSend_control_set_midi_program_data(const uint pluginId, const uint32_t index, const uint32_t bank, const uint32_t program, const char* const name) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2664,7 +2708,7 @@ void CarlaEngine::oscSend_control_set_midi_program_data(const uint pluginId, con | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_note_on(const uint pluginId, const uint8_t channel, const uint8_t note, const uint8_t velo) | |||
void CarlaEngine::oscSend_control_note_on(const uint pluginId, const uint8_t channel, const uint8_t note, const uint8_t velo) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2682,7 +2726,7 @@ void CarlaEngine::oscSend_control_note_on(const uint pluginId, const uint8_t cha | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_note_off(const uint pluginId, const uint8_t channel, const uint8_t note) | |||
void CarlaEngine::oscSend_control_note_off(const uint pluginId, const uint8_t channel, const uint8_t note) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2699,7 +2743,7 @@ void CarlaEngine::oscSend_control_note_off(const uint pluginId, const uint8_t ch | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_set_peaks(const uint pluginId) | |||
void CarlaEngine::oscSend_control_set_peaks(const uint pluginId) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount,); | |||
@@ -2716,7 +2760,7 @@ void CarlaEngine::oscSend_control_set_peaks(const uint pluginId) | |||
} | |||
} | |||
void CarlaEngine::oscSend_control_exit() | |||
void CarlaEngine::oscSend_control_exit() const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->oscData != nullptr,); | |||
carla_debug("CarlaEngine::oscSend_control_exit()"); | |||
@@ -145,12 +145,12 @@ struct BridgeControl : public RingBufferControl { | |||
// ------------------------------------------------------------------- | |||
class CarlaEngineBridge : public CarlaEngine, | |||
public juce::Thread | |||
public CarlaThread | |||
{ | |||
public: | |||
CarlaEngineBridge(const char* const audioBaseName, const char* const controlBaseName) | |||
: CarlaEngine(), | |||
juce::Thread("CarlaEngineBridge"), | |||
CarlaThread("CarlaEngineBridge"), | |||
fIsRunning(false) | |||
{ | |||
carla_debug("CarlaEngineBridge::CarlaEngineBridge()"); | |||
@@ -208,17 +208,15 @@ public: | |||
opcode = fShmControl.readOpcode(); | |||
CARLA_ASSERT_INT(opcode == kPluginBridgeOpcodeSetBufferSize, opcode); | |||
fBufferSize = fShmControl.readInt(); | |||
carla_stderr("BufferSize: %i", fBufferSize); | |||
pData->bufferSize = fShmControl.readInt(); | |||
carla_stderr("BufferSize: %i", pData->bufferSize); | |||
opcode = fShmControl.readOpcode(); | |||
CARLA_ASSERT_INT(opcode == kPluginBridgeOpcodeSetSampleRate, opcode); | |||
fSampleRate = fShmControl.readFloat(); | |||
carla_stderr("SampleRate: %f", fSampleRate); | |||
pData->sampleRate = fShmControl.readFloat(); | |||
carla_stderr("SampleRate: %f", pData->sampleRate); | |||
fIsRunning = true; | |||
startThread(10); | |||
CarlaThread::start(); | |||
CarlaEngine::init(clientName); | |||
return true; | |||
} | |||
@@ -228,7 +226,7 @@ public: | |||
carla_debug("CarlaEnginePlugin::close()"); | |||
CarlaEngine::close(); | |||
stopThread(6000); | |||
CarlaThread::stop(6000); | |||
fShmControl.clear(); | |||
fShmAudioPool.clear(); | |||
@@ -251,27 +249,34 @@ public: | |||
return kEngineTypeBridge; | |||
} | |||
const char* getCurrentDriverName() const noexcept | |||
{ | |||
return "Bridge"; | |||
} | |||
// ------------------------------------- | |||
// CarlaThread virtual calls | |||
void run() override | |||
{ | |||
fIsRunning = true; | |||
// TODO - set RT permissions | |||
carla_debug("CarlaEngineBridge::run()"); | |||
while (! threadShouldExit()) | |||
while (! shouldExit()) | |||
{ | |||
if (! jackbridge_sem_timedwait(&fShmControl.data->runServer, 5)) | |||
{ | |||
if (errno == ETIMEDOUT) | |||
{ | |||
fIsRunning = false; | |||
signalThreadShouldExit(); | |||
signalShouldExit(); | |||
return; | |||
} | |||
} | |||
while (fShmControl.dataAvailable()) | |||
while (fShmControl.isDataAvailable()) | |||
{ | |||
const PluginBridgeOpcode opcode(fShmControl.readOpcode()); | |||
@@ -306,8 +311,8 @@ public: | |||
case kPluginBridgeOpcodeSetParameter: | |||
{ | |||
const int index(fShmControl.readInt()); | |||
const float value(fShmControl.readFloat()); | |||
//const int index(fShmControl.readInt()); | |||
//const float value(fShmControl.readFloat()); | |||
CarlaPlugin* const plugin(getPluginUnchecked(0)); | |||
@@ -322,7 +327,7 @@ public: | |||
case kPluginBridgeOpcodeSetProgram: | |||
{ | |||
const int index(fShmControl.readInt()); | |||
//const int index(fShmControl.readInt()); | |||
CarlaPlugin* const plugin(getPluginUnchecked(0)); | |||
@@ -337,7 +342,7 @@ public: | |||
case kPluginBridgeOpcodeSetMidiProgram: | |||
{ | |||
const int index(fShmControl.readInt()); | |||
//const int index(fShmControl.readInt()); | |||
CarlaPlugin* const plugin(getPluginUnchecked(0)); | |||
@@ -352,18 +357,18 @@ public: | |||
case kPluginBridgeOpcodeMidiEvent: | |||
{ | |||
uint8_t data[4] = { 0 }; | |||
const long time(fShmControl.readLong()); | |||
const int dataSize(fShmControl.readInt()); | |||
//uint8_t data[4] = { 0 }; | |||
//const long time(fShmControl.readLong()); | |||
//const int dataSize(fShmControl.readInt()); | |||
CARLA_ASSERT_INT(dataSize >= 1 && dataSize <= 4, dataSize); | |||
//CARLA_ASSERT_INT(dataSize >= 1 && dataSize <= 4, dataSize); | |||
for (int i=0; i < dataSize && i < 4; ++i) | |||
data[i] = fShmControl.readChar(); | |||
//for (int i=0; i < dataSize && i < 4; ++i) | |||
// data[i] = fShmControl.readChar(); | |||
CARLA_ASSERT(pData->bufEvents.in != nullptr); | |||
//CARLA_ASSERT(pData->bufEvents.in != nullptr); | |||
if (pData->bufEvents.in != nullptr) | |||
//if (pData->bufEvents.in != nullptr) | |||
{ | |||
// TODO | |||
} | |||
@@ -376,7 +381,7 @@ public: | |||
CARLA_ASSERT(fShmAudioPool.data != nullptr); | |||
CarlaPlugin* const plugin(getPluginUnchecked(0)); | |||
if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock()) | |||
if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock(true)) // FIXME - always lock? | |||
{ | |||
const uint32_t inCount(plugin->getAudioInCount()); | |||
const uint32_t outCount(plugin->getAudioOutCount()); | |||
@@ -385,19 +390,19 @@ public: | |||
float* outBuffer[outCount]; | |||
for (uint32_t i=0; i < inCount; ++i) | |||
inBuffer[i] = fShmAudioPool.data + i*fBufferSize; | |||
inBuffer[i] = fShmAudioPool.data + i*pData->bufferSize; | |||
for (uint32_t i=0; i < outCount; ++i) | |||
outBuffer[i] = fShmAudioPool.data + (i+inCount)*fBufferSize; | |||
outBuffer[i] = fShmAudioPool.data + (i+inCount)*pData->bufferSize; | |||
plugin->initBuffers(); | |||
plugin->process(inBuffer, outBuffer, fBufferSize); | |||
plugin->process(inBuffer, outBuffer, pData->bufferSize); | |||
plugin->unlock(); | |||
} | |||
break; | |||
} | |||
case kPluginBridgeOpcodeQuit: | |||
signalThreadShouldExit(); | |||
signalShouldExit(); | |||
break; | |||
} | |||
} | |||
@@ -444,7 +444,7 @@ public: | |||
fTransportState(JackTransportStopped), | |||
fFreewheel(false), | |||
#ifdef BUILD_BRIDGE | |||
fHasQuit(false) | |||
fIsRunning(false) | |||
#else | |||
fLastGroupId(0), | |||
fLastPortId(0), | |||
@@ -527,7 +527,23 @@ public: | |||
carla_zeroStruct<jack_position_t>(fTransportPos); | |||
#ifndef BUILD_BRIDGE | |||
#ifdef BUILD_BRIDGE | |||
if (pData->bufferSize == 0 || pData->sampleRate == 0.0) | |||
{ | |||
// open temp client to get initial buffer-size and sample-rate values | |||
if (jack_client_t* tmpClient = jackbridge_client_open(clientName, JackNullOption, nullptr)) | |||
{ | |||
pData->bufferSize = jackbridge_get_buffer_size(tmpClient); | |||
pData->sampleRate = jackbridge_get_sample_rate(tmpClient); | |||
jackbridge_client_close(tmpClient); | |||
} | |||
} | |||
fIsRunning = true; | |||
return CarlaEngine::init(clientName); | |||
#else | |||
fLastGroupId = 0; | |||
fLastPortId = 0; | |||
fLastConnectionId = 0; | |||
@@ -589,20 +605,6 @@ public: | |||
setLastError("Failed to create new JACK client"); | |||
return false; | |||
#else | |||
if (pData->bufferSize == 0 || pData->sampleRate == 0.0) | |||
{ | |||
// open temp client to get initial buffer-size and sample-rate values | |||
if (jack_client_t* tmpClient = jackbridge_client_open(clientName, JackNullOption, nullptr)) | |||
{ | |||
pData->bufferSize = jackbridge_get_buffer_size(tmpClient); | |||
pData->sampleRate = jackbridge_get_sample_rate(tmpClient); | |||
jackbridge_client_close(tmpClient); | |||
} | |||
} | |||
return CarlaEngine::init(clientName); | |||
#endif | |||
} | |||
@@ -612,8 +614,8 @@ public: | |||
CarlaEngine::close(); | |||
#ifdef BUILD_BRIDGE | |||
fClient = nullptr; | |||
fHasQuit = true; | |||
fClient = nullptr; | |||
fIsRunning = false; | |||
return true; | |||
#else | |||
if (jackbridge_deactivate(fClient)) | |||
@@ -646,8 +648,9 @@ public: | |||
fUsedPortNames.clear(); | |||
fUsedConnections.clear(); | |||
fGroupIconsChanged.clear(); | |||
#endif | |||
return false; | |||
#endif | |||
} | |||
#ifndef BUILD_BRIDGE | |||
@@ -700,7 +703,7 @@ public: | |||
bool isRunning() const noexcept override | |||
{ | |||
#ifdef BUILD_BRIDGE | |||
return (fClient != nullptr || ! fHasQuit); | |||
return (fClient != nullptr || fIsRunning); | |||
#else | |||
return (fClient != nullptr); | |||
#endif | |||
@@ -931,7 +934,6 @@ public: | |||
return true; | |||
} | |||
#endif | |||
// ------------------------------------------------------------------- | |||
// Transport | |||
@@ -959,6 +961,7 @@ public: | |||
else if (fClient != nullptr) | |||
jackbridge_transport_locate(fClient, static_cast<jack_nframes_t>(frame)); | |||
} | |||
#endif | |||
// ------------------------------------------------------------------- | |||
@@ -1435,7 +1438,7 @@ private: | |||
// ------------------------------------------------------------------- | |||
#ifdef BUILD_BRIDGE | |||
bool fHasQuit; | |||
bool fIsRunning; | |||
#else | |||
enum RackPorts { | |||
kRackPortAudioIn1 = 0, | |||
@@ -92,7 +92,7 @@ void CarlaEngineThread::run() | |||
if (oscRegisted) | |||
{ | |||
#ifdef BUILD_BRIDGE | |||
fEngine->oscSend_bridge_set_parameter_value(j, value); | |||
fEngine->oscSend_bridge_parameter_value(j, value); | |||
#else | |||
fEngine->oscSend_control_set_parameter_value(i, j, value); | |||
#endif | |||
@@ -248,17 +248,17 @@ bool CarlaPlugin::isEnabled() const noexcept | |||
const char* CarlaPlugin::getName() const noexcept | |||
{ | |||
return (const char*)pData->name; | |||
return pData->name; | |||
} | |||
const char* CarlaPlugin::getFilename() const noexcept | |||
{ | |||
return (const char*)pData->filename; | |||
return pData->filename; | |||
} | |||
const char* CarlaPlugin::getIconName() const noexcept | |||
{ | |||
return (const char*)pData->iconName; | |||
return pData->iconName; | |||
} | |||
uint32_t CarlaPlugin::getLatencyInFrames() const noexcept | |||
@@ -1524,6 +1524,7 @@ void CarlaPlugin::registerToOscClient() | |||
// Base data | |||
{ | |||
// TODO - clear buf | |||
char bufName[STR_MAX+1] = { '\0' }; | |||
char bufLabel[STR_MAX+1] = { '\0' }; | |||
char bufMaker[STR_MAX+1] = { '\0' }; | |||
@@ -1534,7 +1535,8 @@ void CarlaPlugin::registerToOscClient() | |||
getCopyright(bufCopyright); | |||
#ifdef BUILD_BRIDGE | |||
pData->engine->oscSend_bridge_plugin_info(getCategory(), pData->hints, bufName, bufLabel, bufMaker, bufCopyright, getUniqueId()); | |||
pData->engine->oscSend_bridge_plugin_info1(getCategory(), pData->hints, getUniqueId()); | |||
pData->engine->oscSend_bridge_plugin_info2(bufName, bufLabel, bufMaker, bufCopyright); | |||
#else | |||
pData->engine->oscSend_control_set_plugin_info1(pData->id, getType(), getCategory(), pData->hints, getUniqueId()); | |||
pData->engine->oscSend_control_set_plugin_info2(pData->id, bufName, bufLabel, bufMaker, bufCopyright); | |||
@@ -1547,8 +1549,8 @@ void CarlaPlugin::registerToOscClient() | |||
getParameterCountInfo(paramIns, paramOuts); | |||
#ifdef BUILD_BRIDGE | |||
pData->engine->oscSend_bridge_audio_count(getAudioInCount(), getAudioOutCount(), getAudioInCount() + getAudioOutCount()); | |||
pData->engine->oscSend_bridge_midi_count(getMidiInCount(), getMidiOutCount(), getMidiInCount() + getMidiOutCount()); | |||
pData->engine->oscSend_bridge_audio_count(getAudioInCount(), getAudioOutCount()); | |||
pData->engine->oscSend_bridge_midi_count(getMidiInCount(), getMidiOutCount()); | |||
pData->engine->oscSend_bridge_parameter_count(paramIns, paramOuts); | |||
#else | |||
pData->engine->oscSend_control_set_audio_count(pData->id, getAudioInCount(), getAudioOutCount()); | |||
@@ -1574,10 +1576,12 @@ void CarlaPlugin::registerToOscClient() | |||
const ParameterRanges& paramRanges(pData->param.ranges[i]); | |||
#ifdef BUILD_BRIDGE | |||
pData->engine->oscSend_bridge_parameter_info(i, bufName, bufUnit); | |||
pData->engine->oscSend_bridge_parameter_data(i, paramData.type, paramData.hints, paramData.rindex, paramData.midiChannel, paramData.midiCC); | |||
pData->engine->oscSend_bridge_parameter_ranges(i, paramRanges.def, paramRanges.min, paramRanges.max, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge); | |||
pData->engine->oscSend_bridge_set_parameter_value(i, getParameterValue(i)); | |||
pData->engine->oscSend_bridge_parameter_data(i, paramData.rindex, paramData.type, paramData.hints, bufName, bufUnit); | |||
pData->engine->oscSend_bridge_parameter_ranges1(i, paramRanges.def, paramRanges.min, paramRanges.max); | |||
pData->engine->oscSend_bridge_parameter_ranges2(i, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge); | |||
pData->engine->oscSend_bridge_parameter_value(i, getParameterValue(i)); | |||
pData->engine->oscSend_bridge_parameter_midi_cc(i, paramData.midiCC); | |||
pData->engine->oscSend_bridge_parameter_midi_channel(i, paramData.midiChannel); | |||
#else | |||
pData->engine->oscSend_control_set_parameter_data(pData->id, i, paramData.type, paramData.hints, bufName, bufUnit); | |||
pData->engine->oscSend_control_set_parameter_ranges1(pData->id, i, paramRanges.def, paramRanges.min, paramRanges.max); | |||
@@ -1596,9 +1600,9 @@ void CarlaPlugin::registerToOscClient() | |||
pData->engine->oscSend_bridge_program_count(pData->prog.count); | |||
for (uint32_t i=0; i < pData->prog.count; ++i) | |||
pData->engine->oscSend_bridge_program_info(i, pData->prog.names[i]); | |||
pData->engine->oscSend_bridge_program_name(i, pData->prog.names[i]); | |||
pData->engine->oscSend_bridge_set_current_program(pData->prog.current); | |||
pData->engine->oscSend_bridge_current_program(pData->prog.current); | |||
#else | |||
pData->engine->oscSend_control_set_program_count(pData->id, pData->prog.count); | |||
@@ -1619,10 +1623,10 @@ void CarlaPlugin::registerToOscClient() | |||
{ | |||
const MidiProgramData& mpData(pData->midiprog.data[i]); | |||
pData->engine->oscSend_bridge_midi_program_info(i, mpData.bank, mpData.program, mpData.name); | |||
pData->engine->oscSend_bridge_midi_program_data(i, mpData.bank, mpData.program, mpData.name); | |||
} | |||
pData->engine->oscSend_bridge_set_current_midi_program(pData->midiprog.current); | |||
pData->engine->oscSend_bridge_current_midi_program(pData->midiprog.current); | |||
#else | |||
pData->engine->oscSend_control_set_midi_program_count(pData->id, pData->midiprog.count); | |||
@@ -693,8 +693,8 @@ struct CarlaPluginProtectedData { | |||
// mutex MUST have been locked before | |||
const bool lockMaster(masterMutex.tryLock()); | |||
const bool lockSingle(singleMutex.tryLock()); | |||
CARLA_ASSERT(! lockMaster); | |||
CARLA_ASSERT(! lockSingle); | |||
CARLA_SAFE_ASSERT(! lockMaster); | |||
CARLA_SAFE_ASSERT(! lockSingle); | |||
} | |||
if (client != nullptr) | |||
@@ -812,11 +812,7 @@ struct CarlaPluginProtectedData { | |||
for (uint32_t i=0; i < audioIn.count; ++i) | |||
{ | |||
latencyBuffers[i] = new float[latency]; | |||
#ifdef USE_JUCE | |||
FloatVectorOperations::clear(latencyBuffers[i], latency); | |||
#else | |||
carla_zeroFloat(latencyBuffers[i], latency); | |||
#endif | |||
FLOAT_CLEAR(latencyBuffers[i], latency); | |||
} | |||
} | |||
} | |||
@@ -828,11 +824,7 @@ struct CarlaPluginProtectedData { | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(type != kPluginPostRtEventNull,); | |||
PluginPostRtEvent event; | |||
event.type = type; | |||
event.value1 = value1; | |||
event.value2 = value2; | |||
event.value3 = value3; | |||
PluginPostRtEvent event = { type, value1, value2, value3 }; | |||
postRtEvents.appendRT(event); | |||
} | |||
@@ -54,7 +54,7 @@ CarlaPluginThread::CarlaPluginThread(CarlaBackend::CarlaEngine* const engine, Ca | |||
fPlugin(plugin), | |||
fMode(mode) | |||
{ | |||
carla_debug("CarlaPluginThread::CarlaPluginThread(plugin:\"%s\", engine:\"%s\", %s)", plugin->getName(), engine->getName(), PluginThreadMode2str(mode)); | |||
carla_debug("CarlaPluginThread::CarlaPluginThread(%p, %p, %s)", engine, plugin, PluginThreadMode2str(mode)); | |||
//setPriority(5); | |||
} | |||
@@ -1411,10 +1411,7 @@ public: | |||
else | |||
pData->name = pData->engine->getUniquePluginName(fDescriptor->Label); | |||
pData->filename = filename; | |||
CARLA_ASSERT(pData->name != nullptr); | |||
CARLA_ASSERT(pData->filename != nullptr); | |||
pData->filename = carla_strdup(filename); | |||
// --------------------------------------------------------------- | |||
// register client | |||
@@ -1457,13 +1454,14 @@ public: | |||
if (pData->engine->getOptions().forceStereo) | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
// load settings TODO | |||
pData->identifier = "LADSPA/"; | |||
//pData->idStr += std::strrchr(filename, OS_SEP)+1; | |||
//pData->idStr += "/"; | |||
//pData->idStr += CarlaString(getUniqueId()); | |||
//pData->idStr += "/"; | |||
//pData->idStr += label; | |||
// set identifier string | |||
CarlaString identifier("LADSPA/"); | |||
identifier += CarlaString(getUniqueId()); | |||
identifier += ","; | |||
identifier += label; | |||
pData->identifier = identifier.dup(); | |||
// load settings | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
// ignore settings, we need this anyway | |||
@@ -124,9 +124,9 @@ struct CarlaBackendStandalone { | |||
#ifdef BUILD_BRIDGE | |||
engineOptions.processMode = CB::ENGINE_PROCESS_MODE_BRIDGE; | |||
engineOptions.transportMode = CB::ENGINE_TRANSPORT_MODE_BRIDGE; | |||
engineOptions.forceStereo = CB::ENGINE_OPTION_FORCE_STEREO = false; | |||
engineOptions.preferPluginBridges = CB::ENGINE_OPTION_PREFER_PLUGIN_BRIDGES = false; | |||
engineOptions.preferUiBridges = CB::ENGINE_OPTION_PREFER_UI_BRIDGES = false; | |||
engineOptions.forceStereo = false; | |||
engineOptions.preferPluginBridges = false; | |||
engineOptions.preferUiBridges = false; | |||
#endif | |||
} | |||
@@ -442,8 +442,14 @@ bool carla_engine_init(const char* driverName, const char* clientName) | |||
gStandalone.engine->setCallback(gStandalone.engineCallback, gStandalone.engineCallbackPtr); | |||
#ifdef BUILD_BRIDGE | |||
gStandalone.engine->setOption(CB::ENGINE_OPTION_PROCESS_MODE, CB::ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS, nullptr); | |||
gStandalone.engine->setOption(CB::ENGINE_OPTION_TRANSPORT_MODE, CB::ENGINE_TRANSPORT_MODE_JACK, nullptr); | |||
#else | |||
gStandalone.engine->setOption(CB::ENGINE_OPTION_PROCESS_MODE, static_cast<int>(gStandalone.engineOptions.processMode), nullptr); | |||
gStandalone.engine->setOption(CB::ENGINE_OPTION_TRANSPORT_MODE, static_cast<int>(gStandalone.engineOptions.transportMode), nullptr); | |||
#endif | |||
gStandalone.engine->setOption(CB::ENGINE_OPTION_FORCE_STEREO, gStandalone.engineOptions.forceStereo ? 1 : 0, nullptr); | |||
gStandalone.engine->setOption(CB::ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, gStandalone.engineOptions.preferPluginBridges ? 1 : 0, nullptr); | |||
gStandalone.engine->setOption(CB::ENGINE_OPTION_PREFER_UI_BRIDGES, gStandalone.engineOptions.preferUiBridges ? 1 : 0, nullptr); | |||
@@ -18,7 +18,7 @@ | |||
#ifndef CARLA_BRIDGE_HPP_INCLUDED | |||
#define CARLA_BRIDGE_HPP_INCLUDED | |||
#include "CarlaDefines.hpp" | |||
#include "CarlaDefines.h" | |||
#define CARLA_BRIDGE_START_NAMESPACE namespace CarlaBridge { | |||
#define CARLA_BRIDGE_END_NAMESPACE } | |||
@@ -19,18 +19,18 @@ | |||
#include "CarlaEngine.hpp" | |||
#include "CarlaPlugin.hpp" | |||
#include "CarlaHost.hpp" | |||
#include "CarlaHost.h" | |||
#include "CarlaBackendUtils.hpp" | |||
#include "CarlaBridgeUtils.hpp" | |||
#include "juce_core.h" | |||
//#include "juce_core.h" | |||
#ifdef CARLA_OS_UNIX | |||
# include <signal.h> | |||
#endif | |||
using juce::File; | |||
//using juce::File; | |||
// ------------------------------------------------------------------------- | |||
@@ -103,14 +103,15 @@ class CarlaPluginClient : public CarlaBridgeClient | |||
public: | |||
CarlaPluginClient(const bool useBridge, const char* const driverName, const char* audioBaseName, const char* controlBaseName) | |||
: CarlaBridgeClient(nullptr), | |||
fEngine(nullptr), | |||
fPlugin(nullptr) | |||
fPlugin(nullptr), | |||
fEngine(nullptr) | |||
{ | |||
CARLA_ASSERT(driverName != nullptr && driverName[0] != '\0'); | |||
carla_debug("CarlaPluginClient::CarlaPluginClient(%s, \"%s\", %s, %s)", bool2str(useBridge), driverName, audioBaseName, controlBaseName); | |||
carla_set_engine_callback(callback, this); | |||
#if 0 | |||
File curDir(File::getSpecialLocation(File::currentApplicationFile).getParentDirectory()); | |||
if (curDir.getChildFile("resources").exists()) | |||
@@ -119,13 +120,14 @@ public: | |||
carla_set_engine_option(CarlaBackend::OPTION_PATH_RESOURCES, 0, curDir.getChildFile("../../modules/carla_native/resources").getFullPathName().toRawUTF8()); | |||
else | |||
carla_set_engine_option(CarlaBackend::OPTION_PATH_RESOURCES, 0, curDir.getChildFile("../modules/carla_native/resources").getFullPathName().toRawUTF8()); | |||
#endif | |||
if (useBridge) | |||
carla_engine_init_bridge(audioBaseName, controlBaseName, driverName); | |||
else | |||
carla_engine_init("JACK", driverName); | |||
fEngine = carla_get_standalone_engine(); | |||
fEngine = carla_get_engine(); | |||
} | |||
~CarlaPluginClient() override | |||
@@ -156,8 +158,8 @@ public: | |||
fProjFileName = fPlugin->getName(); | |||
fProjFileName += ".carxs"; | |||
if (! File::isAbsolutePath((const char*)fProjFileName)) | |||
fProjFileName = File::getCurrentWorkingDirectory().getChildFile((const char*)fProjFileName).getFullPathName().toRawUTF8(); | |||
//if (! File::isAbsolutePath((const char*)fProjFileName)) | |||
// fProjFileName = File::getCurrentWorkingDirectory().getChildFile((const char*)fProjFileName).getFullPathName().toRawUTF8(); | |||
if (! fPlugin->loadStateFromFile(fProjFileName)) | |||
carla_stderr("Plugin preset load failed, error was:\n%s", fEngine->getLastError()); | |||
@@ -216,7 +218,7 @@ public: | |||
fEngine->oscSend_bridge_set_custom_data(cdata.type, cdata.key, cdata.value); | |||
} | |||
if (fPlugin->getOptions() & CarlaBackend::PLUGIN_OPTION_USE_CHUNKS) | |||
if (fPlugin->getOptionsEnabled() & CarlaBackend::PLUGIN_OPTION_USE_CHUNKS) | |||
{ | |||
void* data = nullptr; | |||
int32_t dataSize = fPlugin->getChunkData(&data); | |||
@@ -249,7 +251,7 @@ public: | |||
fEngine->oscSend_bridge_configure(CARLA_BRIDGE_MSG_SAVED, ""); | |||
} | |||
void setParameterMidiChannel(const int32_t index, const int32_t channel) | |||
void setParameterMidiChannel(const int32_t index, const uint8_t channel) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fPlugin != nullptr,); | |||
carla_debug("CarlaPluginClient::setParameterMidiChannel(%i, %i)", index, channel); | |||
@@ -257,7 +259,7 @@ public: | |||
fPlugin->setParameterMidiChannel(index, channel, false, false); | |||
} | |||
void setParameterMidiCC(const int32_t index, const int32_t cc) | |||
void setParameterMidiCC(const int32_t index, const int16_t cc) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fPlugin != nullptr,); | |||
carla_debug("CarlaPluginClient::setParameterMidiCC(%i, %i)", index, cc); | |||
@@ -306,7 +308,7 @@ public: | |||
// --------------------------------------------------------------------- | |||
protected: | |||
void handleCallback(const CarlaBackend::CallbackType action, const int value1, const int value2, const float value3, const char* const valueStr) | |||
void handleCallback(const CarlaBackend::EngineCallbackOpcode action, const int value1, const int value2, const float value3, const char* const valueStr) | |||
{ | |||
CARLA_BACKEND_USE_NAMESPACE; | |||
@@ -314,12 +316,12 @@ protected: | |||
switch (action) | |||
{ | |||
case CALLBACK_PARAMETER_VALUE_CHANGED: | |||
case ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED: | |||
if (isOscControlRegistered()) | |||
sendOscControl(value1, value3); | |||
break; | |||
case CALLBACK_SHOW_GUI: | |||
case ENGINE_CALLBACK_UI_STATE_CHANGED: | |||
if (! isOscControlRegistered()) | |||
{ | |||
if (value1 != 1) | |||
@@ -342,14 +344,14 @@ protected: | |||
} | |||
private: | |||
CarlaBackend::CarlaEngine* fEngine; | |||
CarlaBackend::CarlaPlugin* fPlugin; | |||
const CarlaBackend::CarlaEngine* fEngine; | |||
CarlaString fProjFileName; | |||
static void callback(void* ptr, CarlaBackend::CallbackType action, unsigned int pluginId, int value1, int value2, float value3, const char* valueStr) | |||
static void callback(void* ptr, CarlaBackend::EngineCallbackOpcode action, unsigned int pluginId, int value1, int value2, float value3, const char* valueStr) | |||
{ | |||
carla_debug("CarlaPluginClient::callback(%p, %i:%s, %i, %i, %i, %f, \"%s\")", ptr, action, CarlaBackend::CallbackType2Str(action), pluginId, value1, value2, value3, valueStr); | |||
carla_debug("CarlaPluginClient::callback(%p, %i:%s, %i, %i, %i, %f, \"%s\")", ptr, action, CarlaBackend::EngineCallbackOpcode2Str(action), pluginId, value1, value2, value3, valueStr); | |||
CARLA_SAFE_ASSERT_RETURN(ptr != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(pluginId == 0,); | |||
@@ -363,7 +365,7 @@ int CarlaBridgeOsc::handleMsgShow() | |||
{ | |||
carla_debug("CarlaBridgeOsc::handleMsgShow()"); | |||
carla_show_gui(0, true); | |||
carla_show_custom_ui(0, true); | |||
return 0; | |||
} | |||
@@ -371,7 +373,7 @@ int CarlaBridgeOsc::handleMsgHide() | |||
{ | |||
carla_debug("CarlaBridgeOsc::handleMsgHide()"); | |||
carla_show_gui(0, false); | |||
carla_show_custom_ui(0, false); | |||
return 0; | |||
} | |||
@@ -405,8 +407,11 @@ int CarlaBridgeOsc::handleMsgPluginSetParameterMidiChannel(CARLA_BRIDGE_OSC_HAND | |||
const int32_t index = argv[0]->i; | |||
const int32_t channel = argv[1]->i; | |||
CARLA_SAFE_ASSERT_RETURN(index >= 0, 0); | |||
CARLA_SAFE_ASSERT_RETURN(channel >= 0 && channel < MAX_MIDI_CHANNELS, 0); | |||
CarlaPluginClient* const plugClient((CarlaPluginClient*)fClient); | |||
plugClient->setParameterMidiChannel(index, channel); | |||
plugClient->setParameterMidiChannel(static_cast<uint32_t>(index), static_cast<uint8_t>(channel)); | |||
return 0; | |||
} | |||
@@ -420,8 +425,11 @@ int CarlaBridgeOsc::handleMsgPluginSetParameterMidiCC(CARLA_BRIDGE_OSC_HANDLE_AR | |||
const int32_t index = argv[0]->i; | |||
const int32_t cc = argv[1]->i; | |||
CARLA_SAFE_ASSERT_RETURN(index >= 0, 0); | |||
CARLA_SAFE_ASSERT_RETURN(cc >= 1 && cc < 0x5F, 0); | |||
CarlaPluginClient* const plugClient((CarlaPluginClient*)fClient); | |||
plugClient->setParameterMidiCC(index, cc); | |||
plugClient->setParameterMidiCC(static_cast<uint32_t>(index), static_cast<int16_t>(cc)); | |||
return 0; | |||
} | |||
@@ -529,8 +537,8 @@ int main(int argc, char* argv[]) | |||
CarlaString clientName((name != nullptr) ? name : label); | |||
if (clientName.isEmpty()) | |||
clientName = File(filename).getFileNameWithoutExtension().toRawUTF8(); | |||
//if (clientName.isEmpty()) | |||
// clientName = File(filename).getFileNameWithoutExtension().toRawUTF8(); | |||
// --------------------------------------------------------------------- | |||
// Set extraStuff | |||
@@ -586,8 +594,8 @@ int main(int argc, char* argv[]) | |||
if (const CarlaPluginInfo* const pluginInfo = carla_get_plugin_info(0)) | |||
{ | |||
if (pluginInfo->hints & CarlaBackend::PLUGIN_HAS_GUI) | |||
carla_show_gui(0, true); | |||
if (pluginInfo->hints & CarlaBackend::PLUGIN_HAS_CUSTOM_UI) | |||
carla_show_custom_ui(0, true); | |||
} | |||
} | |||
@@ -9,36 +9,37 @@ include ../Makefile.mk | |||
# -------------------------------------------------------------- | |||
# TODO: remove in favour of juce gui stuff | |||
QT5_UI_FLAGS = $(shell pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets) | |||
QT5_UI_LIBS = $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Widgets) | |||
# QT5_UI_FLAGS = $(shell pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets) | |||
# QT5_UI_LIBS = $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Widgets) | |||
# -------------------------------------------------------------- | |||
BUILD_CXX_FLAGS += -DBUILD_BRIDGE | |||
BUILD_CXX_FLAGS += -I. -I../backend -I../includes -I../modules -I../modules/theme -I../utils | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo) | |||
LINK_FLAGS += $(shell pkg-config --libs liblo) | |||
BUILD_CXX_FLAGS += -I. -I../backend -I../includes -I../utils -isystem ../modules -isystem ../modules/theme | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo) $(QTCORE_FLAGS) | |||
LINK_FLAGS += $(shell pkg-config --libs liblo) $(QTCORE_LIBS) | |||
# -------------------------------------------------------------- | |||
# Plugin bridges | |||
BUILD_PLUGIN_FLAGS = $(BUILD_CXX_FLAGS) -DBUILD_BRIDGE_PLUGIN | |||
BUILD_PLUGIN_FLAGS = $(BUILD_CXX_FLAGS) $(QTXML_FLAGS) -DBUILD_BRIDGE_PLUGIN | |||
BUILD_PLUGIN_FLAGS += -I../backend/engine -I../backend/plugin | |||
LINK_PLUGIN_FLAGS = $(LINK_FLAGS) -lpthread | |||
LINK_PLUGIN_FLAGS = $(LINK_FLAGS) $(QTXML_LIBS) -lpthread | |||
ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||
BUILD_PLUGIN_FLAGS += -DWANT_LADSPA -DWANT_DSSI -DWANT_LV2 -DWANT_VST | |||
ifeq ($(CARLA_VESTIGE_HEADER),true) | |||
BUILD_PLUGIN_FLAGS += -DVESTIGE_HEADER | |||
endif | |||
BUILD_PLUGIN_FLAGS += -DWANT_LADSPA | |||
# -DWANT_DSSI -DWANT_LV2 -DWANT_VST | |||
# ifeq ($(CARLA_VESTIGE_HEADER),true) | |||
# BUILD_PLUGIN_FLAGS += -DVESTIGE_HEADER | |||
# endif | |||
endif | |||
LINK_PLUGIN_FLAGS += $(JUCE_AUDIO_BASICS_LIBS) | |||
LINK_PLUGIN_FLAGS += $(JUCE_CORE_LIBS) | |||
LINK_PLUGIN_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS) | |||
LINK_PLUGIN_FLAGS += $(JUCE_EVENTS_LIBS) | |||
LINK_PLUGIN_FLAGS += $(JUCE_GRAPHICS_LIBS) | |||
LINK_PLUGIN_FLAGS += $(JUCE_GUI_BASICS_LIBS) | |||
# LINK_PLUGIN_FLAGS += $(JUCE_AUDIO_BASICS_LIBS) | |||
# LINK_PLUGIN_FLAGS += $(JUCE_CORE_LIBS) | |||
# LINK_PLUGIN_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS) | |||
# LINK_PLUGIN_FLAGS += $(JUCE_EVENTS_LIBS) | |||
# LINK_PLUGIN_FLAGS += $(JUCE_GRAPHICS_LIBS) | |||
# LINK_PLUGIN_FLAGS += $(JUCE_GUI_BASICS_LIBS) | |||
# -------------------------------------------------------------- | |||
# Plugin bridges (POSIX) | |||
@@ -48,10 +49,6 @@ POSIX_32BIT_FLAGS = $(32BIT_FLAGS) -L/usr/lib32 -L/usr/lib/i386-linux-gnu | |||
POSIX_64BIT_FLAGS = $(64BIT_FLAGS) -L/usr/lib64 -L/usr/lib/x86_64-linux-gnu | |||
POSIX_LINK_FLAGS = $(LINK_PLUGIN_FLAGS) -ldl | |||
ifneq ($(MACOS),true) | |||
POSIX_LINK_FLAGS += -lrt | |||
endif | |||
# -------------------------------------------------------------- | |||
# Plugin bridges (Windows) | |||
@@ -63,47 +60,48 @@ WIN_LINK_FLAGS = $(LINK_PLUGIN_FLAGS) -L../modules | |||
# -------------------------------------------------------------- | |||
# Plugin bridges (Native) | |||
NATIVE_BUILD_FLAGS = $(POSIX_BUILD_FLAGS) -DWANT_NATIVE | |||
NATIVE_BUILD_FLAGS = $(POSIX_BUILD_FLAGS) | |||
# -DWANT_NATIVE | |||
NATIVE_LINK_FLAGS = $(POSIX_LINK_FLAGS) | |||
ifeq ($(HAVE_FLUIDSYNTH),true) | |||
NATIVE_BUILD_FLAGS += -DWANT_FLUIDSYNTH | |||
NATIVE_BUILD_FLAGS += $(shell pkg-config --cflags fluidsynth) | |||
NATIVE_LINK_FLAGS += $(shell pkg-config --libs fluidsynth) | |||
endif | |||
ifeq ($(HAVE_LINUXSAMPLER),true) | |||
NATIVE_BUILD_FLAGS += -DWANT_LINUXSAMPLER | |||
NATIVE_BUILD_FLAGS += $(shell pkg-config --cflags linuxsampler) | |||
NATIVE_LINK_FLAGS += $(shell pkg-config --libs linuxsampler) | |||
endif | |||
ifeq ($(HAVE_AF_DEPS),true) | |||
NATIVE_BUILD_FLAGS += -DWANT_AUDIOFILE | |||
NATIVE_LINK_FLAGS += $(shell pkg-config --libs sndfile) | |||
ifeq ($(HAVE_FFMPEG),true) | |||
NATIVE_BUILD_FLAGS += -DHAVE_FFMPEG | |||
NATIVE_LINK_FLAGS += $(shell pkg-config --libs libavcodec libavformat libavutil) | |||
endif | |||
endif | |||
ifeq ($(HAVE_MF_DEPS),true) | |||
NATIVE_BUILD_FLAGS += -DWANT_MIDIFILE | |||
NATIVE_LINK_FLAGS += $(shell pkg-config --libs smf) | |||
endif | |||
ifeq ($(HAVE_OPENGL),true) | |||
NATIVE_BUILD_FLAGS += -DWANT_OPENGL | |||
NATIVE_LINK_FLAGS += $(DGL_LIBS) | |||
endif | |||
ifeq ($(HAVE_ZYN_DEPS),true) | |||
NATIVE_BUILD_FLAGS += -DWANT_ZYNADDSUBFX | |||
NATIVE_LINK_FLAGS += $(shell pkg-config --libs fftw3 mxml zlib) | |||
ifeq ($(HAVE_ZYN_UI_DEPS),true) | |||
NATIVE_LINK_FLAGS += $(shell pkg-config --libs ntk_images ntk) | |||
endif | |||
endif | |||
# ifeq ($(HAVE_FLUIDSYNTH),true) | |||
# NATIVE_BUILD_FLAGS += -DWANT_FLUIDSYNTH | |||
# NATIVE_BUILD_FLAGS += $(shell pkg-config --cflags fluidsynth) | |||
# NATIVE_LINK_FLAGS += $(shell pkg-config --libs fluidsynth) | |||
# endif | |||
# | |||
# ifeq ($(HAVE_LINUXSAMPLER),true) | |||
# NATIVE_BUILD_FLAGS += -DWANT_LINUXSAMPLER | |||
# NATIVE_BUILD_FLAGS += $(shell pkg-config --cflags linuxsampler) | |||
# NATIVE_LINK_FLAGS += $(shell pkg-config --libs linuxsampler) | |||
# endif | |||
# ifeq ($(HAVE_AF_DEPS),true) | |||
# NATIVE_BUILD_FLAGS += -DWANT_AUDIOFILE | |||
# NATIVE_LINK_FLAGS += $(shell pkg-config --libs sndfile) | |||
# ifeq ($(HAVE_FFMPEG),true) | |||
# NATIVE_BUILD_FLAGS += -DHAVE_FFMPEG | |||
# NATIVE_LINK_FLAGS += $(shell pkg-config --libs libavcodec libavformat libavutil) | |||
# endif | |||
# endif | |||
# | |||
# ifeq ($(HAVE_MF_DEPS),true) | |||
# NATIVE_BUILD_FLAGS += -DWANT_MIDIFILE | |||
# NATIVE_LINK_FLAGS += $(shell pkg-config --libs smf) | |||
# endif | |||
# | |||
# ifeq ($(HAVE_OPENGL),true) | |||
# NATIVE_BUILD_FLAGS += -DWANT_OPENGL | |||
# NATIVE_LINK_FLAGS += $(DGL_LIBS) | |||
# endif | |||
# ifeq ($(HAVE_ZYN_DEPS),true) | |||
# NATIVE_BUILD_FLAGS += -DWANT_ZYNADDSUBFX | |||
# NATIVE_LINK_FLAGS += $(shell pkg-config --libs fftw3 mxml zlib) | |||
# ifeq ($(HAVE_ZYN_UI_DEPS),true) | |||
# NATIVE_LINK_FLAGS += $(shell pkg-config --libs ntk_images ntk) | |||
# endif | |||
# endif | |||
# -------------------------------------------------------------- | |||
# UI bridges | |||
@@ -153,23 +151,23 @@ LINK_UI_VST_X11_FLAGS = $(LINK_UI_FLAGS) $(QT5_UI_LIBS) | |||
TARGETS = native | |||
ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||
ifeq ($(HAVE_GTK2),true) | |||
TARGETS += ui_lv2-gtk2 | |||
endif | |||
ifeq ($(HAVE_GTK3),true) | |||
TARGETS += ui_lv2-gtk3 | |||
endif | |||
ifeq ($(HAVE_QT4),true) | |||
TARGETS += ui_lv2-qt4 | |||
else | |||
ifeq ($(HAVE_QT5),true) | |||
TARGETS += ui_lv2-qt5 | |||
endif | |||
endif | |||
TARGETS += ui_lv2-x11 | |||
TARGETS += ui_vst-x11 | |||
endif | |||
# ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||
# ifeq ($(HAVE_GTK2),true) | |||
# TARGETS += ui_lv2-gtk2 | |||
# endif | |||
# ifeq ($(HAVE_GTK3),true) | |||
# TARGETS += ui_lv2-gtk3 | |||
# endif | |||
# ifeq ($(HAVE_QT4),true) | |||
# TARGETS += ui_lv2-qt4 | |||
# else | |||
# ifeq ($(HAVE_QT5),true) | |||
# TARGETS += ui_lv2-qt5 | |||
# endif | |||
# endif | |||
# TARGETS += ui_lv2-x11 | |||
# TARGETS += ui_vst-x11 | |||
# endif | |||
ifeq ($(WIN32),true) | |||
TARGETS = carla-bridge-win32.exe | |||
@@ -394,24 +392,26 @@ OBJS_NATIVE += \ | |||
# libs | |||
OBJS_NATIVE += \ | |||
../modules/carla_native.a \ | |||
../modules/juce_audio_basics.a \ | |||
../modules/juce_core.a \ | |||
../modules/juce_data_structures.a \ | |||
../modules/juce_events.a \ | |||
../modules/juce_graphics.a \ | |||
../modules/juce_gui_basics.a \ | |||
../modules/jackbridge.a \ | |||
../modules/rtmempool.a | |||
ifeq ($(HAVE_OPENGL),true) | |||
OBJS_NATIVE += \ | |||
../modules/dgl.a | |||
endif | |||
ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||
OBJS_NATIVE += \ | |||
../modules/lilv.a | |||
endif | |||
# ../modules/carla_native.a \ | |||
# ../modules/juce_audio_basics.a \ | |||
# ../modules/juce_core.a \ | |||
# ../modules/juce_data_structures.a \ | |||
# ../modules/juce_events.a \ | |||
# ../modules/juce_graphics.a \ | |||
# ../modules/juce_gui_basics.a \ | |||
# ifeq ($(HAVE_OPENGL),true) | |||
# OBJS_NATIVE += \ | |||
# ../modules/dgl.a | |||
# endif | |||
# ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||
# OBJS_NATIVE += \ | |||
# ../modules/lilv.a | |||
# endif | |||
carla-bridge-native: $(FILES) $(OBJS_NATIVE) | |||
$(CXX) $(OBJS_NATIVE) $(NATIVE_LINK_FLAGS) -o $@ | |||
@@ -117,14 +117,14 @@ def findFilenames(filePath, stype): | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Plugin Query | |||
PLUGIN_QUERY_API_VERSION = 2 | |||
PLUGIN_QUERY_API_VERSION = 3 | |||
PyPluginInfo = { | |||
'API': PLUGIN_QUERY_API_VERSION, | |||
'build': BINARY_NONE, | |||
'type': PLUGIN_NONE, | |||
'hints': 0x0, | |||
'binary': "", | |||
'filename': "", | |||
'name': "", | |||
'label': "", | |||
'maker': "", | |||
@@ -177,8 +177,8 @@ def runCarlaDiscovery(itype, stype, filename, tool, isWine=False): | |||
if line == "carla-discovery::init::-----------": | |||
pinfo = deepcopy(PyPluginInfo) | |||
pinfo['type'] = itype | |||
pinfo['binary'] = filename | |||
pinfo['type'] = itype | |||
pinfo['filename'] = filename | |||
elif line == "carla-discovery::end::------------": | |||
if pinfo is not None: | |||
@@ -1250,7 +1250,7 @@ class PluginDatabaseW(QDialog): | |||
self._reAddPlugins() | |||
if self.fRealParent: | |||
self.fRealParent.loadRDFsNeeded() | |||
self.fRealParent.setLoadRDFsNeeded() | |||
def _checkFilters(self): | |||
text = self.ui.lineEdit.text().lower() | |||
@@ -1404,7 +1404,7 @@ class PluginDatabaseW(QDialog): | |||
self.ui.tableWidget.setItem(index, 10, QTableWidgetItem(self.tr("Yes") if (plugin['hints'] & PLUGIN_IS_SYNTH) else self.tr("No"))) | |||
self.ui.tableWidget.setItem(index, 11, QTableWidgetItem(bridgeText)) | |||
self.ui.tableWidget.setItem(index, 12, QTableWidgetItem(ptype)) | |||
self.ui.tableWidget.setItem(index, 13, QTableWidgetItem(str(plugin['binary']))) | |||
self.ui.tableWidget.setItem(index, 13, QTableWidgetItem(str(plugin['filename']))) | |||
self.ui.tableWidget.item(index, 0).setData(Qt.UserRole, plugin) | |||
self.fLastTableIndex += 1 | |||
@@ -67,6 +67,9 @@ class CarlaDummyW(object): | |||
def renamePlugin(self, pluginId, newName): | |||
pass | |||
def disablePlugin(self, pluginId, errorMsg): | |||
pass | |||
def removeAllPlugins(self): | |||
pass | |||
@@ -255,21 +258,30 @@ class HostWindow(QMainWindow): | |||
self.ui.fileTreeView.doubleClicked.connect(self.slot_fileTreeDoubleClicked) | |||
self.DebugCallback.connect(self.slot_handleDebugCallback) | |||
self.PluginAddedCallback.connect(self.slot_handlePluginAddedCallback) | |||
self.PluginRemovedCallback.connect(self.slot_handlePluginRemovedCallback) | |||
self.PluginRenamedCallback.connect(self.slot_handlePluginRenamedCallback) | |||
self.PluginUnavailableCallback.connect(self.slot_handlePluginUnavailableCallback) | |||
# parameter (rack) | |||
# program, midi-program, ui-state (rack) | |||
# note on, off (rack) | |||
# update, reload (rack) | |||
# patchbay | |||
self.EngineStartedCallback.connect(self.slot_handleEngineStartedCallback) | |||
self.EngineStoppedCallback.connect(self.slot_handleEngineStoppedCallback) | |||
self.ProcessModeChangedCallback.connect(self.slot_handleProcessModeChangedCallback) | |||
self.TransportModeChangedCallback.connect(self.slot_handleTransportModeChangedCallback) | |||
self.BufferSizeChangedCallback.connect(self.slot_handleBufferSizeChangedCallback) | |||
self.SampleRateChangedCallback.connect(self.slot_handleSampleRateChangedCallback) | |||
#self.InfoCallback.connect(self.slot_handleInfoCallback) | |||
#self.ErrorCallback.connect(self.slot_handleErrorCallback) | |||
#self.QuitCallback.connect(self.slot_handleQuitCallback) | |||
self.InfoCallback.connect(self.slot_handleInfoCallback) | |||
self.ErrorCallback.connect(self.slot_handleErrorCallback) | |||
self.QuitCallback.connect(self.slot_handleQuitCallback) | |||
self.SIGUSR1.connect(self.slot_handleSIGUSR1) | |||
self.SIGTERM.connect(self.slot_handleSIGTERM) | |||
@@ -398,16 +410,8 @@ class HostWindow(QMainWindow): | |||
QMessageBox.critical(self, self.tr("Error"), self.tr("Could not connect to Audio backend '%s'" % audioDriver)) | |||
return | |||
#self.fBufferSize = Carla.host.get_buffer_size() | |||
#self.fSampleRate = Carla.host.get_sample_rate() | |||
#self.fFirstEngineInit = False | |||
# Peaks and TimeInfo | |||
self.fIdleTimerFast = self.startTimer(30) #self.fSavedSettings["Main/RefreshInterval"]) | |||
# LEDs and edit dialog parameters | |||
self.fIdleTimerSlow = self.startTimer(self.fSavedSettings["Main/RefreshInterval"]*2) | |||
def stopEngine(self): | |||
if self.fContainer.getPluginCount() > 0: | |||
ask = QMessageBox.question(self, self.tr("Warning"), self.tr("There are still some plugins loaded, you need to remove them to stop the engine.\n" | |||
@@ -422,17 +426,6 @@ class HostWindow(QMainWindow): | |||
if Carla.host.is_engine_running() and not Carla.host.engine_close(): | |||
print(Carla.host.get_last_error()) | |||
#self.fBufferSize = 0 | |||
#self.fSampleRate = 0.0 | |||
if self.fIdleTimerFast != 0: | |||
self.killTimer(self.fIdleTimerFast) | |||
self.fIdleTimerFast = 0 | |||
if self.fIdleTimerSlow != 0: | |||
self.killTimer(self.fIdleTimerSlow) | |||
self.fIdleTimerSlow = 0 | |||
# ----------------------------------------------------------------- | |||
# Internal stuff (plugins) | |||
@@ -488,9 +481,7 @@ class HostWindow(QMainWindow): | |||
# Internal stuff (transport) | |||
def refreshTransport(self, forced = False): | |||
if not Carla.host.is_engine_running(): | |||
return | |||
if self.fSampleRate == 0.0: | |||
if Carla.sampleRate == 0.0 or not Carla.host.is_engine_running(): | |||
return | |||
timeInfo = Carla.host.get_transport_info() | |||
@@ -512,7 +503,7 @@ class HostWindow(QMainWindow): | |||
self.fLastTransportState = playing | |||
if frame != self.fLastTransportFrame or forced: | |||
time = frame / self.fSampleRate | |||
time = frame / Carla.sampleRate | |||
secs = time % 60 | |||
mins = (time / 60) % 60 | |||
hrs = (time / 3600) % 60 | |||
@@ -616,7 +607,7 @@ class HostWindow(QMainWindow): | |||
if self.fIdleTimerFast != 0: | |||
self.killTimer(self.fIdleTimerFast) | |||
self.fIdleTimerFast = self.startTimer(30) #self.fSavedSettings["Main/RefreshInterval"]) | |||
self.fIdleTimerFast = self.startTimer(self.fSavedSettings["Main/RefreshInterval"]) | |||
if self.fIdleTimerSlow != 0: | |||
self.killTimer(self.fIdleTimerSlow) | |||
@@ -742,6 +733,11 @@ class HostWindow(QMainWindow): | |||
def slot_engineStop(self, doStop = True): | |||
if doStop: self.stopEngine() | |||
# FIXME? | |||
if self.fContainer.getPluginCount() > 0: | |||
self.ui.act_plugin_remove_all.setEnabled(False) | |||
self.fContainer.removeAllPlugins() | |||
check = Carla.host.is_engine_running() | |||
self.ui.menu_PluginMacros.setEnabled(check) | |||
self.ui.menu_Canvas.setEnabled(check) | |||
@@ -776,7 +772,7 @@ class HostWindow(QMainWindow): | |||
btype = dialog.fRetPlugin['build'] | |||
ptype = dialog.fRetPlugin['type'] | |||
filename = dialog.fRetPlugin['binary'] | |||
filename = dialog.fRetPlugin['filename'] | |||
label = dialog.fRetPlugin['label'] | |||
extraPtr = self.getExtraPtr(dialog.fRetPlugin) | |||
@@ -901,8 +897,8 @@ class HostWindow(QMainWindow): | |||
# ----------------------------------------------------------------- | |||
@pyqtSlot(int) | |||
def slot_handlePluginAddedCallback(self, pluginId): | |||
@pyqtSlot(int, str) | |||
def slot_handlePluginAddedCallback(self, pluginId, pluginName): | |||
self.fContainer.addPlugin(pluginId, self.fIsProjectLoading) | |||
if self.fContainer.getPluginCount() == 1: | |||
@@ -919,25 +915,28 @@ class HostWindow(QMainWindow): | |||
def slot_handlePluginRenamedCallback(self, pluginId, newName): | |||
self.fContainer.renamePlugin(pluginId, newName) | |||
@pyqtSlot(int, str) | |||
def slot_handlePluginUnavailableCallback(self, pluginId, errorMsg): | |||
self.fContainer.disablePlugin(pluginId, errorMsg) | |||
# ----------------------------------------------------------------- | |||
@pyqtSlot(str) | |||
def slot_handleEngineStartedCallback(self, driverName): | |||
#self.fBufferSize = Carla.host.get_buffer_size() | |||
#self.fSampleRate = Carla.host.get_sample_rate() | |||
def slot_handleEngineStartedCallback(self, processMode, transportMode, driverName): | |||
Carla.processMode = processMode | |||
Carla.transportMode = transportMode | |||
Carla.bufferSize = Carla.host.get_buffer_size() | |||
Carla.sampleRate = Carla.host.get_sample_rate() | |||
self.slot_engineStart(False) | |||
if self.fIdleTimerFast == 0: | |||
self.fIdleTimerFast = self.startTimer(30) #self.fSavedSettings["Main/RefreshInterval"]) | |||
self.fIdleTimerFast = self.startTimer(self.fSavedSettings["Main/RefreshInterval"]) | |||
if self.fIdleTimerSlow == 0: | |||
self.fIdleTimerSlow = self.startTimer(self.fSavedSettings["Main/RefreshInterval"]*2) | |||
self.slot_engineStart(False) | |||
@pyqtSlot() | |||
def slot_handleEngineStoppedCallback(self): | |||
#self.fBufferSize = 0 | |||
#self.fSampleRate = 0.0 | |||
if self.fIdleTimerFast != 0: | |||
self.killTimer(self.fIdleTimerFast) | |||
self.fIdleTimerFast = 0 | |||
@@ -946,12 +945,11 @@ class HostWindow(QMainWindow): | |||
self.killTimer(self.fIdleTimerSlow) | |||
self.fIdleTimerSlow = 0 | |||
if self.fContainer.getPluginCount() > 0: | |||
self.ui.act_plugin_remove_all.setEnabled(False) | |||
self.fContainer.removeAllPlugins() # FIXME? | |||
self.slot_engineStop(False) | |||
Carla.bufferSize = 0 | |||
Carla.sampleRate = 0.0 | |||
# ----------------------------------------------------------------- | |||
@pyqtSlot(int) | |||
@@ -962,6 +960,8 @@ class HostWindow(QMainWindow): | |||
def slot_handleTransportModeChangedCallback(self, newTransportMode): | |||
self.fEngineChanged = True | |||
# ----------------------------------------------------------------- | |||
@pyqtSlot(int) | |||
def slot_handleBufferSizeChangedCallback(self, newBufferSize): | |||
self.fEngineChanged = True | |||
@@ -972,6 +972,20 @@ class HostWindow(QMainWindow): | |||
# ----------------------------------------------------------------- | |||
@pyqtSlot(str) | |||
def slot_handleInfoCallback(self, info): | |||
pass | |||
@pyqtSlot(str) | |||
def slot_handleErrorCallback(self, error): | |||
pass | |||
@pyqtSlot() | |||
def slot_handleQuitCallback(self): | |||
pass | |||
# ----------------------------------------------------------------- | |||
@pyqtSlot() | |||
def slot_handleSIGUSR1(self): | |||
print("Got SIGUSR1 -> Saving project now") | |||
@@ -200,6 +200,9 @@ class CarlaPatchbayW(QGraphicsView): | |||
pitem.setName(newName) | |||
def disablePlugin(self, pluginId, errorMsg): | |||
pass | |||
def removeAllPlugins(self): | |||
for i in range(self.fPluginCount): | |||
pitem = self.fPluginList[i] | |||
@@ -72,22 +72,22 @@ class CarlaRackW(QListWidget): | |||
#self.setMnimumWidth(800) | |||
self.setSortingEnabled(False) | |||
#app = QApplication.instance() | |||
#pal1 = app.palette().base().color() | |||
#pal2 = app.palette().button().color() | |||
#col1 = "stop:0 rgb(%i, %i, %i)" % (pal1.red(), pal1.green(), pal1.blue()) | |||
#col2 = "stop:1 rgb(%i, %i, %i)" % (pal2.red(), pal2.green(), pal2.blue()) | |||
#self.setStyleSheet(""" | |||
#QListWidget { | |||
#background-color: qlineargradient(spread:pad, | |||
#x1:0.0, y1:0.0, | |||
#x2:0.2, y2:1.0, | |||
#%s, | |||
#%s | |||
#); | |||
#} | |||
#""" % (col1, col2)) | |||
app = QApplication.instance() | |||
pal1 = app.palette().base().color() | |||
pal2 = app.palette().button().color() | |||
col1 = "stop:0 rgb(%i, %i, %i)" % (pal1.red(), pal1.green(), pal1.blue()) | |||
col2 = "stop:1 rgb(%i, %i, %i)" % (pal2.red(), pal2.green(), pal2.blue()) | |||
self.setStyleSheet(""" | |||
QListWidget { | |||
background-color: qlineargradient(spread:pad, | |||
x1:0.0, y1:0.0, | |||
x2:0.2, y2:1.0, | |||
%s, | |||
%s | |||
); | |||
} | |||
""" % (col1, col2)) | |||
# ------------------------------------------------------------- | |||
# Connect actions to functions | |||
@@ -169,6 +169,9 @@ class CarlaRackW(QListWidget): | |||
pitem.fWidget.ui.label_name.setText(newName) | |||
pitem.fWidget.ui.edit_dialog.setName(newName) | |||
def disablePlugin(self, pluginId, errorMsg): | |||
pass | |||
def removeAllPlugins(self): | |||
while (self.takeItem(0)): | |||
pass | |||
@@ -504,11 +507,4 @@ class CarlaRackW(QListWidget): | |||
pitem.ui.edit_dialog.reloadAll() | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# TESTING | |||
#from PyQt5.QtWidgets import QApplication | |||
#app = QApplication(sys.argv) | |||
#gui = CarlaRackW(None) | |||
#gui.show() | |||
#app.exec_() | |||
# ----------------------------------------------------------------- |
@@ -60,6 +60,7 @@ gFakePluginInfo = { | |||
} | |||
gFakeParamInfo = { | |||
"type": PARAMETER_INPUT, | |||
"hints": PARAMETER_IS_ENABLED|PARAMETER_IS_AUTOMABLE, | |||
"name": "Parameter Name", | |||
"unit": "", | |||
@@ -71,7 +72,7 @@ gFakeParamInfo = { | |||
"maximum": 1.0, | |||
"step": 0.01, | |||
"stepSmall": 0.01, | |||
"stepLarge": 0.01, | |||
"stepLarge": 0.01, # FIXME | |||
"midiCC": -1, | |||
"midiChannel": 1, | |||
@@ -205,34 +206,52 @@ class PluginParameter(QWidget): | |||
# ------------------------------------------------------------- | |||
# Set-up GUI | |||
pType = pInfo['type'] | |||
pHints = pInfo['hints'] | |||
self.ui.label.setText(pInfo['name']) | |||
self.ui.widget.setName(pInfo['name']) | |||
self.ui.widget.setMinimum(pInfo['minimum']) | |||
self.ui.widget.setMaximum(pInfo['maximum']) | |||
self.ui.widget.setDefault(pInfo['default']) | |||
self.ui.widget.setValue(pInfo['current'], False) | |||
self.ui.widget.setLabel(pInfo['unit']) | |||
self.ui.widget.setStep(pInfo['step']) | |||
self.ui.widget.setStepSmall(pInfo['stepSmall']) | |||
self.ui.widget.setStepLarge(pInfo['stepLarge']) | |||
self.ui.widget.setScalePoints(pInfo['scalePoints'], bool(pHints & PARAMETER_USES_SCALEPOINTS)) | |||
if not pHints & PARAMETER_IS_ENABLED: | |||
self.ui.label.setEnabled(False) | |||
self.ui.widget.setEnabled(False) | |||
if pType == PARAMETER_INPUT: | |||
self.ui.widget.setMinimum(pInfo['minimum']) | |||
self.ui.widget.setMaximum(pInfo['maximum']) | |||
self.ui.widget.setDefault(pInfo['default']) | |||
self.ui.widget.setValue(pInfo['current'], False) | |||
self.ui.widget.setLabel(pInfo['unit']) | |||
self.ui.widget.setStep(pInfo['step']) | |||
self.ui.widget.setStepSmall(pInfo['stepSmall']) | |||
self.ui.widget.setStepLarge(pInfo['stepLarge']) | |||
self.ui.widget.setScalePoints(pInfo['scalePoints'], bool(pHints & PARAMETER_USES_SCALEPOINTS)) | |||
if not pHints & PARAMETER_IS_ENABLED: | |||
self.ui.label.setEnabled(False) | |||
self.ui.widget.setEnabled(False) | |||
self.ui.widget.setReadOnly(True) | |||
self.ui.sb_control.setEnabled(False) | |||
self.ui.sb_channel.setEnabled(False) | |||
elif not pHints & PARAMETER_IS_AUTOMABLE: | |||
self.ui.sb_control.setEnabled(False) | |||
self.ui.sb_channel.setEnabled(False) | |||
if pHints & PARAMETER_IS_READ_ONLY: | |||
self.ui.widget.setReadOnly(True) | |||
elif pType == PARAMETER_OUTPUT: | |||
self.ui.widget.setMinimum(pInfo['minimum']) | |||
self.ui.widget.setMaximum(pInfo['maximum']) | |||
self.ui.widget.setValue(pInfo['current'], False) | |||
self.ui.widget.setLabel(pInfo['unit']) | |||
self.ui.widget.setReadOnly(True) | |||
self.ui.sb_control.setEnabled(False) | |||
self.ui.sb_channel.setEnabled(False) | |||
elif not pHints & PARAMETER_IS_AUTOMABLE: | |||
self.ui.sb_control.setEnabled(False) | |||
self.ui.sb_channel.setEnabled(False) | |||
if not pHints & PARAMETER_IS_AUTOMABLE: | |||
self.ui.sb_control.setEnabled(False) | |||
self.ui.sb_channel.setEnabled(False) | |||
if pHints & PARAMETER_IS_READ_ONLY: | |||
self.ui.widget.setReadOnly(True) | |||
else: | |||
self.ui.widget.setVisible(False) | |||
self.ui.sb_control.setVisible(False) | |||
self.ui.sb_channel.setVisible(False) | |||
if pHints & PARAMETER_USES_CUSTOM_TEXT: | |||
self.ui.widget.setTextCallback(self._textCallBack) | |||
@@ -371,7 +390,7 @@ class PluginEdit(QDialog): | |||
self.fScrollAreaSetup = False | |||
self.fParameterCount = 0 | |||
self.fParameterList = [] # (isInput, id, widget) | |||
self.fParameterList = [] # (type, id, widget) | |||
self.fParametersToUpdate = [] # (id, value) | |||
self.fPlayingNotes = [] # (channel, note) | |||
@@ -460,7 +479,7 @@ class PluginEdit(QDialog): | |||
def reloadAll(self): | |||
if Carla.host is not None: | |||
self.fPluginInfo = Carla.host.get_plugin_info(self.fPluginId) | |||
self.fPluginInfo['binary'] = charPtrToString(self.fPluginInfo['binary']) | |||
self.fPluginInfo['filename'] = charPtrToString(self.fPluginInfo['filename']) | |||
self.fPluginInfo['name'] = charPtrToString(self.fPluginInfo['name']) | |||
self.fPluginInfo['label'] = charPtrToString(self.fPluginInfo['label']) | |||
self.fPluginInfo['maker'] = charPtrToString(self.fPluginInfo['maker']) | |||
@@ -638,7 +657,7 @@ class PluginEdit(QDialog): | |||
paramFakeList.append(gFakeParamInfo) | |||
paramFakeListFull.append((paramFakeList, paramFakeWidth)) | |||
self._createParameterWidgets(True, paramFakeListFull, self.tr("Parameters")) | |||
self._createParameterWidgets(PARAMETER_INPUT, paramFakeListFull, self.tr("Parameters")) | |||
return | |||
parameterCount = Carla.host.get_parameter_count(self.fPluginId) | |||
@@ -661,6 +680,9 @@ class PluginEdit(QDialog): | |||
paramRanges = Carla.host.get_parameter_ranges(self.fPluginId, i) | |||
paramValue = Carla.host.get_current_parameter_value(self.fPluginId, i) | |||
if paramData['type'] not in (PARAMETER_INPUT, PARAMETER_OUTPUT): | |||
continue | |||
parameter = { | |||
'type': paramData['type'], | |||
'hints': paramData['hints'], | |||
@@ -694,7 +716,7 @@ class PluginEdit(QDialog): | |||
# ----------------------------------------------------------------- | |||
# Get width values, in packs of 10 | |||
if parameter['hints'] == PARAMETER_IS_INPUT: | |||
if parameter['type'] == PARAMETER_INPUT: | |||
paramInputWidthTMP = QFontMetrics(self.font()).width(parameter['name']) | |||
if paramInputWidthTMP > paramInputWidth: | |||
@@ -732,8 +754,8 @@ class PluginEdit(QDialog): | |||
# ----------------------------------------------------------------- | |||
# Create parameter tabs + widgets | |||
self._createParameterWidgets(True, paramInputListFull, self.tr("Parameters")) | |||
self._createParameterWidgets(False, paramOutputListFull, self.tr("Outputs")) | |||
self._createParameterWidgets(PARAMETER_INPUT, paramInputListFull, self.tr("Parameters")) | |||
self._createParameterWidgets(PARAMETER_OUTPUT, paramOutputListFull, self.tr("Outputs")) | |||
else: # > Carla.maxParameters | |||
fakeName = self.tr("This plugin has too many parameters to display here!") | |||
@@ -743,7 +765,8 @@ class PluginEdit(QDialog): | |||
paramFakeWidth = QFontMetrics(self.font()).width(fakeName) | |||
parameter = { | |||
'hints': PARAMETER_IS_INPUT|PARAMETER_IS_ENABLED|PARAMETER_IS_READ_ONLY, | |||
'type': PARAMETER_UNKNOWN, | |||
'hints': 0x0, | |||
'name': fakeName, | |||
'unit': "", | |||
'scalePoints': [], | |||
@@ -764,7 +787,7 @@ class PluginEdit(QDialog): | |||
paramFakeList.append(parameter) | |||
paramFakeListFull.append((paramFakeList, paramFakeWidth)) | |||
self._createParameterWidgets(True, paramFakeListFull, self.tr("Information")) | |||
self._createParameterWidgets(PARAMETER_UNKNOWN, paramFakeListFull, self.tr("Information")) | |||
def reloadPrograms(self): | |||
# Programs | |||
@@ -845,7 +868,7 @@ class PluginEdit(QDialog): | |||
self.ui.cb_midi_programs.setItemText(mpIndex, "%03i:%03i - %s" % (mpBank+1, mpProg+1, mpName)) | |||
# Update all parameter values | |||
for isInput, paramId, paramWidget in self.fParameterList: | |||
for paramType, paramId, paramWidget in self.fParameterList: | |||
paramWidget.setValue(Carla.host.get_current_parameter_value(self.fPluginId, paramId), False) | |||
paramWidget.update() | |||
@@ -868,19 +891,19 @@ class PluginEdit(QDialog): | |||
self.fParametersToUpdate.append([parameterId, value]) | |||
def setParameterDefault(self, parameterId, value): | |||
for isInput, paramId, paramWidget in self.fParameterList: | |||
for paramType, paramId, paramWidget in self.fParameterList: | |||
if paramId == parameterId: | |||
paramWidget.setDefault(value) | |||
break | |||
def setParameterMidiControl(self, parameterId, control): | |||
for isInput, paramId, paramWidget in self.fParameterList: | |||
for paramType, paramId, paramWidget in self.fParameterList: | |||
if paramId == parameterId: | |||
paramWidget.setMidiControl(control) | |||
break | |||
def setParameterMidiChannel(self, parameterId, channel): | |||
for isInput, paramId, paramWidget in self.fParameterList: | |||
for paramType, paramId, paramWidget in self.fParameterList: | |||
if paramId == parameterId: | |||
paramWidget.setMidiChannel(channel+1) | |||
break | |||
@@ -973,14 +996,14 @@ class PluginEdit(QDialog): | |||
self._updateCtrlMidiProgram() | |||
elif index >= 0: | |||
for isInput, paramId, paramWidget in self.fParameterList: | |||
for paramType, paramId, paramWidget in self.fParameterList: | |||
if paramId != index: | |||
continue | |||
paramWidget.setValue(value, False) | |||
if isInput: | |||
tabIndex = paramWidget.tabIndex() | |||
if paramType == PARAMETER_INPUT: | |||
tabIndex = paramWidget.getTabIndex() | |||
if self.fTabIconTimers[tabIndex-1] == ICON_STATE_NULL: | |||
self.ui.tabWidget.setTabIcon(tabIndex, self.fTabIconOn) | |||
@@ -993,8 +1016,8 @@ class PluginEdit(QDialog): | |||
self.fParametersToUpdate = [] | |||
# Update parameter outputs | |||
for isInput, paramId, paramWidget in self.fParameterList: | |||
if not isInput: | |||
for paramType, paramId, paramWidget in self.fParameterList: | |||
if paramType == PARAMETER_OUTPUT: | |||
value = Carla.host.get_current_parameter_value(self.fPluginId, paramId) | |||
paramWidget.setValue(value, False) | |||
@@ -1263,7 +1286,7 @@ class PluginEdit(QDialog): | |||
selChannel = int(actSel.text()) | |||
self.ui.sb_ctrl_channel.setValue(selChannel) | |||
def _createParameterWidgets(self, isInput, paramListFull, tabPageName): | |||
def _createParameterWidgets(self, paramType, paramListFull, tabPageName): | |||
i = 1 | |||
for paramList, width in paramListFull: | |||
if len(paramList) == 0: | |||
@@ -1279,9 +1302,9 @@ class PluginEdit(QDialog): | |||
paramWidget.setLabelWidth(width) | |||
tabPageLayout.addWidget(paramWidget) | |||
self.fParameterList.append((isInput, paramInfo['index'], paramWidget)) | |||
self.fParameterList.append((paramType, paramInfo['index'], paramWidget)) | |||
if isInput: | |||
if paramType == PARAMETER_INPUT: | |||
paramWidget.valueChanged.connect(self.slot_parameterValueChanged) | |||
paramWidget.midiControlChanged.connect(self.slot_parameterMidiControlChanged) | |||
@@ -1292,7 +1315,7 @@ class PluginEdit(QDialog): | |||
self.ui.tabWidget.addTab(tabPageContainer, "%s (%i)" % (tabPageName, i)) | |||
i += 1 | |||
if isInput: | |||
if paramType == PARAMETER_INPUT: | |||
self.ui.tabWidget.setTabIcon(tabIndex, self.fTabIconOff) | |||
self.fTabIconTimers.append(ICON_STATE_NULL) | |||
@@ -1342,7 +1365,7 @@ class PluginWidget(QFrame): | |||
self.fPluginId = pluginId | |||
self.fPluginInfo = Carla.host.get_plugin_info(self.fPluginId) if Carla.host is not None else gFakePluginInfo | |||
self.fPluginInfo['binary'] = charPtrToString(self.fPluginInfo['binary']) | |||
self.fPluginInfo['filename'] = charPtrToString(self.fPluginInfo['filename']) | |||
self.fPluginInfo['name'] = charPtrToString(self.fPluginInfo['name']) | |||
self.fPluginInfo['label'] = charPtrToString(self.fPluginInfo['label']) | |||
self.fPluginInfo['maker'] = charPtrToString(self.fPluginInfo['maker']) | |||
@@ -8,7 +8,7 @@ include ../../Makefile.mk | |||
# -------------------------------------------------------------- | |||
BUILD_CXX_FLAGS += -I. -I../../includes -I../../utils | |||
BUILD_CXX_FLAGS += -I. -I../../includes -I../../utils -w | |||
ifeq ($(HAVE_QT4),true) | |||
QT4_CXX_FLAGS = $(BUILD_CXX_FLAGS) | |||
@@ -34,12 +34,12 @@ public: | |||
CarlaMutex() noexcept | |||
: fTryLockWasCalled(false) | |||
{ | |||
pthread_mutexattr_t atts; | |||
pthread_mutexattr_init(&atts); | |||
pthread_mutexattr_settype(&atts, PTHREAD_MUTEX_RECURSIVE); | |||
//pthread_mutexattr_t atts; | |||
//pthread_mutexattr_init(&atts); | |||
//pthread_mutexattr_settype(&atts, PTHREAD_MUTEX_RECURSIVE); | |||
pthread_mutex_init(&fMutex, &atts); | |||
pthread_mutexattr_destroy(&atts); | |||
pthread_mutex_init(&fMutex, nullptr /*&atts*/); | |||
//pthread_mutexattr_destroy(&atts); | |||
} | |||
/* | |||