@@ -233,27 +233,21 @@ const unsigned int PLUGIN_OPTION_SEND_ALL_SOUND_OFF = 0x100; | |||
* @{ | |||
*/ | |||
/*! | |||
* Parameter is input.\n | |||
* When this hint is not set, parameter is assumed to be output. | |||
*/ | |||
const unsigned int PARAMETER_IS_INPUT = 0x001; | |||
/*! | |||
* Parameter value is boolean. | |||
* It's always at either minimum or maximum value. | |||
*/ | |||
const unsigned int PARAMETER_IS_BOOLEAN = 0x002; | |||
const unsigned int PARAMETER_IS_BOOLEAN = 0x001; | |||
/*! | |||
* Parameter value is integer. | |||
*/ | |||
const unsigned int PARAMETER_IS_INTEGER = 0x004; | |||
const unsigned int PARAMETER_IS_INTEGER = 0x002; | |||
/*! | |||
* Parameter value is logarithmic. | |||
*/ | |||
const unsigned int PARAMETER_IS_LOGARITHMIC = 0x008; | |||
const unsigned int PARAMETER_IS_LOGARITHMIC = 0x004; | |||
/*! | |||
* Parameter is enabled. | |||
@@ -1165,46 +1165,53 @@ private: | |||
// Bridge/Controller OSC stuff | |||
public: | |||
#ifdef BUILD_BRIDGE | |||
void oscSend_bridge_audio_count(const int32_t ins, const int32_t outs, const int32_t total); | |||
void oscSend_bridge_midi_count(const int32_t ins, const int32_t outs, const int32_t total); | |||
void oscSend_bridge_parameter_count(const int32_t ins, const int32_t outs, const int32_t total); | |||
void oscSend_bridge_program_count(const int32_t count); | |||
void oscSend_bridge_midi_program_count(const int32_t count); | |||
void 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 oscSend_bridge_parameter_info(const int32_t index, const char* const name, const char* const unit); | |||
void 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 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 oscSend_bridge_program_info(const int32_t index, const char* const name); | |||
void oscSend_bridge_midi_program_info(const int32_t index, const int32_t bank, const int32_t program, const char* const label); | |||
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_parameter_value(const int32_t index, const float value); | |||
void oscSend_bridge_set_default_value(const int32_t index, const float value); | |||
void oscSend_bridge_set_program(const int32_t index); | |||
void oscSend_bridge_set_midi_program(const int32_t index); | |||
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(); | |||
#else | |||
void oscSend_control_add_plugin_start(const int32_t pluginId, const char* const pluginName); | |||
void oscSend_control_add_plugin_end(const int32_t pluginId); | |||
void oscSend_control_remove_plugin(const int32_t pluginId); | |||
void oscSend_control_set_plugin_data(const int32_t pluginId, const int32_t type, const int32_t category, const int32_t hints, const char* const realName, const char* const label, const char* const maker, const char* const copyright, const int64_t uniqueId); | |||
void oscSend_control_set_plugin_ports(const int32_t pluginId, const int32_t audioIns, const int32_t audioOuts, const int32_t midiIns, const int32_t midiOuts, const int32_t cIns, const int32_t cOuts); | |||
void oscSend_control_set_parameter_data(const int32_t pluginId, const int32_t index, const int32_t hints, const char* const name, const char* const unit, const float current); | |||
void oscSend_control_set_parameter_ranges(const int32_t pluginId, const int32_t index, const float min, const float max, const float def, const float step, const float stepSmall, const float stepLarge); | |||
void oscSend_control_set_parameter_midi_cc(const int32_t pluginId, const int32_t index, const int32_t cc); | |||
void oscSend_control_set_parameter_midi_channel(const int32_t pluginId, const int32_t index, const int32_t channel); | |||
void oscSend_control_set_parameter_value(const int32_t pluginId, const int32_t index, const float value); | |||
void oscSend_control_set_default_value(const int32_t pluginId, const int32_t index, const float value); | |||
void oscSend_control_set_program(const int32_t pluginId, const int32_t index); | |||
void oscSend_control_set_program_count(const int32_t pluginId, const int32_t count); | |||
void oscSend_control_set_program_name(const int32_t pluginId, const int32_t index, const char* const name); | |||
void oscSend_control_set_midi_program(const int32_t pluginId, const int32_t index); | |||
void oscSend_control_set_midi_program_count(const int32_t pluginId, const int32_t count); | |||
void oscSend_control_set_midi_program_data(const int32_t pluginId, const int32_t index, const int32_t bank, const int32_t program, const char* const name); | |||
void oscSend_control_note_on(const int32_t pluginId, const int32_t channel, const int32_t note, const int32_t velo); | |||
void oscSend_control_note_off(const int32_t pluginId, const int32_t channel, const int32_t note); | |||
void oscSend_control_set_peaks(const int32_t pluginId); | |||
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(); | |||
#endif | |||
@@ -328,7 +328,7 @@ public: | |||
/*! | |||
* Get the custom text of the parameter \a parameterId. | |||
*/ | |||
virtual void getParameterText(const uint32_t parameterId, char* const strBuf) const; | |||
virtual void getParameterText(const uint32_t parameterId, const float value, char* const strBuf) const; | |||
/*! | |||
* Get the unit of the parameter \a parameterId. | |||
@@ -662,15 +662,18 @@ public: | |||
*/ | |||
virtual void offlineModeChanged(const bool isOffline); | |||
#if 0 | |||
/*! | |||
* Lock the plugin's master mutex. | |||
*/ | |||
void lock(); | |||
#endif | |||
/*! | |||
* Try to lock the plugin's master mutex. | |||
* @param forcedOffline When true, always locks and returns true | |||
*/ | |||
bool tryLock(); | |||
bool tryLock(const bool forcedOffline); | |||
/*! | |||
* Unlock the plugin's master mutex. | |||
@@ -25,18 +25,38 @@ | |||
#include "CarlaMutex.hpp" | |||
CARLA_BACKEND_START_NAMESPACE | |||
#if 0 | |||
} // Fix editor indentation | |||
#ifdef HAVE_JUCE | |||
# include "juce_audio_basics.h" | |||
using juce::FloatVectorOperations; | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
// Engine helper macro, sets lastError and returns false/NULL | |||
#define CARLA_SAFE_ASSERT_RETURN_ERR(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return false; } | |||
#define CARLA_SAFE_ASSERT_RETURN_ERRN(cond, err) if (cond) pass(); else { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return nullptr; } | |||
// ----------------------------------------------------------------------- | |||
// Float operations | |||
#ifdef HAVE_JUCE | |||
# define FLOAT_ADD(bufDst, bufSrc, frames) FloatVectorOperations::add(bufDst, bufSrc, frames) | |||
# define FLOAT_COPY(bufDst, bufSrc, frames) FloatVectorOperations::copy(bufDst, bufSrc, frames) | |||
# define FLOAT_CLEAR(buf, frames) FloatVectorOperations::clear(buf, frames) | |||
#else | |||
# define FLOAT_ADD(bufDst, bufSrc, frames) carla_addFloat(bufDst, bufSrc, frames) | |||
# define FLOAT_COPY(bufDst, bufSrc, frames) carla_copyFloat(bufDst, bufSrc, frames) | |||
# define FLOAT_CLEAR(buf, frames) carla_zeroFloat(buf, frames) | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
CARLA_BACKEND_START_NAMESPACE | |||
#if 0 | |||
} // Fix editor indentation | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
static inline | |||
@@ -22,12 +22,8 @@ | |||
#include "List.hpp" | |||
#include "jackbridge/JackBridge.hpp" | |||
#ifdef HAVE_JUCE | |||
# include "juce_audio_basics.h" | |||
using juce::FloatVectorOperations; | |||
#endif | |||
#include <cmath> | |||
#include <QtCore/QStringList> | |||
#define URI_CANVAS_ICON "http://kxstudio.sf.net/ns/canvas/icon" | |||
@@ -90,13 +86,7 @@ public: | |||
fBuffer = (float*)jackbridge_port_get_buffer(fPort, bufferSize); | |||
if (! fIsInput) | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::clear(fBuffer, bufferSize); | |||
#else | |||
carla_zeroFloat(fBuffer, bufferSize); | |||
#endif | |||
} | |||
FLOAT_CLEAR(fBuffer, bufferSize); | |||
} | |||
private: | |||
@@ -153,13 +143,7 @@ public: | |||
fBuffer = (float*)jackbridge_port_get_buffer(fPort, bufferSize); | |||
if (! fIsInput) | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::clear(fBuffer, bufferSize); | |||
#else | |||
carla_zeroFloat(fBuffer, bufferSize); | |||
#endif | |||
} | |||
FLOAT_CLEAR(fBuffer, bufferSize); | |||
} | |||
private: | |||
@@ -1060,13 +1044,9 @@ protected: | |||
float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut2], nframes); | |||
void* const eventOut = jackbridge_port_get_buffer(fRackPorts[kRackPortEventOut], nframes); | |||
# ifdef HAVE_JUCE | |||
FloatVectorOperations::copy(audioOut1, audioIn1, nframes); | |||
FloatVectorOperations::copy(audioOut2, audioIn2, nframes); | |||
# else | |||
carla_copyFloat(audioOut1, audioIn1, nframes); | |||
carla_copyFloat(audioOut2, audioIn2, nframes); | |||
# endif | |||
FLOAT_COPY(audioOut1, audioIn1, nframes); | |||
FLOAT_COPY(audioOut2, audioIn2, nframes); | |||
jackbridge_midi_clear_buffer(eventOut); | |||
} | |||
#endif | |||
@@ -1077,7 +1057,7 @@ protected: | |||
#ifdef BUILD_BRIDGE | |||
CarlaPlugin* const plugin(pData->plugins[0].plugin); | |||
if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock()) | |||
if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock(fFreewheel)) | |||
{ | |||
plugin->initBuffers(); | |||
processPlugin(plugin, nframes); | |||
@@ -1092,7 +1072,7 @@ protected: | |||
{ | |||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||
if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock()) | |||
if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock(fFreewheel)) | |||
{ | |||
plugin->initBuffers(); | |||
processPlugin(plugin, nframes); | |||
@@ -1983,15 +1963,18 @@ private: | |||
{ | |||
CarlaPlugin* const plugin((CarlaPlugin*)arg); | |||
if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock()) | |||
if (plugin != nullptr && plugin->isEnabled()) | |||
{ | |||
CarlaEngineJack* const engine((CarlaEngineJack*)plugin->getEngine()); | |||
CARLA_SAFE_ASSERT_RETURN(engine != nullptr,0); | |||
plugin->initBuffers(); | |||
engine->saveTransportInfo(); | |||
engine->processPlugin(plugin, nframes); | |||
plugin->unlock(); | |||
if (plugin->tryLock(engine->fFreewheel)) | |||
{ | |||
plugin->initBuffers(); | |||
engine->saveTransportInfo(); | |||
engine->processPlugin(plugin, nframes); | |||
plugin->unlock(); | |||
} | |||
} | |||
return 0; | |||
@@ -26,6 +26,7 @@ | |||
// #include "RtList.hpp" | |||
#include "juce_audio_devices.h" | |||
using namespace juce; | |||
CARLA_BACKEND_START_NAMESPACE | |||
@@ -24,11 +24,6 @@ | |||
#include "CarlaNative.hpp" | |||
#ifdef HAVE_JUCE | |||
# include "juce_audio_basics.h" | |||
using juce::FloatVectorOperations; | |||
#endif | |||
CARLA_BACKEND_START_NAMESPACE | |||
#if 0 | |||
@@ -343,23 +338,7 @@ protected: | |||
static char strBuf[STR_MAX+1]; | |||
carla_zeroChar(strBuf, STR_MAX+1); | |||
float oldValue; | |||
plugin->lock(); | |||
oldValue = plugin->getParameterValue(index); | |||
if (oldValue != value) | |||
{ | |||
plugin->setParameterValue(index, value, false, false, false); | |||
plugin->getParameterText(index, strBuf); | |||
plugin->setParameterValue(index, oldValue, false, false, false); | |||
} | |||
else | |||
{ | |||
plugin->getParameterText(index, strBuf); | |||
} | |||
plugin->unlock(); | |||
plugin->getParameterText(index, value, strBuf); | |||
return strBuf; | |||
} | |||
@@ -468,13 +447,9 @@ protected: | |||
{ | |||
if (pData->curPluginCount == 0 && ! fIsPatchbay) | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::copy(outBuffer[0], inBuffer[0], frames); | |||
FloatVectorOperations::copy(outBuffer[1], inBuffer[1], frames); | |||
#else | |||
carla_copyFloat(outBuffer[0], inBuffer[0], frames); | |||
carla_copyFloat(outBuffer[1], inBuffer[1], frames); | |||
#endif | |||
FLOAT_COPY(outBuffer[0], inBuffer[0], frames); | |||
FLOAT_COPY(outBuffer[1], inBuffer[1], frames); | |||
return runPendingRtEvents();; | |||
} | |||
@@ -769,10 +744,12 @@ public: | |||
return new CarlaEngineNative(host, false); | |||
} | |||
#ifdef HAVE_JUCE | |||
static NativePluginHandle _instantiatePatchbay(const NativeHostDescriptor* host) | |||
{ | |||
return new CarlaEngineNative(host, true); | |||
} | |||
#endif | |||
static void _cleanup(NativePluginHandle handle) | |||
{ | |||
@@ -823,6 +800,7 @@ static const NativePluginDescriptor carlaRackDesc = { | |||
PluginDescriptorFILL2(CarlaEngineNative) | |||
}; | |||
#ifdef HAVE_JUCE | |||
static const NativePluginDescriptor carlaPatchbayDesc = { | |||
/* category */ ::PLUGIN_CATEGORY_OTHER, | |||
/* hints */ static_cast<NativePluginHints>(::PLUGIN_IS_SYNTH|::PLUGIN_HAS_UI|::PLUGIN_NEEDS_FIXED_BUFFERS|::PLUGIN_NEEDS_SINGLE_THREAD|::PLUGIN_USES_STATE|::PLUGIN_USES_TIME), | |||
@@ -841,6 +819,7 @@ static const NativePluginDescriptor carlaPatchbayDesc = { | |||
CarlaEngineNative::_cleanup, | |||
PluginDescriptorFILL2(CarlaEngineNative) | |||
}; | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
@@ -853,7 +832,9 @@ void carla_register_native_plugin_carla() | |||
{ | |||
CARLA_BACKEND_USE_NAMESPACE | |||
carla_register_native_plugin(&carlaRackDesc); | |||
#ifdef HAVE_JUCE | |||
carla_register_native_plugin(&carlaPatchbayDesc); | |||
#endif | |||
} | |||
// ----------------------------------------------------------------------- |
@@ -23,11 +23,6 @@ | |||
#include "rtaudio/RtAudio.h" | |||
#include "rtmidi/RtMidi.h" | |||
#ifdef HAVE_JUCE | |||
# include "juce_audio_basics.h" | |||
using juce::FloatVectorOperations; | |||
#endif | |||
CARLA_BACKEND_START_NAMESPACE | |||
#if 0 | |||
@@ -840,13 +835,7 @@ protected: | |||
if (pData->curPluginCount == 0 || fAudioCountOut == 0 || ! fAudioIsReady) | |||
{ | |||
if (fAudioCountOut > 0 && fAudioIsReady) | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::clear(outsPtr, nframes*fAudioCountOut); | |||
#else | |||
carla_zeroFloat(outsPtr, nframes*fAudioCountOut); | |||
#endif | |||
} | |||
FLOAT_CLEAR(outsPtr, nframes*fAudioCountOut); | |||
return runPendingRtEvents(); | |||
} | |||
@@ -865,30 +854,15 @@ protected: | |||
else | |||
{ | |||
for (unsigned int i=0; i < fAudioCountIn; ++i) | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::copy(fAudioBufIn[i], insPtr+(nframes*i), nframes); | |||
#else | |||
carla_copyFloat(fAudioBufIn[i], insPtr+(nframes*i), nframes); | |||
#endif | |||
} | |||
FLOAT_COPY(fAudioBufIn[i], insPtr+(nframes*i), nframes); | |||
} | |||
#ifdef HAVE_JUCE | |||
// initialize audio output | |||
for (unsigned int i=0; i < fAudioCountOut; ++i) | |||
FloatVectorOperations::clear(fAudioBufOut[i], nframes); | |||
FloatVectorOperations::clear(fAudioBufRackOut[0], nframes); | |||
FloatVectorOperations::clear(fAudioBufRackOut[1], nframes); | |||
#else | |||
// initialize audio output | |||
for (unsigned int i=0; i < fAudioCountOut; ++i) | |||
carla_zeroFloat(fAudioBufOut[i], nframes); | |||
FLOAT_CLEAR(fAudioBufOut[i], nframes); | |||
carla_zeroFloat(fAudioBufRackOut[0], nframes); | |||
carla_zeroFloat(fAudioBufRackOut[1], nframes); | |||
#endif | |||
FLOAT_CLEAR(fAudioBufRackOut[0], nframes); | |||
FLOAT_CLEAR(fAudioBufRackOut[1], nframes); | |||
// initialize input events | |||
carla_zeroMem(pData->bufEvents.in, sizeof(EngineEvent)*kEngineMaxInternalEventCount); | |||
@@ -929,11 +903,7 @@ protected: | |||
// connect input buffers | |||
if (fConnectedAudioIns[0].count() == 0) | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::clear(fAudioBufRackIn[0], nframes); | |||
#else | |||
carla_zeroFloat(fAudioBufRackIn[0], nframes); | |||
#endif | |||
FLOAT_CLEAR(fAudioBufRackIn[0], nframes); | |||
} | |||
else | |||
{ | |||
@@ -946,40 +916,22 @@ protected: | |||
if (first) | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::copy(fAudioBufRackIn[0], fAudioBufIn[port], nframes); | |||
#else | |||
carla_copyFloat(fAudioBufRackIn[0], fAudioBufIn[port], nframes); | |||
#endif | |||
FLOAT_COPY(fAudioBufRackIn[0], fAudioBufIn[port], nframes); | |||
first = false; | |||
} | |||
else | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::add(fAudioBufRackIn[0], fAudioBufIn[port], nframes); | |||
#else | |||
carla_addFloat(fAudioBufRackIn[0], fAudioBufIn[port], nframes); | |||
#endif | |||
FLOAT_ADD(fAudioBufRackIn[0], fAudioBufIn[port], nframes); | |||
} | |||
} | |||
if (first) | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::clear(fAudioBufRackIn[0], nframes); | |||
#else | |||
carla_zeroFloat(fAudioBufRackIn[0], nframes); | |||
#endif | |||
} | |||
FLOAT_CLEAR(fAudioBufRackIn[0], nframes); | |||
} | |||
if (fConnectedAudioIns[1].count() == 0) | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::clear(fAudioBufRackIn[1], nframes); | |||
#else | |||
carla_zeroFloat(fAudioBufRackIn[1], nframes); | |||
#endif | |||
FLOAT_CLEAR(fAudioBufRackIn[1], nframes); | |||
} | |||
else | |||
{ | |||
@@ -992,31 +944,17 @@ protected: | |||
if (first) | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::copy(fAudioBufRackIn[1], fAudioBufIn[port], nframes); | |||
#else | |||
carla_copyFloat(fAudioBufRackIn[1], fAudioBufIn[port], nframes); | |||
#endif | |||
FLOAT_COPY(fAudioBufRackIn[1], fAudioBufIn[port], nframes); | |||
first = false; | |||
} | |||
else | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::add(fAudioBufRackIn[1], fAudioBufIn[port], nframes); | |||
#else | |||
carla_addFloat(fAudioBufRackIn[1], fAudioBufIn[port], nframes); | |||
#endif | |||
FLOAT_ADD(fAudioBufRackIn[1], fAudioBufIn[port], nframes); | |||
} | |||
} | |||
if (first) | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::clear(fAudioBufRackIn[1], nframes); | |||
#else | |||
carla_zeroFloat(fAudioBufRackIn[1], nframes); | |||
#endif | |||
} | |||
FLOAT_CLEAR(fAudioBufRackIn[1], nframes); | |||
} | |||
// process | |||
@@ -1030,11 +968,7 @@ protected: | |||
const uint& port(*it); | |||
CARLA_ASSERT(port < fAudioCountOut); | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::add(fAudioBufOut[port], fAudioBufRackOut[0], nframes); | |||
#else | |||
carla_addFloat(fAudioBufOut[port], fAudioBufRackOut[0], nframes); | |||
#endif | |||
FLOAT_ADD(fAudioBufOut[port], fAudioBufRackOut[0], nframes); | |||
} | |||
} | |||
@@ -1045,11 +979,7 @@ protected: | |||
const uint& port(*it); | |||
CARLA_ASSERT(port < fAudioCountOut); | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::add(fAudioBufOut[port], fAudioBufRackOut[1], nframes); | |||
#else | |||
carla_addFloat(fAudioBufOut[port], fAudioBufRackOut[1], nframes); | |||
#endif | |||
FLOAT_ADD(fAudioBufOut[port], fAudioBufRackOut[1], nframes); | |||
} | |||
} | |||
@@ -1069,13 +999,7 @@ protected: | |||
else | |||
{ | |||
for (unsigned int i=0; i < fAudioCountOut; ++i) | |||
{ | |||
#ifdef HAVE_JUCE | |||
FloatVectorOperations::copy(outsPtr+(nframes*i), fAudioBufOut[i], nframes); | |||
#else | |||
carla_copyFloat(outsPtr+(nframes*i), fAudioBufOut[i], nframes); | |||
#endif | |||
} | |||
FLOAT_COPY(outsPtr+(nframes*i), fAudioBufOut[i], nframes); | |||
} | |||
// output events | |||
@@ -18,11 +18,9 @@ | |||
#include "CarlaPluginInternal.hpp" | |||
#include "CarlaLibCounter.hpp" | |||
#ifdef USE_JUCE | |||
#include "juce_data_structures.h" | |||
using namespace juce; | |||
#endif | |||
#include <QtCore/QFile> | |||
#include <QtCore/QTextStream> | |||
#include <QtCore/QSettings> | |||
CARLA_BACKEND_START_NAMESPACE | |||
@@ -109,92 +107,62 @@ void* CarlaPluginProtectedData::uiLibSymbol(const char* const symbol) | |||
void CarlaPluginProtectedData::saveSetting(const unsigned int option, const bool yesNo) | |||
{ | |||
#ifdef USE_JUCE | |||
PropertiesFile::Options opts; | |||
opts.applicationName = "common"; // TODO, (const char*)idStr | |||
opts.filenameSuffix = ".cfg"; | |||
opts.osxLibrarySubFolder = "Application Support"; | |||
#ifdef CARLA_OS_LINUX | |||
opts.folderName = "config/falkTX/Carla/PluginSettings/"; | |||
#else | |||
opts.folderName = "falkTX\\Carla\\PluginSettings\\"; | |||
#endif | |||
CARLA_SAFE_ASSERT_RETURN(identifier != nullptr && identifier[0] != '\0',); | |||
ApplicationProperties appProps; | |||
appProps.setStorageParameters(opts); | |||
PropertiesFile* const props(appProps.getUserSettings()); | |||
CARLA_SAFE_ASSERT_RETURN(props != nullptr,); | |||
QSettings settings("falkTX", "CarlaPluginSettings"); | |||
settings.beginGroup(identifier); | |||
switch (option) | |||
{ | |||
case PLUGIN_OPTION_FIXED_BUFFERS: | |||
props->setValue("FixedBuffers", yesNo); | |||
settings.setValue("FixedBuffers", yesNo); | |||
break; | |||
case PLUGIN_OPTION_FORCE_STEREO: | |||
props->setValue("ForceStereo", yesNo); | |||
settings.setValue("ForceStereo", yesNo); | |||
break; | |||
case PLUGIN_OPTION_MAP_PROGRAM_CHANGES: | |||
props->setValue("MapProgramChanges", yesNo); | |||
settings.setValue("MapProgramChanges", yesNo); | |||
break; | |||
case PLUGIN_OPTION_USE_CHUNKS: | |||
props->setValue("UseChunks", yesNo); | |||
settings.setValue("UseChunks", yesNo); | |||
break; | |||
case PLUGIN_OPTION_SEND_CONTROL_CHANGES: | |||
props->setValue("SendControlChanges", yesNo); | |||
settings.setValue("SendControlChanges", yesNo); | |||
break; | |||
case PLUGIN_OPTION_SEND_CHANNEL_PRESSURE: | |||
props->setValue("SendChannelPressure", yesNo); | |||
settings.setValue("SendChannelPressure", yesNo); | |||
break; | |||
case PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH: | |||
props->setValue("SendNoteAftertouch", yesNo); | |||
settings.setValue("SendNoteAftertouch", yesNo); | |||
break; | |||
case PLUGIN_OPTION_SEND_PITCHBEND: | |||
props->setValue("SendPitchbend", yesNo); | |||
settings.setValue("SendPitchbend", yesNo); | |||
break; | |||
case PLUGIN_OPTION_SEND_ALL_SOUND_OFF: | |||
props->setValue("SendAllSoundOff", yesNo); | |||
settings.setValue("SendAllSoundOff", yesNo); | |||
break; | |||
default: | |||
break; | |||
} | |||
appProps.saveIfNeeded(); | |||
appProps.closeFiles(); | |||
#endif | |||
settings.endGroup(); | |||
} | |||
unsigned int CarlaPluginProtectedData::loadSettings(const unsigned int options, const unsigned int availOptions) | |||
{ | |||
#ifdef USE_JUCE | |||
PropertiesFile::Options opts; | |||
opts.applicationName = "common"; // TODO, (const char*)idStr | |||
opts.filenameSuffix = ".cfg"; | |||
opts.osxLibrarySubFolder = "Application Support"; | |||
CARLA_SAFE_ASSERT_RETURN(identifier != nullptr && identifier[0] != '\0',); | |||
#ifdef CARLA_OS_LINUX | |||
opts.folderName = "config/falkTX/Carla/PluginSettings/"; | |||
#else | |||
opts.folderName = "falkTX\\Carla\\PluginSettings\\"; | |||
#endif | |||
ApplicationProperties appProps; | |||
appProps.setStorageParameters(opts); | |||
PropertiesFile* const props(appProps.getUserSettings()); | |||
CARLA_SAFE_ASSERT_RETURN(props != nullptr, options); | |||
QSettings settings("falkTX", "CarlaPluginSettings"); | |||
settings.beginGroup(identifier); | |||
unsigned int newOptions = 0x0; | |||
#define CHECK_AND_SET_OPTION(KEY, BIT) \ | |||
#define CHECK_AND_SET_OPTION(STR, BIT) \ | |||
if ((availOptions & BIT) != 0 || BIT == PLUGIN_OPTION_FORCE_STEREO) \ | |||
{ \ | |||
if (props->containsKey(KEY)) \ | |||
if (settings.contains(STR)) \ | |||
{ \ | |||
if (props->getBoolValue(KEY, bool(options & BIT))) \ | |||
if (settings.value(STR, (options & BIT) != 0).toBool()) \ | |||
newOptions |= BIT; \ | |||
} \ | |||
else if (options & BIT) \ | |||
@@ -213,9 +181,9 @@ unsigned int CarlaPluginProtectedData::loadSettings(const unsigned int options, | |||
#undef CHECK_AND_SET_OPTION | |||
settings.endGroup(); | |||
return newOptions; | |||
#endif | |||
return 0x0; | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -254,7 +222,6 @@ CarlaPlugin::~CarlaPlugin() | |||
{ | |||
carla_debug("CarlaPlugin::~CarlaPlugin()"); | |||
pData->cleanup(); | |||
delete pData; | |||
} | |||
@@ -378,7 +345,7 @@ const ParameterRanges& CarlaPlugin::getParameterRanges(const uint32_t parameterI | |||
bool CarlaPlugin::isParameterOutput(const uint32_t parameterId) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, false); | |||
return ((pData->param.data[parameterId].hints & PARAMETER_IS_INPUT) == 0); | |||
return (pData->param.data[parameterId].type == PARAMETER_OUTPUT); | |||
} | |||
const MidiProgramData& CarlaPlugin::getMidiProgramData(const uint32_t index) const | |||
@@ -545,7 +512,6 @@ const SaveState& CarlaPlugin::getSaveState() | |||
pData->saveState.ctrlChannel = pData->ctrlChannel; | |||
#endif | |||
#ifdef USE_JUCE | |||
// --------------------------------------------------------------- | |||
// Chunk | |||
@@ -556,14 +522,12 @@ const SaveState& CarlaPlugin::getSaveState() | |||
if (data != nullptr && dataSize > 0) | |||
{ | |||
MemoryBlock memBlock(data, dataSize); | |||
pData->saveState.chunk = carla_strdup(memBlock.toBase64Encoding().toRawUTF8()); | |||
pData->saveState.chunk = carla_strdup(QByteArray((char*)data, dataSize).toBase64().constData()); | |||
// Don't save anything else if using chunks | |||
return pData->saveState; | |||
} | |||
} | |||
#endif | |||
// --------------------------------------------------------------- | |||
// Current Program | |||
@@ -1512,8 +1476,14 @@ void CarlaPlugin::offlineModeChanged(const bool) | |||
{ | |||
} | |||
bool CarlaPlugin::tryLock() | |||
bool CarlaPlugin::tryLock(const bool forcedOffline) | |||
{ | |||
if (forcedOffline) | |||
{ | |||
pData->masterMutex.lock(); | |||
return true; | |||
} | |||
return pData->masterMutex.tryLock(); | |||
} | |||
@@ -1604,11 +1574,11 @@ void CarlaPlugin::registerToOscClient() | |||
#ifdef BUILD_BRIDGE | |||
pData->engine->oscSend_bridge_parameter_info(i, bufName, bufUnit); | |||
pData->engine->oscSend_bridge_parameter_data(i, paramData.rindex, paramData.hints, paramData.midiChannel, paramData.midiCC); | |||
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)); | |||
#else | |||
pData->engine->oscSend_control_set_parameter_data(pData->id, i,paramData.hints, bufName, bufUnit, getParameterValue(i)); | |||
pData->engine->oscSend_control_set_parameter_data(pData->id, i, paramData.type, paramData.hints, bufName, bufUnit, getParameterValue(i)); | |||
pData->engine->oscSend_control_set_parameter_ranges(pData->id, i, paramRanges.min, paramRanges.max, paramRanges.def, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge); | |||
pData->engine->oscSend_control_set_parameter_midi_cc(pData->id, i, paramData.midiCC); | |||
pData->engine->oscSend_control_set_parameter_midi_channel(pData->id, i, paramData.midiChannel); | |||
@@ -2051,7 +2021,6 @@ CarlaEngineAudioPort* CarlaPlugin::getAudioOutPort(const uint32_t index) const n | |||
return pData->audioOut.ports[index].port; | |||
} | |||
// ------------------------------------------------------------------- | |||
// Scoped Disabler | |||
@@ -26,16 +26,30 @@ | |||
#include "CarlaOscUtils.hpp" | |||
#include "CarlaStateUtils.hpp" | |||
#include "CarlaMutex.hpp" | |||
#include "CarlaMIDI.h" | |||
#include "RtList.hpp" | |||
#ifdef HAVE_JUCE | |||
# include "juce_audio_basics.h" | |||
using juce::FloatVectorOperations; | |||
#endif | |||
#include <cmath> | |||
// ----------------------------------------------------------------------- | |||
#define CARLA_PROCESS_CONTINUE_CHECK if (! pData->enabled) { pData->engine->callback(ENGINE_CALLBACK_DEBUG, pData->id, 0, 0, 0.0f, "Processing while plugin is disabled!!"); return; } | |||
#ifdef USE_JUCE | |||
#include "juce_audio_basics.h" | |||
using juce::FloatVectorOperations; | |||
// ----------------------------------------------------------------------- | |||
// Float operations | |||
#ifdef HAVE_JUCE | |||
# define FLOAT_ADD(bufDst, bufSrc, frames) FloatVectorOperations::add(bufDst, bufSrc, frames) | |||
# define FLOAT_COPY(bufDst, bufSrc, frames) FloatVectorOperations::copy(bufDst, bufSrc, frames) | |||
# define FLOAT_CLEAR(buf, frames) FloatVectorOperations::clear(buf, frames) | |||
#else | |||
# define FLOAT_ADD(bufDst, bufSrc, frames) carla_addFloat(bufDst, bufSrc, frames) | |||
# define FLOAT_COPY(bufDst, bufSrc, frames) carla_copyFloat(bufDst, bufSrc, frames) | |||
# define FLOAT_CLEAR(buf, frames) carla_zeroFloat(buf, frames) | |||
#endif | |||
CARLA_BACKEND_START_NAMESPACE | |||
@@ -80,12 +94,12 @@ struct PluginPostRtEvent { | |||
int32_t value1; | |||
int32_t value2; | |||
float value3; | |||
}; | |||
PluginPostRtEvent() noexcept | |||
: type(kPluginPostRtEventNull), | |||
value1(-1), | |||
value2(-1), | |||
value3(0.0f) {} | |||
struct ExternalMidiNote { | |||
int8_t channel; // invalid if -1 | |||
uint8_t note; // 0 to 127 | |||
uint8_t velo; // note-off if 0 | |||
}; | |||
// ----------------------------------------------------------------------- | |||
@@ -474,19 +488,6 @@ struct PluginMidiProgramData { | |||
// ----------------------------------------------------------------------- | |||
struct ExternalMidiNote { | |||
int8_t channel; // invalid if -1 | |||
uint8_t note; | |||
uint8_t velo; // note-off if 0 | |||
ExternalMidiNote() noexcept | |||
: channel(-1), | |||
note(0), | |||
velo(0) {} | |||
}; | |||
// ----------------------------------------------------------------------- | |||
struct CarlaPluginProtectedData { | |||
CarlaEngine* const engine; | |||
CarlaEngineClient* client; | |||
@@ -503,19 +504,19 @@ struct CarlaPluginProtectedData { | |||
void* uiLib; | |||
// misc | |||
int8_t ctrlChannel; | |||
unsigned int extraHints; | |||
int patchbayClientId; | |||
int8_t ctrlChannel; | |||
uint extraHints; | |||
int patchbayClientId; | |||
// latency | |||
uint32_t latency; | |||
float** latencyBuffers; | |||
// data 1 | |||
CarlaString name; | |||
CarlaString filename; | |||
CarlaString iconName; | |||
CarlaString idStr; | |||
const char* name; | |||
const char* filename; | |||
const char* iconName; | |||
const char* identifier; // used for save/restore settings per plugin | |||
// data 2 | |||
PluginAudioData audioIn; | |||
@@ -633,8 +634,8 @@ struct CarlaPluginProtectedData { | |||
#endif | |||
} osc; | |||
CarlaPluginProtectedData(CarlaEngine* const eng, CarlaPlugin* const plug) | |||
: engine(eng), | |||
CarlaPluginProtectedData(CarlaEngine* const e, CarlaPlugin* const p) | |||
: engine(e), | |||
client(nullptr), | |||
id(0), | |||
hints(0x0), | |||
@@ -649,7 +650,11 @@ struct CarlaPluginProtectedData { | |||
patchbayClientId(0), | |||
latency(0), | |||
latencyBuffers(nullptr), | |||
osc(eng, plug) {} | |||
name(nullptr), | |||
filename(nullptr), | |||
iconName(nullptr), | |||
identifier(nullptr), | |||
osc(e, p) {} | |||
#ifdef CARLA_PROPER_CPP11_SUPPORT | |||
CarlaPluginProtectedData() = delete; | |||
@@ -658,20 +663,32 @@ struct CarlaPluginProtectedData { | |||
~CarlaPluginProtectedData() | |||
{ | |||
CARLA_ASSERT(client == nullptr); | |||
CARLA_ASSERT(! active); | |||
CARLA_ASSERT(lib == nullptr); | |||
CARLA_ASSERT(uiLib == nullptr); | |||
CARLA_ASSERT(latency == 0); | |||
CARLA_ASSERT(latencyBuffers == nullptr); | |||
CARLA_SAFE_ASSERT(! needsReset); | |||
} | |||
// ------------------------------------------------------------------- | |||
// Cleanup | |||
if (name != nullptr) | |||
{ | |||
delete[] name; | |||
name = nullptr; | |||
} | |||
if (filename != nullptr) | |||
{ | |||
delete[] filename; | |||
filename = nullptr; | |||
} | |||
if (iconName != nullptr) | |||
{ | |||
delete[] iconName; | |||
iconName = nullptr; | |||
} | |||
if (identifier != nullptr) | |||
{ | |||
delete[] identifier; | |||
identifier = nullptr; | |||
} | |||
void cleanup() | |||
{ | |||
{ | |||
// mutex MUST have been locked before | |||
const bool lockMaster(masterMutex.tryLock()); | |||
@@ -734,6 +751,8 @@ struct CarlaPluginProtectedData { | |||
if (lib != nullptr) | |||
libClose(); | |||
CARLA_ASSERT(uiLib == nullptr); | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -1358,13 +1358,8 @@ const char* carla_get_chunk_data(uint pluginId) | |||
if (data != nullptr && dataSize > 0) | |||
{ | |||
#if 0 //def HAVE_JUCE | |||
juce::MemoryBlock memBlock(data, dataSize); | |||
chunkData = memBlock.toBase64Encoding().toRawUTF8(); | |||
#else | |||
QByteArray chunk(QByteArray((char*)data, dataSize).toBase64()); | |||
chunkData = chunk.constData(); | |||
#endif | |||
chunkData = QByteArray((char*)data, dataSize).toBase64().constData(); | |||
return (const char*)chunkData; | |||
} | |||
else | |||
@@ -222,18 +222,14 @@ PLUGIN_OPTION_SEND_ALL_SOUND_OFF = 0x100 | |||
# Various parameter hints. | |||
# @see CarlaPlugin::getParameterData() and carla_get_parameter_data() | |||
# Parameter is input. | |||
# When this hint is not set, parameter is assumed to be output. | |||
PARAMETER_IS_INPUT = 0x001 | |||
# Parameter value is boolean. | |||
PARAMETER_IS_BOOLEAN = 0x002 | |||
PARAMETER_IS_BOOLEAN = 0x001 | |||
# Parameter value is integer. | |||
PARAMETER_IS_INTEGER = 0x004 | |||
PARAMETER_IS_INTEGER = 0x002 | |||
# Parameter value is logarithmic. | |||
PARAMETER_IS_LOGARITHMIC = 0x008 | |||
PARAMETER_IS_LOGARITHMIC = 0x004 | |||
# Parameter is enabled. | |||
# It can be viewed, changed and stored. | |||
@@ -19,11 +19,6 @@ | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Global) | |||
#try: | |||
#from PyQt5.QtCore import pyqtSignal, pyqtSlot, QByteArray, QSettings | |||
#from PyQt5.QtGui import QColor, QCursor, QFontMetrics, QPainter, QPainterPath | |||
#from PyQt5.QtWidgets import QDialog, QFrame, QInputDialog, QLineEdit, QMenu, QVBoxLayout, QWidget | |||
#except: | |||
from PyQt4.QtCore import pyqtSignal, pyqtSlot, QByteArray, QSettings | |||
from PyQt4.QtGui import QColor, QCursor, QFontMetrics, QPainter, QPainterPath | |||
from PyQt4.QtGui import QDialog, QFrame, QInputDialog, QLineEdit, QMenu, QVBoxLayout, QWidget | |||
@@ -65,7 +60,7 @@ gFakePluginInfo = { | |||
} | |||
gFakeParamInfo = { | |||
"hints": PARAMETER_IS_INPUT|PARAMETER_IS_ENABLED|PARAMETER_IS_AUTOMABLE, | |||
"hints": PARAMETER_IS_ENABLED|PARAMETER_IS_AUTOMABLE, | |||
"name": "Parameter Name", | |||
"unit": "", | |||
"scalePoints": [], | |||
@@ -45,7 +45,7 @@ | |||
/** Config: JUCE_ALSA | |||
Enables ALSA audio devices (Linux only). | |||
*/ | |||
#if 0 //JUCE_LINUX | |||
#if JUCE_LINUX | |||
#define JUCE_ALSA 1 | |||
#define JUCE_ALSA_MIDI_INPUT_NAME "Carla" | |||
#define JUCE_ALSA_MIDI_OUTPUT_NAME "Carla" | |||
@@ -74,7 +74,7 @@ void CarlaPlugin::getCopyright(char* const) const noexcept {} | |||
void CarlaPlugin::getRealName(char* const) const noexcept {} | |||
void CarlaPlugin::getParameterName(const uint32_t, char* const) const {} | |||
void CarlaPlugin::getParameterSymbol(const uint32_t, char* const) const {} | |||
void CarlaPlugin::getParameterText(const uint32_t, char* const) const {} | |||
void CarlaPlugin::getParameterText(const uint32_t, const float, char* const) const {} | |||
void CarlaPlugin::getParameterUnit(const uint32_t, char* const) const {} | |||
void CarlaPlugin::getParameterScalePointLabel(const uint32_t, const uint32_t, char* const) const {} | |||
void CarlaPlugin::getProgramName(const uint32_t, char* const) const {} | |||