Browse Source

More work

tags/1.9.4
falkTX 10 years ago
parent
commit
3b6d54acdc
9 changed files with 305 additions and 283 deletions
  1. +8
    -8
      source/backend/CarlaEngine.hpp
  2. +74
    -90
      source/backend/engine/CarlaEngine.cpp
  3. +91
    -103
      source/backend/engine/CarlaEngineInternal.cpp
  4. +19
    -2
      source/backend/engine/CarlaEngineInternal.hpp
  5. +36
    -40
      source/backend/engine/CarlaEngineJack.cpp
  6. +0
    -2
      source/backend/engine/CarlaEngineJuce.cpp
  7. +63
    -37
      source/backend/engine/CarlaEngineRtAudio.cpp
  8. +2
    -0
      source/modules/jackbridge/JackBridge.hpp
  9. +12
    -1
      source/modules/jackbridge/JackBridge1.cpp

+ 8
- 8
source/backend/CarlaEngine.hpp View File

@@ -584,7 +584,7 @@ public:
* Add a new port of type \a portType. * Add a new port of type \a portType.
* \note This function does nothing in rack processing mode since ports are static there (2 audio + 1 event for both input and output). * \note This function does nothing in rack processing mode since ports are static there (2 audio + 1 event for both input and output).
*/ */
virtual CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput) noexcept;
virtual CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput);


#ifndef DOXYGEN #ifndef DOXYGEN
protected: protected:
@@ -623,7 +623,7 @@ public:
* The decontructor. * The decontructor.
* The engine must have been closed before this happens. * The engine must have been closed before this happens.
*/ */
virtual ~CarlaEngine();
virtual ~CarlaEngine() noexcept;


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Static calls // Static calls
@@ -1069,7 +1069,7 @@ protected:


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


private:
public:
/*! /*!
* Native audio APIs. * Native audio APIs.
*/ */
@@ -1094,6 +1094,7 @@ private:
// JACK // JACK
static CarlaEngine* newJack(); static CarlaEngine* newJack();


#ifndef BUILD_BRIDGE
// RtAudio // RtAudio
static CarlaEngine* newRtAudio(const AudioApi api); static CarlaEngine* newRtAudio(const AudioApi api);
static uint getRtAudioApiCount(); static uint getRtAudioApiCount();
@@ -1107,15 +1108,15 @@ private:
static const char* getJuceApiName(const uint index); static const char* getJuceApiName(const uint index);
static const char* const* getJuceApiDeviceNames(const uint index); static const char* const* getJuceApiDeviceNames(const uint index);
static const EngineDriverDeviceInfo* getJuceDeviceInfo(const uint index, const char* const deviceName); static const EngineDriverDeviceInfo* getJuceDeviceInfo(const uint index, const char* const deviceName);

#ifdef BUILD_BRIDGE
public:
#else
// Bridge // Bridge
static CarlaEngine* newBridge(const char* const audioBaseName, const char* const controlBaseName, const char* const timeBaseName);
static CarlaEngine* newBridge(const char* const audioBaseName, const char* const controlBaseName, const char* const timeBaseName);
#endif


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Bridge/Controller OSC stuff // Bridge/Controller OSC stuff


#ifdef BUILD_BRIDGE
void oscSend_bridge_plugin_info1(const PluginCategory category, const uint hints, const int64_t uniqueId) const noexcept; void oscSend_bridge_plugin_info1(const PluginCategory category, const uint hints, const int64_t uniqueId) const noexcept;
void oscSend_bridge_plugin_info2(const char* const realName, const char* const label, const char* const maker, const char* const copyright) const noexcept; void oscSend_bridge_plugin_info2(const char* const realName, const char* const label, const char* const maker, const char* const copyright) const noexcept;
void oscSend_bridge_audio_count(const uint32_t ins, const uint32_t outs) const noexcept; void oscSend_bridge_audio_count(const uint32_t ins, const uint32_t outs) const noexcept;
@@ -1140,7 +1141,6 @@ public:
void oscSend_bridge_set_peaks() const noexcept; void oscSend_bridge_set_peaks() const noexcept;
void oscSend_bridge_pong() const noexcept; void oscSend_bridge_pong() const noexcept;
#else #else
public:
void oscSend_control_add_plugin_start(const uint pluginId, const char* const pluginName) const noexcept; void oscSend_control_add_plugin_start(const uint pluginId, const char* const pluginName) const noexcept;
void oscSend_control_add_plugin_end(const uint pluginId) const noexcept; void oscSend_control_add_plugin_end(const uint pluginId) const noexcept;
void oscSend_control_remove_plugin(const uint pluginId) const noexcept; void oscSend_control_remove_plugin(const uint pluginId) const noexcept;


+ 74
- 90
source/backend/engine/CarlaEngine.cpp View File

@@ -30,9 +30,10 @@
#include "CarlaBackendUtils.hpp" #include "CarlaBackendUtils.hpp"
#include "CarlaEngineUtils.hpp" #include "CarlaEngineUtils.hpp"
#include "CarlaMathUtils.hpp" #include "CarlaMathUtils.hpp"
#include "CarlaMIDI.h"
#include "CarlaStateUtils.hpp" #include "CarlaStateUtils.hpp"


#include "CarlaMIDI.h"
#include "jackbridge/JackBridge.hpp"


#include <QtCore/QDir> #include <QtCore/QDir>
#include <QtCore/QFile> #include <QtCore/QFile>
@@ -438,9 +439,6 @@ bool CarlaEngineEventPort::writeControlEvent(const uint32_t time, const uint8_t
CARLA_SAFE_ASSERT(! MIDI_IS_CONTROL_BANK_SELECT(param)); CARLA_SAFE_ASSERT(! MIDI_IS_CONTROL_BANK_SELECT(param));
} }


// FIXME? should not fix range if midi-program
const float fixedValue(carla_fixValue<float>(0.0f, 1.0f, value));

for (uint32_t i=0; i < kMaxEngineEventInternalCount; ++i) for (uint32_t i=0; i < kMaxEngineEventInternalCount; ++i)
{ {
EngineEvent& event(fBuffer[i]); EngineEvent& event(fBuffer[i]);
@@ -454,7 +452,7 @@ bool CarlaEngineEventPort::writeControlEvent(const uint32_t time, const uint8_t


event.ctrl.type = type; event.ctrl.type = type;
event.ctrl.param = param; event.ctrl.param = param;
event.ctrl.value = fixedValue;
event.ctrl.value = carla_fixValue<float>(0.0f, 1.0f, value);


return true; return true;
} }
@@ -569,30 +567,22 @@ void CarlaEngineClient::setLatency(const uint32_t samples) noexcept
fLatency = samples; fLatency = samples;
} }


CarlaEnginePort* CarlaEngineClient::addPort(const EnginePortType portType, const char* const name, const bool isInput) noexcept
CarlaEnginePort* CarlaEngineClient::addPort(const EnginePortType portType, const char* const name, const bool isInput)
{ {
CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', nullptr); CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', nullptr);
carla_debug("CarlaEngineClient::addPort(%i:%s, \"%s\", %s)", portType, EnginePortType2Str(portType), name, bool2str(isInput)); carla_debug("CarlaEngineClient::addPort(%i:%s, \"%s\", %s)", portType, EnginePortType2Str(portType), name, bool2str(isInput));


CarlaEnginePort* ret = nullptr;

try {
switch (portType)
{
case kEnginePortTypeNull:
break;
case kEnginePortTypeAudio:
ret = new CarlaEngineAudioPort(fEngine, isInput);
case kEnginePortTypeCV:
ret = new CarlaEngineCVPort(fEngine, isInput);
case kEnginePortTypeEvent:
ret = new CarlaEngineEventPort(fEngine, isInput);
}
switch (portType)
{
case kEnginePortTypeNull:
break;
case kEnginePortTypeAudio:
return new CarlaEngineAudioPort(fEngine, isInput);
case kEnginePortTypeCV:
return new CarlaEngineCVPort(fEngine, isInput);
case kEnginePortTypeEvent:
return new CarlaEngineEventPort(fEngine, isInput);
} }
CARLA_SAFE_EXCEPTION_RETURN("new CarlaEnginePort", nullptr);

if (ret != nullptr)
return ret;


carla_stderr("CarlaEngineClient::addPort(%i, \"%s\", %s) - invalid type", portType, name, bool2str(isInput)); carla_stderr("CarlaEngineClient::addPort(%i, \"%s\", %s) - invalid type", portType, name, bool2str(isInput));
return nullptr; return nullptr;
@@ -607,7 +597,7 @@ CarlaEngine::CarlaEngine()
carla_debug("CarlaEngine::CarlaEngine()"); carla_debug("CarlaEngine::CarlaEngine()");
} }


CarlaEngine::~CarlaEngine()
CarlaEngine::~CarlaEngine() noexcept
{ {
carla_debug("CarlaEngine::~CarlaEngine()"); carla_debug("CarlaEngine::~CarlaEngine()");


@@ -617,11 +607,14 @@ CarlaEngine::~CarlaEngine()
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Static calls // Static calls


unsigned int CarlaEngine::getDriverCount()
uint CarlaEngine::getDriverCount()
{ {
carla_debug("CarlaEngine::getDriverCount()"); carla_debug("CarlaEngine::getDriverCount()");


unsigned int count = 1; // JACK
uint count = 0;

if (jackbridge_is_ok())
count += 1;


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
count += getRtAudioApiCount(); count += getRtAudioApiCount();
@@ -633,24 +626,24 @@ unsigned int CarlaEngine::getDriverCount()
return count; return count;
} }


const char* CarlaEngine::getDriverName(const unsigned int index)
const char* CarlaEngine::getDriverName(const uint index2)
{ {
carla_debug("CarlaEngine::getDriverName(%i)", index);
carla_debug("CarlaEngine::getDriverName(%i)", index2);

uint index(index2);


if (index == 0)
if (jackbridge_is_ok() && index-- == 0)
return "JACK"; return "JACK";


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
const unsigned int rtAudioIndex(index-1);
if (index < getRtAudioApiCount())
return getRtAudioApiName(index);


if (rtAudioIndex < getRtAudioApiCount())
return getRtAudioApiName(rtAudioIndex);
index -= getRtAudioApiCount();


# ifdef HAVE_JUCE # ifdef HAVE_JUCE
const unsigned int juceIndex(index-rtAudioIndex-1);

if (juceIndex < getJuceApiCount())
return getJuceApiName(juceIndex);
if (index < getJuceApiCount())
return getJuceApiName(index);
# endif # endif
#endif #endif


@@ -658,27 +651,27 @@ const char* CarlaEngine::getDriverName(const unsigned int index)
return nullptr; return nullptr;
} }


const char* const* CarlaEngine::getDriverDeviceNames(const unsigned int index)
const char* const* CarlaEngine::getDriverDeviceNames(const uint index2)
{ {
carla_debug("CarlaEngine::getDriverDeviceNames(%i)", index);
carla_debug("CarlaEngine::getDriverDeviceNames(%i)", index2);

uint index(index2);


if (index == 0) // JACK
if (jackbridge_is_ok() && index-- == 0)
{ {
static const char* ret[3] = { "Auto-Connect OFF", "Auto-Connect ON", nullptr }; static const char* ret[3] = { "Auto-Connect OFF", "Auto-Connect ON", nullptr };
return ret; return ret;
} }


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
const unsigned int rtAudioIndex(index-1);
if (index < getRtAudioApiCount())
return getRtAudioApiDeviceNames(index);


if (rtAudioIndex < getRtAudioApiCount())
return getRtAudioApiDeviceNames(rtAudioIndex);
index -= getRtAudioApiCount();


# ifdef HAVE_JUCE # ifdef HAVE_JUCE
const unsigned int juceIndex(index-rtAudioIndex-1);

if (juceIndex < getJuceApiCount())
return getJuceApiDeviceNames(juceIndex);
if (index < getJuceApiCount())
return getJuceApiDeviceNames(index);
# endif # endif
#endif #endif


@@ -686,11 +679,13 @@ const char* const* CarlaEngine::getDriverDeviceNames(const unsigned int index)
return nullptr; return nullptr;
} }


const EngineDriverDeviceInfo* CarlaEngine::getDriverDeviceInfo(const unsigned int index, const char* const deviceName)
const EngineDriverDeviceInfo* CarlaEngine::getDriverDeviceInfo(const uint index2, const char* const deviceName)
{ {
carla_debug("CarlaEngine::getDriverDeviceInfo(%i, \"%s\")", index, deviceName);
carla_debug("CarlaEngine::getDriverDeviceInfo(%i, \"%s\")", index2, deviceName);

uint index(index2);


if (index == 0) // JACK
if (jackbridge_is_ok() && index-- == 0)
{ {
static uint32_t bufSizes[11] = { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 0 }; static uint32_t bufSizes[11] = { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 0 };
static EngineDriverDeviceInfo devInfo; static EngineDriverDeviceInfo devInfo;
@@ -701,16 +696,14 @@ const EngineDriverDeviceInfo* CarlaEngine::getDriverDeviceInfo(const unsigned in
} }


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
const unsigned int rtAudioIndex(index-1);
if (index < getRtAudioApiCount())
return getRtAudioDeviceInfo(index, deviceName);


if (rtAudioIndex < getRtAudioApiCount())
return getRtAudioDeviceInfo(rtAudioIndex, deviceName);
index -= getRtAudioApiCount();


# ifdef HAVE_JUCE # ifdef HAVE_JUCE
const unsigned int juceIndex(index-rtAudioIndex-1);

if (juceIndex < getJuceApiCount())
return getJuceDeviceInfo(juceIndex, deviceName);
if (index < getJuceApiCount())
return getJuceDeviceInfo(index, deviceName);
# endif # endif
#endif #endif


@@ -789,22 +782,22 @@ CarlaEngine* CarlaEngine::newDriverByName(const char* const driverName)
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Maximum values // Maximum values


unsigned int CarlaEngine::getMaxClientNameSize() const noexcept
uint CarlaEngine::getMaxClientNameSize() const noexcept
{ {
return STR_MAX/2; return STR_MAX/2;
} }


unsigned int CarlaEngine::getMaxPortNameSize() const noexcept
uint CarlaEngine::getMaxPortNameSize() const noexcept
{ {
return STR_MAX; return STR_MAX;
} }


unsigned int CarlaEngine::getCurrentPluginCount() const noexcept
uint CarlaEngine::getCurrentPluginCount() const noexcept
{ {
return pData->curPluginCount; return pData->curPluginCount;
} }


unsigned int CarlaEngine::getMaxPluginNumber() const noexcept
uint CarlaEngine::getMaxPluginNumber() const noexcept
{ {
return pData->maxPluginNumber; return pData->maxPluginNumber;
} }
@@ -924,17 +917,8 @@ bool CarlaEngine::close()
pData->plugins = nullptr; pData->plugins = nullptr;
} }


if (pData->events.in != nullptr)
{
delete[] pData->events.in;
pData->events.in = nullptr;
}

if (pData->events.out != nullptr)
{
delete[] pData->events.out;
pData->events.out = nullptr;
}
pData->events.clear();
pData->audio.clear();


pData->name.clear(); pData->name.clear();


@@ -949,7 +933,7 @@ void CarlaEngine::idle()
CARLA_SAFE_ASSERT_RETURN(pData->nextPluginId == pData->maxPluginNumber,); // TESTING, remove later CARLA_SAFE_ASSERT_RETURN(pData->nextPluginId == pData->maxPluginNumber,); // TESTING, remove later
CARLA_SAFE_ASSERT_RETURN(pData->plugins != nullptr,); // this one too maybe CARLA_SAFE_ASSERT_RETURN(pData->plugins != nullptr,); // this one too maybe


for (unsigned int i=0; i < pData->curPluginCount; ++i)
for (uint i=0; i < pData->curPluginCount; ++i)
{ {
CarlaPlugin* const plugin(pData->plugins[i].plugin); CarlaPlugin* const plugin(pData->plugins[i].plugin);


@@ -978,7 +962,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons
CARLA_SAFE_ASSERT_RETURN_ERR((filename != nullptr && filename[0] != '\0') || (label != nullptr && label[0] != '\0'), "Invalid plugin params (err #3)"); CARLA_SAFE_ASSERT_RETURN_ERR((filename != nullptr && filename[0] != '\0') || (label != nullptr && label[0] != '\0'), "Invalid plugin params (err #3)");
carla_debug("CarlaEngine::addPlugin(%i:%s, %i:%s, \"%s\", \"%s\", \"%s\", " P_INT64 ", %p)", btype, BinaryType2Str(btype), ptype, PluginType2Str(ptype), filename, name, label, uniqueId, extra); carla_debug("CarlaEngine::addPlugin(%i:%s, %i:%s, \"%s\", \"%s\", \"%s\", " P_INT64 ", %p)", btype, BinaryType2Str(btype), ptype, PluginType2Str(ptype), filename, name, label, uniqueId, extra);


unsigned int id;
uint id;
CarlaPlugin* oldPlugin = nullptr; CarlaPlugin* oldPlugin = nullptr;


if (pData->nextPluginId < pData->curPluginCount) if (pData->nextPluginId < pData->curPluginCount)
@@ -1229,7 +1213,7 @@ bool CarlaEngine::addPlugin(const PluginType ptype, const char* const filename,
return addPlugin(BINARY_NATIVE, ptype, filename, name, label, uniqueId, extra); return addPlugin(BINARY_NATIVE, ptype, filename, name, label, uniqueId, extra);
} }


bool CarlaEngine::removePlugin(const unsigned int id)
bool CarlaEngine::removePlugin(const uint id)
{ {
CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #14)"); CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #14)");
CARLA_SAFE_ASSERT_RETURN_ERR(pData->curPluginCount != 0, "Invalid engine internal data (err #15)"); CARLA_SAFE_ASSERT_RETURN_ERR(pData->curPluginCount != 0, "Invalid engine internal data (err #15)");
@@ -1278,7 +1262,7 @@ bool CarlaEngine::removeAllPlugins()


callback(ENGINE_CALLBACK_IDLE, 0, 0, 0, 0.0f, nullptr); callback(ENGINE_CALLBACK_IDLE, 0, 0, 0, 0.0f, nullptr);


for (unsigned int i=0; i < pData->maxPluginNumber; ++i)
for (uint i=0; i < pData->maxPluginNumber; ++i)
{ {
EnginePluginData& pluginData(pData->plugins[i]); EnginePluginData& pluginData(pData->plugins[i]);


@@ -1302,7 +1286,7 @@ bool CarlaEngine::removeAllPlugins()
return true; return true;
} }


const char* CarlaEngine::renamePlugin(const unsigned int id, const char* const newName)
const char* CarlaEngine::renamePlugin(const uint id, const char* const newName)
{ {
CARLA_SAFE_ASSERT_RETURN_ERRN(pData->plugins != nullptr, "Invalid engine internal data (err #21)"); CARLA_SAFE_ASSERT_RETURN_ERRN(pData->plugins != nullptr, "Invalid engine internal data (err #21)");
CARLA_SAFE_ASSERT_RETURN_ERRN(pData->curPluginCount != 0, "Invalid engine internal data (err #22)"); CARLA_SAFE_ASSERT_RETURN_ERRN(pData->curPluginCount != 0, "Invalid engine internal data (err #22)");
@@ -1326,7 +1310,7 @@ const char* CarlaEngine::renamePlugin(const unsigned int id, const char* const n
return nullptr; return nullptr;
} }


bool CarlaEngine::clonePlugin(const unsigned int id)
bool CarlaEngine::clonePlugin(const uint id)
{ {
CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #25)"); CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #25)");
CARLA_SAFE_ASSERT_RETURN_ERR(pData->curPluginCount != 0, "Invalid engine internal data (err #26)"); CARLA_SAFE_ASSERT_RETURN_ERR(pData->curPluginCount != 0, "Invalid engine internal data (err #26)");
@@ -1343,7 +1327,7 @@ bool CarlaEngine::clonePlugin(const unsigned int id)
carla_zeroChar(label, STR_MAX+1); carla_zeroChar(label, STR_MAX+1);
plugin->getLabel(label); plugin->getLabel(label);


const unsigned int pluginCountBefore(pData->curPluginCount);
const uint pluginCountBefore(pData->curPluginCount);


if (! addPlugin(plugin->getBinaryType(), plugin->getType(), plugin->getFilename(), plugin->getName(), label, plugin->getUniqueId(), plugin->getExtraStuff())) if (! addPlugin(plugin->getBinaryType(), plugin->getType(), plugin->getFilename(), plugin->getName(), label, plugin->getUniqueId(), plugin->getExtraStuff()))
return false; return false;
@@ -1356,7 +1340,7 @@ bool CarlaEngine::clonePlugin(const unsigned int id)
return true; return true;
} }


bool CarlaEngine::replacePlugin(const unsigned int id)
bool CarlaEngine::replacePlugin(const uint id)
{ {
CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #29)"); CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #29)");
CARLA_SAFE_ASSERT_RETURN_ERR(pData->curPluginCount != 0, "Invalid engine internal data (err #30)"); CARLA_SAFE_ASSERT_RETURN_ERR(pData->curPluginCount != 0, "Invalid engine internal data (err #30)");
@@ -1382,7 +1366,7 @@ bool CarlaEngine::replacePlugin(const unsigned int id)
return true; return true;
} }


bool CarlaEngine::switchPlugins(const unsigned int idA, const unsigned int idB)
bool CarlaEngine::switchPlugins(const uint idA, const uint idB)
{ {
CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #33)"); CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #33)");
CARLA_SAFE_ASSERT_RETURN_ERR(pData->curPluginCount >= 2, "Invalid engine internal data (err #34)"); CARLA_SAFE_ASSERT_RETURN_ERR(pData->curPluginCount >= 2, "Invalid engine internal data (err #34)");
@@ -1416,7 +1400,7 @@ bool CarlaEngine::switchPlugins(const unsigned int idA, const unsigned int idB)
return true; return true;
} }


CarlaPlugin* CarlaEngine::getPlugin(const unsigned int id) const
CarlaPlugin* CarlaEngine::getPlugin(const uint id) const
{ {
CARLA_SAFE_ASSERT_RETURN_ERRN(pData->plugins != nullptr, "Invalid engine internal data (err #38)"); 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)"); CARLA_SAFE_ASSERT_RETURN_ERRN(pData->curPluginCount != 0, "Invalid engine internal data (err #39)");
@@ -1426,7 +1410,7 @@ CarlaPlugin* CarlaEngine::getPlugin(const unsigned int id) const
return pData->plugins[id].plugin; return pData->plugins[id].plugin;
} }


CarlaPlugin* CarlaEngine::getPluginUnchecked(const unsigned int id) const noexcept
CarlaPlugin* CarlaEngine::getPluginUnchecked(const uint id) const noexcept
{ {
return pData->plugins[id].plugin; return pData->plugins[id].plugin;
} }
@@ -1454,7 +1438,7 @@ const char* CarlaEngine::getUniquePluginName(const char* const name) const
sname.truncate(maxNameSize); sname.truncate(maxNameSize);
sname.replace(':', '.'); // ':' is used in JACK1 to split client/port names sname.replace(':', '.'); // ':' is used in JACK1 to split client/port names


for (unsigned short i=0; i < pData->curPluginCount; ++i)
for (uint i=0; i < pData->curPluginCount; ++i)
{ {
CARLA_SAFE_ASSERT_BREAK(pData->plugins[i].plugin != nullptr); CARLA_SAFE_ASSERT_BREAK(pData->plugins[i].plugin != nullptr);


@@ -1836,7 +1820,7 @@ bool CarlaEngine::saveProject(const char* const filename)
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Information (base) // Information (base)


unsigned int CarlaEngine::getHints() const noexcept
uint CarlaEngine::getHints() const noexcept
{ {
return pData->hints; return pData->hints;
} }
@@ -1874,14 +1858,14 @@ const EngineTimeInfo& CarlaEngine::getTimeInfo() const noexcept
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Information (peaks) // Information (peaks)


float CarlaEngine::getInputPeak(const unsigned int pluginId, const bool isLeft) const noexcept
float CarlaEngine::getInputPeak(const uint pluginId, const bool isLeft) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount, 0.0f); CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount, 0.0f);


return pData->plugins[pluginId].insPeak[isLeft ? 0 : 1]; return pData->plugins[pluginId].insPeak[isLeft ? 0 : 1];
} }


float CarlaEngine::getOutputPeak(const unsigned int pluginId, const bool isLeft) const noexcept
float CarlaEngine::getOutputPeak(const uint pluginId, const bool isLeft) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount, 0.0f); CARLA_SAFE_ASSERT_RETURN(pluginId < pData->curPluginCount, 0.0f);


@@ -1891,7 +1875,7 @@ float CarlaEngine::getOutputPeak(const unsigned int pluginId, const bool isLeft)
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Callback // Callback


void CarlaEngine::callback(const EngineCallbackOpcode action, const unsigned int pluginId, const int value1, const int value2, const float value3, const char* const valueStr) noexcept
void CarlaEngine::callback(const EngineCallbackOpcode action, const uint pluginId, const int value1, const int value2, const float value3, const char* const valueStr) noexcept
{ {
carla_debug("CarlaEngine::callback(%s, %i, %i, %i, %f, \"%s\")", EngineCallbackOpcode2Str(action), pluginId, value1, value2, value3, valueStr); carla_debug("CarlaEngine::callback(%s, %i, %i, %i, %f, \"%s\")", EngineCallbackOpcode2Str(action), pluginId, value1, value2, value3, valueStr);


@@ -2186,7 +2170,7 @@ EngineEvent* CarlaEngine::getInternalEventBuffer(const bool isInput) const noexc
return isInput ? pData->events.in : pData->events.out; return isInput ? pData->events.in : pData->events.out;
} }


void CarlaEngine::registerEnginePlugin(const unsigned int id, CarlaPlugin* const plugin) noexcept
void CarlaEngine::registerEnginePlugin(const uint id, CarlaPlugin* const plugin) noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(id == pData->curPluginCount,); CARLA_SAFE_ASSERT_RETURN(id == pData->curPluginCount,);
carla_debug("CarlaEngine::registerEnginePlugin(%i, %p)", id, plugin); carla_debug("CarlaEngine::registerEnginePlugin(%i, %p)", id, plugin);
@@ -2254,7 +2238,7 @@ void CarlaEngine::runPendingRtEvents() noexcept
} }
} }


void CarlaEngine::setPluginPeaks(const unsigned int pluginId, float const inPeaks[2], float const outPeaks[2]) noexcept
void CarlaEngine::setPluginPeaks(const uint pluginId, float const inPeaks[2], float const outPeaks[2]) noexcept
{ {
EnginePluginData& pluginData(pData->plugins[pluginId]); EnginePluginData& pluginData(pData->plugins[pluginId]);




+ 91
- 103
source/backend/engine/CarlaEngineInternal.cpp View File

@@ -172,59 +172,59 @@ bool RackGraph::disconnect(CarlaEngine* const engine, const uint connectionId) n


if (connection.id == connectionId) if (connection.id == connectionId)
{ {
#if 0
const int otherPort((connection.portOut >= 0) ? connection.portOut : connection.portIn);
const int carlaPort((otherPort == connection.portOut) ? connection.portIn : connection.portOut);
int carlaPort, otherPort;


if (otherPort >= RACK_PATCHBAY_GROUP_MIDI_OUT*1000)
if (connection.groupA == RACK_PATCHBAY_GROUP_CARLA)
{ {
CARLA_SAFE_ASSERT_RETURN(carlaPort == RACK_PATCHBAY_PORT_MIDI_IN, false);

const int portId(otherPort-RACK_PATCHBAY_GROUP_MIDI_OUT*1000);
disconnectRackMidiInPort(portId);
carlaPort = connection.portA;
otherPort = connection.portB;
} }
else if (otherPort >= RACK_PATCHBAY_GROUP_MIDI_IN*1000)
else
{ {
CARLA_SAFE_ASSERT_RETURN(carlaPort == RACK_PATCHBAY_PORT_MIDI_OUT, false);
CARLA_SAFE_ASSERT_RETURN(connection.groupB == RACK_PATCHBAY_GROUP_CARLA, false);


const int portId(otherPort-RACK_PATCHBAY_GROUP_MIDI_IN*1000);
disconnectRackMidiOutPort(portId);
carlaPort = connection.portB;
otherPort = connection.portA;
} }
else if (otherPort >= RACK_PATCHBAY_GROUP_AUDIO_OUT*1000)
{
CARLA_SAFE_ASSERT_RETURN(carlaPort == RACK_PATCHBAY_PORT_AUDIO_OUT1 || carlaPort == RACK_PATCHBAY_PORT_AUDIO_OUT2, false);

const int portId(otherPort-RACK_PATCHBAY_GROUP_AUDIO_OUT*1000);


switch (carlaPort)
{
case RACK_PATCHBAY_CARLA_PORT_AUDIO_IN1:
connectLock.enter(); connectLock.enter();
connectedIn1.removeAll(otherPort);
connectLock.leave();
break;


if (carlaPort == RACK_PATCHBAY_PORT_AUDIO_OUT1)
connectedOut1.removeAll(portId);
else
connectedOut2.removeAll(portId);

case RACK_PATCHBAY_CARLA_PORT_AUDIO_IN2:
connectLock.enter();
connectedIn2.removeAll(otherPort);
connectLock.leave(); connectLock.leave();
}
else if (otherPort >= RACK_PATCHBAY_GROUP_AUDIO_IN*1000)
{
CARLA_SAFE_ASSERT_RETURN(carlaPort == RACK_PATCHBAY_PORT_AUDIO_IN1 || carlaPort == RACK_PATCHBAY_PORT_AUDIO_IN2, false);
break;


const int portId(otherPort-RACK_PATCHBAY_GROUP_AUDIO_IN*1000);
case RACK_PATCHBAY_CARLA_PORT_AUDIO_OUT1:
connectLock.enter();
connectedOut1.removeAll(otherPort);
connectLock.leave();
break;


case RACK_PATCHBAY_CARLA_PORT_AUDIO_OUT2:
connectLock.enter(); connectLock.enter();
connectedOut2.removeAll(otherPort);
connectLock.leave();
break;


if (carlaPort == RACK_PATCHBAY_PORT_AUDIO_IN1)
connectedIn1.removeAll(portId);
else
connectedIn2.removeAll(portId);
case RACK_PATCHBAY_CARLA_PORT_MIDI_IN:
engine->disconnectRackMidiInPort(otherPort);
break;


connectLock.leave();
}
else
{
CARLA_SAFE_ASSERT_RETURN(false, false);
case RACK_PATCHBAY_CARLA_PORT_MIDI_OUT:
engine->disconnectRackMidiOutPort(otherPort);
break;

default:
engine->setLastError("Invalid connection");
return false;
} }
#endif


engine->callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED, connection.id, 0, 0, 0.0f, nullptr); engine->callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED, connection.id, 0, 0, 0.0f, nullptr);


@@ -237,76 +237,63 @@ bool RackGraph::disconnect(CarlaEngine* const engine, const uint connectionId) n
return false; return false;
} }


void RackGraph::refresh(CarlaEngine* const engine, const LinkedList<PortNameToId>& /*midiIns*/, const LinkedList<PortNameToId>& /*midiOuts*/) noexcept
void RackGraph::refresh(CarlaEngine* const engine, const char* const deviceName, const LinkedList<PortNameToId>& /*midiIns*/, const LinkedList<PortNameToId>& /*midiOuts*/) noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(engine != nullptr,); CARLA_SAFE_ASSERT_RETURN(engine != nullptr,);


#if 0
CARLA_SAFE_ASSERT_RETURN(pData->audio.isReady, false);

fUsedMidiIns.clear();
fUsedMidiOuts.clear();

pData->audio.initPatchbay();

if (! pData->audio.isRack)
{
// not implemented yet
return false;
}
lastConnectionId = 0;
usedConnections.clear();


char strBuf[STR_MAX+1]; char strBuf[STR_MAX+1];
strBuf[STR_MAX] = '\0'; strBuf[STR_MAX] = '\0';


AbstractEngineBuffer* const rack(pData->audio.buffer);

// Main // Main
{ {
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, RACK_PATCHBAY_GROUP_CARLA, PATCHBAY_ICON_CARLA, -1, 0.0f, getName());
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_CARLA, RACK_PATCHBAY_CARLA_PORT_AUDIO_IN1, PATCHBAY_PORT_TYPE_AUDIO|PATCHBAY_PORT_IS_INPUT, 0.0f, "audio-in1");
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_CARLA, RACK_PATCHBAY_CARLA_PORT_AUDIO_IN2, PATCHBAY_PORT_TYPE_AUDIO|PATCHBAY_PORT_IS_INPUT, 0.0f, "audio-in2");
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_CARLA, RACK_PATCHBAY_CARLA_PORT_AUDIO_OUT1, PATCHBAY_PORT_TYPE_AUDIO, 0.0f, "audio-out1");
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_CARLA, RACK_PATCHBAY_CARLA_PORT_AUDIO_OUT2, PATCHBAY_PORT_TYPE_AUDIO, 0.0f, "audio-out2");
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_CARLA, RACK_PATCHBAY_CARLA_PORT_MIDI_IN, PATCHBAY_PORT_TYPE_MIDI|PATCHBAY_PORT_IS_INPUT, 0.0f, "midi-in");
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_CARLA, RACK_PATCHBAY_CARLA_PORT_MIDI_OUT, PATCHBAY_PORT_TYPE_MIDI, 0.0f, "midi-out");
engine->callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, RACK_PATCHBAY_GROUP_CARLA, PATCHBAY_ICON_CARLA, -1, 0.0f, engine->getName());

engine->callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_CARLA, RACK_PATCHBAY_CARLA_PORT_AUDIO_IN1, PATCHBAY_PORT_TYPE_AUDIO|PATCHBAY_PORT_IS_INPUT, 0.0f, "audio-in1");
engine->callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_CARLA, RACK_PATCHBAY_CARLA_PORT_AUDIO_IN2, PATCHBAY_PORT_TYPE_AUDIO|PATCHBAY_PORT_IS_INPUT, 0.0f, "audio-in2");
engine->callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_CARLA, RACK_PATCHBAY_CARLA_PORT_AUDIO_OUT1, PATCHBAY_PORT_TYPE_AUDIO, 0.0f, "audio-out1");
engine->callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_CARLA, RACK_PATCHBAY_CARLA_PORT_AUDIO_OUT2, PATCHBAY_PORT_TYPE_AUDIO, 0.0f, "audio-out2");
engine->callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_CARLA, RACK_PATCHBAY_CARLA_PORT_MIDI_IN, PATCHBAY_PORT_TYPE_MIDI|PATCHBAY_PORT_IS_INPUT, 0.0f, "midi-in");
engine->callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_CARLA, RACK_PATCHBAY_CARLA_PORT_MIDI_OUT, PATCHBAY_PORT_TYPE_MIDI, 0.0f, "midi-out");
} }


// Audio In // Audio In
{ {
if (fDeviceName.isNotEmpty())
std::snprintf(strBuf, STR_MAX, "Capture (%s)", fDeviceName.buffer());
if (deviceName != nullptr)
std::snprintf(strBuf, STR_MAX, "Capture (%s)", deviceName);
else else
std::strncpy(strBuf, "Capture", STR_MAX); std::strncpy(strBuf, "Capture", STR_MAX);


callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, RACK_PATCHBAY_GROUP_AUDIO, PATCHBAY_ICON_HARDWARE, -1, 0.0f, strBuf);
engine->callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, RACK_PATCHBAY_GROUP_AUDIO, PATCHBAY_ICON_HARDWARE, -1, 0.0f, strBuf);


for (uint i=0; i < pData->audio.inCount; ++i) for (uint i=0; i < pData->audio.inCount; ++i)
{ {
std::snprintf(strBuf, STR_MAX, "capture_%i", i+1); std::snprintf(strBuf, STR_MAX, "capture_%i", i+1);
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_AUDIO, static_cast<int>(i), PATCHBAY_PORT_TYPE_AUDIO, 0.0f, strBuf);
engine->callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_AUDIO, static_cast<int>(i), PATCHBAY_PORT_TYPE_AUDIO, 0.0f, strBuf);
} }
} }


// Audio Out // Audio Out
{ {
if (fDeviceName.isNotEmpty())
std::snprintf(strBuf, STR_MAX, "Playback (%s)", fDeviceName.buffer());
if (deviceName != nullptr)
std::snprintf(strBuf, STR_MAX, "Playback (%s)", deviceName);
else else
std::strncpy(strBuf, "Playback", STR_MAX); std::strncpy(strBuf, "Playback", STR_MAX);


callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, RACK_PATCHBAY_GROUP_AUDIO, PATCHBAY_ICON_HARDWARE, -1, 0.0f, strBuf);
engine->callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, RACK_PATCHBAY_GROUP_AUDIO, PATCHBAY_ICON_HARDWARE, -1, 0.0f, strBuf);


for (uint i=0; i < pData->audio.outCount; ++i) for (uint i=0; i < pData->audio.outCount; ++i)
{ {
std::snprintf(strBuf, STR_MAX, "playback_%i", i+1); std::snprintf(strBuf, STR_MAX, "playback_%i", i+1);
callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_AUDIO, static_cast<int>(i), PATCHBAY_PORT_TYPE_AUDIO|PATCHBAY_PORT_IS_INPUT, 0.0f, strBuf);
engine->callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_AUDIO, static_cast<int>(i), PATCHBAY_PORT_TYPE_AUDIO|PATCHBAY_PORT_IS_INPUT, 0.0f, strBuf);
} }
} }


// MIDI In // MIDI In
{ {
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, RACK_PATCHBAY_GROUP_MIDI, PATCHBAY_ICON_HARDWARE, -1, 0.0f, "Readable MIDI ports");
engine->callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, RACK_PATCHBAY_GROUP_MIDI, PATCHBAY_ICON_HARDWARE, -1, 0.0f, "Readable MIDI ports");


for (uint i=0, count=fDummyMidiIn.getPortCount(); i < count; ++i) for (uint i=0, count=fDummyMidiIn.getPortCount(); i < count; ++i)
{ {
@@ -316,13 +303,13 @@ void RackGraph::refresh(CarlaEngine* const engine, const LinkedList<PortNameToId
portNameToId.name[STR_MAX] = '\0'; portNameToId.name[STR_MAX] = '\0';
fUsedMidiIns.append(portNameToId); fUsedMidiIns.append(portNameToId);


callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_MIDI, portNameToId.portId, PATCHBAY_PORT_TYPE_MIDI, 0.0f, portNameToId.name);
engine->callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_MIDI, portNameToId.portId, PATCHBAY_PORT_TYPE_MIDI, 0.0f, portNameToId.name);
} }
} }


// MIDI Out // MIDI Out
{ {
callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, RACK_PATCHBAY_GROUP_MIDI, PATCHBAY_ICON_HARDWARE, -1, 0.0f, "Writable MIDI ports");
engine->callback(ENGINE_CALLBACK_PATCHBAY_CLIENT_ADDED, RACK_PATCHBAY_GROUP_MIDI, PATCHBAY_ICON_HARDWARE, -1, 0.0f, "Writable MIDI ports");


for (uint i=0, count=fDummyMidiOut.getPortCount(); i < count; ++i) for (uint i=0, count=fDummyMidiOut.getPortCount(); i < count; ++i)
{ {
@@ -332,107 +319,107 @@ void RackGraph::refresh(CarlaEngine* const engine, const LinkedList<PortNameToId
portNameToId.name[STR_MAX] = '\0'; portNameToId.name[STR_MAX] = '\0';
fUsedMidiOuts.append(portNameToId); fUsedMidiOuts.append(portNameToId);


callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_MIDI, portNameToId.portId, PATCHBAY_PORT_TYPE_MIDI|PATCHBAY_PORT_IS_INPUT, 0.0f, portNameToId.name);
engine->callback(ENGINE_CALLBACK_PATCHBAY_PORT_ADDED, RACK_PATCHBAY_GROUP_MIDI, portNameToId.portId, PATCHBAY_PORT_TYPE_MIDI|PATCHBAY_PORT_IS_INPUT, 0.0f, portNameToId.name);
} }
} }


// Connections // Connections
rack->connectLock.enter();
connectLock.enter();


for (LinkedList<int>::Itenerator it = rack->connectedIn1.begin(); it.valid(); it.next())
for (LinkedList<int>::Itenerator it = connectedIn1.begin(); it.valid(); it.next())
{ {
const int& port(it.getValue()); const int& port(it.getValue());
CARLA_SAFE_ASSERT_CONTINUE(port >= 0 && port < static_cast<int>(pData->audio.inCount)); CARLA_SAFE_ASSERT_CONTINUE(port >= 0 && port < static_cast<int>(pData->audio.inCount));


ConnectionToId connectionToId; ConnectionToId connectionToId;
connectionToId.id = rack->lastConnectionId;
connectionToId.id = lastConnectionId;
connectionToId.groupOut = RACK_PATCHBAY_GROUP_AUDIO; connectionToId.groupOut = RACK_PATCHBAY_GROUP_AUDIO;
connectionToId.portOut = port; connectionToId.portOut = port;
connectionToId.groupIn = RACK_PATCHBAY_GROUP_CARLA; connectionToId.groupIn = RACK_PATCHBAY_GROUP_CARLA;
connectionToId.portIn = RACK_PATCHBAY_CARLA_PORT_AUDIO_IN1; connectionToId.portIn = RACK_PATCHBAY_CARLA_PORT_AUDIO_IN1;


std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i", connectionToId.groupOut, connectionToId.portOut, connectionToId.groupIn, connectionToId.portIn); std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i", connectionToId.groupOut, connectionToId.portOut, connectionToId.groupIn, connectionToId.portIn);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, rack->lastConnectionId, 0, 0, 0.0f, strBuf);
engine->callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, lastConnectionId, 0, 0, 0.0f, strBuf);


rack->usedConnections.append(connectionToId);
++rack->lastConnectionId;
usedConnections.append(connectionToId);
++lastConnectionId;
} }


for (LinkedList<int>::Itenerator it = rack->connectedIn2.begin(); it.valid(); it.next())
for (LinkedList<int>::Itenerator it = connectedIn2.begin(); it.valid(); it.next())
{ {
const int& port(it.getValue()); const int& port(it.getValue());
CARLA_SAFE_ASSERT_CONTINUE(port >= 0 && port < static_cast<int>(pData->audio.inCount)); CARLA_SAFE_ASSERT_CONTINUE(port >= 0 && port < static_cast<int>(pData->audio.inCount));


ConnectionToId connectionToId; ConnectionToId connectionToId;
connectionToId.id = rack->lastConnectionId;
connectionToId.id = lastConnectionId;
connectionToId.groupOut = RACK_PATCHBAY_GROUP_AUDIO; connectionToId.groupOut = RACK_PATCHBAY_GROUP_AUDIO;
connectionToId.portOut = port; connectionToId.portOut = port;
connectionToId.groupIn = RACK_PATCHBAY_GROUP_CARLA; connectionToId.groupIn = RACK_PATCHBAY_GROUP_CARLA;
connectionToId.portIn = RACK_PATCHBAY_CARLA_PORT_AUDIO_IN2; connectionToId.portIn = RACK_PATCHBAY_CARLA_PORT_AUDIO_IN2;


std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i", connectionToId.groupOut, connectionToId.portOut, connectionToId.groupIn, connectionToId.portIn); std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i", connectionToId.groupOut, connectionToId.portOut, connectionToId.groupIn, connectionToId.portIn);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, rack->lastConnectionId, 0, 0, 0.0f, strBuf);
engine->callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, lastConnectionId, 0, 0, 0.0f, strBuf);


rack->usedConnections.append(connectionToId);
++rack->lastConnectionId;
usedConnections.append(connectionToId);
++lastConnectionId;
} }


for (LinkedList<int>::Itenerator it = rack->connectedOut1.begin(); it.valid(); it.next())
for (LinkedList<int>::Itenerator it = connectedOut1.begin(); it.valid(); it.next())
{ {
const int& port(it.getValue()); const int& port(it.getValue());
CARLA_SAFE_ASSERT_CONTINUE(port >= 0 && port < static_cast<int>(pData->audio.outCount)); CARLA_SAFE_ASSERT_CONTINUE(port >= 0 && port < static_cast<int>(pData->audio.outCount));


ConnectionToId connectionToId; ConnectionToId connectionToId;
connectionToId.id = rack->lastConnectionId;
connectionToId.id = lastConnectionId;
connectionToId.groupOut = RACK_PATCHBAY_GROUP_CARLA; connectionToId.groupOut = RACK_PATCHBAY_GROUP_CARLA;
connectionToId.portOut = RACK_PATCHBAY_CARLA_PORT_AUDIO_OUT1; connectionToId.portOut = RACK_PATCHBAY_CARLA_PORT_AUDIO_OUT1;
connectionToId.groupIn = RACK_PATCHBAY_GROUP_AUDIO; connectionToId.groupIn = RACK_PATCHBAY_GROUP_AUDIO;
connectionToId.portIn = port; connectionToId.portIn = port;


std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i", connectionToId.groupOut, connectionToId.portOut, connectionToId.groupIn, connectionToId.portIn); std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i", connectionToId.groupOut, connectionToId.portOut, connectionToId.groupIn, connectionToId.portIn);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, rack->lastConnectionId, 0, 0, 0.0f, strBuf);
engine->callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, lastConnectionId, 0, 0, 0.0f, strBuf);


rack->usedConnections.append(connectionToId);
++rack->lastConnectionId;
usedConnections.append(connectionToId);
++lastConnectionId;
} }


for (LinkedList<int>::Itenerator it = rack->connectedOut2.begin(); it.valid(); it.next())
for (LinkedList<int>::Itenerator it = connectedOut2.begin(); it.valid(); it.next())
{ {
const int& port(it.getValue()); const int& port(it.getValue());
CARLA_SAFE_ASSERT_CONTINUE(port >= 0 && port < static_cast<int>(pData->audio.outCount)); CARLA_SAFE_ASSERT_CONTINUE(port >= 0 && port < static_cast<int>(pData->audio.outCount));


ConnectionToId connectionToId; ConnectionToId connectionToId;
connectionToId.id = rack->lastConnectionId;
connectionToId.id = lastConnectionId;
connectionToId.groupOut = RACK_PATCHBAY_GROUP_CARLA; connectionToId.groupOut = RACK_PATCHBAY_GROUP_CARLA;
connectionToId.portOut = RACK_PATCHBAY_CARLA_PORT_AUDIO_OUT2; connectionToId.portOut = RACK_PATCHBAY_CARLA_PORT_AUDIO_OUT2;
connectionToId.groupIn = RACK_PATCHBAY_GROUP_AUDIO; connectionToId.groupIn = RACK_PATCHBAY_GROUP_AUDIO;
connectionToId.portIn = port; connectionToId.portIn = port;


std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i", connectionToId.groupOut, connectionToId.portOut, connectionToId.groupIn, connectionToId.portIn); std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i", connectionToId.groupOut, connectionToId.portOut, connectionToId.groupIn, connectionToId.portIn);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, rack->lastConnectionId, 0, 0, 0.0f, strBuf);
engine->callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, lastConnectionId, 0, 0, 0.0f, strBuf);


rack->usedConnections.append(connectionToId);
++rack->lastConnectionId;
usedConnections.append(connectionToId);
++lastConnectionId;
} }


pData->audio.rack->connectLock.leave();
connectLock.leave();


for (LinkedList<MidiPort>::Itenerator it=fMidiIns.begin(); it.valid(); it.next()) for (LinkedList<MidiPort>::Itenerator it=fMidiIns.begin(); it.valid(); it.next())
{ {
const MidiPort& midiPort(it.getValue()); const MidiPort& midiPort(it.getValue());


ConnectionToId connectionToId; ConnectionToId connectionToId;
connectionToId.id = rack->lastConnectionId;
connectionToId.id = lastConnectionId;
connectionToId.groupOut = RACK_PATCHBAY_GROUP_MIDI; connectionToId.groupOut = RACK_PATCHBAY_GROUP_MIDI;
connectionToId.portOut = midiPort.portId; connectionToId.portOut = midiPort.portId;
connectionToId.groupIn = RACK_PATCHBAY_GROUP_CARLA; connectionToId.groupIn = RACK_PATCHBAY_GROUP_CARLA;
connectionToId.portIn = RACK_PATCHBAY_CARLA_PORT_MIDI_IN; connectionToId.portIn = RACK_PATCHBAY_CARLA_PORT_MIDI_IN;


std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i", connectionToId.groupOut, connectionToId.portOut, connectionToId.groupIn, connectionToId.portIn); std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i", connectionToId.groupOut, connectionToId.portOut, connectionToId.groupIn, connectionToId.portIn);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, rack->lastConnectionId, 0, 0, 0.0f, strBuf);
engine->callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, lastConnectionId, 0, 0, 0.0f, strBuf);


rack->usedConnections.append(connectionToId);
++rack->lastConnectionId;
usedConnections.append(connectionToId);
++lastConnectionId;
} }


for (LinkedList<MidiPort>::Itenerator it=fMidiOuts.begin(); it.valid(); it.next()) for (LinkedList<MidiPort>::Itenerator it=fMidiOuts.begin(); it.valid(); it.next())
@@ -440,18 +427,19 @@ void RackGraph::refresh(CarlaEngine* const engine, const LinkedList<PortNameToId
const MidiPort& midiPort(it.getValue()); const MidiPort& midiPort(it.getValue());


ConnectionToId connectionToId; ConnectionToId connectionToId;
connectionToId.id = rack->lastConnectionId;
connectionToId.id = lastConnectionId;
connectionToId.groupOut = RACK_PATCHBAY_GROUP_CARLA; connectionToId.groupOut = RACK_PATCHBAY_GROUP_CARLA;
connectionToId.portOut = RACK_PATCHBAY_CARLA_PORT_MIDI_OUT; connectionToId.portOut = RACK_PATCHBAY_CARLA_PORT_MIDI_OUT;
connectionToId.groupIn = RACK_PATCHBAY_GROUP_MIDI; connectionToId.groupIn = RACK_PATCHBAY_GROUP_MIDI;
connectionToId.portIn = midiPort.portId; connectionToId.portIn = midiPort.portId;


std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i", connectionToId.groupOut, connectionToId.portOut, connectionToId.groupIn, connectionToId.portIn); std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i", connectionToId.groupOut, connectionToId.portOut, connectionToId.groupIn, connectionToId.portIn);
callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, rack->lastConnectionId, 0, 0, 0.0f, strBuf);
engine->callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, lastConnectionId, 0, 0, 0.0f, strBuf);


rack->usedConnections.append(connectionToId);
++rack->lastConnectionId;
usedConnections.append(connectionToId);
++lastConnectionId;
} }
#if 0
#endif #endif
} }




+ 19
- 2
source/backend/engine/CarlaEngineInternal.hpp View File

@@ -280,6 +280,21 @@ struct EngineInternalEvents {
CARLA_SAFE_ASSERT(out == nullptr); CARLA_SAFE_ASSERT(out == nullptr);
} }


void clear() noexcept
{
if (in != nullptr)
{
delete[] in;
in = nullptr;
}

if (out != nullptr)
{
delete[] out;
out = nullptr;
}
}

CARLA_DECLARE_NON_COPY_STRUCT(EngineInternalEvents) CARLA_DECLARE_NON_COPY_STRUCT(EngineInternalEvents)
}; };


@@ -432,11 +447,13 @@ struct CarlaEngineProtectedData {


EnginePluginData* plugins; EnginePluginData* plugins;


//#ifndef BUILD_BRIDGE
#ifndef BUILD_BRIDGE
EngineInternalAudio audio; EngineInternalAudio audio;
//#endif
#endif
EngineInternalEvents events; EngineInternalEvents events;
#ifndef BUILD_BRIDGE
EngineInternalGraph graph; EngineInternalGraph graph;
#endif
EngineInternalTime time; EngineInternalTime time;
EngineNextAction nextAction; EngineNextAction nextAction;




+ 36
- 40
source/backend/engine/CarlaEngineJack.cpp View File

@@ -457,60 +457,56 @@ public:
} }
#endif #endif


CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput) noexcept override
CarlaEnginePort* addPort(const EnginePortType portType, const char* const name, const bool isInput) override
{ {
carla_debug("CarlaEngineJackClient::addPort(%s, \"%s\", %s)", EnginePortType2Str(portType), name, bool2str(isInput));
carla_debug("CarlaEngineJackClient::addPort(%i:%s, \"%s\", %s)", portType, EnginePortType2Str(portType), name, bool2str(isInput));


jack_port_t* port = nullptr; jack_port_t* port = nullptr;


// Create JACK port first, if needed // Create JACK port first, if needed
if (fUseClient && fClient != nullptr) if (fUseClient && fClient != nullptr)
{ {
try {
switch (portType)
{
case kEnginePortTypeNull:
break;
case kEnginePortTypeAudio:
port = jackbridge_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
break;
case kEnginePortTypeCV:
port = jackbridge_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
break;
case kEnginePortTypeEvent:
port = jackbridge_port_register(fClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
break;
}
}
CARLA_SAFE_EXCEPTION_RETURN("JackClient addPort", nullptr)
}

// Create Engine port
try {
switch (portType) switch (portType)
{ {
case kEnginePortTypeNull: case kEnginePortTypeNull:
break; break;
case kEnginePortTypeAudio: {
CarlaEngineJackAudioPort* const enginePort(new CarlaEngineJackAudioPort(fEngine, isInput, fClient, port));
fAudioPorts.append(enginePort);
return enginePort;
}
case kEnginePortTypeCV: {
CarlaEngineJackCVPort* const enginePort(new CarlaEngineJackCVPort(fEngine, isInput, fClient, port));
fCVPorts.append(enginePort);
return enginePort;
}
case kEnginePortTypeEvent: {
CarlaEngineJackEventPort* const enginePort(new CarlaEngineJackEventPort(fEngine, isInput, fClient, port));
fEventPorts.append(enginePort);
return enginePort;
}
case kEnginePortTypeAudio:
port = jackbridge_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
break;
case kEnginePortTypeCV:
port = jackbridge_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
break;
case kEnginePortTypeEvent:
port = jackbridge_port_register(fClient, name, JACK_DEFAULT_MIDI_TYPE, isInput ? JackPortIsInput : JackPortIsOutput, 0);
break;
} }

CARLA_SAFE_ASSERT_RETURN(port != nullptr, nullptr);
}

// Create Engine port
switch (portType)
{
case kEnginePortTypeNull:
break;
case kEnginePortTypeAudio: {
CarlaEngineJackAudioPort* const enginePort(new CarlaEngineJackAudioPort(fEngine, isInput, fClient, port));
fAudioPorts.append(enginePort);
return enginePort;
}
case kEnginePortTypeCV: {
CarlaEngineJackCVPort* const enginePort(new CarlaEngineJackCVPort(fEngine, isInput, fClient, port));
fCVPorts.append(enginePort);
return enginePort;
}
case kEnginePortTypeEvent: {
CarlaEngineJackEventPort* const enginePort(new CarlaEngineJackEventPort(fEngine, isInput, fClient, port));
fEventPorts.append(enginePort);
return enginePort;
}
} }
CARLA_SAFE_EXCEPTION_RETURN("JackClient new Port", nullptr)


carla_stderr("CarlaEngineJackClient::addPort(%s, \"%s\", %s) - invalid type", EnginePortType2Str(portType), name, bool2str(isInput));
carla_stderr("CarlaEngineJackClient::addPort(%i, \"%s\", %s) - invalid type", portType, name, bool2str(isInput));
return nullptr; return nullptr;
} }




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

@@ -184,8 +184,6 @@ public:
fDevice = nullptr; fDevice = nullptr;
} }


pData->audio.clear();

return !hasError; return !hasError;
} }




+ 63
- 37
source/backend/engine/CarlaEngineRtAudio.cpp View File

@@ -62,7 +62,7 @@ static void initRtApis()
} }
} }


static const char* getRtAudioApiName(const RtAudio::Api api)
static const char* getRtAudioApiName(const RtAudio::Api api) noexcept
{ {
switch (api) switch (api)
{ {
@@ -98,7 +98,7 @@ static const char* getRtAudioApiName(const RtAudio::Api api)
return nullptr; return nullptr;
} }


static RtMidi::Api getMatchedAudioMidiAPi(const RtAudio::Api rtApi)
static RtMidi::Api getMatchedAudioMidiAPi(const RtAudio::Api rtApi) noexcept
{ {
switch (rtApi) switch (rtApi)
{ {
@@ -138,16 +138,14 @@ static RtMidi::Api getMatchedAudioMidiAPi(const RtAudio::Api rtApi)
// ------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------
// Cleanup // Cleanup


static struct RtAudioCleanup {
static const struct RtAudioCleanup {
RtAudioCleanup() {} RtAudioCleanup() {}
~RtAudioCleanup()
{
~RtAudioCleanup() {
if (gRetNames != nullptr) if (gRetNames != nullptr)
{ {
delete[] gRetNames; delete[] gRetNames;
gRetNames = nullptr; gRetNames = nullptr;
} }

gRtAudioApis.clear(); gRtAudioApis.clear();
} }
} sRtAudioCleanup; } sRtAudioCleanup;
@@ -202,7 +200,7 @@ public:
RtAudio::StreamParameters iParams, oParams; RtAudio::StreamParameters iParams, oParams;
bool deviceSet = false; bool deviceSet = false;


const unsigned int devCount(fAudio.getDeviceCount());
const uint devCount(fAudio.getDeviceCount());


if (devCount == 0) if (devCount == 0)
{ {
@@ -212,13 +210,13 @@ public:


if (pData->options.audioDevice != nullptr && pData->options.audioDevice[0] != '\0') if (pData->options.audioDevice != nullptr && pData->options.audioDevice[0] != '\0')
{ {
for (unsigned int i=0; i < devCount; ++i)
for (uint i=0; i < devCount; ++i)
{ {
RtAudio::DeviceInfo devInfo(fAudio.getDeviceInfo(i)); RtAudio::DeviceInfo devInfo(fAudio.getDeviceInfo(i));


if (devInfo.probed && devInfo.outputChannels > 0 && devInfo.name == pData->options.audioDevice) if (devInfo.probed && devInfo.outputChannels > 0 && devInfo.name == pData->options.audioDevice)
{ {
deviceSet = true;
deviceSet = true;
fDeviceName = devInfo.name.c_str(); fDeviceName = devInfo.name.c_str();
iParams.deviceId = i; iParams.deviceId = i;
oParams.deviceId = i; oParams.deviceId = i;
@@ -255,13 +253,12 @@ public:


fLastEventTime = 0; fLastEventTime = 0;


unsigned int bufferFrames = pData->options.audioBufferSize;
uint bufferFrames = pData->options.audioBufferSize;


try { try {
fAudio.openStream(&oParams, &iParams, RTAUDIO_FLOAT32, pData->options.audioSampleRate, &bufferFrames, carla_rtaudio_process_callback, this, &rtOptions); fAudio.openStream(&oParams, &iParams, RTAUDIO_FLOAT32, pData->options.audioSampleRate, &bufferFrames, carla_rtaudio_process_callback, this, &rtOptions);
} }
catch (const RtError& e)
{
catch (const RtError& e) {
setLastError(e.what()); setLastError(e.what());
return false; return false;
} }
@@ -278,16 +275,30 @@ public:
{ {
fAudioBufIn = new float*[pData->audio.inCount]; fAudioBufIn = new float*[pData->audio.inCount];


// set as null first
for (uint i=0; i < pData->audio.inCount; ++i) for (uint i=0; i < pData->audio.inCount; ++i)
fAudioBufIn[i] = nullptr;

for (uint i=0; i < pData->audio.inCount; ++i)
{
fAudioBufIn[i] = new float[pData->bufferSize]; fAudioBufIn[i] = new float[pData->bufferSize];
FLOAT_CLEAR(fAudioBufIn[i], pData->bufferSize);
}
} }


if (pData->audio.outCount > 0) if (pData->audio.outCount > 0)
{ {
fAudioBufOut = new float*[pData->audio.outCount]; fAudioBufOut = new float*[pData->audio.outCount];


// set as null first
for (uint i=0; i < pData->audio.outCount; ++i) for (uint i=0; i < pData->audio.outCount; ++i)
fAudioBufOut[i] = nullptr;

for (uint i=0; i < pData->audio.outCount; ++i)
{
fAudioBufOut[i] = new float[pData->bufferSize]; fAudioBufOut[i] = new float[pData->bufferSize];
FLOAT_CLEAR(fAudioBufOut[i], pData->bufferSize);
}
} }


pData->audio.create(pData->bufferSize); pData->audio.create(pData->bufferSize);
@@ -340,7 +351,13 @@ public:
if (fAudioBufIn != nullptr) if (fAudioBufIn != nullptr)
{ {
for (uint i=0; i < pData->audio.inCount; ++i) for (uint i=0; i < pData->audio.inCount; ++i)
delete[] fAudioBufIn[i];
{
if (fAudioBufIn[i] != nullptr)
{
delete[] fAudioBufIn[i];
fAudioBufIn[i] = nullptr;
}
}


delete[] fAudioBufIn; delete[] fAudioBufIn;
fAudioBufIn = nullptr; fAudioBufIn = nullptr;
@@ -349,16 +366,18 @@ public:
if (fAudioBufOut != nullptr) if (fAudioBufOut != nullptr)
{ {
for (uint i=0; i < pData->audio.outCount; ++i) for (uint i=0; i < pData->audio.outCount; ++i)
delete[] fAudioBufOut[i];
{
if (fAudioBufOut[i] != nullptr)
{
delete[] fAudioBufOut[i];
fAudioBufOut[i] = nullptr;
}
}


delete[] fAudioBufOut; delete[] fAudioBufOut;
fAudioBufOut = nullptr; fAudioBufOut = nullptr;
} }


pData->audio.clear();

fDeviceName.clear();

for (LinkedList<MidiPort>::Itenerator it = fMidiIns.begin(); it.valid(); it.next()) for (LinkedList<MidiPort>::Itenerator it = fMidiIns.begin(); it.valid(); it.next())
{ {
MidiPort& port(it.getValue()); MidiPort& port(it.getValue());
@@ -376,6 +395,8 @@ public:
delete midiOutPort; delete midiOutPort;
} }


fDeviceName.clear();

fMidiIns.clear(); fMidiIns.clear();
fMidiOuts.clear(); fMidiOuts.clear();


@@ -410,13 +431,18 @@ public:


bool patchbayRefresh() override bool patchbayRefresh() override
{ {
CARLA_SAFE_ASSERT_RETURN(pData->audio.isReady, false);

fUsedMidiIns.clear();
fUsedMidiOuts.clear();

return true; return true;
} }


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


protected: protected:
void handleAudioProcessCallback(void* outputBuffer, void* inputBuffer, unsigned int nframes, double streamTime, RtAudioStreamStatus status)
void handleAudioProcessCallback(void* outputBuffer, void* inputBuffer, uint nframes, double streamTime, RtAudioStreamStatus status)
{ {
// get buffers from RtAudio // get buffers from RtAudio
float* const insPtr = (float*)inputBuffer; float* const insPtr = (float*)inputBuffer;
@@ -432,7 +458,7 @@ protected:
// initialize rtaudio input // initialize rtaudio input
if (fIsAudioInterleaved) if (fIsAudioInterleaved)
{ {
for (unsigned int i=0, j=0, count=nframes*pData->audio.inCount; i < count; ++i)
for (uint i=0, j=0, count=nframes*pData->audio.inCount; i < count; ++i)
{ {
fAudioBufIn[i/pData->audio.inCount][j] = insPtr[i]; fAudioBufIn[i/pData->audio.inCount][j] = insPtr[i];


@@ -442,12 +468,12 @@ protected:
} }
else else
{ {
for (unsigned int i=0; i < pData->audio.inCount; ++i)
for (uint i=0; i < pData->audio.inCount; ++i)
FLOAT_COPY(fAudioBufIn[i], insPtr+(nframes*i), nframes); FLOAT_COPY(fAudioBufIn[i], insPtr+(nframes*i), nframes);
} }


// initialize rtaudio output // initialize rtaudio output
for (unsigned int i=0; i < pData->audio.outCount; ++i)
for (uint i=0; i < pData->audio.outCount; ++i)
FLOAT_CLEAR(fAudioBufOut[i], nframes); FLOAT_CLEAR(fAudioBufOut[i], nframes);


// initialize input events // initialize input events
@@ -495,7 +521,7 @@ protected:
// output audio // output audio
if (fIsAudioInterleaved) if (fIsAudioInterleaved)
{ {
for (unsigned int i=0, j=0; i < nframes*pData->audio.outCount; ++i)
for (uint i=0, j=0; i < nframes*pData->audio.outCount; ++i)
{ {
outsPtr[i] = fAudioBufOut[i/pData->audio.outCount][j]; outsPtr[i] = fAudioBufOut[i/pData->audio.outCount][j];


@@ -505,7 +531,7 @@ protected:
} }
else else
{ {
for (unsigned int i=0; i < pData->audio.outCount; ++i)
for (uint i=0; i < pData->audio.outCount; ++i)
FLOAT_COPY(outsPtr+(nframes*i), fAudioBufOut[i], nframes); FLOAT_COPY(outsPtr+(nframes*i), fAudioBufOut[i], nframes);
} }


@@ -523,7 +549,7 @@ protected:
(void)status; (void)status;
} }


void handleMidiCallback(double timeStamp, std::vector<unsigned char>* const message)
void handleMidiCallback(double timeStamp, std::vector<uchar>* const message)
{ {
if (! pData->audio.isReady) if (! pData->audio.isReady)
return; return;
@@ -781,13 +807,13 @@ private:


#define handlePtr ((CarlaEngineRtAudio*)userData) #define handlePtr ((CarlaEngineRtAudio*)userData)


static int carla_rtaudio_process_callback(void* outputBuffer, void* inputBuffer, unsigned int nframes, double streamTime, RtAudioStreamStatus status, void* userData)
static int carla_rtaudio_process_callback(void* outputBuffer, void* inputBuffer, uint nframes, double streamTime, RtAudioStreamStatus status, void* userData)
{ {
handlePtr->handleAudioProcessCallback(outputBuffer, inputBuffer, nframes, streamTime, status); handlePtr->handleAudioProcessCallback(outputBuffer, inputBuffer, nframes, streamTime, status);
return 0; return 0;
} }


static void carla_rtmidi_callback(double timeStamp, std::vector<unsigned char>* message, void* userData)
static void carla_rtmidi_callback(double timeStamp, std::vector<uchar>* message, void* userData)
{ {
handlePtr->handleMidiCallback(timeStamp, message); handlePtr->handleMidiCallback(timeStamp, message);
} }
@@ -799,7 +825,7 @@ private:


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


CarlaEngine* CarlaEngine::newRtAudio(AudioApi api)
CarlaEngine* CarlaEngine::newRtAudio(const AudioApi api)
{ {
initRtApis(); initRtApis();


@@ -836,14 +862,14 @@ CarlaEngine* CarlaEngine::newRtAudio(AudioApi api)
return new CarlaEngineRtAudio(rtApi); return new CarlaEngineRtAudio(rtApi);
} }


unsigned int CarlaEngine::getRtAudioApiCount()
uint CarlaEngine::getRtAudioApiCount()
{ {
initRtApis(); initRtApis();


return static_cast<unsigned int>(gRtAudioApis.size());
return static_cast<uint>(gRtAudioApis.size());
} }


const char* CarlaEngine::getRtAudioApiName(const unsigned int index)
const char* CarlaEngine::getRtAudioApiName(const uint index)
{ {
initRtApis(); initRtApis();


@@ -853,7 +879,7 @@ const char* CarlaEngine::getRtAudioApiName(const unsigned int index)
return CarlaBackend::getRtAudioApiName(gRtAudioApis[index]); return CarlaBackend::getRtAudioApiName(gRtAudioApis[index]);
} }


const char* const* CarlaEngine::getRtAudioApiDeviceNames(const unsigned int index)
const char* const* CarlaEngine::getRtAudioApiDeviceNames(const uint index)
{ {
initRtApis(); initRtApis();


@@ -864,14 +890,14 @@ const char* const* CarlaEngine::getRtAudioApiDeviceNames(const unsigned int inde


RtAudio rtAudio(api); RtAudio rtAudio(api);


const unsigned int devCount(rtAudio.getDeviceCount());
const uint devCount(rtAudio.getDeviceCount());


if (devCount == 0) if (devCount == 0)
return nullptr; return nullptr;


LinkedList<const char*> devNames; LinkedList<const char*> devNames;


for (unsigned int i=0; i < devCount; ++i)
for (uint i=0; i < devCount; ++i)
{ {
RtAudio::DeviceInfo devInfo(rtAudio.getDeviceInfo(i)); RtAudio::DeviceInfo devInfo(rtAudio.getDeviceInfo(i));


@@ -899,7 +925,7 @@ const char* const* CarlaEngine::getRtAudioApiDeviceNames(const unsigned int inde
return gRetNames; return gRetNames;
} }


const EngineDriverDeviceInfo* CarlaEngine::getRtAudioDeviceInfo(const unsigned int index, const char* const deviceName)
const EngineDriverDeviceInfo* CarlaEngine::getRtAudioDeviceInfo(const uint index, const char* const deviceName)
{ {
initRtApis(); initRtApis();


@@ -910,12 +936,12 @@ const EngineDriverDeviceInfo* CarlaEngine::getRtAudioDeviceInfo(const unsigned i


RtAudio rtAudio(api); RtAudio rtAudio(api);


const unsigned int devCount(rtAudio.getDeviceCount());
const uint devCount(rtAudio.getDeviceCount());


if (devCount == 0) if (devCount == 0)
return nullptr; return nullptr;


unsigned int i;
uint i;
RtAudio::DeviceInfo rtAudioDevInfo; RtAudio::DeviceInfo rtAudioDevInfo;


for (i=0; i < devCount; ++i) for (i=0; i < devCount; ++i)


+ 2
- 0
source/modules/jackbridge/JackBridge.hpp View File

@@ -263,6 +263,8 @@ typedef void (*JackPropertyChangeCallback)(jack_uuid_t subject, const char* key,


#endif // ! JACKBRIDGE_DIRECT #endif // ! JACKBRIDGE_DIRECT


bool jackbridge_is_ok() noexcept;

CARLA_EXPORT void jackbridge_get_version(int* major_ptr, int* minor_ptr, int* micro_ptr, int* proto_ptr); CARLA_EXPORT void jackbridge_get_version(int* major_ptr, int* minor_ptr, int* micro_ptr, int* proto_ptr);
CARLA_EXPORT const char* jackbridge_get_version_string(); CARLA_EXPORT const char* jackbridge_get_version_string();




+ 12
- 1
source/modules/jackbridge/JackBridge1.cpp View File

@@ -484,12 +484,23 @@ struct JackBridge {
} }
}; };


static JackBridge bridge;
static const JackBridge bridge;


#endif // ! JACKBRIDGE_DIRECT #endif // ! JACKBRIDGE_DIRECT


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


bool jackbridge_is_ok() noexcept
{
#if defined(JACKBRIDGE_DUMMY) || defined(JACKBRIDGE_DIRECT)
return true;
#else
return (bridge.lib != nullptr);
#endif
}

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

void jackbridge_get_version(int* major_ptr, int* minor_ptr, int* micro_ptr, int* proto_ptr) void jackbridge_get_version(int* major_ptr, int* minor_ptr, int* micro_ptr, int* proto_ptr)
{ {
#if defined(JACKBRIDGE_DUMMY) #if defined(JACKBRIDGE_DUMMY)


Loading…
Cancel
Save