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