Skip to content

Commit 9f7bbb9

Browse files
committed
Merge branch 'develop' into feature/rtcheck
# Conflicts: # .github/workflows/build.yaml
2 parents a759fd6 + d2b1930 commit 9f7bbb9

File tree

15 files changed

+209
-45
lines changed

15 files changed

+209
-45
lines changed

.github/FUNDING.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
github: drowaudio

.github/workflows/build.yaml

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
test-binary: ./pluginval
2424
container: ubuntu:22.04
2525
- name: macOS
26-
os: macos-12
26+
os: macos-13
2727
app: pluginval.app
2828
test-binary: pluginval.app/Contents/MacOS/pluginval
2929
- name: Windows
@@ -54,7 +54,7 @@ jobs:
5454
- name: Setup Environment Variables
5555
shell: bash
5656
run: |
57-
VERSION=$(cat VERSION)
57+
VERSION=$(head -n1 VERSION)
5858
echo "VERSION=$VERSION" >> $GITHUB_ENV
5959
echo "APP_DIR=${{ env.BUILD_DIR }}/${{ env.BINARY_NAME }}_artefacts/${{ env.BUILD_TYPE }}" >> $GITHUB_ENV
6060
echo "ZIP_FILE_NAME=${{ env.BINARY_NAME }}_${{ matrix.name }}.zip" >> $GITHUB_ENV
@@ -64,15 +64,15 @@ jobs:
6464
# This needs to be absolute to make action/cache happy
6565
WORKING_DIR=$(pwd)
6666
echo "PLUGIN_CACHE_PATH=$WORKING_DIR/modules/juce/Builds/examples/Plugins" >> $GITHUB_ENV
67-
67+
6868
- name: Install dependencies (Linux)
6969
if: ${{ matrix.name == 'Linux' }}
7070
run: |
7171
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
7272
sudo apt-get update
7373
sudo apt-get install -y freeglut3-dev g++ libasound2-dev libcurl4-openssl-dev libfreetype6-dev libjack-jackd2-dev libx11-dev libxcomposite-dev libxcursor-dev libxinerama-dev libxrandr-dev mesa-common-dev ladspa-sdk webkit2gtk-4.0 libgtk-3-dev xvfb
7474
sudo /usr/bin/Xvfb $DISPLAY &
75-
75+
7676
- name: Make VST2 SDK available
7777
shell: bash
7878
run: |
@@ -111,11 +111,11 @@ jobs:
111111
- name: Cache JUCE example plugin binaries
112112
id: cache-plugins
113113
uses: actions/cache@v3
114-
with:
114+
with:
115115
path: ${{ env.PLUGIN_CACHE_PATH }}
116116
# Increment the version in the key below to manually break plugin cache
117117
key: v7-${{ runner.os }}-${{ env.JUCE_SHA1 }}
118-
118+
119119
- name: Build JUCE example plugins
120120
if: steps.cache-plugins.outputs.cache-hit != 'true'
121121
working-directory: modules/juce
@@ -144,13 +144,11 @@ jobs:
144144
cp -R ${{ env.PLUGIN_CACHE_PATH }}/DSPModulePluginDemo_artefacts/Release/AU/DSPModulePluginDemo.component ~/Library/Audio/Plug-Ins/Components/
145145
killall -9 AudioComponentRegistrar # kick the AU registrar
146146
${{ env.APP_DIR }}/${{ matrix.test-binary }} --strictness-level 10 --validate ~/Library/Audio/Plug-Ins/Components/DSPModulePluginDemo.component
147-
147+
148148
- name: Codesign (macOS)
149149
if: ${{ matrix.name == 'macOS' }}
150-
run: |
151-
codesign --force -s "${{ secrets.DEVELOPER_ID_APPLICATION}}" -v ${{ env.APP_DIR }}/${{ matrix.app }}/Contents/Libraries/librtcheck.dylib --entitlements ${{ env.BUILD_DIR }}/${{ env.BINARY_NAME }}_artefacts/JuceLibraryCode/${{ env.BINARY_NAME }}.entitlements --deep --strict --options=runtime --timestamp
152-
codesign --force -s "${{ secrets.DEVELOPER_ID_APPLICATION}}" -v ${{ env.APP_DIR }}/${{ matrix.app }} --entitlements ${{ env.BUILD_DIR }}/${{ env.BINARY_NAME }}_artefacts/JuceLibraryCode/${{ env.BINARY_NAME }}.entitlements --deep --strict --options=runtime --timestamp
153-
150+
run: codesign --force -s "${{ secrets.DEVELOPER_ID_APPLICATION}}" -v ${{ env.APP_DIR }}/${{ matrix.app }} --entitlements ${{ env.BUILD_DIR }}/${{ env.BINARY_NAME }}_artefacts/JuceLibraryCode/${{ env.BINARY_NAME }}.entitlements --deep --strict --options=runtime --timestamp
151+
154152
- name: "Notarize and staple (macOS)"
155153
if: ${{ matrix.name == 'macOS' }}
156154
working-directory: ${{ env.APP_DIR }}
@@ -159,17 +157,17 @@ jobs:
159157
xcrun notarytool submit ${{ env.ZIP_FILE_NAME }} --apple-id ${{ secrets.NOTARIZATION_USERNAME }} --password ${{ secrets.NOTARIZATION_PASSWORD }} --team-id ${{ secrets.TEAM_ID }} --wait
160158
xcrun stapler staple ${{ matrix.app }}
161159
rm ${{ env.ZIP_FILE_NAME }}
162-
160+
163161
- name: Create zip files
164162
working-directory: ${{ env.APP_DIR }}
165163
run: 7z a -aoa -tzip ${{ env.ZIP_FILE_NAME }} ${{ matrix.app }}
166-
164+
167165
- name: Upload zip files
168166
uses: actions/upload-artifact@v4
169167
with:
170168
name: ${{ env.ZIP_FILE_NAME }}
171169
path: ${{ env.APP_DIR }}/${{ env.ZIP_FILE_NAME }}
172-
170+
173171
# Create release for tagged refs
174172
deploy:
175173
if: contains(github.ref, 'tags/v')
@@ -178,20 +176,19 @@ jobs:
178176
steps:
179177
# Needed to grab CHANGELIST.md
180178
- uses: actions/checkout@v3
181-
179+
182180
- name: Get Artifacts
183-
uses: actions/download-artifact@v3
181+
uses: actions/download-artifact@v4
184182
with:
185183
path: ./
186184

187185
- name: Display structure of downloaded files
188186
run: ls -la
189187

190188
- name: Create Release
191-
uses: softprops/action-gh-release@v1
189+
uses: softprops/action-gh-release@v2
192190
with:
193191
body_path: CHANGELIST.md
194-
draft: true
195192
files: |
196193
CHANGELIST.md/*
197194
pluginval_Linux.zip/*

CHANGELIST.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
# pluginval Change List
22

3+
### 1.0.5
4+
- Added static linking to the Windows runtime so it should run on more Windows systems (particularly non-dev machines)
5+
- Made `PluginInfoTest` run on the message thread as the functions it calls aren't thread-safe
6+
37
### 1.0.4
8+
- Limit auval's stress test to 20 seconds (vs 600) [#135]
49
- Fixed incorrect "ALL TESTS PASSED" message when validating out of process [#125]
5-
- Updated juce to 113009c074
10+
- Updated juce to 8.0.3 [#133]
611
- Added LV2 support [#25]
12+
- Provide CMake module for registering pluginval tests with CTest [#123]
713
- Changed minimum Linux version to Ubuntu 22.04
814

915
### 1.0.3

CMakeLists.txt

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,42 @@
11
cmake_minimum_required(VERSION 3.15)
22

3-
file(READ VERSION CURRENT_VERSION)
3+
file(STRINGS VERSION CURRENT_VERSION LIMIT_COUNT 1)
44
project(pluginval VERSION ${CURRENT_VERSION})
55

66
if (APPLE)
77
# Target OS versions down to 10.11
88
set (CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE INTERNAL "")
9-
9+
1010
# Uncomment to produce a universal binary
1111
# set(CMAKE_OSX_ARCHITECTURES arm64 x86_64)
1212
set(PLUGINVAL_ENABLE_RTCHECK ON)
1313
endif()
1414

15-
# Uncomment to enable tsan
16-
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread")
17-
15+
# sanitizer options, from https://github.com/sudara/cmake-includes/blob/main/Sanitizers.cmake
16+
# set the corresponding option ON to turn on Address/Thread Sanitizer
17+
option(WITH_ADDRESS_SANITIZER "Enable Address Sanitizer" OFF)
18+
option(WITH_THREAD_SANITIZER "Enable Thread Sanitizer" OFF)
19+
20+
message(STATUS "Sanitizers: ASan=${WITH_ADDRESS_SANITIZER} TSan=${WITH_THREAD_SANITIZER}")
21+
if (WITH_ADDRESS_SANITIZER)
22+
if (MSVC)
23+
add_compile_options(/fsanitize=address)
24+
elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
25+
# also enable UndefinedBehaviorSanitizer
26+
# https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
27+
add_compile_options(-fsanitize=address,undefined -fno-omit-frame-pointer)
28+
link_libraries(-fsanitize=address)
29+
endif ()
30+
message("Address Sanitizer enabled")
31+
endif ()
32+
33+
if (WITH_THREAD_SANITIZER)
34+
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
35+
add_compile_options(-fsanitize=thread -g -fno-omit-frame-pointer)
36+
link_libraries(-fsanitize=thread)
37+
message("Thread Sanitizer enabled")
38+
endif ()
39+
endif ()
1840

1941
# Adds all the module sources so they appear correctly in the IDE
2042
set_property(GLOBAL PROPERTY USE_FOLDERS YES)
@@ -74,6 +96,7 @@ set(SourceFiles
7496
Source/MainComponent.cpp
7597
Source/PluginTests.cpp
7698
Source/tests/BasicTests.cpp
99+
Source/tests/LocaleTest.cpp
77100
Source/tests/BusTests.cpp
78101
Source/tests/ParameterFuzzTests.cpp
79102
Source/TestUtilities.cpp
@@ -94,14 +117,16 @@ target_compile_definitions(pluginval PRIVATE
94117
JUCE_PLUGINHOST_LV2=1
95118
JUCE_USE_CURL=0
96119
JUCE_WEB_BROWSER=0
97-
JUCER_ENABLE_GPL_MODE=1
98-
JUCE_DISPLAY_SPLASH_SCREEN=0
99120
JUCE_MODAL_LOOPS_PERMITTED=1
100-
JUCE_REPORT_APP_USAGE=0
101121
JUCE_GUI_BASICS_INCLUDE_XHEADERS=1
102122
$<$<BOOL:${PLUGINVAL_ENABLE_RTCHECK}>:PLUGINVAL_ENABLE_RTCHECK=1>
103123
VERSION="${CURRENT_VERSION}")
104124

125+
if(MSVC AND NOT CMAKE_MSVC_RUNTIME_LIBRARY)
126+
# Default to statically linking the runtime libraries
127+
set_property(TARGET pluginval PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
128+
endif()
129+
105130
target_link_libraries(pluginval PRIVATE
106131
juce::juce_audio_devices
107132
juce::juce_audio_processors

FUNDING.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Funding
2+
3+
Support the development of this project by sponsoring it!
4+
Your contributions help maintain and improve this project, add new features, and keep documentation up-to-date.
5+
6+
## How to Sponsor
7+
8+
You can sponsor this project through the following platforms:
9+
10+
- **GitHub Sponsors**: [Become a sponsor on GitHub](https://github.com/sponsors/drowaudio)
11+
12+
## Why Sponsor?
13+
14+
- 💡 Influence the [roadmap](ROADMAP.md)
15+
- 🐞 Priority support on issues
16+
- ❤️ Help sustain open-source work
17+
18+
## Tiers
19+
### Monthly:
20+
- 🥉 [$5](https://github.com/sponsors/drowaudio/sponsorships?sponsor=drowaudio&tier_id=535613)
21+
- 🥈 [$10](https://github.com/sponsors/drowaudio/sponsorships?sponsor=drowaudio&tier_id=535614)
22+
- 🥇 [$25](https://github.com/sponsors/drowaudio/sponsorships?sponsor=drowaudio&tier_id=535619)
23+
- 💎 [$50](https://github.com/sponsors/drowaudio/sponsorships?sponsor=drowaudio&tier_id=535620)
24+
25+
### One-time
26+
- 🥉 [$50](https://github.com/sponsors/drowaudio/sponsorships?sponsor=drowaudio&tier_id=535616)
27+
- 🥈 [$100](https://github.com/sponsors/drowaudio/sponsorships?sponsor=drowaudio&tier_id=535618)
28+
- 🥇 [$500](https://github.com/sponsors/drowaudio/sponsorships?sponsor=drowaudio&tier_id=535615)
29+
- 💎 [$1000](https://github.com/sponsors/drowaudio/sponsorships?sponsor=drowaudio&tier_id=535617) one [roadmap](ROADMAP.md) item fully implemented
30+
31+
32+
---
33+
34+
Thank you for considering sponsorship!
35+
Your support makes open-source possible.

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ If you are a plugin user looking to report a problem with a plugin to the develo
1515
- Run in GUI or headless mode
1616
- Validation is performed in a separate process to avoid crashing
1717

18+
### Funding
19+
pluginval is a free, open source project but supporting it via funding is a great way to show your appreciation for it, speed up development and influence the [roadmap](ROADMAP.md).
20+
21+
See [FUNDING.md](FUNDING.md) for more details and the bottom of this file for a list of our diamond sponsors.
1822

1923
### Installation
2024

@@ -101,6 +105,30 @@ If you would like to contribute to the project please do! It's very simple to ad
101105
102106
If you have a case you would like tests, please simply write the test in a fork and create a pull request. The more tests the better!
103107
108+
### Cutting New Releases
109+
110+
* Update VERSION (an extra newline is fine)
111+
* Update CHANGELIST.md
112+
* `git commit -am "Version 1.0.5"`
113+
* `git tag -a v1.0.5 -m "1.0.5 release"`
114+
* `git push --tags`
115+
116+
## Roadmap
117+
Find more information on what's in the pipeline for pluginval [here](ROADMAP.md).
118+
119+
## Sponsors
120+
Thanks to all those who sponsor pluginval's development and a special thanks to those at the diamond level:
121+
122+
[💎 The Audio Programmer](https://theaudioprogrammer.com/?utm_source=pluginval)
123+
124+
<a href="https://theaudioprogrammer.com/?utm_source=pluginval"><img width="75" height="75" alt="image" src="https://github.com/user-attachments/assets/7a6e2e8e-d4c7-461c-98db-d8c1df67be1b" />
125+
</a>
126+
127+
[💎 Moonbase](https://moonbase.sh/?utm_source=pluginval)
128+
129+
<a href="https://moonbase.sh/?utm_source=pluginval"><img width="517" height="75" alt="MB-banner" src="https://github.com/user-attachments/assets/80f5d6bf-2606-416d-8bb6-f02c66626377"/></a>
130+
131+
104132
License
105133
----
106134

ROADMAP.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Roadmap
2+
3+
There are lots of ways pluginval can be improved, some of these are listed below but we're open to Discussions on others.
4+
5+
You can help get there by issuing PRs or [funding](FUNDING.md) development.
6+
7+
- #### Integration of real-time safety checking (via RTsan or rtcheck)
8+
- #### Improved stack trace/crash reporting
9+
- #### Acceptance testing using input files and reference output files
10+
- #### Automatic integration of Asan/Tsan on platforms that allow it
11+
- #### More tests/logging
12+
- #### Integration with CTest
13+
- #### Improved command-line handling and json config file support

Source/CommandLine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ namespace
239239
bool isPluginArgument (juce::String arg)
240240
{
241241
juce::AudioPluginFormatManager formatManager;
242-
formatManager.addDefaultFormats();
242+
juce::addDefaultFormatsToManager (formatManager);
243243

244244
for (auto format : formatManager.getFormats())
245245
if (format->fileMightContainThisPluginType (arg))

Source/MainComponent.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,14 @@ namespace
194194
message << "\n\n" << "\"None set\"";
195195

196196
std::shared_ptr<juce::AlertWindow> aw (juce::LookAndFeel::getDefaultLookAndFeel().createAlertWindow (TRANS("Set Log File Directory"), message,
197-
TRANS("Choose dir"), TRANS("Cancel"), TRANS("Don't save logs"),
197+
TRANS("Choose dir"), TRANS("Don't save logs"), TRANS("Cancel"),
198198
juce::AlertWindow::QuestionIcon, 3, nullptr));
199199
aw->enterModalState (true, juce::ModalCallbackFunction::create ([aw] (int res)
200200
{
201-
if (res == 3)
201+
if (res == 1)
202202
getAppPreferences().setValue ("outputDir", juce::String());
203203

204-
if (res == 1)
204+
if (res == 2)
205205
{
206206
const auto defaultDir = juce::File::getSpecialLocation (juce::File::userDesktopDirectory).getChildFile ("pluginval logs").getFullPathName();
207207
juce::FileChooser fc (TRANS("Directory to save log files"), defaultDir);
@@ -223,11 +223,11 @@ namespace
223223
message << "\n\n" << "\"None set\"";
224224

225225
std::shared_ptr<juce::AlertWindow> aw (juce::LookAndFeel::getDefaultLookAndFeel().createAlertWindow (TRANS("Set VST3 validator"), message,
226-
TRANS("Choose"), TRANS("Cancel"), TRANS("Don't use VST3 validator"),
226+
TRANS("Choose"), TRANS("Don't use VST3 validator"), TRANS("Cancel"),
227227
juce::AlertWindow::QuestionIcon, 3, nullptr));
228228
aw->enterModalState (true, juce::ModalCallbackFunction::create ([aw] (int res)
229229
{
230-
if (res == 3)
230+
if (res == 1)
231231
setVST3Validator ({});
232232

233233
if (res == 1)
@@ -246,7 +246,7 @@ namespace
246246
MainComponent::MainComponent (Validator& v)
247247
: validator (v)
248248
{
249-
formatManager.addDefaultFormats();
249+
juce::addDefaultFormatsToManager (formatManager);
250250

251251
const auto tabCol = getLookAndFeel().findColour (juce::ResizableWindow::backgroundColourId);
252252
addAndMakeVisible (tabbedComponent);

Source/PluginTests.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ PluginTests::PluginTests (const juce::String& fileOrIdentifier, Options opts)
5252
{
5353
jassert (fileOrIdentifier.isNotEmpty());
5454
jassert (juce::isPositiveAndNotGreaterThan (options.strictnessLevel, 10));
55-
formatManager.addDefaultFormats();
55+
juce::addDefaultFormatsToManager (formatManager);
5656
}
5757

5858
PluginTests::PluginTests (const juce::PluginDescription& desc, Options opts)
@@ -193,10 +193,10 @@ void PluginTests::testType (const juce::PluginDescription& pd)
193193
{
194194
juce::WaitableEvent completionEvent;
195195
juce::MessageManager::callAsync ([&, this]() mutable
196-
{
197-
t->runTest (*this, *instance);
198-
completionEvent.signal();
199-
});
196+
{
197+
t->runTest (*this, *instance);
198+
completionEvent.signal();
199+
});
200200
completionEvent.wait();
201201
}
202202
else

0 commit comments

Comments
 (0)