diff --git a/.drone.yml b/.drone.yml index 916c919..6e1f717 100644 --- a/.drone.yml +++ b/.drone.yml @@ -6,6 +6,7 @@ name: Release paulxstretch trigger: event: - tag +name: Build paulxstretch trigger: branch: @@ -32,6 +33,20 @@ steps: -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr -Wno-dev - git submodule update --init --recursive --progress + - git submodule update --init --recursive + - name: Build and push the docker image + image: plugins/docker + when: + branch: + - dev + settings: + registry: git.badhouseplants.net + username: allanger + password: + from_secret: GITEA_TOKEN + repo: git.badhouseplants.net/${DRONE_REPO} + dockerfile: Containerfile + tags: latest - name: Build the Linux version image: ubuntu diff --git a/.gitmodules b/.gitmodules index ba28778..903b3ca 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,7 @@ [submodule "deps/juce"] path = deps/juce - url = https://github.com/juce-framework/JUCE.git + url = https://github.com/juce-framework/JUCE.git + branch = 7.0.6 [submodule "deps/clap-juce-extensions"] path = deps/clap-juce-extensions url = https://github.com/free-audio/clap-juce-extensions.git diff --git a/CHANGES.md b/CHANGES.md index e6e468b..00e9ad4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,11 @@ ## PaulXStretch Change History + +**v1.7.1** (2023-09-18) + - Updated JUCE to 7.0.6, so the linux VST versions can be open in DAW + - Temporarily dropped support for CLAP + - Switched to git submodules to track deps + **v1.7.0** - Update JUCE to 7.0.2 - Started using submodules for deps diff --git a/Dockerfile b/Containerfile similarity index 100% rename from Dockerfile rename to Containerfile diff --git a/Source/CustomStandaloneFilterApp.cpp b/Source/CustomStandaloneFilterApp.cpp index a6da225..14278a3 100644 --- a/Source/CustomStandaloneFilterApp.cpp +++ b/Source/CustomStandaloneFilterApp.cpp @@ -3,11 +3,11 @@ #include "../JuceLibraryCode/JuceHeader.h" #include "juce_core/system/juce_TargetPlatform.h" -#include "juce_audio_plugin_client/utility/juce_CheckSettingMacros.h" +#include "juce_audio_plugin_client/detail/juce_CheckSettingMacros.h" -#include "juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h" -#include "juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h" -#include "juce_audio_plugin_client/utility/juce_WindowsHooks.h" +#include "juce_audio_plugin_client/detail/juce_IncludeSystemHeaders.h" +#include "juce_audio_plugin_client/detail/juce_IncludeModuleHeaders.h" +#include "juce_gui_basics/native/juce_WindowsHooks_windows.h" #include #include @@ -50,7 +50,7 @@ public: appProperties.setStorageParameters (options); LookAndFeel::setDefaultLookAndFeel(&sonoLNF); - + } const String getApplicationName() override { return JucePlugin_Name; } @@ -71,7 +71,7 @@ public: CustomLookAndFeel sonoLNF; - + virtual StandaloneFilterWindow* createWindow() { #ifdef JucePlugin_PreferredChannelConfigurations @@ -80,7 +80,7 @@ public: AudioDeviceManager::AudioDeviceSetup setupOptions; setupOptions.bufferSize = 512; - + return new StandaloneFilterWindow (getApplicationName(), LookAndFeel::getDefaultLookAndFeel().findColour (ResizableWindow::backgroundColourId), appProperties.getUserSettings(), @@ -106,7 +106,7 @@ public: #endif mainWindow->setVisible (true); - + Desktop::getInstance().setScreenSaverEnabled(false); } @@ -117,7 +117,7 @@ public: mainWindow->pluginHolder->savePluginState(); mainWindow->pluginHolder->saveAudioDeviceState(); } - + mainWindow = nullptr; appProperties.saveIfNeeded(); } @@ -142,9 +142,9 @@ public: appProperties.saveIfNeeded(); - Desktop::getInstance().setScreenSaverEnabled(true); + Desktop::getInstance().setScreenSaverEnabled(true); } - + void resumed() override { Desktop::getInstance().setScreenSaverEnabled(false); @@ -159,7 +159,7 @@ public: mainWindow->getDeviceManager().restartLastAudioDevice(); } } - + //============================================================================== void systemRequestedQuit() override { @@ -189,7 +189,7 @@ public: { DBG("Memory warning"); } - + protected: ApplicationProperties appProperties; std::unique_ptr mainWindow; diff --git a/Source/CustomStandaloneFilterWindow.h b/Source/CustomStandaloneFilterWindow.h index 42f9138..0bbe0e9 100644 --- a/Source/CustomStandaloneFilterWindow.h +++ b/Source/CustomStandaloneFilterWindow.h @@ -102,7 +102,7 @@ public: virtual void createPlugin() { #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client - processor.reset (::createPluginFilterOfType (AudioProcessor::wrapperType_Standalone)); + processor = createPluginFilterOfType (AudioProcessor::wrapperType_Standalone); #else AudioProcessor::setTypeOfNextNewPlugin (AudioProcessor::wrapperType_Standalone); processor.reset (createPluginFilter()); @@ -524,11 +524,9 @@ private: }; //============================================================================== - void audioDeviceIOCallback (const float** inputChannelData, - int numInputChannels, - float** outputChannelData, - int numOutputChannels, - int numSamples) override + void audioDeviceIOCallbackWithContext (const float* const* inputChannelData, int numInputChannels, + float* const* outputChannelData, int numOutputChannels, + int numSamples, const AudioIODeviceCallbackContext& context) override { const bool inputMuted = shouldMuteInput.getValue(); @@ -538,8 +536,8 @@ private: inputChannelData = emptyBuffer.getArrayOfReadPointers(); } - player.audioDeviceIOCallback (inputChannelData, numInputChannels, - outputChannelData, numOutputChannels, numSamples); + player.audioDeviceIOCallbackWithContext (inputChannelData, numInputChannels, + outputChannelData, numOutputChannels, numSamples, context); } void audioDeviceAboutToStart (AudioIODevice* device) override @@ -644,8 +642,8 @@ public: : DocumentWindow (title, backgroundColour, DocumentWindow::minimiseButton | DocumentWindow::closeButton), optionsButton ("Options") { - - + + #if JUCE_IOS || JUCE_ANDROID setTitleBarHeight (0); #else @@ -658,7 +656,7 @@ public: #endif setResizable (true, false); - + pluginHolder.reset (new StandalonePluginHolder (settingsToUse, takeOwnershipOfSettings, preferredDefaultDeviceName, preferredSetupOptions, constrainToConfiguration, autoOpenMidiDevices)); @@ -770,7 +768,7 @@ public: std::unique_ptr pluginHolder; - + private: //============================================================================== class MainContentComponent : public Component, @@ -829,7 +827,7 @@ private: } void resized() override - { + { auto r = getLocalBounds(); bool portrait = getWidth() < getHeight(); @@ -847,7 +845,7 @@ private: // call resized again if on iOS, due to dumb stuff related to safe area insets not being updated #if JUCE_IOS Timer::callAfterDelay(150, [this]() { - this->resized(); + this->resized(); }); //return; #endif @@ -862,18 +860,18 @@ private: r.removeFromBottom(bottomInset); r.removeFromLeft(leftInset); r.removeFromRight(rightInset); - - + + if (shouldShowNotification) { - notification.setBounds (r.removeFromTop (NotificationArea::height)); - topInset += NotificationArea::height; + notification.setBounds (r.removeFromTop (NotificationArea::height)); + topInset += NotificationArea::height; } editor->setBounds (r); } private: - + bool isPortrait = false; bool isTall = false; int orientation = 0; @@ -968,7 +966,7 @@ private: int bottomInset = 0; int leftInset = 0; int rightInset = 0; - + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent) }; diff --git a/Source/PS_Source/Input/AInputS.h b/Source/PS_Source/Input/AInputS.h index e56e5e9..376a257 100644 --- a/Source/PS_Source/Input/AInputS.h +++ b/Source/PS_Source/Input/AInputS.h @@ -123,7 +123,7 @@ public: return m_readbuf.getSample(ch, int(pos - m_cached_file_range.getStart())); else { - Range activerange((int64_t)(m_activerange.getStart()*info.nsamples), + Range activerange((int64_t)(m_activerange.getStart()*info.nsamples), (int64_t)(m_activerange.getEnd()*info.nsamples+1)); Range possiblerange(pos, pos + m_readbuf.getNumSamples() + 0); m_cached_file_range = activerange.getIntersectionWith(possiblerange); @@ -154,7 +154,7 @@ public: ++m_silenceoutputted; return 0.0f; }; - float** smps = abuf.getArrayOfWritePointers(); + float* const* smps = abuf.getArrayOfWritePointers(); int readinc = 1; if (m_reverseplay) readinc = -1; @@ -212,7 +212,7 @@ public: for (int j = 0; j < numchans; ++j) { int inchantouse = j % inchans; - smps[j][i] = seekfadegain*getCrossFadedSampleLambda(m_currentsample, inchantouse, + smps[j][i] = seekfadegain*getCrossFadedSampleLambda(m_currentsample, inchantouse, subsect_t0, subsect_t1,xfadelen); } @@ -224,7 +224,7 @@ public: { m_currentsample = subsect_t0+xfadelen; ++m_loopcount; - } + } else if (m_reverseplay == true && m_currentsample < subsect_t0) { m_currentsample = subsect_t1 - 1; @@ -237,7 +237,7 @@ public: PlayRangeEndCallback(this); } } - + return nsmps; } void seekImpl(double pos) @@ -282,7 +282,7 @@ public: } m_seekfade.length = 16384; m_seekfade.requestedpos = pos; - + } std::pair,Range> getCachedRangesNormalized() @@ -322,7 +322,7 @@ public: void setActiveRange(Range rng) override { ScopedLock locker(m_mutex); - + /* if (rng.contains(getCurrentPositionPercent())) { @@ -373,7 +373,7 @@ public: } bool isReversed() { return m_reverseplay; } int64_t getLoopCount() { return m_loopcount; } - + private: std::function PlayRangeEndCallback; std::unique_ptr m_afreader; diff --git a/Source/PS_Source/StretchSource.cpp b/Source/PS_Source/StretchSource.cpp index 33403f7..24aede4 100644 --- a/Source/PS_Source/StretchSource.cpp +++ b/Source/PS_Source/StretchSource.cpp @@ -316,7 +316,7 @@ void StretchAudioSource::getNextAudioBlock(const AudioSourceChannelInfo & buffer if (m_vol_smoother.getTargetValue() != maingain) m_vol_smoother.setTargetValue(maingain); FloatVectorOperations::disableDenormalisedNumberSupport(); - float** outarrays = bufferToFill.buffer->getArrayOfWritePointers(); + float* const* outarrays = bufferToFill.buffer->getArrayOfWritePointers(); int outbufchans = jmin(m_num_outchans, bufferToFill.buffer->getNumChannels()); int offset = bufferToFill.startSample; if (m_stretchers.size() == 0) diff --git a/Source/PluginEditor.h b/Source/PluginEditor.h index 667c606..9ba70d4 100644 --- a/Source/PluginEditor.h +++ b/Source/PluginEditor.h @@ -52,7 +52,7 @@ public: SpectralVisualizer(); void setState(const ProcessParameters& pars, int nfreqs, double samplerate); void paint(Graphics& g) override; - + private: Image m_img; std::vector m_insamples,m_freqs1, m_freqs2, m_freqs3; @@ -174,10 +174,10 @@ private: class MyThumbCache : public AudioThumbnailCache { public: - MyThumbCache() : AudioThumbnailCache(200) - { + MyThumbCache() : AudioThumbnailCache(200) + { // The default priority of 2 is a bit too low in some cases, it seems... - getTimeSliceThread().setPriority(3); + //getTimeSliceThread().setPriority(juce::Thread::Priority::highest); } ~MyThumbCache() {} }; @@ -328,11 +328,11 @@ public: void currentTabChanged(int newCurrentTabIndex, const String&) override { //m_cur_tab = newCurrentTabIndex; - + } private: int& m_cur_tab; - + }; class SimpleFFTComponent : public Component, @@ -346,15 +346,15 @@ public: { setOpaque(true); startTimerHz(60); - + } ~SimpleFFTComponent() { - + } - void addAudioBlock(const AudioBuffer& bufferToFill) + void addAudioBlock(const AudioBuffer& bufferToFill) { if (bufferToFill.getNumChannels() > 0) { @@ -447,7 +447,7 @@ private: int fifoIndex = 0; bool nextFFTBlockReady = false; - + }; @@ -511,7 +511,7 @@ private: LookAndFeel_V3 m_filebwlookandfeel; }; -class PaulstretchpluginAudioProcessorEditor : public AudioProcessorEditor, +class PaulstretchpluginAudioProcessorEditor : public AudioProcessorEditor, public MultiTimer, public FileDragAndDropTarget, public DragAndDropContainer, public ComponentListener { @@ -535,7 +535,7 @@ public: void paint (Graphics&) override; void resized() override; void timerCallback(int id) override; - + bool isInterestedInFileDrag(const StringArray &files) override; void filesDropped(const StringArray &files, int x, int y) override; @@ -543,9 +543,9 @@ public: void componentParentHierarchyChanged (Component& component) override; - + WaveformComponent m_wavecomponent; - + void showRenderDialog(); //SimpleFFTComponent m_sonogram; String m_last_err; @@ -566,7 +566,7 @@ private: void showPopTip(const String & message, int timeoutMs, Component * target, int maxwidth=100); - + CustomLookAndFeel m_lookandfeel; PaulstretchpluginAudioProcessor& processor; @@ -600,18 +600,18 @@ private: WeakReference settingsCalloutBox; std::unique_ptr m_optionsView; - + zoom_scrollbar m_zs; RatioMixerEditor m_ratiomixeditor{ 8 }; FreeFilterComponent m_free_filter_component; - + MyTabComponent m_wavefilter_tab; Component* m_wave_container=nullptr; void showAudioSetup(); void showSettings(bool flag); void toggleFileBrowser(); std::vector m_capturelens{ 2,5,10,30,60,120 }; - + std::unique_ptr m_filechooser; std::unique_ptr fileChooser; WildcardFileFilter m_filefilter; @@ -645,7 +645,7 @@ private: // keep this down here, so it gets destroyed early std::unique_ptr popTip; - + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessorEditor) }; diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index db0e58b..7b4ada4 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -616,8 +616,8 @@ void PaulstretchpluginAudioProcessor::startplay(Range playrange, int num m_recreate_buffering_source = false; } if (m_bufferingthread.isThreadRunning() == false) { - m_bufferingthread.setPriority(8); m_bufferingthread.startThread(); + // m_bufferingthread.setPriority(juce::Thread::Priority::high); } m_stretch_source->setNumOutChannels(numoutchans); m_stretch_source->setFFTSize(m_fft_size_to_use, true); diff --git a/deps/juce b/deps/juce index 965d0ca..d24c272 160000 --- a/deps/juce +++ b/deps/juce @@ -1 +1 @@ -Subproject commit 965d0ca4be178c4a0000b116d460e15c30311992 +Subproject commit d24c2729268e322f3ba1b5070eb96ab232d7f6ba