1
0
Fork 0
Commit graph

420 commits

Author SHA1 Message Date
Robbert van der Helm 41ee117bfa Prepent CLAP states with the length
To avoid having to read in chunks.
2022-03-02 22:25:10 +01:00
Robbert van der Helm 8cc216dc02 Actually support the state extension
That seems sort of useful, you know?
2022-03-02 16:26:47 +01:00
Robbert van der Helm 7e9eadfc64 Implement state handling for CLAP 2022-03-02 16:25:30 +01:00
Robbert van der Helm ec452bd41d Also move state deserialization to a function 2022-03-02 16:00:11 +01:00
Robbert van der Helm 7a3d3b8c8e Move state serialization to a helper function
So we can reuse it for the CLAP wrapper.
2022-03-02 15:49:40 +01:00
Robbert van der Helm bc2332801c Implement the CLAP audio ports extension 2022-03-02 15:16:58 +01:00
Robbert van der Helm 70c81642a5 Implement CLAP audio ports config extension 2022-03-02 14:57:30 +01:00
Robbert van der Helm 78b815fede Add consistent null pointer checks to CLAP wrapper
Just like we do for the VST3 wrapper.
2022-03-02 14:25:26 +01:00
Robbert van der Helm 5b369f6ab5 Re-introduce destructuring assignments
Now that that's landed on the stable compiler.
2022-03-02 02:03:57 +01:00
Robbert van der Helm 29c1b5e5d5 Clear input events in CLAP wrapper 2022-03-02 00:38:25 +01:00
Robbert van der Helm 69a085ddad Handle MIDI events for CLAP 2022-03-02 00:29:50 +01:00
Robbert van der Helm 0d359c344a Fix CLAP step count handling 2022-03-02 00:04:33 +01:00
Robbert van der Helm 37e88d063f Change bypassed Enabled label to Not Bypassed
To remove ambiguity.
2022-03-01 23:55:33 +01:00
Robbert van der Helm 57ed66f8f6 Implement basic CLAP audio processing 2022-03-01 23:50:10 +01:00
Robbert van der Helm 3bd83ca55a Implement CLAP input parameter handling 2022-03-01 19:31:16 +01:00
Robbert van der Helm a58c796fc0 Add an output slices field to Buffer 2022-03-01 15:43:13 +01:00
Robbert van der Helm 6ded3d6f11 Use the thread check extension in the CLAP wrapper 2022-03-01 13:47:06 +01:00
Robbert van der Helm e5edbac2b4 Add comments for potential parameter quirks 2022-03-01 02:15:23 +01:00
Robbert van der Helm 5f1ebca6e6 Implement clap_plugin_params::get_value() 2022-03-01 02:00:12 +01:00
Robbert van der Helm ae3c00d069 Implement CLAP parmater info 2022-03-01 01:54:04 +01:00
Robbert van der Helm 0fd80330bb Move parameter step count to ParamPtr 2022-03-01 01:53:48 +01:00
Robbert van der Helm 1c4a5bc4da Add stubs for the CLAP params extension 2022-03-01 01:27:01 +01:00
Robbert van der Helm af77d45877 Add a Send+Sync wrapper for CLAP object pointers
We'll need this for the extensions.
2022-02-28 20:39:15 +01:00
Robbert van der Helm 12075b1a24 Rename main CLAP plugin wrapper struct to Wrapper 2022-02-28 20:25:49 +01:00
Robbert van der Helm 2750b2a6ad Implement the event loop for CLAP
It cannot yet handle any tasks though.
2022-02-28 20:05:48 +01:00
Robbert van der Helm 4ad972ea23 Add stubs for a CLAP ProcessContext implementation
And the `clap_plugin::active()` function.
2022-02-28 19:45:41 +01:00
Robbert van der Helm 41663a404a Change VST3 wrapper trait bounds to Vst3Plugin
To be consistent with the CLAP wrapper
2022-02-28 19:21:14 +01:00
Robbert van der Helm 6d1e581c26 Partially implement clap_plugin 2022-02-28 19:16:03 +01:00
Robbert van der Helm 0511053b3b Add stubs for the clap_plugin methods 2022-02-28 18:55:33 +01:00
Robbert van der Helm 2e6faaa324 Move plugin descriptor to its own module
Because we also need this in the clap_plugin implementation.
2022-02-28 18:44:03 +01:00
Robbert van der Helm 32a640acf7 Create a clap_plugin instance stub 2022-02-28 18:27:57 +01:00
Robbert van der Helm 0b0876e4a5 Remove entry point debug prints 2022-02-28 18:17:01 +01:00
Robbert van der Helm 560d5fd78f Build the CLAP plugin descriptor
This requires a _lot_ of CStrings.
2022-02-28 17:46:20 +01:00
Robbert van der Helm e718bbd0a4 Capitalize the FACTORY lazy static
To stop the linters from complaining.
2022-02-28 17:30:21 +01:00
Robbert van der Helm 089f1589bf Add the remaining CLAP factory stubs 2022-02-28 16:53:31 +01:00
Robbert van der Helm 31e2480458 Begin clap objects with vtables for pointer casts 2022-02-28 16:50:37 +01:00
Robbert van der Helm 17b51c8920 Remove function pointer transmutes 2022-02-28 16:46:06 +01:00
Robbert van der Helm 0609f89df6 Create a factory stub from the entry point macro
From this point on we should no longer need any of these ugly macros.
2022-02-28 16:31:49 +01:00
Robbert van der Helm 51d7532b87 Add some more use path safety for the clap export 2022-02-28 15:48:26 +01:00
Robbert van der Helm 56c1545196 Add a basic nih_export_clap!() macro
This does not do anything useful yet.
2022-02-28 14:45:31 +01:00
Robbert van der Helm b209c9caf3 Move the event loop to its own module
Now that the context module is becoming larger and larger.
2022-02-28 12:57:01 +01:00
Robbert van der Helm 0675feb54b Keep a reference to WrapperView in WrapperInner 2022-02-27 00:51:41 +01:00
Robbert van der Helm 8ddad4e893 Store the IPlugFrame instance 2022-02-27 00:51:41 +01:00
Robbert van der Helm 95f0183d27 Add VST3 smart pointers for regular objects 2022-02-27 00:51:41 +01:00
Robbert van der Helm dcca3f8bf4 Fix events not working in release builds 2022-02-15 23:11:50 +01:00
Robbert van der Helm 4f0e2b70b5 Rework EnumParam to be a whole lot less sketchy
Now it no longer needs to do any unsound type punning. The internal
parameter that the wrapper has access to has been completely type
erased, and only the outer parameter knows about enum T. This also gets
rid of strum and replaces it with a custom trait.
2022-02-14 15:34:46 +01:00
Robbert van der Helm cf0fb039b0 Add todo about enum value serialization 2022-02-14 02:29:08 +01:00
Robbert van der Helm 39e8dfc83c Add somewhat shady enum parameters 2022-02-14 02:04:17 +01:00
Robbert van der Helm d878fd692a Prefix all marker fields with underscores 2022-02-13 22:58:51 +01:00
Robbert van der Helm ef4c2ad7f9 Add missing #[cfg(test)] 2022-02-13 16:14:26 +01:00
Robbert van der Helm 7d3beb174e Simplify ScopedFtz 2022-02-13 13:51:02 +01:00
Robbert van der Helm e7c3e19519 Add (miri) tests for {u16,}strlcpy() 2022-02-13 13:04:19 +01:00
Robbert van der Helm a70edc8105 Remove now-unnecessary unsafe blocks 2022-02-13 12:47:14 +01:00
Robbert van der Helm f645b6a92f Relicense under the ISC license 2022-02-12 16:04:46 +01:00
Robbert van der Helm 6e1f7930e3 Fix VST3 CID consistency between platforms 2022-02-10 21:31:27 +01:00
Robbert van der Helm 1d6a9aac74 Add a way to fetch a parameter's default value 2022-02-08 23:51:07 +01:00
Robbert van der Helm 0ddfae1dd3 Also mode the factory to its own module
Now you can finally find the thing you're looking for.
2022-02-08 22:32:54 +01:00
Robbert van der Helm 05b9d4dd0b Move the main VST3 wrapper to a module 2022-02-08 22:28:18 +01:00
Robbert van der Helm 02115d5004 Use a patched {egui-,}baseview for X11 GL contexts 2022-02-07 21:58:59 +01:00
Robbert van der Helm ce37ec288e Don't store a GUID in the factory
This isn't actually needed.
2022-02-07 00:19:05 +01:00
Robbert van der Helm c9a5818cb4 Fix Windows entry point names 2022-02-06 23:37:40 +01:00
Robbert van der Helm df76047419 Move the process context to its own module 2022-02-06 18:51:46 +01:00
Robbert van der Helm 37a8f529b0 Move WrapperView to its own module 2022-02-06 18:46:16 +01:00
Robbert van der Helm 9db4c0d691 Move inner wrapper to its own module
We'll need to do this with the other parts as well. Navigating this
module has become practically impossible
2022-02-06 17:50:15 +01:00
Robbert van der Helm 427c7674b9 Move VST3 pointer check macros to a module 2022-02-06 17:40:35 +01:00
Robbert van der Helm 556bec7c0b Move editor handling to its own struct
This makes the API much, much nicer (especially consuming the egui
wrapper), and it also avoids having to lock the plugin instance which is
obviously very bad if the plugin is also supposed to be processing audio
on another thread.
2022-02-06 17:12:57 +01:00
Robbert van der Helm 3ede5ed751 Move the TODO on GUI opening xruns 2022-02-06 15:32:54 +01:00
Robbert van der Helm 3bd3696abe Put the no_alloc guard around entire process call 2022-02-06 15:24:18 +01:00
Robbert van der Helm f644ae8df8 Don't require a write lock to create an editor 2022-02-06 15:22:30 +01:00
Robbert van der Helm 7000e9d42e Don't propagate parameter changes while processing
Let the host do this, this would solve all unsoundness issues and
potential collisions.
2022-02-06 14:15:43 +01:00
Robbert van der Helm 29a9c41389 Delay the process_wrapper() use
The other parts also don't allocate, but parking_lot doesn't play nicely
when spawning an editor thread. In that case its hashmap may get resized
on the audio thread which is not what we want, but it won't cause any
real problems.
2022-02-06 00:51:18 +01:00
Robbert van der Helm 3c867f9305 Allow all platform constants to be unused 2022-02-06 00:22:15 +01:00
Robbert van der Helm 7a6bfa4573 Add a HasRawWindowHandle wrapper struct 2022-02-06 00:22:15 +01:00
Robbert van der Helm b1afe0b224 Downgrade raw-window-handle for baseview compat 2022-02-06 00:22:15 +01:00
Robbert van der Helm 7b14106505 Update local parameters when changing from GUI 2022-02-05 22:26:42 +01:00
Robbert van der Helm 7e240146b7 Implement IPlugView 2022-02-05 18:42:06 +01:00
Robbert van der Helm 895dada6f6 Add window type constants missing from vst3_sys 2022-02-05 18:41:54 +01:00
Robbert van der Helm 2a0fde2fd5 Create a plugview if the plugin has an editor
The plugview, however, is still filled with stubs.
2022-02-05 18:07:03 +01:00
Robbert van der Helm ea8edf2563 Move the editor to the IPlugView instance
This way the RAII make much more sense.
2022-02-05 18:06:52 +01:00
Robbert van der Helm 4c5622cf40 Implement GuiContext for the VST3 wrapper 2022-02-05 17:47:55 +01:00
Robbert van der Helm 9d2ddf016a Add Editor and GuiContext stubs in VST3 wrapper 2022-02-05 17:15:07 +01:00
Robbert van der Helm 3e2dc92b22 Avoid destructuring assignment
Somehow the nightly compiler just lets you do this without needing to
opt in to the unstable feature.
2022-02-05 16:46:29 +01:00
Robbert van der Helm b901dac012 Disambiguate rustdoc link references 2022-02-05 12:56:03 +01:00
Robbert van der Helm bbc190c67f Hold the RwLock guard in the process context
This avoids having to constantly acquire a new lock.
2022-02-04 23:03:11 +01:00
Robbert van der Helm ce3da8ea44 Use a dedicated struct for the process context 2022-02-04 22:55:10 +01:00
Robbert van der Helm 209c19b74f Get rid of lifetime parameters for VST3 wrapper
This lifetime didn't make any sense anyways since these buffers don't
adhere to Rust's lifetime rules. Getting rid of these will let us make
nicer wrappers around the process context.
2022-02-04 22:54:28 +01:00
Robbert van der Helm fdfd1b01c2 Add a function for retrieving the next note event 2022-02-04 15:17:42 +01:00
Robbert van der Helm 0e67c61be0 Store timing along with the note events 2022-02-04 15:17:42 +01:00
Robbert van der Helm 02cf16e9c0 Accept incoming note events 2022-02-04 15:17:42 +01:00
Robbert van der Helm 51dace591d Add an event bus depending on ACCEPTS_MIDI 2022-02-04 15:17:42 +01:00
Robbert van der Helm fc96bb4349 Fix channel map debug assertion 2022-02-03 17:03:33 +01:00
Robbert van der Helm dfb73f6902 Mention the 6 character overflow limit for IDs 2022-02-03 17:02:42 +01:00
Robbert van der Helm e642fb5ff8 Make sure FTZ is always enabled 2022-02-03 16:18:24 +01:00
Robbert van der Helm dfedd7b2c4 Enable assert_no_alloc in debug builds 2022-02-03 15:58:00 +01:00
Robbert van der Helm 0ecec104fb Completely reset smoothing on init or restore 2022-02-02 21:41:20 +01:00
Robbert van der Helm 1336139a65 Update smoothers on init and state restore
Otherwise this would be filled with default values.
2022-02-02 21:33:20 +01:00
Robbert van der Helm 8f89754ba5 Add simple linear parameter smoothing 2022-02-02 21:26:13 +01:00
Robbert van der Helm fced4001c0 Access plain values using the method
Since we're also setting them using the method.
2022-02-02 20:39:04 +01:00
Robbert van der Helm a42649b2de Derive a Default instance for the Buffer
To make Clippy happy.
2022-02-02 20:37:06 +01:00
Robbert van der Helm 13369e4085 Reinitialize the plugin after restoring state
This lets you use the parameters to set fields on the plugin struct
during `initialize()`.
2022-02-02 15:39:55 +01:00
Robbert van der Helm c982ad9599 Avoid duplicate state restores 2022-02-02 15:32:21 +01:00
Robbert van der Helm c8cc6bd26b Re-export all user facing includes 2022-02-02 15:16:10 +01:00
Robbert van der Helm f44597df7c Move the buffer adapter to its own module 2022-02-02 15:01:41 +01:00
Robbert van der Helm 048d69213e Make the buffer own the output slices
This gets rid of a lot of lifetime casting and other unsoundness.
2022-02-02 14:41:35 +01:00
Robbert van der Helm 58736f5cc8 Add a super unsafe channel buffer adapter
To avoid having to perform lifetime magic here, this buffer needs to own
the slices and be stored as part of the RwLock.
2022-02-02 13:02:28 +01:00
Robbert van der Helm 7752ce6771 Add symmetrically and asymmetrically skewed ranges
This is super useful. I'm sure the symmetrical implementation can be
optimized a lot, but my math-fu was not strong enough today.
2022-02-01 23:37:28 +01:00
Robbert van der Helm 4aa85b43b4 Move parameter implementation details to a module 2022-02-01 21:01:28 +01:00
Robbert van der Helm 6bb83061dd Rename the params module to param
It's a heterogeneous module, and splitting the ranges to their own
module will be a bit weird otherwise.
2022-02-01 20:51:22 +01:00
Robbert van der Helm 473447179f Handle idempotent latency changes 2022-02-01 17:17:10 +01:00
Robbert van der Helm e2e2c59d34 Pass the process context to the plugin 2022-02-01 17:09:23 +01:00
Robbert van der Helm 3a1fbed4c3 Mark MainThreadExecutor::execute as unsafe
This should only be called from the main thread. Otherwise the API's
threading guarantees will not be upheld.
2022-02-01 17:01:05 +01:00
Robbert van der Helm 459175b470 Call the component handler for restarts 2022-02-01 16:59:11 +01:00
Robbert van der Helm 223d0c3a90 Take a reference to the component handler 2022-02-01 16:52:55 +01:00
Robbert van der Helm d47aac25a1 Rearrange WrapperInner parameters 2022-02-01 16:40:51 +01:00
Robbert van der Helm 565d9259c3 Use weak references to the executor
So this cyclic reference can't keep it alive.
2022-02-01 15:31:16 +01:00
Robbert van der Helm f009384c2f Don't require Arcs for ProcessContext
It makes more sense to pass this as a reference, so the plugin cannot do
weird things with it.
2022-01-31 23:47:54 +01:00
Robbert van der Helm 22995df7ea Actually only calculate hashes once 2022-01-31 22:42:36 +01:00
Robbert van der Helm 7c57ac6737 Fix typo in hash overflow warning 2022-01-31 22:39:11 +01:00
Robbert van der Helm 0aad790fd7 Fix deserializing boolean parameters 2022-01-31 22:32:20 +01:00
Robbert van der Helm 85db4d82df Fix param_id_to_hash name
These were swapped for some reason.
2022-01-31 22:24:07 +01:00
Robbert van der Helm 880ee92a47 Drop param_id_to_hash
As it turns out, it's redundant (and also had the opposite name).
2022-01-31 22:23:29 +01:00
Robbert van der Helm fe8f1d27d6 Use a stable ordering for the parameters
As the fields are specified on the parameters struct.
2022-01-31 22:20:09 +01:00
Robbert van der Helm 260d38580b Warn on parameter hash overflow 2022-01-31 21:34:36 +01:00
Robbert van der Helm 4734a51440 Move wrapper data to an inner struct
This fixes the soundness issue with the use of Arc. Moving a `Box` to an
`Arc` frees the old boxed data, and the internal reference counting
would also try to free that. As an added benefit, we no longer need the
unsafe Send+Sync implementation for the event loop.
2022-01-31 20:18:12 +01:00
Robbert van der Helm 6c518fad9d Add stubs for using the event loop in VST3 wrapper 2022-01-31 19:47:16 +01:00
Robbert van der Helm 4495064558 Redesign the wrapper's interiors for thread safety
There are a lot of locks needed now here, but none of them should be
contended. This is much better than potentially having RefCell's blow up
due to simultaneous mutable borrows, and the Arc is needed for the event
loop.
2022-01-31 19:44:02 +01:00
Robbert van der Helm 1a2c90fdfd Set the VST3 parameter step counts 2022-01-31 13:33:30 +01:00
Robbert van der Helm 6494d1ed5f Store persistent fields as plain JSON strings
On second thought, this is much better. The resulting file size will be
much smaller because only double quotes need to be escaped. It's also
easier to read at a glance.
2022-01-30 18:23:13 +01:00
Robbert van der Helm 3111d75b29 Serialize custom persistent fields as base64
This still takes up more space than plain JSON would, but I don't know
if serde_json would allow inlining that JSON. Presumably not. It would
get hairy quickly as a regular embedded JSON string due to the encoding.
2022-01-30 18:15:01 +01:00
Robbert van der Helm 29a0f83163 Add a TODO on packing stored state 2022-01-30 17:29:25 +01:00
Robbert van der Helm f0ea9e9451 Fix broken rustdoc links 2022-01-30 17:17:34 +01:00
Robbert van der Helm 486fc67a4b Serialize persistent fields for VST3 plugins 2022-01-30 17:09:18 +01:00
Robbert van der Helm b76b6e4a9b Add boolean parameters 2022-01-30 02:17:40 +01:00
Robbert van der Helm 7feb8006ef Persist the bypass parameter 2022-01-30 02:04:35 +01:00
Robbert van der Helm 16238f1e00 Support VST3 parameter flushes 2022-01-30 01:50:22 +01:00
Robbert van der Helm 6ddae6a506 Handle the output channel map
I apparently committed this a bit too early.
2022-01-30 01:43:40 +01:00
Robbert van der Helm 0c24398234 Target vst3-sys fork with better pointer semantics 2022-01-30 01:37:10 +01:00
Robbert van der Helm 902c3b2bf6 Upgrade vst3-sys dependency 2022-01-29 20:54:52 +01:00
Robbert van der Helm 3019f7aea6 Add a way to create VST3 bundles after building 2022-01-29 18:38:09 +01:00
Robbert van der Helm 47d102f2ba Implement restoring parameter values 2022-01-29 16:42:20 +01:00
Robbert van der Helm ebb74a737c Use plain instead of unnormalized in the APIs
It takes more effort than what should be needed to tell normalized and
unnormalized apart at a glance.
2022-01-29 14:54:48 +01:00
Robbert van der Helm 97a88e0db2 Implement saving parameter state
Restoring is next.
2022-01-29 14:20:14 +01:00
Robbert van der Helm f5f143b4f0 Read updated parmater values from the process data 2022-01-29 01:01:14 +01:00
Robbert van der Helm 59b1132d3b Mark hyperlinks in doc comments 2022-01-28 18:10:28 +01:00
Robbert van der Helm 6b7acb7cb5 Add TODO for wrapping parameter access in a mutex 2022-01-28 17:58:40 +01:00
Robbert van der Helm e393b3e268 Add a todo for handling incoming parameter changes 2022-01-28 17:58:40 +01:00
Robbert van der Helm 7d0fce2f84 Implement audio processing 2022-01-28 17:58:40 +01:00
Robbert van der Helm 38bcf33a50 Use the precalculated bypass parameter hash 2022-01-28 14:52:04 +01:00
Robbert van der Helm 6439acad84 Use the correct vendor name 2022-01-28 14:20:16 +01:00
Robbert van der Helm b14dc7eae9 Avoid duplicate units in VST3 parameter strings 2022-01-28 14:06:51 +01:00
Robbert van der Helm 47f84081dd Use a macro for the null pointer checks 2022-01-28 13:45:17 +01:00
Robbert van der Helm b9d38f5c39 Implement most of IAudioProcessor
Except for the process function itself.
2022-01-28 13:40:47 +01:00
Robbert van der Helm a34293fbb4 Silence too_many_arguments Clippy lint in wrapper
Aside from wrapping everything in another struct we can't really do
anything about this since this is all generated by the VST3 macro.
2022-01-28 13:39:44 +01:00
Robbert van der Helm 5e17b2190a Add null pointer checks to the VST3 wrapper 2022-01-27 22:51:49 +01:00
Robbert van der Helm 91e20f1230 Don't internally use param string IDs in wrapper
This avoids a layer of indirection for every parameter lookup using a
hash.
2022-01-27 22:36:46 +01:00
Robbert van der Helm 217b28fdca Move VST3 categories and class ID to a new trait
Makes more sense than having this in either the general plugin trait or
as part of the macro.
2022-01-27 22:13:13 +01:00
Robbert van der Helm b5636ef556 Implement the rest of IEditController 2022-01-27 19:55:24 +01:00
Robbert van der Helm 1f0dbdbbec Clean up parameter access conditionals
I forgot this works as an else if
2022-01-27 19:36:36 +01:00
Robbert van der Helm 338abf7367 Implement IEditController::getParamValueByString() 2022-01-27 19:30:42 +01:00
Robbert van der Helm d357add75a Implement most of the VST3 parameter handling 2022-01-27 00:19:50 +01:00
Robbert van der Helm 186a924104 Implement a JUCE-compatible Rabin fingerprint 2022-01-26 23:35:01 +01:00
Robbert van der Helm 22be850d9e Implement IPluginFactory2 and IPluginFactory3 2022-01-26 22:23:44 +01:00
Robbert van der Helm 35cf7ffc1d Implement IComponent 2022-01-26 21:12:13 +01:00
Robbert van der Helm 4014d83a9b Allow creating VST3 plugin instances 2022-01-26 21:12:02 +01:00
Robbert van der Helm a959f7a2ad Add an UTF-16 equivalent for strlcpy() 2022-01-26 21:02:52 +01:00
Robbert van der Helm 19b51df357 Implement IPluginFactory up to creating instances 2022-01-26 20:05:51 +01:00
Robbert van der Helm dc6db232ed Pass a CID to the VST3 export macro
Seems much less prone to breakage than generating them, since this way
the programmer has full control.
2022-01-26 19:20:39 +01:00
Robbert van der Helm bd2e0eca0c Add a strlcpy implementation 2022-01-26 19:18:31 +01:00
Robbert van der Helm fa782ff938 Add a stub plugin factory implementation 2022-01-26 18:14:54 +01:00
Robbert van der Helm 070e68c084 Move nih_plug to the repo's root
Makes more sense to have this be on the same level as the workspace
since technically this crate can be used separately.
2022-01-26 12:52:57 +01:00