Browse Source

API Fixes; add offline check to Plugin tryLock; engine osc changes

tags/1.9.4
falkTX 11 years ago
parent
commit
0f3664d2e7
16 changed files with 540 additions and 631 deletions
  1. +3
    -9
      source/backend/CarlaBackend.h
  2. +42
    -35
      source/backend/CarlaEngine.hpp
  3. +5
    -2
      source/backend/CarlaPlugin.hpp
  4. +317
    -295
      source/backend/engine/CarlaEngine.cpp
  5. +25
    -5
      source/backend/engine/CarlaEngineInternal.hpp
  6. +16
    -33
      source/backend/engine/CarlaEngineJack.cpp
  7. +1
    -0
      source/backend/engine/CarlaEngineJuce.cpp
  8. +10
    -29
      source/backend/engine/CarlaEngineNative.cpp
  9. +16
    -92
      source/backend/engine/CarlaEngineRtAudio.cpp
  10. +35
    -66
      source/backend/plugin/CarlaPlugin.cpp
  11. +62
    -43
      source/backend/plugin/CarlaPluginInternal.hpp
  12. +2
    -7
      source/backend/standalone/CarlaStandalone.cpp
  13. +3
    -7
      source/carla_backend.py
  14. +1
    -6
      source/carla_widgets.py
  15. +1
    -1
      source/modules/juce_audio_devices/AppConfig.h
  16. +1
    -1
      source/tests/CarlaBackendDummy.cpp

+ 3
- 9
source/backend/CarlaBackend.h View File

@@ -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.


+ 42
- 35
source/backend/CarlaEngine.hpp View File

@@ -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



+ 5
- 2
source/backend/CarlaPlugin.hpp View File

@@ -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.


+ 317
- 295
source/backend/engine/CarlaEngine.cpp
File diff suppressed because it is too large
View File


+ 25
- 5
source/backend/engine/CarlaEngineInternal.hpp View File

@@ -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


+ 16
- 33
source/backend/engine/CarlaEngineJack.cpp View File

@@ -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;


+ 1
- 0
source/backend/engine/CarlaEngineJuce.cpp View File

@@ -26,6 +26,7 @@
// #include "RtList.hpp"

#include "juce_audio_devices.h"

using namespace juce;

CARLA_BACKEND_START_NAMESPACE


+ 10
- 29
source/backend/engine/CarlaEngineNative.cpp View File

@@ -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
}

// -----------------------------------------------------------------------

+ 16
- 92
source/backend/engine/CarlaEngineRtAudio.cpp View File

@@ -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


+ 35
- 66
source/backend/plugin/CarlaPlugin.cpp View File

@@ -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



+ 62
- 43
source/backend/plugin/CarlaPluginInternal.hpp View File

@@ -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);
}

// -------------------------------------------------------------------


+ 2
- 7
source/backend/standalone/CarlaStandalone.cpp View File

@@ -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


+ 3
- 7
source/carla_backend.py View File

@@ -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.


+ 1
- 6
source/carla_widgets.py View File

@@ -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": [],


+ 1
- 1
source/modules/juce_audio_devices/AppConfig.h View File

@@ -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"


+ 1
- 1
source/tests/CarlaBackendDummy.cpp View File

@@ -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 {}


Loading…
Cancel
Save