| @@ -31,6 +31,9 @@ | |||
| # include <xmmintrin.h> | |||
| #endif | |||
| #include "AppConfig.h" | |||
| #include "juce_core/juce_core.h" | |||
| // must be last | |||
| #include "jackbridge/JackBridge.hpp" | |||
| @@ -22,6 +22,9 @@ | |||
| #include "CarlaMathUtils.hpp" | |||
| #include "CarlaMIDI.h" | |||
| #include "AppConfig.h" | |||
| #include "juce_audio_basics/juce_audio_basics.h" | |||
| using juce::AudioBuffer; | |||
| using juce::FloatVectorOperations; | |||
| using juce::MemoryBlock; | |||
| @@ -26,7 +26,6 @@ | |||
| #include "CarlaStringList.hpp" | |||
| #include "jackey.h" | |||
| #include "juce_audio_basics/juce_audio_basics.h" | |||
| #ifdef __SSE2_MATH__ | |||
| # include <xmmintrin.h> | |||
| @@ -37,10 +36,6 @@ | |||
| #define URI_CANVAS_ICON "http://kxstudio.sf.net/ns/canvas/icon" | |||
| using juce::FloatVectorOperations; | |||
| using juce::String; | |||
| using juce::StringArray; | |||
| CARLA_BACKEND_START_NAMESPACE | |||
| class CarlaEngineJack; | |||
| @@ -137,7 +132,7 @@ public: | |||
| } | |||
| if (! kIsInput) | |||
| FloatVectorOperations::clear(fBuffer, static_cast<int>(bufferSize)); | |||
| carla_zeroFloats(fBuffer, static_cast<int>(bufferSize)); | |||
| } | |||
| void invalidate() noexcept | |||
| @@ -229,7 +224,7 @@ public: | |||
| } | |||
| if (! kIsInput) | |||
| FloatVectorOperations::clear(fBuffer, static_cast<int>(bufferSize)); | |||
| carla_zeroFloats(fBuffer, static_cast<int>(bufferSize)); | |||
| } | |||
| void invalidate() noexcept | |||
| @@ -1560,10 +1555,10 @@ protected: | |||
| if (pData->aboutToClose) | |||
| { | |||
| if (float* const audioOut1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut1], nframes)) | |||
| FloatVectorOperations::clear(audioOut1, static_cast<int>(nframes)); | |||
| carla_zeroFloats(audioOut1, nframes); | |||
| if (float* const audioOut2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioOut2], nframes)) | |||
| FloatVectorOperations::clear(audioOut2, static_cast<int>(nframes)); | |||
| carla_zeroFloats(audioOut2, nframes); | |||
| } | |||
| else if (pData->curPluginCount == 0) | |||
| { | |||
| @@ -1579,8 +1574,8 @@ protected: | |||
| CARLA_SAFE_ASSERT_RETURN(audioOut2 != nullptr,); | |||
| // pass-through | |||
| FloatVectorOperations::copy(audioOut1, audioIn1, static_cast<int>(nframes)); | |||
| FloatVectorOperations::copy(audioOut2, audioIn2, static_cast<int>(nframes)); | |||
| carla_copyFloats(audioOut1, audioIn1, nframes); | |||
| carla_copyFloats(audioOut2, audioIn2, nframes); | |||
| // TODO pass-through MIDI as well | |||
| if (void* const eventOut = jackbridge_port_get_buffer(fRackPorts[kRackPortEventOut], nframes)) | |||
| @@ -2024,11 +2019,11 @@ private: | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(ourName != nullptr && ourName[0] != '\0',); | |||
| StringArray parsedGroups; | |||
| CarlaStringList parsedGroups; | |||
| // add our client first | |||
| { | |||
| parsedGroups.add(String(ourName)); | |||
| parsedGroups.append(ourName); | |||
| GroupNameToId groupNameToId; | |||
| groupNameToId.setData(++fUsedGroups.lastId, ourName); | |||
| @@ -2061,9 +2056,7 @@ private: | |||
| CARLA_SAFE_ASSERT_CONTINUE(found); | |||
| String jGroupName(groupName.buffer()); | |||
| if (parsedGroups.contains(jGroupName)) | |||
| if (parsedGroups.contains(groupName)) | |||
| { | |||
| groupId = fUsedGroups.getGroupId(groupName); | |||
| CARLA_SAFE_ASSERT_CONTINUE(groupId > 0); | |||
| @@ -2071,7 +2064,7 @@ private: | |||
| else | |||
| { | |||
| groupId = ++fUsedGroups.lastId; | |||
| parsedGroups.add(jGroupName); | |||
| parsedGroups.append(groupName); | |||
| int pluginId = -1; | |||
| PatchbayIcon icon = (jackPortFlags & JackPortIsPhysical) ? PATCHBAY_ICON_HARDWARE : PATCHBAY_ICON_APPLICATION; | |||
| @@ -34,6 +34,7 @@ | |||
| #include "CarlaHost.h" | |||
| #include "CarlaNative.hpp" | |||
| #include "AppConfig.h" | |||
| #include "juce_audio_basics/juce_audio_basics.h" | |||
| using juce::File; | |||
| @@ -22,6 +22,7 @@ | |||
| #include "CarlaUtils.hpp" | |||
| #if defined(CARLA_OS_WIN) | |||
| # include "AppConfig.h" | |||
| # include "juce_core/juce_core.h" | |||
| #elif defined(HAVE_LIBMAGIC) | |||
| # include <magic.h> | |||
| @@ -129,10 +130,14 @@ BinaryType getBinaryTypeFromFile(const char* const filename) | |||
| if (std::strstr(output, "MS Windows") != nullptr) | |||
| if (std::strstr(output, "PE32 executable") != nullptr || std::strstr(output, "PE32+ executable") != nullptr) | |||
| return (std::strstr(output, "x86-64") != nullptr) ? BINARY_WIN64 : BINARY_WIN32; | |||
| return (std::strstr(output, "x86-64") != nullptr) | |||
| ? BINARY_WIN64 | |||
| : BINARY_WIN32; | |||
| if (std::strstr(output, "ELF") != nullptr) | |||
| return (std::strstr(output, "x86-64") != nullptr || std::strstr(output, "aarch64") != nullptr) ? BINARY_POSIX64 : BINARY_POSIX32; | |||
| return (std::strstr(output, "x86-64") != nullptr || std::strstr(output, "aarch64") != nullptr) | |||
| ? BINARY_POSIX64 | |||
| : BINARY_POSIX32; | |||
| #endif | |||
| return BINARY_NATIVE; | |||
| @@ -21,11 +21,6 @@ | |||
| #include "CarlaEngine.hpp" | |||
| #include "CarlaUtils.hpp" | |||
| #include "CarlaMIDI.h" | |||
| #include "AppConfig.h" | |||
| #include "juce_audio_basics/juce_audio_basics.h" | |||
| CARLA_BACKEND_START_NAMESPACE | |||
| // ----------------------------------------------------------------------- | |||
| @@ -115,94 +110,6 @@ const char* EngineControlEventType2Str(const EngineControlEventType type) noexce | |||
| return nullptr; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| static inline | |||
| void fillEngineEventsFromJuceMidiBuffer(EngineEvent engineEvents[kMaxEngineEventInternalCount], const juce::MidiBuffer& midiBuffer) | |||
| { | |||
| const uint8_t* midiData; | |||
| int numBytes, sampleNumber; | |||
| ushort engineEventIndex = 0; | |||
| for (ushort i=0; i < kMaxEngineEventInternalCount; ++i) | |||
| { | |||
| const EngineEvent& engineEvent(engineEvents[i]); | |||
| if (engineEvent.type != kEngineEventTypeNull) | |||
| continue; | |||
| engineEventIndex = i; | |||
| break; | |||
| } | |||
| for (juce::MidiBuffer::Iterator midiBufferIterator(midiBuffer); midiBufferIterator.getNextEvent(midiData, numBytes, sampleNumber) && engineEventIndex < kMaxEngineEventInternalCount;) | |||
| { | |||
| CARLA_SAFE_ASSERT_CONTINUE(numBytes > 0); | |||
| CARLA_SAFE_ASSERT_CONTINUE(sampleNumber >= 0); | |||
| CARLA_SAFE_ASSERT_CONTINUE(numBytes < 0xFF /* uint8_t max */); | |||
| EngineEvent& engineEvent(engineEvents[engineEventIndex++]); | |||
| engineEvent.time = static_cast<uint32_t>(sampleNumber); | |||
| engineEvent.fillFromMidiData(static_cast<uint8_t>(numBytes), midiData, 0); | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| static inline | |||
| void fillJuceMidiBufferFromEngineEvents(juce::MidiBuffer& midiBuffer, const EngineEvent engineEvents[kMaxEngineEventInternalCount]) | |||
| { | |||
| uint8_t size = 0; | |||
| uint8_t mdata[3] = { 0, 0, 0 }; | |||
| const uint8_t* mdataPtr = mdata; | |||
| uint8_t mdataTmp[EngineMidiEvent::kDataSize]; | |||
| for (ushort i=0; i < kMaxEngineEventInternalCount; ++i) | |||
| { | |||
| const EngineEvent& engineEvent(engineEvents[i]); | |||
| if (engineEvent.type == kEngineEventTypeNull) | |||
| { | |||
| break; | |||
| } | |||
| else if (engineEvent.type == kEngineEventTypeControl) | |||
| { | |||
| const EngineControlEvent& ctrlEvent(engineEvent.ctrl); | |||
| ctrlEvent.convertToMidiData(engineEvent.channel, size, mdata); | |||
| mdataPtr = mdata; | |||
| } | |||
| else if (engineEvent.type == kEngineEventTypeMidi) | |||
| { | |||
| const EngineMidiEvent& midiEvent(engineEvent.midi); | |||
| size = midiEvent.size; | |||
| if (size > EngineMidiEvent::kDataSize && midiEvent.dataExt != nullptr) | |||
| { | |||
| mdataPtr = midiEvent.dataExt; | |||
| } | |||
| else | |||
| { | |||
| // copy | |||
| carla_copy<uint8_t>(mdataTmp, midiEvent.data, size); | |||
| // add channel | |||
| mdataTmp[0] = static_cast<uint8_t>(mdataTmp[0] | (engineEvent.channel & MIDI_CHANNEL_BIT)); | |||
| // done | |||
| mdataPtr = mdataTmp; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| continue; | |||
| } | |||
| if (size > 0) | |||
| midiBuffer.addEvent(mdataPtr, static_cast<int>(size), static_cast<int>(engineEvent.time)); | |||
| } | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // Helper classes | |||
| @@ -202,12 +202,6 @@ private: | |||
| CARLA_PREVENT_HEAP_ALLOCATION | |||
| }; | |||
| #ifdef CARLA_OS_WIN | |||
| namespace juce { | |||
| extern bool juce_isRunningInWine(); | |||
| } | |||
| #endif | |||
| //===================================================================================================================== | |||
| #endif // CARLA_JUCE_UTILS_HPP_INCLUDED | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * Carla patchbay utils | |||
| * Copyright (C) 2011-2014 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2011-2017 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * Carla String List | |||
| * Copyright (C) 2014 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2014-2017 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -261,6 +261,27 @@ public: | |||
| // ------------------------------------------------------------------- | |||
| bool contains(const char* const string) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(string != nullptr, false); | |||
| if (fCount == 0) | |||
| return false; | |||
| for (Itenerator it = begin2(); it.valid(); it.next()) | |||
| { | |||
| const char* const stringComp(it.getValue(nullptr)); | |||
| CARLA_SAFE_ASSERT_CONTINUE(stringComp != nullptr); | |||
| if (std::strcmp(string, stringComp) == 0) | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| void remove(Itenerator& it) noexcept | |||
| { | |||
| if (const char* const string = it.getValue(nullptr)) | |||