@@ -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; | ||||
@@ -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]); | ||||
@@ -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 | ||||
} | } | ||||
@@ -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; | ||||
@@ -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; | ||||
} | } | ||||
@@ -184,8 +184,6 @@ public: | |||||
fDevice = nullptr; | fDevice = nullptr; | ||||
} | } | ||||
pData->audio.clear(); | |||||
return !hasError; | return !hasError; | ||||
} | } | ||||
@@ -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) | ||||
@@ -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(); | ||||
@@ -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) | ||||