1
0
Fork 0
Commit graph

1044 commits

Author SHA1 Message Date
Robbert van der Helm efff43df21 Add an StftHelper::max_padding() 2023-01-30 02:16:03 +01:00
Robbert van der Helm e3e2a2e7d0 Actually change padding in StftHelper::set_padding 2023-01-30 01:55:34 +01:00
Robbert van der Helm 161c97bb28 Add the CLAP note detector feature 2023-01-28 23:23:56 +01:00
Robbert van der Helm 98d44798ea Allow changing StftHelper padding after creation
Adapted from #52.
2023-01-25 18:40:09 +01:00
Robbert van der Helm ead160497b Fix excess padding handling in StftHelper 2023-01-25 18:35:55 +01:00
Robbert van der Helm 1e90f55019 Add a todo for invalid CLAP event parsing
Currently these values are never -1, but they can be.
2023-01-16 23:59:10 +01:00
Robbert van der Helm 92ce737000 Add a gain_to_db_fast() with a lower limit
These functions probably need some better organization at some point.
2023-01-15 18:15:52 +01:00
Robbert van der Helm bb521fcb82 Upgrade Vizia for the cosmic-text changes
This brings some breaking changes, and vertical positioning of text may
have changed slightly.
2023-01-12 19:03:02 +01:00
Robbert van der Helm e5a26ac199 Send individual parameter changes for VST3 plugins 2023-01-11 16:59:21 +01:00
Robbert van der Helm adb49cb6d1 Simplify VST3 wrapper creation 2023-01-11 16:51:21 +01:00
Robbert van der Helm d3d34b59ac Send individual parameter changes for standalones 2023-01-11 16:51:21 +01:00
Robbert van der Helm 048cfd73b5 Add a TODO for merging hashmaps 2023-01-11 15:22:26 +01:00
Robbert van der Helm 951a0739d7 Send individual parameter changes for CLAP plugins 2023-01-11 15:22:26 +01:00
Robbert van der Helm 4e53d3a799 Significantly increase task queue capacity
This is needed to prevent parameter change events from being dropped.
2023-01-11 15:22:26 +01:00
Robbert van der Helm 08c6729ed1 Also add an Editor::param_modulation_changed() 2023-01-11 15:22:26 +01:00
Robbert van der Helm 922d2de603 Add an individual Editor::param_value_changed 2023-01-11 15:22:26 +01:00
Robbert van der Helm 838e1bfd2d Fix note formatter octave conversion, again 2023-01-10 14:03:17 +01:00
Robbert van der Helm 2aa937e370 Fix note formatting for 0 Hz
This would result in an underflow, failing the test case.
2023-01-10 02:28:39 +01:00
Robbert van der Helm a9d0e40447 Fix octave -1 edge case in v2s_f32_hz_then_khz_with_note_name 2023-01-10 02:11:45 +01:00
Robbert van der Helm 32903ac065 Test f32_hz_then_khz_with_note_name roundtrip
This was failing in clap-validator.
2023-01-10 01:46:34 +01:00
Robbert van der Helm 18b4403a3b Fix roundtrip in f32_hz_then_khz_with_note_names 2023-01-10 01:46:14 +01:00
Robbert van der Helm b647f24121 Fix rounding error in v2s_f32_hz_then_khz_with_note_name 2023-01-10 01:43:27 +01:00
Robbert van der Helm 26422ae8e3 Fix -inf parsing in s2v_f32_gain_to_db()
I noticed this thanks to a test I implemented myself in clap-validator
ha.
2023-01-10 00:40:50 +01:00
Robbert van der Helm 57e751d277 Remove todo about single message queues
Because we just did that.
2023-01-06 18:05:52 +01:00
Robbert van der Helm 47b75fd020 Fix missing generic arguments on BackgroundThread 2023-01-06 17:59:33 +01:00
Robbert van der Helm 6f7f2e30ed Fix debug assertion failure in smoother 2023-01-06 17:58:13 +01:00
Robbert van der Helm 28cd25d501 Implement Linux event loop using BackgroundThread
This reduces duplication a lot.
2023-01-06 17:53:07 +01:00
Robbert van der Helm 5c9be077e7 Allow BackgroundThread sharing between instances
This removes the need for every instance to have its own background
thread.
2023-01-06 17:51:38 +01:00
Robbert van der Helm 8d242b45ad Remove old overeager clippy lint silence
This is no longer enabled by default.
2023-01-06 16:13:01 +01:00
Robbert van der Helm dfeb8164ca Fix new Clippy lints 2023-01-06 16:13:01 +01:00
Robbert van der Helm 935bf6f7f3 Fix allocation failures in BackgroundThread 2023-01-06 16:03:48 +01:00
Robbert van der Helm c0e9b29bf4 Remove macOS deprecation warning from event loop 2023-01-06 15:58:01 +01:00
Robbert van der Helm d5006d109e Code style cleanup for macOS event loop 2023-01-06 15:46:29 +01:00
Robbert van der Helm 700a15f528 Merge branch 'maxjvh/master' #48
native macOS event loop: https://github.com/robbert-vdh/nih-plug/pull/48
2023-01-06 15:14:29 +01:00
Robbert van der Helm 300e112ede Rename Block::len() to Block::samples()
For the same reason mentioned in the last commit.
2023-01-05 16:13:58 +01:00
Robbert van der Helm cb2824021b Fix buffer adapter size hints for zero channels
And the SamplesIter one was simply not correct when yielded by the block
iterator.
2023-01-05 16:12:09 +01:00
Robbert van der Helm cb827d18dd Rename Buffer::len() to Buffer::samples()
To reduce ambiguity.
2023-01-05 16:04:38 +01:00
Robbert van der Helm 9e1a888b38 Store sample count in Buffer
This fixes the sample count not being correct for MIDI-only plugins.
2023-01-05 15:58:55 +01:00
Robbert van der Helm 19be530ba3 Rename Buffer::with_raw_vec to set_slices 2023-01-05 15:36:04 +01:00
Robbert van der Helm 11d9476a5f Use db_to_gain_fast() in plugins 2023-01-04 17:05:13 +01:00
Robbert van der Helm 3b57ebe895 Add test for fast decibel<->gain functions 2023-01-04 17:01:25 +01:00
Robbert van der Helm c55fb02982 Add faster decibel<->gain conversion functions 2023-01-04 16:58:28 +01:00
Robbert van der Helm 74a9e294b1 Make gain_to_db() branchless 2023-01-04 16:45:11 +01:00
max 1e83730ba9 rename variable 2023-01-02 19:30:31 +02:00
max edca84a42c address comments 2023-01-02 19:29:13 +02:00
max 1fbe3efb79 update comment 2023-01-01 20:22:17 +02:00
max 9fd88ffd48 initial event loop implementation for macOS 2023-01-01 20:14:55 +02:00
Robbert van der Helm 069053ca50 Also defer latency change for CLAP plugins
In case a future host does the same thing Ardour does right now for VST3
plugins.
2022-12-28 01:34:42 +01:00
Robbert van der Helm 5cbef6ec03 Fix alloc failures in VST3 with many events
Or well, work around. We should use a different non-allocating sorting
implementation here. This only crept up in Ardour because they for some
reason send all parameter values after loading a VST3 plugin.
2022-12-28 01:30:26 +01:00
Robbert van der Helm fd28a95231 Defer set_latency_samples() in VST3 plugin init
The host might otherwise restart the plugin while the `Plugin::init()`
call is still active, resulting in a deadlock because the plugin mutex
is still locked. This was causing issues when loading state in Ardour7.
The new approach also removes the need for a previous hack added for
Ardour6.
2022-12-28 01:28:33 +01:00
Robbert van der Helm 46752fc7f0 Make the definition of buffer length more explicit
This is the standard definition, but apparently it's still confusing.
Resolves #47.
2022-12-23 20:34:57 +01:00
Robbert van der Helm 2747714640 Silence warning for standalone config on macOS 2022-12-02 19:42:51 +01:00
Robbert van der Helm ec34e54bfe Update dependencies, allow resizing on Win/macOS
This was implemented for Linux in March, but it should now also work on
Windows and macOS.
2022-12-01 20:21:56 +01:00
Robbert van der Helm 50fa1008c0 Allow assert_process_allocs+mingw-w64 in release
This causes the application to halt in debug builds, but it shouldn't be
an issue in release builds.
2022-12-01 20:18:30 +01:00
Robbert van der Helm 1d9e7e6256 Implement Debug for parameters 2022-11-26 12:58:32 +01:00
Robbert van der Helm 9a77bd2918 Remove old comment 2022-11-22 21:29:06 +01:00
Robbert van der Helm d9284ef0b7 Add debug assertion for custom feature namespaces 2022-11-22 21:19:17 +01:00
Robbert van der Helm 7c732e594c Document that custom features must be namespaced 2022-11-22 21:09:35 +01:00
Robbert van der Helm 26535a099d Seal the Params trait
This avoids situations like #41 where people try to implement the trait
only to find out that you simply can't.
2022-11-22 17:43:26 +01:00
Robbert van der Helm 753ca201a6 Support #[nested] prefixes/suffixes w/ #[persist]
This makes nested fields behave the same as nested parameters, allowing
multiple copies of a persistent field to exist.
2022-11-19 00:17:13 +01:00
Robbert van der Helm c947d6c232 Handle shaprs in s2v_i32_note_formatter() 2022-11-18 17:26:42 +01:00
Robbert van der Helm 230ed90745 Parse XXX Hz, C4 as XXX Hz
This can happen if the user edits the output of
`v2s_f32_hz_then_khz_with_note_name()`.
2022-11-18 17:12:52 +01:00
Robbert van der Helm 4dbc0c1a87 Mark the utils functions as inlnie
So the compiler can decide what to do with them.
2022-11-18 16:09:32 +01:00
Robbert van der Helm 6d0c1eebbe Move frequency to note number conversion to utils 2022-11-18 16:09:18 +01:00
Robbert van der Helm 6966d00dd7 Fix cents in s2v_f32_hz_then_khz()
The trimming was not done correctly, and cents were treated as partial
octaves.
2022-11-12 01:32:09 +01:00
Robbert van der Helm 79f5bd8659 Add a formatter for frequencies with note name
This is the same as the 'Hz then kHz' formatter but it also appends the
note name and optionally the number of cents.
2022-11-12 01:26:27 +01:00
Robbert van der Helm c3cd2fb0dd Fix v2s_i32_note_formatter() for negative numbers
Otherwise this would wrap around or panic in debug builds.
2022-11-12 01:25:33 +01:00
Robbert van der Helm 59456a2973 Remove 128 note MIDI limit in frequency parser
This is useful when the value->string function can go outside of the
standard 128 note range.
2022-11-12 01:25:33 +01:00
Robbert van der Helm 5330a7d938 Add a version of util::midi_note_to_freq for f32 2022-11-12 01:25:33 +01:00
Robbert van der Helm 761f0b0a80 Add cents support to s2v_f32_hz_then_khz() 2022-11-12 01:25:33 +01:00
Robbert van der Helm b93cd08dfa Default cpal backend to 48 kHz sample rate
This is probably a safer default for most regular computers.
2022-11-11 03:15:05 +01:00
Robbert van der Helm 5b3c327e29 Handle -inf dB in gain<->decibel formatters 2022-11-11 03:15:05 +01:00
Robbert van der Helm e583b8e777 Add finer step sizes to parameters 2022-11-11 03:15:05 +01:00
Robbert van der Helm 8885713ea1 Take largest step out of 100 steps and step_size
For floating point ranges. This otherwise feels very janky.
2022-11-11 03:15:05 +01:00
Robbert van der Helm b2da26ecd7 Add prefix to plain_value() and normalized_value()
To make it clearer that these functions include monophonic modulation.
When creating GUI widgets, you should be using the unmodulated variants.
2022-11-11 03:15:05 +01:00
Robbert van der Helm 841ec96d2d Use Rust range notation for NoteEvent docs #42
Apparently `from x to y` is ambiguous, so we now use the Rust `x..y`
syntax instead.
2022-11-08 19:36:07 +01:00
Robbert van der Helm 4f16fa3998 Fix typos in NoteEvent documentation 2022-11-08 19:33:40 +01:00
Robbert van der Helm 4893479485 Clarify integer range conventions in docs
This resolves #42.
2022-11-07 22:47:17 +01:00
Robbert van der Helm 69f9880fe5 Use consistent real interval syntax in docs 2022-11-07 22:45:36 +01:00
Robbert van der Helm 5851bc5a27 Add missing ranges in note enum documentation 2022-11-07 22:45:22 +01:00
Robbert van der Helm 542b3052f2 Support running status MIDI events 2022-11-05 14:19:47 +01:00
Robbert van der Helm e8002730a0 Fix clippy lints 2022-11-05 14:19:47 +01:00
Robbert van der Helm 8f91ecf247 Silence bool_to_int_with_if clippy lint 2022-11-05 14:19:47 +01:00
Robbert van der Helm 6eccabb701 Allow basic CLAP MIDI msgs with MidiConfig::Basic
This is needed for Qtractor compatibility. Even though it always sends
notes as CLAP events, it requires the plugin to support both the CLAP
and the MIDI note event dialects. Otherwise it won't send any notes at
all. Feature, not a bug.
2022-11-05 14:19:47 +01:00
Robbert van der Helm f48b36f2a7 Add Persist implementations for Arc wrapped types 2022-11-05 14:19:32 +01:00
Robbert van der Helm a0ca80297b Add Persistent implementations for atomics 2022-11-05 14:19:32 +01:00
Robbert van der Helm 23f4fd6fc5 Rearrange persist module 2022-11-05 14:19:32 +01:00
Robbert van der Helm fc9e521a85 Fix potential VST3 parking_lot allocation failure
This can happen when the process function is called from a new thread or
when a new thread has been spawned.
2022-11-04 15:00:45 +01:00
Robbert van der Helm 6c0df7ec39 Fix typo in pos_seconds documentation 2022-11-03 03:08:28 +01:00
Robbert van der Helm 456655b269 Use the clap_plugin::plugin_data field
Instead of relying on the struct layout and doing raw pointer casts. We
still need to do this for the CLAP plugin factory though.
2022-10-30 14:18:18 +01:00
Robbert van der Helm 36bf46f569 Fix setProcessing() in Ardour when setting latency 2022-10-25 17:47:36 +02:00
Robbert van der Helm 8b47f90dd7 Fix setActive() in Ardour when setting latency 2022-10-25 17:38:51 +02:00
Robbert van der Helm 435fcd8106 Fix CLAP modulation
This was a regression introduced in
c566888fa3.
2022-10-24 23:56:49 +02:00
Robbert van der Helm ba9e9253f2 Clean up Plugin trait doc comment 2022-10-23 16:33:20 +02:00
Robbert van der Helm f42b2d55f9 Clarify Plugin trait background task docs 2022-10-23 16:32:15 +02:00
Robbert van der Helm 3032300bcf Clarify task scheduling doc comments 2022-10-23 16:29:30 +02:00
Robbert van der Helm 0dd3bfe4e7 Allow running tasks on a dedicated thread
Independent of the GUI thread, which is also still an option. This is
useful for long running IO jobs that might otherwise block the GUI for
long enough to be noticeable.
2022-10-23 16:23:20 +02:00
Robbert van der Helm 028aeed18e Add a schedule_background() EventLoop method 2022-10-23 16:19:49 +02:00
Robbert van der Helm 520eba71ca Add a simple background thread task runner
This can be used by the Windows event loop, the future macOS event loop,
and the CLAP event loop.
2022-10-23 16:14:35 +02:00
Robbert van der Helm dbb97f0534 Use channels for Windows event loop
Instead of an `ArrayQueue`. Since this doesn't need to both send and
receive on the same object.
2022-10-23 15:52:14 +02:00
Robbert van der Helm 31cda78201 Rename do_maybe_async() to schedule_gui() 2022-10-23 15:48:27 +02:00
Robbert van der Helm 4524719128 Add an is_gui_thread flag to MainThreadExecutor
We'll also use the EventLoop for running background tasks completely
decoupled from the GUI.
2022-10-23 15:48:27 +02:00
Robbert van der Helm 967426453a Clean up EventLoop API
By taking an `Arc<T>` instead of a `Weak<T>`. The `Weak` is only needed
for the background threads.
2022-10-23 15:48:27 +02:00
Robbert van der Helm 21bfb57023 Rename execute_async() to execute_gui()
We'll have another function that uses a dedicated background thread.
2022-10-23 13:58:33 +02:00
Robbert van der Helm 5d84800c0c Manually implement Clone for AsyncExecutor 2022-10-22 15:32:42 +02:00
Robbert van der Helm 63db56fa68 Make AsyncExecutor Send+Sync
Otherwise actually using this will be a bit difficult.
2022-10-22 15:10:34 +02:00
Robbert van der Helm c980576102 Add an AsyncExecutor for editor GUIs
This is decoupled form `GuiContext` as that would require invasive
changes all over the place.
2022-10-22 15:05:39 +02:00
Robbert van der Helm f3bb816cb5 Add an AsyncExecutor type for use with the GUI 2022-10-22 14:34:32 +02:00
Robbert van der Helm b676353589 Split the nih_plug::context module
So that structs are more logically grouped with their traits.
2022-10-22 14:19:10 +02:00
Robbert van der Helm faa9742eee Rearrange the wrapper context modules
This matches the order in `src/context.rs`.
2022-10-22 14:15:49 +02:00
Robbert van der Helm b1f24bfad9 Reorder Context methods 2022-10-22 13:13:08 +02:00
Robbert van der Helm 5a974219b8 Remove Sync bound from TaskExecutor 2022-10-22 12:31:54 +02:00
Robbert van der Helm 8b53ca2ab0 Mention duplicate tasks in execute_async() 2022-10-22 02:30:13 +02:00
Robbert van der Helm 5ea2377c18 Replace AsyncExecutor with simple closure
This makes everything much simpler. The task type is now defined
directly on `Plugin`.
2022-10-22 02:01:03 +02:00
Robbert van der Helm 84f834abb6 Add AsyncExecutor support to ProcessContext 2022-10-22 02:01:03 +02:00
Robbert van der Helm ec8e99cf44 Require AsyncExecutor tasks to be Send 2022-10-22 00:55:04 +02:00
Robbert van der Helm 6ffa23971e Add AsyncExecutor support to InitContext 2022-10-22 00:21:08 +02:00
Robbert van der Helm 297ad2a83e Add an AsyncExecutor associated type to Plugin
This will make it possible to run background tasks in a type safe way.
Sadly, this does mean that every plugin now needs to define the type
alias and constructor function since Rust does not yet support defaults
for associated types.
2022-10-21 23:52:46 +02:00
Robbert van der Helm 25d20f1950 Add an AsyncExecutor trait for background tasks 2022-10-21 23:52:29 +02:00
Robbert van der Helm 558922c9a9 Add missing doc comments in Plugin 2022-10-21 23:34:59 +02:00
Robbert van der Helm 6ee3aafa91 Move Editor and ParentWindowHandle to a new module 2022-10-21 23:12:05 +02:00
Robbert van der Helm 46094e5249 Explicitly drop Arc::from_raw 2022-10-20 16:28:58 +02:00
Robbert van der Helm f9bdaffc62 Don't require Sync for Plugin
In hindsight there's really no reason to, because process() requires
exclusive access and the other functions won't be called during
processing.
2022-10-20 16:12:50 +02:00
Robbert van der Helm 375262aaa3 Also drop Sync requirement for editor handles 2022-10-20 14:41:53 +02:00
Robbert van der Helm a2a52e0ff1 Drop Sync requirement for Editor 2022-10-20 14:31:48 +02:00
Robbert van der Helm a9b1dd61fd Add state filter method for performing migrations
This allows plugins to migrate old state, for instance when parameter
meanings change, new parameters are introduced, or parameter IDs have
been changed.
2022-10-20 12:45:53 +02:00
Robbert van der Helm bd295b7380 Move nih_plug::param to nih_plug::params 2022-10-20 12:26:12 +02:00
Robbert van der Helm e1269d07b1 Fix references in docs 2022-10-20 12:21:24 +02:00
Robbert van der Helm ee38566d74 Remove unused DPI scale function in standalone 2022-10-20 12:14:26 +02:00
Robbert van der Helm 2a0ed0c5ec Move PersistentField and helpers to dedicated mod
As mentioned in the previous commit's breaking changes entry.
2022-10-20 12:11:04 +02:00
Robbert van der Helm fb71d0fcce Move the Params trait out of params::internals
This makes much more sense, since this trait is a cornerstone of
NIH-plug.
2022-10-20 12:10:35 +02:00
Robbert van der Helm 727d88c4d7 Add ID renaming superpowers to #[nested(...)]
This can now be used for most common use cases where you previously had
to do a manual `Params` implementation, like arrays of parameter objects
and duplicate parameter objects.
2022-10-13 01:28:05 +02:00
Robbert van der Helm 71c7e00f2b Prevent assert_process_allocs on x86_64-pc-windows-gnu
This will result in plugins that hang during their first allocation.
2022-10-05 17:22:29 +02:00
Robbert van der Helm 417a810936 Always use a hyphen in realtime-safe 2022-09-29 16:50:53 +02:00
Robbert van der Helm b8593b03f4 Inline the nih_plug::debug macro docstrings
This makes it easier to browse the module in rustdoc.
2022-09-29 16:50:13 +02:00
Robbert van der Helm cba0bdc21d Document the logging module 2022-09-29 16:46:33 +02:00
Simon Leiner 0bb5662770 Remove dead code 2022-09-29 15:13:43 +02:00
Simon Leiner 2402eada05 Fix typos in productive cod 2022-09-29 15:13:43 +02:00
Simon Leiner 67808fd9ae Fix typos in test names 2022-09-29 15:13:43 +02:00
Simon Leiner 0caef90b1a Fix typos in comments 2022-09-29 15:13:43 +02:00
Simon Leiner f4995abf88 Fix typos in documentation 2022-09-29 15:13:43 +02:00
Simon Leiner 958767acf2 Fix off-by-1 error in VST3 parameter range
Running the VST3 SDK Validator [1] for the midi_inverter plugin shows
one failing test:

    [Scan Parameters]
    Info:  ===Scan Parameters ====================================
    Info:  This component exports 2080 parameter(s)
    Info:     Parameter 000 (id=2147481569): [title="MIDI Ch. 1 CC 0"] [unit=""] [type = F, default = 0.000000, unit = 0]
    Info:     Parameter 001 (id=2147481570): [title="MIDI Ch. 1 CC 1"] [unit=""] [type = F, default = 0.000000, unit = 0]
    Info:     Parameter 002 (id=2147481571): [title="MIDI Ch. 1 CC 2"] [unit=""] [type = F, default = 0.000000, unit = 0]

[...]

    Info:     Parameter 2077 (id=2147483646): [title="MIDI Ch. 16 CC 127"] [unit=""] [type = F, default = 0.000000, unit = 0]
    Info:     Parameter 2078 (id=2147483647): [title="MIDI Ch. 16 Channel Pressure"] [unit=""] [type = F, default = 0.000000, unit = 0]
    ERROR: =>Parameter 2079 (id=-2147483648): Invalid Id!!!
    [XXXXXXX Failed]

The relevant part of the test code [2] looks like this:

    int32 paramId = paramInfo.id;
    if (paramId < 0)
    {
        // Error
    }

This shows that the parameter ID must be INT32_MAX = (1 << 31) - 1 at
most. As far as I see, even Steinberg's own documentation [3] gets
this wrong.

[1]: 55d7ed3c6a/samples/vst-hosting/validator
[2]: 55d7ed3c6a/source/vst/testsuite/general/scanparameters.cpp (L100)
[3]: https://steinbergmedia.github.io/vst3_dev_portal/pages/Technical+Documentation/Parameters+Automation/Index.html
2022-09-29 00:24:41 +02:00
Robbert van der Helm fae7050113 Add helper to compensate smoother for oversampling 2022-09-25 17:37:25 +02:00
Robbert van der Helm fff713d066 Fix resizing with HiDPI standalones 2022-09-22 19:36:43 +02:00
Robbert van der Helm 963d1bd14f Fix bar start position calculation 2022-09-12 14:17:06 +02:00
Robbert van der Helm b883a611ab Fix resizing aux input storage on buffer size
This nested `resize_with()` of course wouldn't resize the inner vectors
of the outer ones were already the correct size.
2022-09-11 16:41:31 +02:00
Robbert van der Helm 4c9a2726f3 Fix s2v_bool_bypass() 2022-09-07 20:43:47 +02:00
Robbert van der Helm cf72a796f4 Fix GUI context state loading in standalones 2022-09-07 18:38:07 +02:00
Robbert van der Helm 910a90d47a Respect assert_process_allocs in standalones
This fixes #29.
2022-09-07 18:29:58 +02:00
Robbert van der Helm 591f3710bd Add missing reset call to standalone init
The plugin versions also do this, and the docs mention that this always
happens.
2022-09-07 18:23:36 +02:00