@@ -1273,53 +1273,6 @@ void CarlaEngine::setFileCallback(const FileCallbackFunc func, void* const ptr) | |||
pData->fileCallbackPtr = ptr; | |||
} | |||
#ifndef BUILD_BRIDGE | |||
// ----------------------------------------------------------------------- | |||
// Patchbay | |||
bool CarlaEngine::patchbayConnect(const uint groupA, const uint portA, const uint groupB, const uint portB) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK || pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY, false); | |||
CARLA_SAFE_ASSERT_RETURN(pData->audio.isReady, false); | |||
carla_debug("CarlaEngine::patchbayConnect(%u, %u, %u, %u)", groupA, portA, groupB, portB); | |||
if (pData->graph.isRack) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->graph.rack != nullptr, nullptr); | |||
return pData->graph.rack->connect(this, groupA, portA, groupB, portB); | |||
} | |||
else | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->graph.patchbay != nullptr, nullptr); | |||
return pData->graph.patchbay->connect(this, groupA, portA, groupB, portB); | |||
} | |||
} | |||
bool CarlaEngine::patchbayDisconnect(const uint connectionId) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK || pData->options.processMode == ENGINE_PROCESS_MODE_PATCHBAY, false); | |||
CARLA_SAFE_ASSERT_RETURN(pData->audio.isReady, false); | |||
carla_debug("CarlaEngine::patchbayDisconnect(%u)", connectionId); | |||
if (pData->graph.isRack) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->graph.rack != nullptr, nullptr); | |||
return pData->graph.rack->disconnect(this, connectionId); | |||
} | |||
else | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->graph.patchbay != nullptr, nullptr); | |||
return pData->graph.patchbay->disconnect(this, connectionId); | |||
} | |||
} | |||
bool CarlaEngine::patchbayRefresh() | |||
{ | |||
setLastError("Unsupported operation"); | |||
return false; | |||
} | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
// Transport | |||
@@ -1588,56 +1541,6 @@ void CarlaEngine::setPluginPeaks(const uint pluginId, float const inPeaks[2], fl | |||
pluginData.outsPeak[1] = outPeaks[1]; | |||
} | |||
#ifndef BUILD_BRIDGE | |||
// ----------------------------------------------------------------------- | |||
// Patchbay stuff | |||
const char* const* CarlaEngine::getPatchbayConnections() const | |||
{ | |||
carla_debug("CarlaEngine::getPatchbayConnections()"); | |||
if (pData->graph.isRack) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->graph.rack != nullptr, nullptr); | |||
return pData->graph.rack->getConnections(); | |||
} | |||
else | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->graph.patchbay != nullptr, nullptr); | |||
return pData->graph.patchbay->getConnections(); | |||
} | |||
} | |||
void CarlaEngine::restorePatchbayConnection(const char* const connSource, const char* const connTarget) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(connSource != nullptr && connSource[0] != '\0',); | |||
CARLA_SAFE_ASSERT_RETURN(connTarget != nullptr && connTarget[0] != '\0',); | |||
carla_debug("CarlaEngine::restorePatchbayConnection(\"%s\", \"%s\")", connSource, connTarget); | |||
uint groupA, portA; | |||
uint groupB, portB; | |||
if (pData->graph.isRack) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->graph.rack != nullptr,); | |||
if (! pData->graph.rack->getPortIdFromFullName(connSource, groupA, portA)) | |||
return; | |||
if (! pData->graph.rack->getPortIdFromFullName(connTarget, groupB, portB)) | |||
return; | |||
} | |||
else | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->graph.patchbay != nullptr,); | |||
if (! pData->graph.patchbay->getPortIdFromFullName(connSource, groupA, portA)) | |||
return; | |||
if (! pData->graph.patchbay->getPortIdFromFullName(connTarget, groupB, portB)) | |||
return; | |||
} | |||
patchbayConnect(groupA, portA, groupB, portB); | |||
} | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
// Bridge/Controller OSC stuff | |||
@@ -24,414 +24,176 @@ | |||
#include "juce_audio_basics.h" | |||
using juce::FloatVectorOperations; | |||
CARLA_BACKEND_START_NAMESPACE | |||
// ----------------------------------------------------------------------- | |||
// Engine Internal helper macro, sets lastError and returns false/NULL | |||
#define CARLA_SAFE_ASSERT_RETURN_INTERNAL_ERR(cond, err) if (! (cond)) { carla_safe_assert(#cond, __FILE__, __LINE__); lastError = err; return false; } | |||
#define CARLA_SAFE_ASSERT_RETURN_INTERNAL_ERRN(cond, err) if (! (cond)) { carla_safe_assert(#cond, __FILE__, __LINE__); lastError = err; return nullptr; } | |||
// ----------------------------------------------------------------------- | |||
CARLA_BACKEND_START_NAMESPACE | |||
#if 0 | |||
} // Fix editor indentation | |||
#endif | |||
#ifndef BUILD_BRIDGE | |||
// ----------------------------------------------------------------------- | |||
// Rack Patchbay stuff | |||
// InternalAudio | |||
static uint getCarlaRackPortIdFromName(const char* const shortname) noexcept | |||
EngineInternalAudio::EngineInternalAudio() noexcept | |||
: isReady(false), | |||
inCount(0), | |||
outCount(0), | |||
inBuf(nullptr), | |||
outBuf(nullptr) {} | |||
EngineInternalAudio::~EngineInternalAudio() noexcept | |||
{ | |||
if (std::strcmp(shortname, "AudioIn1") == 0 || std::strcmp(shortname, "audio-in1") == 0) | |||
return RACK_GRAPH_CARLA_PORT_AUDIO_IN1; | |||
if (std::strcmp(shortname, "AudioIn2") == 0 || std::strcmp(shortname, "audio-in2") == 0) | |||
return RACK_GRAPH_CARLA_PORT_AUDIO_IN2; | |||
if (std::strcmp(shortname, "AudioOut1") == 0 || std::strcmp(shortname, "audio-out1") == 0) | |||
return RACK_GRAPH_CARLA_PORT_AUDIO_OUT1; | |||
if (std::strcmp(shortname, "AudioOut2") == 0 || std::strcmp(shortname, "audio-out2") == 0) | |||
return RACK_GRAPH_CARLA_PORT_AUDIO_OUT2; | |||
if (std::strcmp(shortname, "MidiIn") == 0 || std::strcmp(shortname, "midi-in") == 0) | |||
return RACK_GRAPH_CARLA_PORT_MIDI_IN; | |||
if (std::strcmp(shortname, "MidiOut") == 0 || std::strcmp(shortname, "midi-out") == 0) | |||
return RACK_GRAPH_CARLA_PORT_MIDI_OUT; | |||
carla_stderr("CarlaBackend::getCarlaRackPortIdFromName(%s) - invalid short name", shortname); | |||
return RACK_GRAPH_CARLA_PORT_NULL; | |||
CARLA_SAFE_ASSERT(! isReady); | |||
CARLA_SAFE_ASSERT(inCount == 0); | |||
CARLA_SAFE_ASSERT(outCount == 0); | |||
CARLA_SAFE_ASSERT(inBuf == nullptr); | |||
CARLA_SAFE_ASSERT(outBuf == nullptr); | |||
} | |||
// ----------------------------------------------------------------------- | |||
// RackGraph | |||
const char* RackGraph::MIDI::getName(const bool isInput, const uint index) const noexcept | |||
void EngineInternalAudio::clearBuffers() noexcept | |||
{ | |||
for (LinkedList<PortNameToId>::Itenerator it = isInput ? ins.begin() : outs.begin(); it.valid(); it.next()) | |||
for (uint32_t i=0; i < inCount; ++i) | |||
{ | |||
const PortNameToId& port(it.getValue()); | |||
if (port.port == index) | |||
return port.name; | |||
if (inBuf[i] != nullptr) | |||
{ | |||
delete[] inBuf[i]; | |||
inBuf[i] = nullptr; | |||
} | |||
} | |||
return nullptr; | |||
} | |||
uint RackGraph::MIDI::getPortId(const bool isInput, const char portName[]) const noexcept | |||
{ | |||
for (LinkedList<PortNameToId>::Itenerator it = isInput ? ins.begin() : outs.begin(); it.valid(); it.next()) | |||
for (uint32_t i=0; i < outCount; ++i) | |||
{ | |||
const PortNameToId& port(it.getValue()); | |||
if (std::strcmp(port.name, portName) == 0) | |||
return port.port; | |||
if (outBuf[i] != nullptr) | |||
{ | |||
delete[] outBuf[i]; | |||
outBuf[i] = nullptr; | |||
} | |||
} | |||
return 0; | |||
} | |||
bool RackGraph::connect(CarlaEngine* const engine, const uint groupA, const uint portA, const uint groupB, const uint portB) noexcept | |||
void EngineInternalAudio::clear() noexcept | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(engine != nullptr, false); | |||
isReady = false; | |||
uint carlaPort; | |||
GroupPort otherPort; | |||
clearBuffers(); | |||
if (groupA == RACK_GRAPH_GROUP_CARLA) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(groupB != RACK_GRAPH_GROUP_CARLA, false); | |||
inCount = 0; | |||
outCount = 0; | |||
carlaPort = portA; | |||
otherPort.group = groupB; | |||
otherPort.port = portB; | |||
} | |||
else | |||
if (inBuf != nullptr) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(groupB == RACK_GRAPH_GROUP_CARLA, false); | |||
carlaPort = portB; | |||
otherPort.group = groupA; | |||
otherPort.port = portA; | |||
} | |||
CARLA_SAFE_ASSERT_RETURN(carlaPort > RACK_GRAPH_CARLA_PORT_NULL && carlaPort < RACK_GRAPH_CARLA_PORT_MAX, false); | |||
CARLA_SAFE_ASSERT_RETURN(otherPort.group > RACK_GRAPH_GROUP_CARLA && otherPort.group < RACK_GRAPH_GROUP_MAX, false); | |||
bool makeConnection = false; | |||
switch (carlaPort) | |||
{ | |||
case RACK_GRAPH_CARLA_PORT_AUDIO_IN1: | |||
CARLA_SAFE_ASSERT_RETURN(otherPort.group == RACK_GRAPH_GROUP_AUDIO_IN, false); | |||
audio.mutex.lock(); | |||
makeConnection = audio.connectedIn1.append(otherPort.port); | |||
audio.mutex.unlock(); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_AUDIO_IN2: | |||
CARLA_SAFE_ASSERT_RETURN(otherPort.group == RACK_GRAPH_GROUP_AUDIO_IN, false); | |||
audio.mutex.lock(); | |||
makeConnection = audio.connectedIn2.append(otherPort.port); | |||
audio.mutex.unlock(); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_AUDIO_OUT1: | |||
CARLA_SAFE_ASSERT_RETURN(otherPort.group == RACK_GRAPH_GROUP_AUDIO_OUT, false); | |||
audio.mutex.lock(); | |||
makeConnection = audio.connectedOut1.append(otherPort.port); | |||
audio.mutex.unlock(); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_AUDIO_OUT2: | |||
CARLA_SAFE_ASSERT_RETURN(otherPort.group == RACK_GRAPH_GROUP_AUDIO_OUT, false); | |||
audio.mutex.lock(); | |||
makeConnection = audio.connectedOut2.append(otherPort.port); | |||
audio.mutex.unlock(); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_MIDI_IN: | |||
CARLA_SAFE_ASSERT_RETURN(otherPort.group == RACK_GRAPH_GROUP_MIDI_IN, false); | |||
if (const char* const portName = midi.getName(true, otherPort.port)) | |||
makeConnection = engine->connectRackMidiInPort(portName); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_MIDI_OUT: | |||
CARLA_SAFE_ASSERT_RETURN(otherPort.group == RACK_GRAPH_GROUP_MIDI_OUT, false); | |||
if (const char* const portName = midi.getName(false, otherPort.port)) | |||
makeConnection = engine->connectRackMidiOutPort(portName); | |||
break; | |||
delete[] inBuf; | |||
inBuf = nullptr; | |||
} | |||
if (! makeConnection) | |||
if (outBuf != nullptr) | |||
{ | |||
engine->setLastError("Invalid rack connection"); | |||
return false; | |||
delete[] outBuf; | |||
outBuf = nullptr; | |||
} | |||
ConnectionToId connectionToId; | |||
connectionToId.setData(++connections.lastId, groupA, portA, groupB, portB); | |||
char strBuf[STR_MAX+1]; | |||
strBuf[STR_MAX] = '\0'; | |||
std::snprintf(strBuf, STR_MAX, "%u:%u:%u:%u", groupA, portA, groupB, portB); | |||
engine->callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_ADDED, connectionToId.id, 0, 0, 0.0f, strBuf); | |||
connections.list.append(connectionToId); | |||
return true; | |||
} | |||
bool RackGraph::disconnect(CarlaEngine* const engine, const uint connectionId) noexcept | |||
void EngineInternalAudio::create(const uint32_t bufferSize) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(engine != nullptr, false); | |||
CARLA_SAFE_ASSERT_RETURN(connections.list.count() > 0, false); | |||
CARLA_SAFE_ASSERT(! isReady); | |||
CARLA_SAFE_ASSERT(inBuf == nullptr); | |||
CARLA_SAFE_ASSERT(outBuf == nullptr); | |||
for (LinkedList<ConnectionToId>::Itenerator it=connections.list.begin(); it.valid(); it.next()) | |||
if (inCount > 0) | |||
{ | |||
const ConnectionToId& connection(it.getValue()); | |||
if (connection.id != connectionId) | |||
continue; | |||
uint carlaPort; | |||
GroupPort otherPort; | |||
if (connection.groupA == RACK_GRAPH_GROUP_CARLA) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(connection.groupB != RACK_GRAPH_GROUP_CARLA, false); | |||
carlaPort = connection.portA; | |||
otherPort.group = connection.groupB; | |||
otherPort.port = connection.portB; | |||
} | |||
else | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(connection.groupB == RACK_GRAPH_GROUP_CARLA, false); | |||
carlaPort = connection.portB; | |||
otherPort.group = connection.groupA; | |||
otherPort.port = connection.portA; | |||
} | |||
inBuf = new float*[inCount]; | |||
CARLA_SAFE_ASSERT_RETURN(carlaPort > RACK_GRAPH_CARLA_PORT_NULL && carlaPort < RACK_GRAPH_CARLA_PORT_MAX, false); | |||
CARLA_SAFE_ASSERT_RETURN(otherPort.group > RACK_GRAPH_GROUP_CARLA && otherPort.group < RACK_GRAPH_GROUP_MAX, false); | |||
bool makeDisconnection = false; | |||
switch (carlaPort) | |||
{ | |||
case RACK_GRAPH_CARLA_PORT_AUDIO_IN1: | |||
audio.mutex.lock(); | |||
makeDisconnection = audio.connectedIn1.removeOne(otherPort.port); | |||
audio.mutex.unlock(); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_AUDIO_IN2: | |||
audio.mutex.lock(); | |||
makeDisconnection = audio.connectedIn2.removeOne(otherPort.port); | |||
audio.mutex.unlock(); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_AUDIO_OUT1: | |||
audio.mutex.lock(); | |||
makeDisconnection = audio.connectedOut1.removeOne(otherPort.port); | |||
audio.mutex.unlock(); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_AUDIO_OUT2: | |||
audio.mutex.lock(); | |||
makeDisconnection = audio.connectedOut2.removeOne(otherPort.port); | |||
audio.mutex.unlock(); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_MIDI_IN: | |||
if (const char* const portName = midi.getName(true, otherPort.port)) | |||
makeDisconnection = engine->disconnectRackMidiInPort(portName); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_MIDI_OUT: | |||
if (const char* const portName = midi.getName(false, otherPort.port)) | |||
makeDisconnection = engine->disconnectRackMidiOutPort(portName); | |||
break; | |||
} | |||
if (! makeDisconnection) | |||
{ | |||
engine->setLastError("Invalid rack connection"); | |||
return false; | |||
} | |||
for (uint32_t i=0; i < inCount; ++i) | |||
inBuf[i] = nullptr; | |||
} | |||
engine->callback(ENGINE_CALLBACK_PATCHBAY_CONNECTION_REMOVED, connection.id, 0, 0, 0.0f, nullptr); | |||
if (outCount > 0) | |||
{ | |||
outBuf = new float*[outCount]; | |||
connections.list.remove(it); | |||
return true; | |||
for (uint32_t i=0; i < outCount; ++i) | |||
outBuf[i] = nullptr; | |||
} | |||
engine->setLastError("Failed to find connection"); | |||
return false; | |||
resize(bufferSize, false); | |||
} | |||
const char* const* RackGraph::getConnections() const | |||
void EngineInternalAudio::resize(const uint32_t bufferSize, const bool doClear = true) | |||
{ | |||
if (connections.list.count() == 0) | |||
return nullptr; | |||
if (doClear) | |||
clearBuffers(); | |||
LinkedList<const char*> connList; | |||
char strBuf[STR_MAX+1]; | |||
strBuf[STR_MAX] = '\0'; | |||
CARLA_SAFE_ASSERT_RETURN(bufferSize != 0,); | |||
for (LinkedList<ConnectionToId>::Itenerator it=connections.list.begin(); it.valid(); it.next()) | |||
for (uint32_t i=0; i < inCount; ++i) | |||
{ | |||
const ConnectionToId& connection(it.getValue()); | |||
uint carlaPort; | |||
GroupPort otherPort; | |||
if (connection.groupA == RACK_GRAPH_GROUP_CARLA) | |||
{ | |||
CARLA_SAFE_ASSERT_CONTINUE(connection.groupB != RACK_GRAPH_GROUP_CARLA); | |||
carlaPort = connection.portA; | |||
otherPort.group = connection.groupB; | |||
otherPort.port = connection.portB; | |||
} | |||
else | |||
{ | |||
CARLA_SAFE_ASSERT_CONTINUE(connection.groupB == RACK_GRAPH_GROUP_CARLA); | |||
carlaPort = connection.portB; | |||
otherPort.group = connection.groupA; | |||
otherPort.port = connection.portA; | |||
} | |||
CARLA_SAFE_ASSERT_CONTINUE(carlaPort > RACK_GRAPH_CARLA_PORT_NULL && carlaPort < RACK_GRAPH_CARLA_PORT_MAX); | |||
CARLA_SAFE_ASSERT_CONTINUE(otherPort.group > RACK_GRAPH_GROUP_CARLA && otherPort.group < RACK_GRAPH_GROUP_MAX); | |||
switch (carlaPort) | |||
{ | |||
case RACK_GRAPH_CARLA_PORT_AUDIO_IN1: | |||
case RACK_GRAPH_CARLA_PORT_AUDIO_IN2: | |||
std::snprintf(strBuf, STR_MAX, "AudioIn:%i", otherPort.port+1); | |||
connList.append(carla_strdup(strBuf)); | |||
connList.append(carla_strdup((carlaPort == RACK_GRAPH_CARLA_PORT_AUDIO_IN1) ? "Carla:AudioIn1" : "Carla:AudioIn2")); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_AUDIO_OUT1: | |||
case RACK_GRAPH_CARLA_PORT_AUDIO_OUT2: | |||
std::snprintf(strBuf, STR_MAX, "AudioOut:%i", otherPort.port+1); | |||
connList.append(carla_strdup((carlaPort == RACK_GRAPH_CARLA_PORT_AUDIO_OUT1) ? "Carla:AudioOut1" : "Carla:AudioOut2")); | |||
connList.append(carla_strdup(strBuf)); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_MIDI_IN: | |||
std::snprintf(strBuf, STR_MAX, "MidiIn:%s", midi.getName(true, otherPort.port)); | |||
connList.append(carla_strdup(strBuf)); | |||
connList.append(carla_strdup("Carla:MidiIn")); | |||
break; | |||
case RACK_GRAPH_CARLA_PORT_MIDI_OUT: | |||
std::snprintf(strBuf, STR_MAX, "MidiOut:%s", midi.getName(false, otherPort.port)); | |||
connList.append(carla_strdup("Carla:MidiOut")); | |||
connList.append(carla_strdup(strBuf)); | |||
break; | |||
} | |||
inBuf[i] = new float[bufferSize]; | |||
FloatVectorOperations::clear(inBuf[i], bufferSize); | |||
} | |||
const size_t connCount(connList.count()); | |||
if (connCount == 0) | |||
return nullptr; | |||
const char** const retConns = new const char*[connCount+1]; | |||
for (size_t i=0; i < connCount; ++i) | |||
for (uint32_t i=0; i < outCount; ++i) | |||
{ | |||
retConns[i] = connList.getAt(i, nullptr); | |||
if (retConns[i] == nullptr) | |||
retConns[i] = carla_strdup("(unknown)"); | |||
outBuf[i] = new float[bufferSize]; | |||
FloatVectorOperations::clear(outBuf[i], bufferSize); | |||
} | |||
} | |||
#endif | |||
retConns[connCount] = nullptr; | |||
connList.clear(); | |||
// ----------------------------------------------------------------------- | |||
// InternalEvents | |||
return retConns; | |||
} | |||
EngineInternalEvents::EngineInternalEvents() noexcept | |||
: in(nullptr), | |||
out(nullptr) {} | |||
bool RackGraph::getPortIdFromFullName(const char* const fullPortName, uint& groupId, uint& portId) const | |||
EngineInternalEvents::~EngineInternalEvents() noexcept | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fullPortName != nullptr && fullPortName[0] != '\0', false); | |||
int portTest; | |||
CARLA_SAFE_ASSERT(in == nullptr); | |||
CARLA_SAFE_ASSERT(out == nullptr); | |||
} | |||
if (std::strncmp(fullPortName, "Carla:", 6) == 0) | |||
{ | |||
groupId = RACK_GRAPH_GROUP_CARLA; | |||
portId = getCarlaRackPortIdFromName(fullPortName+6); | |||
CARLA_SAFE_ASSERT_RETURN(portId > RACK_GRAPH_CARLA_PORT_NULL && portId < RACK_GRAPH_CARLA_PORT_MAX, false); | |||
} | |||
else if (std::strncmp(fullPortName, "AudioIn:", 8) == 0) | |||
{ | |||
groupId = RACK_GRAPH_GROUP_AUDIO_IN; | |||
portTest = std::atoi(fullPortName+8) - 1; | |||
CARLA_SAFE_ASSERT_RETURN(portTest >= 0, false); | |||
portId = static_cast<uint>(portTest); | |||
} | |||
else if (std::strncmp(fullPortName, "AudioOut:", 9) == 0) | |||
{ | |||
groupId = RACK_GRAPH_GROUP_AUDIO_OUT; | |||
portTest = std::atoi(fullPortName+9) - 1; | |||
CARLA_SAFE_ASSERT_RETURN(portTest >= 0, false); | |||
portId = static_cast<uint>(portTest); | |||
} | |||
else if (std::strncmp(fullPortName, "MidiIn:", 7) == 0) | |||
{ | |||
groupId = RACK_GRAPH_GROUP_MIDI_IN; | |||
//portId = std::atoi(fullPortName+7) - 1; | |||
} | |||
else if (std::strncmp(fullPortName, "MidiOut:", 8) == 0) | |||
void EngineInternalEvents::clear() noexcept | |||
{ | |||
if (in != nullptr) | |||
{ | |||
groupId = RACK_GRAPH_GROUP_MIDI_OUT; | |||
//portId = std::atoi(fullPortName+8) - 1; | |||
delete[] in; | |||
in = nullptr; | |||
} | |||
else | |||
if (out != nullptr) | |||
{ | |||
return false; | |||
delete[] out; | |||
out = nullptr; | |||
} | |||
return true; | |||
} | |||
// ----------------------------------------------------------------------- | |||
// PatchbayGraph | |||
// InternalTime | |||
// TODO | |||
EngineInternalTime::EngineInternalTime() noexcept | |||
: playing(false), | |||
frame(0) {} | |||
bool PatchbayGraph::connect(CarlaEngine* const engine, const uint /*groupA*/, const uint /*portA*/, const uint /*groupB*/, const uint /*portB*/) noexcept | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(engine != nullptr, false); | |||
// ----------------------------------------------------------------------- | |||
// NextAction | |||
return false; | |||
} | |||
EngineNextAction::EngineNextAction() noexcept | |||
: opcode(kEnginePostActionNull), | |||
pluginId(0), | |||
value(0) {} | |||
bool PatchbayGraph::disconnect(CarlaEngine* const engine, const uint /*connectionId*/) noexcept | |||
EngineNextAction::~EngineNextAction() noexcept | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(engine != nullptr, false); | |||
return false; | |||
CARLA_SAFE_ASSERT(opcode == kEnginePostActionNull); | |||
} | |||
const char* const* PatchbayGraph::getConnections() const | |||
void EngineNextAction::ready() const noexcept | |||
{ | |||
return nullptr; | |||
mutex.lock(); | |||
mutex.unlock(); | |||
} | |||
bool PatchbayGraph::getPortIdFromFullName(const char* const /*fillPortName*/, uint& /*groupId*/, uint& /*portId*/) const | |||
{ | |||
return false; | |||
} | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
// CarlaEngine::ProtectedData | |||
@@ -525,12 +287,6 @@ bool CarlaEngine::ProtectedData::init(const char* const clientName) | |||
#ifndef BUILD_BRIDGE | |||
oscData = osc.getControlData(); | |||
if (options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK || options.processMode == ENGINE_PROCESS_MODE_PATCHBAY) | |||
{ | |||
graph.isRack = (options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK); | |||
graph.create(); | |||
} | |||
#endif | |||
nextAction.ready(); | |||
@@ -551,11 +307,6 @@ void CarlaEngine::ProtectedData::close() | |||
thread.stopThread(500); | |||
nextAction.ready(); | |||
#ifndef BUILD_BRIDGE | |||
if (options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK || options.processMode == ENGINE_PROCESS_MODE_PATCHBAY) | |||
graph.clear(); | |||
#endif | |||
osc.close(); | |||
oscData = nullptr; | |||
@@ -570,12 +321,11 @@ void CarlaEngine::ProtectedData::close() | |||
delete[] plugins; | |||
plugins = nullptr; | |||
} | |||
graph.clear(); | |||
#endif | |||
events.clear(); | |||
#ifndef BUILD_BRIDGE | |||
audio.clear(); | |||
#endif | |||
name.clear(); | |||
} | |||
@@ -667,214 +417,6 @@ void CarlaEngine::ProtectedData::doNextPluginAction(const bool unlock) noexcept | |||
} | |||
} | |||
// ----------------------------------------------------------------------- | |||
#ifndef BUILD_BRIDGE | |||
void CarlaEngine::ProtectedData::processRack(const float* inBufReal[2], float* outBuf[2], const uint32_t frames, const bool isOffline) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(events.in != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(events.out != nullptr,); | |||
// safe copy | |||
float inBuf0[frames]; | |||
float inBuf1[frames]; | |||
float* inBuf[2] = { inBuf0, inBuf1 }; | |||
// initialize audio inputs | |||
FLOAT_COPY(inBuf0, inBufReal[0], frames); | |||
FLOAT_COPY(inBuf1, inBufReal[1], frames); | |||
// initialize audio outputs (zero) | |||
FLOAT_CLEAR(outBuf[0], frames); | |||
FLOAT_CLEAR(outBuf[1], frames); | |||
// initialize event outputs (zero) | |||
carla_zeroStruct<EngineEvent>(events.out, kMaxEngineEventInternalCount); | |||
bool processed = false; | |||
uint32_t oldAudioInCount = 0; | |||
uint32_t oldMidiOutCount = 0; | |||
// process plugins | |||
for (uint i=0; i < curPluginCount; ++i) | |||
{ | |||
CarlaPlugin* const plugin = plugins[i].plugin; | |||
if (plugin == nullptr || ! plugin->isEnabled() || ! plugin->tryLock(isOffline)) | |||
continue; | |||
if (processed) | |||
{ | |||
// initialize audio inputs (from previous outputs) | |||
FLOAT_COPY(inBuf0, outBuf[0], frames); | |||
FLOAT_COPY(inBuf1, outBuf[1], frames); | |||
// initialize audio outputs (zero) | |||
FLOAT_CLEAR(outBuf[0], frames); | |||
FLOAT_CLEAR(outBuf[1], frames); | |||
// if plugin has no midi out, add previous events | |||
if (oldMidiOutCount == 0 && events.in[0].type != kEngineEventTypeNull) | |||
{ | |||
if (events.out[0].type != kEngineEventTypeNull) | |||
{ | |||
// TODO: carefully add to input, sorted events | |||
} | |||
// else nothing needed | |||
} | |||
else | |||
{ | |||
// initialize event inputs from previous outputs | |||
carla_copyStruct<EngineEvent>(events.in, events.out, kMaxEngineEventInternalCount); | |||
// initialize event outputs (zero) | |||
carla_zeroStruct<EngineEvent>(events.out, kMaxEngineEventInternalCount); | |||
} | |||
} | |||
oldAudioInCount = plugin->getAudioInCount(); | |||
oldMidiOutCount = plugin->getMidiOutCount(); | |||
// process | |||
plugin->initBuffers(); | |||
plugin->process(inBuf, outBuf, frames); | |||
plugin->unlock(); | |||
// if plugin has no audio inputs, add input buffer | |||
if (oldAudioInCount == 0) | |||
{ | |||
FLOAT_ADD(outBuf[0], inBuf0, frames); | |||
FLOAT_ADD(outBuf[1], inBuf1, frames); | |||
} | |||
// set peaks | |||
{ | |||
EnginePluginData& pluginData(plugins[i]); | |||
juce::Range<float> range; | |||
if (oldAudioInCount > 0) | |||
{ | |||
range = FloatVectorOperations::findMinAndMax(inBuf0, static_cast<int>(frames)); | |||
pluginData.insPeak[0] = carla_max<float>(std::abs(range.getStart()), std::abs(range.getEnd()), 1.0f); | |||
range = FloatVectorOperations::findMinAndMax(inBuf1, static_cast<int>(frames)); | |||
pluginData.insPeak[1] = carla_max<float>(std::abs(range.getStart()), std::abs(range.getEnd()), 1.0f); | |||
} | |||
else | |||
{ | |||
pluginData.insPeak[0] = 0.0f; | |||
pluginData.insPeak[1] = 0.0f; | |||
} | |||
if (plugin->getAudioOutCount() > 0) | |||
{ | |||
range = FloatVectorOperations::findMinAndMax(outBuf[0], static_cast<int>(frames)); | |||
pluginData.outsPeak[0] = carla_max<float>(std::abs(range.getStart()), std::abs(range.getEnd()), 1.0f); | |||
range = FloatVectorOperations::findMinAndMax(outBuf[1], static_cast<int>(frames)); | |||
pluginData.outsPeak[1] = carla_max<float>(std::abs(range.getStart()), std::abs(range.getEnd()), 1.0f); | |||
} | |||
else | |||
{ | |||
pluginData.outsPeak[0] = 0.0f; | |||
pluginData.outsPeak[1] = 0.0f; | |||
} | |||
} | |||
processed = true; | |||
} | |||
} | |||
void CarlaEngine::ProtectedData::processRackFull(const float* const* const inBuf, const uint32_t inCount, float* const* const outBuf, const uint32_t outCount, const uint32_t nframes, const bool isOffline) | |||
{ | |||
RackGraph::Audio& rackAudio(graph.rack->audio); | |||
const CarlaMutexLocker _cml(rackAudio.mutex); | |||
if (inBuf != nullptr && inCount > 0) | |||
{ | |||
bool noConnections = true; | |||
// connect input buffers | |||
for (LinkedList<uint>::Itenerator it = rackAudio.connectedIn1.begin(); it.valid(); it.next()) | |||
{ | |||
const uint& port(it.getValue()); | |||
CARLA_SAFE_ASSERT_CONTINUE(port < inCount); | |||
if (noConnections) | |||
{ | |||
FLOAT_COPY(audio.inBuf[0], inBuf[port], nframes); | |||
noConnections = false; | |||
} | |||
else | |||
{ | |||
FLOAT_ADD(audio.inBuf[0], inBuf[port], nframes); | |||
} | |||
} | |||
if (noConnections) | |||
FLOAT_CLEAR(audio.inBuf[0], nframes); | |||
noConnections = true; | |||
for (LinkedList<uint>::Itenerator it = rackAudio.connectedIn2.begin(); it.valid(); it.next()) | |||
{ | |||
const uint& port(it.getValue()); | |||
CARLA_SAFE_ASSERT_CONTINUE(port < inCount); | |||
if (noConnections) | |||
{ | |||
FLOAT_COPY(audio.inBuf[1], inBuf[port], nframes); | |||
noConnections = false; | |||
} | |||
else | |||
{ | |||
FLOAT_ADD(audio.inBuf[1], inBuf[port], nframes); | |||
} | |||
} | |||
if (noConnections) | |||
FLOAT_CLEAR(audio.inBuf[1], nframes); | |||
} | |||
else | |||
{ | |||
FLOAT_CLEAR(audio.inBuf[0], nframes); | |||
FLOAT_CLEAR(audio.inBuf[1], nframes); | |||
} | |||
FLOAT_CLEAR(audio.outBuf[0], nframes); | |||
FLOAT_CLEAR(audio.outBuf[1], nframes); | |||
// process | |||
processRack(const_cast<const float**>(audio.inBuf), audio.outBuf, nframes, isOffline); | |||
// connect output buffers | |||
if (rackAudio.connectedOut1.count() != 0) | |||
{ | |||
for (LinkedList<uint>::Itenerator it = rackAudio.connectedOut1.begin(); it.valid(); it.next()) | |||
{ | |||
const uint& port(it.getValue()); | |||
CARLA_SAFE_ASSERT_CONTINUE(port < outCount); | |||
FLOAT_ADD(outBuf[port], audio.outBuf[0], nframes); | |||
} | |||
} | |||
if (rackAudio.connectedOut2.count() != 0) | |||
{ | |||
for (LinkedList<uint>::Itenerator it = rackAudio.connectedOut2.begin(); it.valid(); it.next()) | |||
{ | |||
const uint& port(it.getValue()); | |||
CARLA_SAFE_ASSERT_CONTINUE(port < outCount); | |||
FLOAT_ADD(outBuf[port], audio.outBuf[1], nframes); | |||
} | |||
} | |||
} | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
// ScopedActionLock | |||
@@ -23,9 +23,7 @@ | |||
#include "CarlaEngineThread.hpp" | |||
#include "CarlaEngineUtils.hpp" | |||
#include "CarlaMathUtils.hpp" | |||
#include "CarlaPatchbayUtils.hpp" | |||
#include "CarlaMutex.hpp" | |||
CARLA_BACKEND_START_NAMESPACE | |||
// ----------------------------------------------------------------------- | |||
// Engine helper macro, sets lastError and returns false/NULL | |||
@@ -33,239 +31,6 @@ | |||
#define CARLA_SAFE_ASSERT_RETURN_ERR(cond, err) if (! (cond)) { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return false; } | |||
#define CARLA_SAFE_ASSERT_RETURN_ERRN(cond, err) if (! (cond)) { carla_safe_assert(#cond, __FILE__, __LINE__); setLastError(err); return nullptr; } | |||
// ----------------------------------------------------------------------- | |||
CARLA_BACKEND_START_NAMESPACE | |||
#if 0 | |||
} // Fix editor indentation | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
// Patchbay stuff | |||
struct GroupPort { | |||
uint group, port; | |||
}; | |||
#ifndef BUILD_BRIDGE | |||
// ----------------------------------------------------------------------- | |||
// Rack Graph stuff | |||
enum RackGraphGroupIds { | |||
RACK_GRAPH_GROUP_CARLA = 0, | |||
RACK_GRAPH_GROUP_AUDIO_IN = 1, | |||
RACK_GRAPH_GROUP_AUDIO_OUT = 2, | |||
RACK_GRAPH_GROUP_MIDI_IN = 3, | |||
RACK_GRAPH_GROUP_MIDI_OUT = 4, | |||
RACK_GRAPH_GROUP_MAX = 5 | |||
}; | |||
enum RackGraphCarlaPortIds { | |||
RACK_GRAPH_CARLA_PORT_NULL = 0, | |||
RACK_GRAPH_CARLA_PORT_AUDIO_IN1 = 1, | |||
RACK_GRAPH_CARLA_PORT_AUDIO_IN2 = 2, | |||
RACK_GRAPH_CARLA_PORT_AUDIO_OUT1 = 3, | |||
RACK_GRAPH_CARLA_PORT_AUDIO_OUT2 = 4, | |||
RACK_GRAPH_CARLA_PORT_MIDI_IN = 5, | |||
RACK_GRAPH_CARLA_PORT_MIDI_OUT = 6, | |||
RACK_GRAPH_CARLA_PORT_MAX = 7 | |||
}; | |||
// ----------------------------------------------------------------------- | |||
// RackGraph | |||
struct RackGraph { | |||
PatchbayConnectionList connections; | |||
struct Audio { | |||
CarlaMutex mutex; | |||
LinkedList<uint> connectedIn1; | |||
LinkedList<uint> connectedIn2; | |||
LinkedList<uint> connectedOut1; | |||
LinkedList<uint> connectedOut2; | |||
} audio; | |||
struct MIDI { | |||
LinkedList<PortNameToId> ins; | |||
LinkedList<PortNameToId> outs; | |||
const char* getName(const bool isInput, const uint index) const noexcept; | |||
uint getPortId(const bool isInput, const char portName[]) const noexcept; | |||
} midi; | |||
RackGraph() noexcept {} | |||
~RackGraph() noexcept | |||
{ | |||
clear(); | |||
} | |||
void clear() noexcept | |||
{ | |||
connections.clear(); | |||
audio.mutex.lock(); | |||
audio.connectedIn1.clear(); | |||
audio.connectedIn2.clear(); | |||
audio.connectedOut1.clear(); | |||
audio.connectedOut2.clear(); | |||
audio.mutex.unlock(); | |||
midi.ins.clear(); | |||
midi.outs.clear(); | |||
} | |||
bool connect(CarlaEngine* const engine, const uint groupA, const uint portA, const uint groupB, const uint portB) noexcept; | |||
bool disconnect(CarlaEngine* const engine, const uint connectionId) noexcept; | |||
const char* const* getConnections() const; | |||
bool getPortIdFromFullName(const char* const fullPortName, uint& groupId, uint& portId) const; | |||
}; | |||
// ----------------------------------------------------------------------- | |||
// PatchbayGraph | |||
struct PatchbayGraph { | |||
PatchbayGraph() noexcept {} | |||
~PatchbayGraph() noexcept | |||
{ | |||
clear(); | |||
} | |||
void clear() noexcept | |||
{ | |||
} | |||
bool connect(CarlaEngine* const engine, const uint groupA, const uint portA, const uint groupB, const uint portB) noexcept; | |||
bool disconnect(CarlaEngine* const engine, const uint connectionId) noexcept; | |||
const char* const* getConnections() const; | |||
bool getPortIdFromFullName(const char* const fullPortName, uint& groupId, uint& portId) const; | |||
}; | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
// InternalAudio | |||
struct EngineInternalAudio { | |||
bool isReady; | |||
// always 2x2 in rack mode | |||
uint inCount; | |||
uint outCount; | |||
float** inBuf; | |||
float** outBuf; | |||
EngineInternalAudio() noexcept | |||
: isReady(false), | |||
inCount(0), | |||
outCount(0), | |||
inBuf(nullptr), | |||
outBuf(nullptr) {} | |||
~EngineInternalAudio() noexcept | |||
{ | |||
CARLA_SAFE_ASSERT(! isReady); | |||
CARLA_SAFE_ASSERT(inCount == 0); | |||
CARLA_SAFE_ASSERT(outCount == 0); | |||
CARLA_SAFE_ASSERT(inBuf == nullptr); | |||
CARLA_SAFE_ASSERT(outBuf == nullptr); | |||
} | |||
void clearBuffers() noexcept | |||
{ | |||
for (uint32_t i=0; i < inCount; ++i) | |||
{ | |||
if (inBuf[i] != nullptr) | |||
{ | |||
delete[] inBuf[i]; | |||
inBuf[i] = nullptr; | |||
} | |||
} | |||
for (uint32_t i=0; i < outCount; ++i) | |||
{ | |||
if (outBuf[i] != nullptr) | |||
{ | |||
delete[] outBuf[i]; | |||
outBuf[i] = nullptr; | |||
} | |||
} | |||
} | |||
void clear() noexcept | |||
{ | |||
isReady = false; | |||
clearBuffers(); | |||
inCount = 0; | |||
outCount = 0; | |||
if (inBuf != nullptr) | |||
{ | |||
delete[] inBuf; | |||
inBuf = nullptr; | |||
} | |||
if (outBuf != nullptr) | |||
{ | |||
delete[] outBuf; | |||
outBuf = nullptr; | |||
} | |||
} | |||
void create(const uint32_t bufferSize) | |||
{ | |||
CARLA_SAFE_ASSERT(! isReady); | |||
CARLA_SAFE_ASSERT(inBuf == nullptr); | |||
CARLA_SAFE_ASSERT(outBuf == nullptr); | |||
if (inCount > 0) | |||
{ | |||
inBuf = new float*[inCount]; | |||
for (uint32_t i=0; i < inCount; ++i) | |||
inBuf[i] = nullptr; | |||
} | |||
if (outCount > 0) | |||
{ | |||
outBuf = new float*[outCount]; | |||
for (uint32_t i=0; i < outCount; ++i) | |||
outBuf[i] = nullptr; | |||
} | |||
resize(bufferSize, false); | |||
} | |||
void resize(const uint32_t bufferSize, const bool doClear = true) | |||
{ | |||
if (doClear) | |||
clearBuffers(); | |||
CARLA_SAFE_ASSERT_RETURN(bufferSize != 0,); | |||
for (uint32_t i=0; i < inCount; ++i) | |||
{ | |||
inBuf[i] = new float[bufferSize]; | |||
FLOAT_CLEAR(inBuf[i], bufferSize); | |||
} | |||
for (uint32_t i=0; i < outCount; ++i) | |||
{ | |||
outBuf[i] = new float[bufferSize]; | |||
FLOAT_CLEAR(outBuf[i], bufferSize); | |||
} | |||
} | |||
CARLA_DECLARE_NON_COPY_STRUCT(EngineInternalAudio) | |||
}; | |||
// ----------------------------------------------------------------------- | |||
// InternalEvents | |||
@@ -273,30 +38,9 @@ struct EngineInternalEvents { | |||
EngineEvent* in; | |||
EngineEvent* out; | |||
EngineInternalEvents() noexcept | |||
: in(nullptr), | |||
out(nullptr) {} | |||
~EngineInternalEvents() noexcept | |||
{ | |||
CARLA_SAFE_ASSERT(in == nullptr); | |||
CARLA_SAFE_ASSERT(out == nullptr); | |||
} | |||
void clear() noexcept | |||
{ | |||
if (in != nullptr) | |||
{ | |||
delete[] in; | |||
in = nullptr; | |||
} | |||
if (out != nullptr) | |||
{ | |||
delete[] out; | |||
out = nullptr; | |||
} | |||
} | |||
EngineInternalEvents() noexcept; | |||
~EngineInternalEvents() noexcept; | |||
void clear() noexcept; | |||
CARLA_DECLARE_NON_COPY_STRUCT(EngineInternalEvents) | |||
}; | |||
@@ -305,54 +49,19 @@ struct EngineInternalEvents { | |||
// ----------------------------------------------------------------------- | |||
// InternalGraph | |||
struct InternalGraph; | |||
struct EngineInternalGraph { | |||
bool isRack; | |||
bool isReady; | |||
InternalGraph* graph; | |||
EngineInternalGraph() noexcept; | |||
~EngineInternalGraph() noexcept; | |||
union { | |||
RackGraph* rack; | |||
PatchbayGraph* patchbay; | |||
}; | |||
EngineInternalGraph() noexcept | |||
: isRack(true) | |||
{ | |||
rack = nullptr; | |||
} | |||
~EngineInternalGraph() noexcept | |||
{ | |||
CARLA_SAFE_ASSERT(rack == nullptr); | |||
} | |||
void create() | |||
{ | |||
if (isRack) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(rack == nullptr,); | |||
rack = new RackGraph(); | |||
} | |||
else | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(patchbay == nullptr,); | |||
patchbay = new PatchbayGraph(); | |||
} | |||
} | |||
void clear() | |||
{ | |||
if (isRack) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(rack != nullptr,); | |||
delete rack; | |||
rack = nullptr; | |||
} | |||
else | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(patchbay != nullptr,); | |||
delete patchbay; | |||
patchbay = nullptr; | |||
} | |||
} | |||
void create(const uint32_t bufferSize); | |||
void resize(const uint32_t bufferSize) noexcept; | |||
void clear() noexcept; | |||
CARLA_DECLARE_NON_COPY_STRUCT(EngineInternalGraph) | |||
}; | |||
@@ -365,22 +74,20 @@ struct EngineInternalTime { | |||
bool playing; | |||
uint64_t frame; | |||
EngineInternalTime() noexcept | |||
: playing(false), | |||
frame(0) {} | |||
EngineInternalTime() noexcept; | |||
CARLA_DECLARE_NON_COPY_STRUCT(EngineInternalTime) | |||
}; | |||
// ----------------------------------------------------------------------- | |||
// NextAction | |||
// EngineNextAction | |||
enum EnginePostAction { | |||
kEnginePostActionNull, | |||
kEnginePostActionZeroCount, | |||
kEnginePostActionNull = 0, | |||
kEnginePostActionZeroCount, // set curPluginCount to 0 | |||
#ifndef BUILD_BRIDGE | |||
kEnginePostActionRemovePlugin, | |||
kEnginePostActionSwitchPlugins | |||
kEnginePostActionRemovePlugin, // remove a plugin | |||
kEnginePostActionSwitchPlugins // switch between 2 plugins | |||
#endif | |||
}; | |||
@@ -390,21 +97,9 @@ struct EngineNextAction { | |||
uint value; | |||
CarlaMutex mutex; | |||
EngineNextAction() noexcept | |||
: opcode(kEnginePostActionNull), | |||
pluginId(0), | |||
value(0) {} | |||
~EngineNextAction() noexcept | |||
{ | |||
CARLA_SAFE_ASSERT(opcode == kEnginePostActionNull); | |||
} | |||
void ready() const noexcept | |||
{ | |||
mutex.lock(); | |||
mutex.unlock(); | |||
} | |||
EngineNextAction() noexcept; | |||
~EngineNextAction() noexcept; | |||
void ready() const noexcept; | |||
CARLA_DECLARE_NON_COPY_STRUCT(EngineNextAction) | |||
}; | |||
@@ -453,9 +148,6 @@ struct CarlaEngine::ProtectedData { | |||
EnginePluginData* plugins; | |||
#endif | |||
#ifndef BUILD_BRIDGE | |||
EngineInternalAudio audio; | |||
#endif | |||
EngineInternalEvents events; | |||
#ifndef BUILD_BRIDGE | |||
EngineInternalGraph graph; | |||
@@ -22,11 +22,12 @@ | |||
#include "CarlaEngineUtils.hpp" | |||
#include "CarlaMathUtils.hpp" | |||
#include "CarlaMIDI.h" | |||
#include "CarlaPatchbayUtils.hpp" | |||
#include "jackbridge/JackBridge.hpp" | |||
#include "jackey.h" | |||
#include "juce_core.h" | |||
#include "juce_audio_basics.h" | |||
#ifdef __SSE2_MATH__ | |||
# include <xmmintrin.h> | |||
@@ -34,6 +35,7 @@ | |||
#define URI_CANVAS_ICON "http://kxstudio.sf.net/ns/canvas/icon" | |||
using juce::FloatVectorOperations; | |||
using juce::String; | |||
using juce::StringArray; | |||
@@ -153,7 +155,7 @@ public: | |||
} | |||
else | |||
{ | |||
FLOAT_CLEAR(fBuffer, bufferSize); | |||
FloatVectorOperations::clear(fBuffer, bufferSize); | |||
} | |||
} | |||
@@ -191,7 +193,7 @@ public: | |||
{ | |||
fLatencyBufferSize = range.max; | |||
fLatencyBuffer = new float[fLatencyBufferSize]; | |||
FLOAT_CLEAR(fLatencyBuffer, fLatencyBufferSize); | |||
FloatVectorOperations::clear(fLatencyBuffer, fLatencyBufferSize); | |||
} | |||
} | |||
} | |||
@@ -281,7 +283,7 @@ public: | |||
} | |||
if (! fIsInput) | |||
FLOAT_CLEAR(fBuffer, bufferSize); | |||
FloatVectorOperations::clear(fBuffer, bufferSize); | |||
} | |||
void invalidate() noexcept | |||
@@ -1429,8 +1431,8 @@ protected: | |||
float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut2], nframes); | |||
void* const eventOut = jackbridge_port_get_buffer(fRackPorts[kRackPortEventOut], nframes); | |||
FLOAT_COPY(audioOut1, audioIn1, nframes); | |||
FLOAT_COPY(audioOut2, audioIn2, nframes); | |||
FloatVectorOperations::copy(audioOut1, audioIn1, nframes); | |||
FloatVectorOperations::copy(audioOut2, audioIn2, nframes); | |||
jackbridge_midi_clear_buffer(eventOut); | |||
} | |||
@@ -16,6 +16,7 @@ | |||
*/ | |||
#include "CarlaEngineInternal.hpp" | |||
#include "CarlaEngineGraph.hpp" | |||
#include "CarlaBackendUtils.hpp" | |||
#include "CarlaStringList.hpp" | |||
@@ -159,23 +160,13 @@ public: | |||
pData->bufferSize = static_cast<uint32_t>(fDevice->getCurrentBufferSizeSamples()); | |||
pData->sampleRate = fDevice->getCurrentSampleRate(); | |||
if (pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||
{ | |||
pData->audio.inCount = 2; | |||
pData->audio.outCount = 2; | |||
} | |||
else | |||
{ | |||
pData->audio.inCount = 0; | |||
pData->audio.outCount = 0; | |||
} | |||
pData->audio.create(pData->bufferSize); | |||
pData->graph.isRack = (pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK); | |||
pData->graph.create(pData->bufferSize); | |||
fDevice->start(this); | |||
CarlaEngine::init(clientName); | |||
pData->audio.isReady = true; | |||
pData->graph.isReady = true; | |||
patchbayRefresh(); | |||
@@ -186,7 +177,7 @@ public: | |||
{ | |||
carla_debug("CarlaEngineJuce::close()"); | |||
pData->audio.isReady = false; | |||
pData->graph.isReady = false; | |||
bool hasError = !CarlaEngine::close(); | |||
@@ -255,7 +246,7 @@ public: | |||
bool patchbayRefresh() override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->audio.isReady, false); | |||
CARLA_SAFE_ASSERT_RETURN(pData->graph.isReady, false); | |||
//fUsedMidiPorts.clear(); | |||
@@ -269,7 +260,7 @@ public: | |||
void patchbayRefreshRack() | |||
{ | |||
RackGraph* const rack(pData->graph.rack); | |||
RackGraph* const rack((RackGraph*)pData->graph.graph); | |||
rack->connections.clear(); | |||
@@ -484,7 +475,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(outputChannelData != nullptr, runPendingRtEvents()); | |||
CARLA_SAFE_ASSERT_RETURN(numSamples == static_cast<int>(pData->bufferSize), runPendingRtEvents()); | |||
if (! pData->audio.isReady) | |||
if (! pData->graph.isReady) | |||
return runPendingRtEvents(); | |||
const uint32_t nframes(static_cast<uint32_t>(numSamples)); | |||
@@ -614,7 +605,7 @@ protected: | |||
void handleIncomingMidiMessage(MidiInput* /*source*/, const MidiMessage& message) override | |||
{ | |||
if (! pData->audio.isReady) | |||
if (! pData->graph.isReady) | |||
return; | |||
const int messageSize(message.getRawDataSize()); | |||
@@ -645,7 +636,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(portName != nullptr && portName[0] != '\0', false); | |||
carla_debug("CarlaEngineJuce::connectRackMidiInPort(\"%s\")", portName); | |||
RackGraph* const rack(pData->graph.rack); | |||
RackGraph* const rack((RackGraph*)pData->graph.graph); | |||
CARLA_SAFE_ASSERT_RETURN(rack->midi.ins.count() > 0, false); | |||
StringArray midiIns(MidiInput::getDevices()); | |||
@@ -671,7 +662,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(portName != nullptr && portName[0] != '\0', false); | |||
carla_debug("CarlaEngineJuce::connectRackMidiOutPort(\"%s\")", portName); | |||
RackGraph* const rack(pData->graph.rack); | |||
RackGraph* const rack((RackGraph*)pData->graph.graph); | |||
CARLA_SAFE_ASSERT_RETURN(rack->midi.ins.count() > 0, false); | |||
StringArray midiOuts(MidiOutput::getDevices()); | |||
@@ -699,7 +690,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(portName != nullptr && portName[0] != '\0', false); | |||
carla_debug("CarlaEngineRtAudio::disconnectRackMidiInPort(\"%s\")", portName); | |||
RackGraph* const rack(pData->graph.rack); | |||
RackGraph* const rack((RackGraph*)pData->graph.graph); | |||
CARLA_SAFE_ASSERT_RETURN(rack->midi.ins.count() > 0, false); | |||
for (LinkedList<MidiInPort>::Itenerator it=fMidiIns.begin(); it.valid(); it.next()) | |||
@@ -725,7 +716,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(portName != nullptr && portName[0] != '\0', false); | |||
carla_debug("CarlaEngineRtAudio::disconnectRackMidiOutPort(\"%s\")", portName); | |||
RackGraph* const rack(pData->graph.rack); | |||
RackGraph* const rack((RackGraph*)pData->graph.graph); | |||
CARLA_SAFE_ASSERT_RETURN(rack->midi.outs.count() > 0, false); | |||
const CarlaMutexLocker cml(fMidiOutMutex); | |||
@@ -34,8 +34,9 @@ | |||
#include "CarlaExternalUI.hpp" | |||
#include "CarlaNative.hpp" | |||
#include "juce_core.h" | |||
#include "juce_audio_basics.h" | |||
using juce::FloatVectorOperations; | |||
using juce::MemoryOutputStream; | |||
using juce::ScopedPointer; | |||
using juce::String; | |||
@@ -1069,8 +1070,8 @@ protected: | |||
{ | |||
if (pData->curPluginCount == 0 && ! fIsPatchbay) | |||
{ | |||
FLOAT_COPY(outBuffer[0], inBuffer[0], frames); | |||
FLOAT_COPY(outBuffer[1], inBuffer[1], frames); | |||
FloatVectorOperations::copy(outBuffer[0], inBuffer[0], frames); | |||
FloatVectorOperations::copy(outBuffer[1], inBuffer[1], frames); | |||
return runPendingRtEvents();; | |||
} | |||
@@ -16,6 +16,7 @@ | |||
*/ | |||
#include "CarlaEngineInternal.hpp" | |||
#include "CarlaEngineGraph.hpp" | |||
#include "CarlaBackendUtils.hpp" | |||
#include "CarlaMathUtils.hpp" | |||
#include "CarlaStringList.hpp" | |||
@@ -23,15 +24,14 @@ | |||
#include "RtLinkedList.hpp" | |||
#include "jackbridge/JackBridge.hpp" | |||
#include "juce_audio_basics.h" | |||
#include "rtaudio/RtAudio.h" | |||
#include "rtmidi/RtMidi.h" | |||
CARLA_BACKEND_START_NAMESPACE | |||
using juce::FloatVectorOperations; | |||
#if 0 | |||
} // Fix editor indentation | |||
#endif | |||
CARLA_BACKEND_START_NAMESPACE | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
// Global static data | |||
@@ -262,18 +262,8 @@ public: | |||
fAudioOutCount = oParams.nChannels; | |||
fLastEventTime = 0; | |||
if (pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||
{ | |||
pData->audio.inCount = 2; | |||
pData->audio.outCount = 2; | |||
} | |||
else | |||
{ | |||
pData->audio.inCount = 0; | |||
pData->audio.outCount = 0; | |||
} | |||
pData->audio.create(pData->bufferSize); | |||
pData->graph.isRack = (pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK); | |||
pData->graph.create(pData->bufferSize); | |||
try { | |||
fAudio.startStream(); | |||
@@ -286,7 +276,7 @@ public: | |||
} | |||
CarlaEngine::init(clientName); | |||
pData->audio.isReady = true; | |||
pData->graph.isReady = true; | |||
patchbayRefresh(); | |||
@@ -298,7 +288,7 @@ public: | |||
CARLA_SAFE_ASSERT(fAudioOutCount != 0); | |||
carla_debug("CarlaEngineRtAudio::close()"); | |||
pData->audio.isReady = false; | |||
pData->graph.isReady = false; | |||
bool hasError = !CarlaEngine::close(); | |||
@@ -382,7 +372,7 @@ public: | |||
bool patchbayRefresh() override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pData->audio.isReady, false); | |||
CARLA_SAFE_ASSERT_RETURN(pData->graph.isReady, false); | |||
if (pData->graph.isRack) | |||
patchbayRefreshRack(); | |||
@@ -394,7 +384,7 @@ public: | |||
void patchbayRefreshRack() | |||
{ | |||
RackGraph* const rack(pData->graph.rack); | |||
RackGraph* const rack((RackGraph*)pData->graph.graph); | |||
rack->connections.clear(); | |||
@@ -608,7 +598,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(outputBuffer != nullptr, runPendingRtEvents()); | |||
CARLA_SAFE_ASSERT_RETURN(pData->bufferSize == nframes, runPendingRtEvents()); | |||
if (! pData->audio.isReady) | |||
if (! pData->graph.isReady) | |||
return runPendingRtEvents(); | |||
// initialize rtaudio input | |||
@@ -623,7 +613,7 @@ protected: | |||
for (uint i=0; i < fAudioOutCount; ++i) | |||
outBuf[i] = outsPtr+(nframes*i); | |||
FLOAT_CLEAR(outsPtr, nframes*fAudioOutCount); | |||
FloatVectorOperations::clear(outsPtr, nframes*fAudioOutCount); | |||
// initialize events | |||
carla_zeroStruct<EngineEvent>(pData->events.in, kMaxEngineEventInternalCount); | |||
@@ -733,7 +723,7 @@ protected: | |||
void handleMidiCallback(double timeStamp, std::vector<uchar>* const message) | |||
{ | |||
if (! pData->audio.isReady) | |||
if (! pData->graph.isReady) | |||
return; | |||
const size_t messageSize(message->size()); | |||
@@ -774,7 +764,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(portName != nullptr && portName[0] != '\0', false); | |||
carla_debug("CarlaEngineRtAudio::connectRackMidiInPort(\"%s\")", portName); | |||
RackGraph* const rack(pData->graph.rack); | |||
RackGraph* const rack((RackGraph*)pData->graph.graph); | |||
CARLA_SAFE_ASSERT_RETURN(rack->midi.ins.count() > 0, false); | |||
CarlaString newRtMidiPortName; | |||
@@ -828,7 +818,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(portName != nullptr && portName[0] != '\0', false); | |||
carla_debug("CarlaEngineRtAudio::connectRackMidiOutPort(\"%s\")", portName); | |||
RackGraph* const rack(pData->graph.rack); | |||
RackGraph* const rack((RackGraph*)pData->graph.graph); | |||
CARLA_SAFE_ASSERT_RETURN(rack->midi.ins.count() > 0, false); | |||
CarlaString newRtMidiPortName; | |||
@@ -882,7 +872,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(portName != nullptr && portName[0] != '\0', false); | |||
carla_debug("CarlaEngineRtAudio::disconnectRackMidiInPort(\"%s\")", portName); | |||
RackGraph* const rack(pData->graph.rack); | |||
RackGraph* const rack((RackGraph*)pData->graph.graph); | |||
CARLA_SAFE_ASSERT_RETURN(rack->midi.ins.count() > 0, false); | |||
for (LinkedList<MidiInPort>::Itenerator it=fMidiIns.begin(); it.valid(); it.next()) | |||
@@ -909,7 +899,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(portName != nullptr && portName[0] != '\0', false); | |||
carla_debug("CarlaEngineRtAudio::disconnectRackMidiOutPort(\"%s\")", portName); | |||
RackGraph* const rack(pData->graph.rack); | |||
RackGraph* const rack((RackGraph*)pData->graph.graph); | |||
CARLA_SAFE_ASSERT_RETURN(rack->midi.outs.count() > 0, false); | |||
const CarlaMutexLocker cml(fMidiOutMutex); | |||
@@ -12,6 +12,7 @@ OBJS = \ | |||
CarlaEngine.cpp.o \ | |||
CarlaEngineClient.cpp.o \ | |||
CarlaEngineData.cpp.o \ | |||
CarlaEngineGraph.cpp.o \ | |||
CarlaEngineInternal.cpp.o \ | |||
CarlaEngineOsc.cpp.o \ | |||
CarlaEnginePorts.cpp.o \ | |||
@@ -67,6 +68,9 @@ CarlaEngineClient.cpp.o: CarlaEngineClient.cpp $(CARLA_ENGINE_CLIENT_CPP_DEPS) | |||
CarlaEngineData.cpp.o: CarlaEngineData.cpp $(CARLA_ENGINE_DATA_CPP_DEPS) | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
CarlaEngineGraph.cpp.o: CarlaEngineGraph.cpp $(CARLA_ENGINE_GRAPH_CPP_DEPS) | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
CarlaEngineInternal.cpp.o: CarlaEngineInternal.cpp $(CARLA_ENGINE_INTERNAL_CPP_DEPS) | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
@@ -830,7 +830,7 @@ public: | |||
{ | |||
// disable any output sound | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(outBuffer[i], frames); | |||
FloatVectorOperations::clear(outBuffer[i], frames); | |||
return; | |||
} | |||
@@ -1145,7 +1145,7 @@ public: | |||
else if (! pData->singleMutex.tryLock()) | |||
{ | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(outBuffer[i], frames); | |||
FloatVectorOperations::clear(outBuffer[i], frames); | |||
return false; | |||
} | |||
@@ -1155,7 +1155,7 @@ public: | |||
//std::memset(fShmAudioPool.data, 0, fShmAudioPool.size); | |||
for (uint32_t i=0; i < fInfo.aIns; ++i) | |||
FLOAT_COPY(fShmAudioPool.data + (i * frames), inBuffer[i], frames); | |||
FloatVectorOperations::copy(fShmAudioPool.data + (i * frames), inBuffer[i], frames); | |||
// -------------------------------------------------------------------------------------------------------- | |||
// TimeInfo | |||
@@ -1199,7 +1199,7 @@ public: | |||
} | |||
for (uint32_t i=0; i < fInfo.aOuts; ++i) | |||
FLOAT_COPY(outBuffer[i], fShmAudioPool.data + ((i + fInfo.aIns) * frames), frames); | |||
FloatVectorOperations::copy(outBuffer[i], fShmAudioPool.data + ((i + fInfo.aIns) * frames), frames); | |||
// -------------------------------------------------------------------------------------------------------- | |||
// Post-processing (dry/wet, volume and balance) | |||
@@ -1232,7 +1232,7 @@ public: | |||
if (isPair) | |||
{ | |||
CARLA_ASSERT(i+1 < pData->audioOut.count); | |||
FLOAT_COPY(oldBufLeft, outBuffer[i], frames); | |||
FloatVectorOperations::copy(oldBufLeft, outBuffer[i], frames); | |||
} | |||
float balRangeL = (pData->postProc.balanceLeft + 1.0f)/2.0f; | |||
@@ -632,7 +632,7 @@ void CarlaPlugin::ProtectedData::recreateLatencyBuffers() | |||
for (uint32_t i=0; i < audioIn.count; ++i) | |||
{ | |||
latencyBuffers[i] = new float[latency]; | |||
FLOAT_CLEAR(latencyBuffers[i], latency); | |||
FloatVectorOperations::clear(latencyBuffers[i], latency); | |||
} | |||
} | |||
} | |||
@@ -25,21 +25,14 @@ | |||
#include "CarlaStateUtils.hpp" | |||
#include "CarlaMIDI.h" | |||
#include "CarlaMutex.hpp" | |||
#include "RtLinkedList.hpp" | |||
// ----------------------------------------------------------------------- | |||
#define CARLA_PROCESS_CONTINUE_CHECK if (! pData->enabled) { pData->engine->callback(ENGINE_CALLBACK_DEBUG, pData->id, 0, 0, 0.0f, "Processing while plugin is disabled!!"); return; } | |||
#include "juce_audio_basics.h" | |||
// ----------------------------------------------------------------------- | |||
using juce::FloatVectorOperations; | |||
CARLA_BACKEND_START_NAMESPACE | |||
#if 0 | |||
} // Fix editor indentation | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
// Forward declarations of CarlaEngine port classes | |||
@@ -60,6 +53,17 @@ const uint PLUGIN_EXTRA_HINT_HAS_MIDI_OUT = 0x02; | |||
const uint PLUGIN_EXTRA_HINT_CAN_RUN_RACK = 0x04; | |||
const uint PLUGIN_EXTRA_HINT_USES_MULTI_PROGS = 0x08; | |||
// ----------------------------------------------------------------------- | |||
// Special parameters | |||
enum SpecialParameterType { | |||
PARAMETER_SPECIAL_NULL = 0, | |||
PARAMETER_SPECIAL_FREEWHEEL = 1, | |||
PARAMETER_SPECIAL_LATENCY = 2, | |||
PARAMETER_SPECIAL_SAMPLE_RATE = 3, | |||
PARAMETER_SPECIAL_TIME = 4 | |||
}; | |||
// ----------------------------------------------------------------------- | |||
/*! | |||
@@ -123,7 +127,7 @@ struct PluginAudioData { | |||
struct PluginCVPort { | |||
uint32_t rindex; | |||
uint32_t param; // FIXME is this needed? | |||
//uint32_t param; // FIXME is this needed? | |||
CarlaEngineCVPort* port; | |||
}; | |||
@@ -156,14 +160,6 @@ struct PluginEventData { | |||
// ----------------------------------------------------------------------- | |||
enum SpecialParameterType { | |||
PARAMETER_SPECIAL_NULL = 0, | |||
PARAMETER_SPECIAL_FREEWHEEL = 1, | |||
PARAMETER_SPECIAL_LATENCY = 2, | |||
PARAMETER_SPECIAL_SAMPLE_RATE = 3, | |||
PARAMETER_SPECIAL_TIME = 4 | |||
}; | |||
struct PluginParameterData { | |||
uint32_t count; | |||
ParameterData* data; | |||
@@ -564,7 +564,7 @@ public: | |||
pData->param.createNew(params, true); | |||
fParamBuffers = new float[params]; | |||
FLOAT_CLEAR(fParamBuffers, params); | |||
FloatVectorOperations::clear(fParamBuffers, params); | |||
} | |||
const uint portNameSize(pData->engine->getMaxPortNameSize()); | |||
@@ -1093,7 +1093,7 @@ public: | |||
{ | |||
// disable any output sound | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(outBuffer[i], frames); | |||
FloatVectorOperations::clear(outBuffer[i], frames); | |||
return; | |||
} | |||
@@ -1137,7 +1137,7 @@ public: | |||
if (pData->latency > 0) | |||
{ | |||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | |||
FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | |||
FloatVectorOperations::clear(pData->latencyBuffers[i], pData->latency); | |||
} | |||
#endif | |||
@@ -1540,7 +1540,7 @@ public: | |||
if (pData->latency <= frames) | |||
{ | |||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | |||
FLOAT_COPY(pData->latencyBuffers[i], inBuffer[i]+(frames-pData->latency), pData->latency); | |||
FloatVectorOperations::copy(pData->latencyBuffers[i], inBuffer[i]+(frames-pData->latency), pData->latency); | |||
} | |||
else | |||
{ | |||
@@ -1618,10 +1618,10 @@ public: | |||
// Reset audio buffers | |||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | |||
FLOAT_COPY(fAudioInBuffers[i], inBuffer[i]+timeOffset, frames); | |||
FloatVectorOperations::copy(fAudioInBuffers[i], inBuffer[i]+timeOffset, frames); | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(fAudioOutBuffers[i], frames); | |||
FloatVectorOperations::clear(fAudioOutBuffers[i], frames); | |||
// -------------------------------------------------------------------------------------------------------- | |||
// Run plugin | |||
@@ -1689,7 +1689,7 @@ public: | |||
if (isPair) | |||
{ | |||
CARLA_ASSERT(i+1 < pData->audioOut.count); | |||
FLOAT_COPY(oldBufLeft, fAudioOutBuffers[i], frames); | |||
FloatVectorOperations::copy(oldBufLeft, fAudioOutBuffers[i], frames); | |||
} | |||
float balRangeL = (pData->postProc.balanceLeft + 1.0f)/2.0f; | |||
@@ -52,7 +52,7 @@ public: | |||
{ | |||
carla_debug("FluidSynthPlugin::FluidSynthPlugin(%p, %i, %s)", engine, id, bool2str(use16Outs)); | |||
FLOAT_CLEAR(fParamBuffers, FluidSynthParametersMax); | |||
FloatVectorOperations::clear(fParamBuffers, FluidSynthParametersMax); | |||
carla_fill<int32_t>(fCurMidiProgs, 0, MAX_MIDI_CHANNELS); | |||
// create settings | |||
@@ -1044,7 +1044,7 @@ public: | |||
{ | |||
// disable any output sound | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(outBuffer[i], frames); | |||
FloatVectorOperations::clear(outBuffer[i], frames); | |||
return; | |||
} | |||
@@ -1366,8 +1366,6 @@ public: | |||
} // End of Event Input and Processing | |||
CARLA_PROCESS_CONTINUE_CHECK; | |||
// -------------------------------------------------------------------------------------------------------- | |||
// Control Output | |||
@@ -1414,7 +1412,7 @@ public: | |||
if (fUses16Outs) | |||
{ | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(fAudio16Buffers[i], frames); | |||
FloatVectorOperations::clear(fAudio16Buffers[i], frames); | |||
// FIXME use '32' or '16' instead of outs | |||
fluid_synth_process(fSynth, static_cast<int>(frames), 0, nullptr, static_cast<int>(pData->audioOut.count), fAudio16Buffers); | |||
@@ -1439,7 +1437,7 @@ public: | |||
if (doBalance) | |||
{ | |||
if (i % 2 == 0) | |||
FLOAT_COPY(oldBufLeft, outBuffer[i]+timeOffset, frames); | |||
FloatVectorOperations::copy(oldBufLeft, outBuffer[i]+timeOffset, frames); | |||
float balRangeL = (pData->postProc.balanceLeft + 1.0f)/2.0f; | |||
float balRangeR = (pData->postProc.balanceRight + 1.0f)/2.0f; | |||
@@ -534,7 +534,7 @@ public: | |||
pData->param.createNew(params, true); | |||
fParamBuffers = new float[params]; | |||
FLOAT_CLEAR(fParamBuffers, params); | |||
FloatVectorOperations::clear(fParamBuffers, params); | |||
} | |||
const uint portNameSize(pData->engine->getMaxPortNameSize()); | |||
@@ -960,7 +960,7 @@ public: | |||
{ | |||
// disable any output sound | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(outBuffer[i], frames); | |||
FloatVectorOperations::clear(outBuffer[i], frames); | |||
return; | |||
} | |||
@@ -973,7 +973,7 @@ public: | |||
if (pData->latency > 0) | |||
{ | |||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | |||
FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | |||
FloatVectorOperations::clear(pData->latencyBuffers[i], pData->latency); | |||
} | |||
#endif | |||
@@ -1153,7 +1153,7 @@ public: | |||
if (pData->latency <= frames) | |||
{ | |||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | |||
FLOAT_COPY(pData->latencyBuffers[i], inBuffer[i]+(frames-pData->latency), pData->latency); | |||
FloatVectorOperations::copy(pData->latencyBuffers[i], inBuffer[i]+(frames-pData->latency), pData->latency); | |||
} | |||
else | |||
{ | |||
@@ -1231,10 +1231,10 @@ public: | |||
// Reset audio buffers | |||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | |||
FLOAT_COPY(fAudioInBuffers[i], inBuffer[i]+timeOffset, frames); | |||
FloatVectorOperations::copy(fAudioInBuffers[i], inBuffer[i]+timeOffset, frames); | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(fAudioOutBuffers[i], frames); | |||
FloatVectorOperations::clear(fAudioOutBuffers[i], frames); | |||
// -------------------------------------------------------------------------------------------------------- | |||
// Run plugin | |||
@@ -1288,7 +1288,7 @@ public: | |||
if (isPair) | |||
{ | |||
CARLA_ASSERT(i+1 < pData->audioOut.count); | |||
FLOAT_COPY(oldBufLeft, fAudioOutBuffers[i], frames); | |||
FloatVectorOperations::copy(oldBufLeft, fAudioOutBuffers[i], frames); | |||
} | |||
float balRangeL = (pData->postProc.balanceLeft + 1.0f)/2.0f; | |||
@@ -730,7 +730,7 @@ public: | |||
{ | |||
// disable any output sound | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(outBuffer[i], frames); | |||
FloatVectorOperations::clear(outBuffer[i], frames); | |||
return; | |||
} | |||
@@ -1081,7 +1081,7 @@ public: | |||
if (doBalance) | |||
{ | |||
if (i % 2 == 0) | |||
FLOAT_COPY(oldBufLeft, outBuffer[i], frames); | |||
FloatVectorOperations::copy(oldBufLeft, outBuffer[i], frames); | |||
float balRangeL = (pData->postProc.balanceLeft + 1.0f)/2.0f; | |||
float balRangeR = (pData->postProc.balanceRight + 1.0f)/2.0f; | |||
@@ -1516,7 +1516,7 @@ public: | |||
{ | |||
pData->param.createNew(params, true); | |||
fParamBuffers = new float[params]; | |||
FLOAT_CLEAR(fParamBuffers, params); | |||
FloatVectorOperations::clear(fParamBuffers, params); | |||
} | |||
if (const uint32_t count = static_cast<uint32_t>(evIns.count())) | |||
@@ -2438,7 +2438,7 @@ public: | |||
{ | |||
// disable any output sound | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(outBuffer[i], frames); | |||
FloatVectorOperations::clear(outBuffer[i], frames); | |||
return; | |||
} | |||
@@ -2487,8 +2487,6 @@ public: | |||
} | |||
} | |||
CARLA_PROCESS_CONTINUE_CHECK; | |||
// -------------------------------------------------------------------------------------------------------- | |||
// Check if needs reset | |||
@@ -2552,7 +2550,7 @@ public: | |||
if (pData->latency > 0) | |||
{ | |||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | |||
FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | |||
FloatVectorOperations::clear(pData->latencyBuffers[i], pData->latency); | |||
} | |||
#endif | |||
@@ -2705,8 +2703,6 @@ public: | |||
pData->postRtEvents.trySplice(); | |||
carla_copyStruct<EngineTimeInfo>(fLastTimeInfo, timeInfo); | |||
CARLA_PROCESS_CONTINUE_CHECK; | |||
} | |||
// -------------------------------------------------------------------------------------------------------- | |||
@@ -3135,7 +3131,7 @@ public: | |||
if (pData->latency <= frames) | |||
{ | |||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | |||
FLOAT_COPY(pData->latencyBuffers[i], inBuffer[i]+(frames-pData->latency), pData->latency); | |||
FloatVectorOperations::copy(pData->latencyBuffers[i], inBuffer[i]+(frames-pData->latency), pData->latency); | |||
} | |||
else | |||
{ | |||
@@ -3327,19 +3323,19 @@ public: | |||
// Set audio buffers | |||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | |||
FLOAT_COPY(fAudioInBuffers[i], audioInBuf[i]+timeOffset, frames); | |||
FloatVectorOperations::copy(fAudioInBuffers[i], audioInBuf[i]+timeOffset, frames); | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(fAudioOutBuffers[i], frames); | |||
FloatVectorOperations::clear(fAudioOutBuffers[i], frames); | |||
// -------------------------------------------------------------------------------------------------------- | |||
// Set CV buffers | |||
for (uint32_t i=0; i < fCvIn.count; ++i) | |||
FLOAT_COPY(fCvInBuffers[i], cvInBuf[i]+timeOffset, frames); | |||
FloatVectorOperations::copy(fCvInBuffers[i], cvInBuf[i]+timeOffset, frames); | |||
for (uint32_t i=0; i < fCvOut.count; ++i) | |||
FLOAT_CLEAR(fCvOutBuffers[i], frames); | |||
FloatVectorOperations::clear(fCvOutBuffers[i], frames); | |||
// -------------------------------------------------------------------------------------------------------- | |||
// Run plugin | |||
@@ -3407,7 +3403,7 @@ public: | |||
if (isPair) | |||
{ | |||
CARLA_ASSERT(i+1 < pData->audioOut.count); | |||
FLOAT_COPY(oldBufLeft, fAudioOutBuffers[i], frames); | |||
FloatVectorOperations::copy(oldBufLeft, fAudioOutBuffers[i], frames); | |||
} | |||
float balRangeL = (pData->postProc.balanceLeft + 1.0f)/2.0f; | |||
@@ -1282,7 +1282,7 @@ public: | |||
{ | |||
// disable any output sound | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(outBuffer[i], frames); | |||
FloatVectorOperations::clear(outBuffer[i], frames); | |||
return; | |||
} | |||
@@ -1328,8 +1328,6 @@ public: | |||
pData->needsReset = false; | |||
} | |||
CARLA_PROCESS_CONTINUE_CHECK; | |||
// -------------------------------------------------------------------------------------------------------- | |||
// Set TimeInfo | |||
@@ -1357,8 +1355,6 @@ public: | |||
else | |||
fTimeInfo.bbt.valid = false; | |||
CARLA_PROCESS_CONTINUE_CHECK; | |||
// -------------------------------------------------------------------------------------------------------- | |||
// Event Input and Processing | |||
@@ -1685,8 +1681,6 @@ public: | |||
} // End of Plugin processing (no events) | |||
CARLA_PROCESS_CONTINUE_CHECK; | |||
// -------------------------------------------------------------------------------------------------------- | |||
// Control and MIDI Output | |||
@@ -1771,10 +1765,10 @@ public: | |||
// Reset audio buffers | |||
for (i=0; i < pData->audioIn.count; ++i) | |||
FLOAT_COPY(fAudioInBuffers[i], inBuffer[i]+timeOffset, frames); | |||
FloatVectorOperations::copy(fAudioInBuffers[i], inBuffer[i]+timeOffset, frames); | |||
for (i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(fAudioOutBuffers[i], frames); | |||
FloatVectorOperations::clear(fAudioOutBuffers[i], frames); | |||
// -------------------------------------------------------------------------------------------------------- | |||
// Run plugin | |||
@@ -1832,7 +1826,7 @@ public: | |||
if (isPair) | |||
{ | |||
CARLA_ASSERT(i+1 < pData->audioOut.count); | |||
FLOAT_COPY(oldBufLeft, fAudioOutBuffers[i], frames); | |||
FloatVectorOperations::copy(oldBufLeft, fAudioOutBuffers[i], frames); | |||
} | |||
float balRangeL = (pData->postProc.balanceLeft + 1.0f)/2.0f; | |||
@@ -1055,7 +1055,7 @@ public: | |||
{ | |||
// disable any output sound | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(outBuffer[i], frames); | |||
FloatVectorOperations::clear(outBuffer[i], frames); | |||
return; | |||
} | |||
@@ -1101,7 +1101,7 @@ public: | |||
if (pData->latency > 0) | |||
{ | |||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | |||
FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | |||
FloatVectorOperations::clear(pData->latencyBuffers[i], pData->latency); | |||
} | |||
#endif | |||
@@ -1474,8 +1474,6 @@ public: | |||
} // End of Plugin processing (no events) | |||
CARLA_PROCESS_CONTINUE_CHECK; | |||
// -------------------------------------------------------------------------------------------------------- | |||
// MIDI Output | |||
@@ -1568,7 +1566,7 @@ public: | |||
else | |||
{ | |||
for (uint32_t i=0; i < pData->audioOut.count; ++i) | |||
FLOAT_CLEAR(vstOutBuffer[i], frames); | |||
FloatVectorOperations::clear(vstOutBuffer[i], frames); | |||
#if ! VST_FORCE_DEPRECATED | |||
fEffect->process(fEffect, (pData->audioIn.count > 0) ? vstInBuffer : nullptr, (pData->audioOut.count > 0) ? vstOutBuffer : nullptr, static_cast<int32_t>(frames)); | |||
@@ -1611,7 +1609,7 @@ public: | |||
if (isPair) | |||
{ | |||
CARLA_ASSERT(i+1 < pData->audioOut.count); | |||
FLOAT_COPY(oldBufLeft, outBuffer[i]+timeOffset, frames); | |||
FloatVectorOperations::copy(oldBufLeft, outBuffer[i]+timeOffset, frames); | |||
} | |||
float balRangeL = (pData->postProc.balanceLeft + 1.0f)/2.0f; | |||
@@ -20,12 +20,9 @@ | |||
#include "CarlaMathUtils.hpp" | |||
#include "CarlaMIDI.h" | |||
// FIXME | |||
#ifdef HAVE_JUCE | |||
# if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN) | |||
# define WANT_JUCE_PROCESSORS | |||
# include "juce_audio_processors.h" | |||
# endif | |||
#if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN) | |||
# define WANT_JUCE_PROCESSORS | |||
# include "juce_audio_processors.h" | |||
#endif | |||
#ifdef WANT_LADSPA | |||
@@ -49,6 +46,10 @@ | |||
#include <iostream> | |||
#include "juce_audio_basics.h" | |||
using juce::FloatVectorOperations; | |||
// FIXME | |||
#include <QtCore/QDir> | |||
#include <QtCore/QFileInfo> | |||
#include <QtCore/QUrl> | |||
@@ -553,7 +554,7 @@ static void do_ladspa_check(void*& libHandle, const char* const filename, const | |||
if (LADSPA_IS_PORT_AUDIO(portDescriptor)) | |||
{ | |||
carla_zeroFloat(bufferAudio[iA], kBufferSize); | |||
FloatVectorOperations::clear(bufferAudio[iA], kBufferSize); | |||
descriptor->connect_port(handle, j, bufferAudio[iA++]); | |||
} | |||
else if (LADSPA_IS_PORT_CONTROL(portDescriptor)) | |||
@@ -829,7 +830,7 @@ static void do_dssi_check(void*& libHandle, const char* const filename, const bo | |||
if (LADSPA_IS_PORT_AUDIO(portDescriptor)) | |||
{ | |||
carla_zeroFloat(bufferAudio[iA], kBufferSize); | |||
FloatVectorOperations::clear(bufferAudio[iA], kBufferSize); | |||
ldescriptor->connect_port(handle, j, bufferAudio[iA++]); | |||
} | |||
else if (LADSPA_IS_PORT_CONTROL(portDescriptor)) | |||
@@ -1295,14 +1296,14 @@ static void do_vst_check(void*& libHandle, const bool init) | |||
for (int j=0; j < audioIns; ++j) | |||
{ | |||
bufferAudioIn[j] = new float[kBufferSize]; | |||
carla_zeroFloat(bufferAudioIn[j], kBufferSize); | |||
FloatVectorOperations::clear(bufferAudioIn[j], kBufferSize); | |||
} | |||
float* bufferAudioOut[audioOuts]; | |||
for (int j=0; j < audioOuts; ++j) | |||
{ | |||
bufferAudioOut[j] = new float[kBufferSize]; | |||
carla_zeroFloat(bufferAudioOut[j], kBufferSize); | |||
FloatVectorOperations::clear(bufferAudioOut[j], kBufferSize); | |||
} | |||
struct VstEventsFixed { | |||
@@ -20,7 +20,8 @@ | |||
#include "CarlaThread.hpp" | |||
#include "CarlaMathUtils.hpp" | |||
#include "juce_audio_basics.h" | |||
using juce::FloatVectorOperations; | |||
extern "C" { | |||
#include "audio_decoder/ad.h" | |||
@@ -91,8 +92,8 @@ struct AudioFilePool { | |||
startFrame = 0; | |||
FLOAT_CLEAR(buffer[0], size); | |||
FLOAT_CLEAR(buffer[1], size); | |||
FloatVectorOperations::clear(buffer[0], size); | |||
FloatVectorOperations::clear(buffer[1], size); | |||
} | |||
}; | |||
@@ -218,8 +219,8 @@ public: | |||
{ | |||
pool.startFrame = fPool.startFrame; | |||
FLOAT_COPY(pool.buffer[0], fPool.buffer[0], fPool.size); | |||
FLOAT_COPY(pool.buffer[1], fPool.buffer[1], fPool.size); | |||
FloatVectorOperations::copy(pool.buffer[0], fPool.buffer[0], fPool.size); | |||
FloatVectorOperations::copy(pool.buffer[1], fPool.buffer[1], fPool.size); | |||
} | |||
fMutex.unlock(); | |||
@@ -269,7 +270,7 @@ public: | |||
const size_t tmpSize = fPool.size * fFileNfo.channels; | |||
float tmpData[tmpSize]; | |||
FLOAT_CLEAR(tmpData, int(tmpSize)); | |||
FloatVectorOperations::clear(tmpData, int(tmpSize)); | |||
{ | |||
carla_stderr("R: poll data - reading at %li:%02li", readFrame/44100/60, (readFrame/44100) % 60); | |||
@@ -128,8 +128,8 @@ protected: | |||
//carla_stderr("P: no process"); | |||
fLastFrame = timePos->frame; | |||
FLOAT_CLEAR(out1, frames); | |||
FLOAT_CLEAR(out2, frames); | |||
FloatVectorOperations::clear(out1, frames); | |||
FloatVectorOperations::clear(out2, frames); | |||
return; | |||
} | |||
@@ -142,8 +142,8 @@ protected: | |||
if (timePos->frame == 0 && fLastFrame > 0) | |||
fThread.setNeedsRead(); | |||
FLOAT_CLEAR(out1, frames); | |||
FLOAT_CLEAR(out2, frames); | |||
FloatVectorOperations::clear(out1, frames); | |||
FloatVectorOperations::clear(out2, frames); | |||
return; | |||
} | |||
@@ -158,8 +158,8 @@ protected: | |||
if (timePos->frame + frames < fPool.startFrame) | |||
fThread.setNeedsRead(); | |||
FLOAT_CLEAR(out1, frames); | |||
FLOAT_CLEAR(out2, frames); | |||
FloatVectorOperations::clear(out1, frames); | |||
FloatVectorOperations::clear(out2, frames); | |||
return; | |||
} | |||
@@ -80,8 +80,8 @@ protected: | |||
} | |||
else | |||
{ | |||
FLOAT_CLEAR(outBuf[0], frames); | |||
FLOAT_CLEAR(outBuf[1], frames); | |||
FloatVectorOperations::clear(outBuf[0], frames); | |||
FloatVectorOperations::clear(outBuf[1], frames); | |||
} | |||
} | |||
@@ -25,7 +25,8 @@ | |||
#include "zynaddsubfx/Effects/Phaser.h" | |||
#include "zynaddsubfx/Effects/Reverb.h" | |||
#include "CarlaMathUtils.hpp" | |||
#include "juce_audio_basics.h" | |||
using juce::FloatVectorOperations; | |||
// ----------------------------------------------------------------------- | |||
@@ -45,8 +46,8 @@ protected: | |||
efxoutl = new float[bufferSize]; | |||
efxoutr = new float[bufferSize]; | |||
FLOAT_CLEAR(efxoutl, bufferSize); | |||
FLOAT_CLEAR(efxoutr, bufferSize); | |||
FloatVectorOperations::clear(efxoutl, bufferSize); | |||
FloatVectorOperations::clear(efxoutr, bufferSize); | |||
} | |||
~FxAbstractPlugin() override | |||
@@ -134,8 +135,8 @@ protected: | |||
{ | |||
fEffect->out(Stereo<float*>(inBuffer[0], inBuffer[1])); | |||
FLOAT_COPY(outBuffer[0], efxoutl, frames); | |||
FLOAT_COPY(outBuffer[1], efxoutr, frames); | |||
FloatVectorOperations::copy(outBuffer[0], efxoutl, frames); | |||
FloatVectorOperations::copy(outBuffer[1], efxoutr, frames); | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -147,8 +148,8 @@ protected: | |||
delete[] efxoutr; | |||
efxoutl = new float[bufferSize]; | |||
efxoutr = new float[bufferSize]; | |||
FLOAT_CLEAR(efxoutl, bufferSize); | |||
FLOAT_CLEAR(efxoutr, bufferSize); | |||
FloatVectorOperations::clear(efxoutl, bufferSize); | |||
FloatVectorOperations::clear(efxoutr, bufferSize); | |||
doReinit(bufferSize, getSampleRate()); | |||
} | |||
@@ -49,6 +49,9 @@ | |||
#include <set> | |||
#include <string> | |||
#include "juce_audio_basics.h" | |||
using juce::FloatVectorOperations; | |||
#ifdef WANT_ZYNADDSUBFX_UI | |||
static Fl_Tiled_Image* gModuleBackdrop = nullptr; | |||
static CarlaString gPixmapPath; | |||
@@ -640,8 +643,8 @@ protected: | |||
{ | |||
if (pthread_mutex_trylock(&fMaster->mutex) != 0) | |||
{ | |||
FLOAT_CLEAR(outBuffer[0], frames); | |||
FLOAT_CLEAR(outBuffer[1], frames); | |||
FloatVectorOperations::clear(outBuffer[0], frames); | |||
FloatVectorOperations::clear(outBuffer[1], frames); | |||
return; | |||
} | |||
@@ -453,7 +453,7 @@ public: | |||
{ | |||
FloatVectorOperations::multiply(fPorts.audioIns[i], fVolume*(1.0f-fDryWet), frames); | |||
FloatVectorOperations::multiply(fPorts.audioOuts[i], fVolume*fDryWet, frames); | |||
FLOAT_ADD(fPorts.audioOuts[i], fPorts.audioIns[i], frames); | |||
FloatVectorOperations::add(fPorts.audioOuts[i], fPorts.audioIns[i], frames); | |||
} | |||
} | |||
else if (fVolume != 1.0f) | |||
@@ -22,25 +22,6 @@ | |||
#include <cmath> | |||
// TODO - always use juce | |||
// #ifdef HAVE_JUCE | |||
// # include "juce_audio_basics.h" | |||
// using juce::FloatVectorOperations; | |||
// #endif | |||
// ----------------------------------------------------------------------- | |||
// Float operations | |||
// #ifdef HAVE_JUCE | |||
// # define FLOAT_ADD(bufDst, bufSrc, frames) FloatVectorOperations::add(bufDst, bufSrc, static_cast<int>(frames)) | |||
// # define FLOAT_COPY(bufDst, bufSrc, frames) FloatVectorOperations::copy(bufDst, bufSrc, static_cast<int>(frames)) | |||
// # define FLOAT_CLEAR(buf, frames) FloatVectorOperations::clear(buf, static_cast<int>(frames)) | |||
// #else | |||
# define FLOAT_ADD(bufDst, bufSrc, frames) carla_addFloat(bufDst, bufSrc, frames) | |||
# define FLOAT_COPY(bufDst, bufSrc, frames) carla_copyFloat(bufDst, bufSrc, frames) | |||
# define FLOAT_CLEAR(buf, frames) carla_zeroFloat(buf, frames) | |||
// #endif | |||
// ----------------------------------------------------------------------- | |||
// math functions (base) | |||
@@ -115,6 +96,7 @@ uint32_t carla_nextPowerOf2(uint32_t size) noexcept | |||
return ++size; | |||
} | |||
#if 0 | |||
// ----------------------------------------------------------------------- | |||
// math functions (extended) | |||
@@ -156,6 +138,7 @@ void carla_zeroFloat(float* const data, const std::size_t numSamples) noexcept | |||
std::memset(data, 0, numSamples*sizeof(float)); | |||
} | |||
#endif | |||
#if defined(CARLA_OS_MAC) && ! defined(DISTRHO_OS_MAC) | |||
/* | |||