1
0
Fork 0
Commit graph

707 commits

Author SHA1 Message Date
Robbert van der Helm 1d3ac1b2af Move param setting functions to new ParamMut trait
This makes things slightly less confusing because these functions should
never be called from user code.
2022-05-01 18:45:35 +02:00
Robbert van der Helm a17c63bf71 Add parameter getters for unmodulated values
This is needed to be able to support modulation events in CLAP. There an
offset gets applied to the parameter's actual current value. That way
GUIs don't have to move around when parameters are being modulated and
save states cannot get influenced by modulation.
2022-05-01 18:30:30 +02:00
Robbert van der Helm 6451555f85 Add missing #[inline] attribute 2022-05-01 17:56:20 +02:00
Robbert van der Helm 2026257561 Get rid of Default implementations on ranges
These also don't make any sense anymore and will likely lead to more
problems than they solve.
2022-05-01 17:40:53 +02:00
Robbert van der Helm d6bdfd7391 Get rid of Default implementations for params
These don't make any sense anymore with the builder API.
2022-05-01 17:40:26 +02:00
Robbert van der Helm cd628e80ee Store normalized values on the param structs
This will be necessary to implement CLAP modulation later.
2022-05-01 17:34:59 +02:00
Robbert van der Helm 54d2a4cd2c Hide param fields other than value and smoothed
Direct initialization was no longer recommended anyways since now you
need to keep the default value in sync. The next couple of commits will
add a normalized value field and two more fields to help with
modulation.
2022-05-01 17:08:08 +02:00
Robbert van der Helm 40b555bfbd Document how values work in the Param trait 2022-05-01 16:40:18 +02:00
Robbert van der Helm 48d0f87e4c Mark param value getters as inline 2022-05-01 16:40:16 +02:00
Robbert van der Helm 98876670f8 Re-export debug macros from the debug module
This makes it easy to import just the macros without having to use the
oldschool `#[macro_use] extern crate ...;` syntax.
2022-04-30 02:10:54 +02:00
Robbert van der Helm 3d454bfc9c Don't process audio at all with invalid buffers
If the host does some kind of flush this way with num_samples > 0 but
without any outputs or with zero output channels then we should not try
to read from the now invalid pointers from the previous cycle.
2022-04-30 02:00:09 +02:00
Robbert van der Helm ddc28eef5e Clarify the VST3 output .take(num_outputs) 2022-04-30 01:52:53 +02:00
Robbert van der Helm e35886c216 Move window function handling out of StftHelper
And apply the window function only once at the end of the process
function for the plugins that used it.
2022-04-28 17:20:39 +02:00
Robbert van der Helm 4fb67a720b Add a todo for fallback DPI scale detection 2022-04-27 19:26:39 +02:00
Robbert van der Helm b89b4dfbb2 Add a .previous_value() method to the smoothers 2022-04-27 17:43:40 +02:00
Robbert van der Helm 6185909ddf Also safeguard against zero channel counts in CLAP 2022-04-27 17:06:19 +02:00
Robbert van der Helm 21e28fdca2 Handle hosts providing zero output channels 2022-04-27 16:52:30 +02:00
Robbert van der Helm afde489bbf Add a fixme for REAPER's broken bypass handling 2022-04-27 16:45:34 +02:00
Robbert van der Helm 76e7f67f3a Add missing backtick 2022-04-27 15:16:52 +02:00
Robbert van der Helm bb3175f68e Return -> Returns at the start of a docstring
The imperative tense doesn't make any sense when the function is a mere
getter and doesn't actually perform a nontrivial task.
2022-04-26 19:39:51 +02:00
Robbert van der Helm abe5a12461 Add a nih_dbg!() macro analog for dbg!() 2022-04-26 15:43:24 +02:00
Robbert van der Helm dedbfebb71 Add todos about potential duplicate reset calls 2022-04-26 14:15:57 +02:00
Robbert van der Helm 4779991edf Also move reset() call to process start for CLAP
So the behavior is consistent for CLAP and VST3.
2022-04-26 14:14:12 +02:00
Robbert van der Helm 4ac0c40812 Reset last processing status for CLAP on start
Just like we're doing in the VST3 wrapper.
2022-04-26 14:10:00 +02:00
Robbert van der Helm 582ab50e58 Move VST3 Plugin::reset() call to set_processing()
This lets the host reset buffers the intended way.
2022-04-26 13:42:32 +02:00
Robbert van der Helm f855a60c57 Fix rustdoc link in Plugin::reset() 2022-04-26 13:37:53 +02:00
Robbert van der Helm 7c5aa9069b Simplify lifetime bounds 2022-04-24 20:03:30 +02:00
Robbert van der Helm 04c5780e4a Implement state saving/loading for standalone 2022-04-24 19:46:51 +02:00
Robbert van der Helm 566095802c Decouple state functions from CLAP/VST3 wrapper
This should also be usable with a plain `params` object, since we don't
need hashes in the standalone wrapper.
2022-04-24 19:46:07 +02:00
Robbert van der Helm 9acd312768 Parmaeters are not real, they can't hurt you 2022-04-24 19:46:07 +02:00
Robbert van der Helm 8714310468 Silence dead code warnings in standalone wrapper
These were kept in as a reminder, but since standalone has been merged
into master these should be silenced as there are relevant TODOs for the
missing features in place already.
2022-04-24 18:18:11 +02:00
Robbert van der Helm 084d34fe5c Set up the logger for the standalone target 2022-04-24 15:50:17 +02:00
Robbert van der Helm 60593e7cc3 Close standalone when process returns an error
For this to work the resize mutex has been replaced with a channel for
sending tasks.
2022-04-24 15:48:42 +02:00
Robbert van der Helm 5d481e59f1 Call the process function in the standalone target
Although there's no functional backend yet.
2022-04-24 15:48:42 +02:00
Robbert van der Helm ae24ed4c4d Move standalone audio thread to a function 2022-04-24 15:48:42 +02:00
Robbert van der Helm 19d4b73039 Implement parameter changes for standalone target
Changing parameters from an editor now works just like in the other
targets.
2022-04-24 15:48:42 +02:00
Robbert van der Helm 9e40ec11fe Print a message about IO being unimplemented 2022-04-24 15:48:42 +02:00
Robbert van der Helm 8cb763246b Add an audio thread for the standalone target 2022-04-24 15:48:42 +02:00
Robbert van der Helm 81e56dd018 Abstract the IO backend for the standalone wrapper 2022-04-24 15:48:42 +02:00
Robbert van der Helm 8ba60eeab9 Implement resizing for standalone editor window 2022-04-24 15:48:42 +02:00
Robbert van der Helm da86d1c6b1 Open a basic baseview window for standalone target 2022-04-24 15:48:41 +02:00
Robbert van der Helm 6c84fec09e Add a (not yet functional) standalone run function 2022-04-24 15:48:05 +02:00
Robbert van der Helm f838062d72 Don't use an Arc for the CLAP editor 2022-04-24 15:48:05 +02:00
Robbert van der Helm e90bacffb5 Print initialization errors in standalone 2022-04-24 15:48:05 +02:00
Robbert van der Helm 261594a478 Initialize the standalone target 2022-04-24 15:48:05 +02:00
Robbert van der Helm cf3745a4e1 Somewhat clarify initialize_block_smoothers()
This function is meant to be called by the plugin itself, it only lives
in the plugin trait to make using it more convenient.
2022-04-24 15:48:05 +02:00
Robbert van der Helm 42548ef5d1 Update standalone target todos 2022-04-24 15:48:05 +02:00
Robbert van der Helm 96ec1da037 Export the standalone target for gain_gui_vizia 2022-04-24 15:48:05 +02:00
Robbert van der Helm f3db4a9ed0 Add a (not yet functional) standalone exporter 2022-04-24 15:48:05 +02:00
Robbert van der Helm 532ffca768 Permit allocations in debug and tracing messages
Otherwise debugging becomes a lot more difficult when using the
assert_no_alloc feature.
2022-04-24 15:43:23 +02:00
Robbert van der Helm f895a27136 Simplify known VST3 note expression match 2022-04-24 15:31:02 +02:00
Robbert van der Helm 54bab5ff6d Add an nih_trace!() macro 2022-04-24 15:30:38 +02:00
Robbert van der Helm 3264bee810 Include locations in assertion failure messages 2022-04-24 15:27:59 +02:00
Robbert van der Helm 015c554d79 Register the loggers for VST3 and CLAP plugins 2022-04-24 15:24:35 +02:00
Robbert van der Helm 5ae0bee3ee Use the new logger for the debug macros 2022-04-24 15:20:25 +02:00
Robbert van der Helm 88260c55c7 Log on lower verbosity in release builds
This will also strip away information.
2022-04-24 15:08:55 +02:00
Robbert van der Helm 3b0291b4f5 Add function for setting up file and windbg logs
And also writing panics to those logs.
2022-04-24 15:08:48 +02:00
Robbert van der Helm a79099f573 Work around Bitwig VST3 note expressions bug
Bitwig will only send these note expression events if the plugin claims
to support at least one custom note expression type, and if it returns
`kResultOk` on `INoteExpressionController::get_note_expression_info()`
when the expression ID is equal to the note expression type (even though
these are out of range, since this index argument is supposed to be a
linear index from `0..count`).
2022-04-23 15:00:30 +02:00
Robbert van der Helm 3361c4454b Define constants for VST3 note expression types 2022-04-23 14:49:19 +02:00
Robbert van der Helm 83f9ce3608 Add a todo for a standalone target 2022-04-21 21:30:04 +02:00
Robbert van der Helm b88707769a Add a way to find out the current plugin API 2022-04-21 21:27:36 +02:00
Robbert van der Helm 2bc77ed691 Work around vst3-sys not allowing #[cfg()] fields 2022-04-20 20:44:07 +02:00
Robbert van der Helm 6ae05eb01b Log assertion failure if a VST3 resize is denied 2022-04-20 20:35:44 +02:00
Robbert van der Helm 8966ca5280 Fix C++ interface pointer transmutes
These are supposed to be pointers to vtable pointers.
2022-04-20 20:25:59 +02:00
Robbert van der Helm 5d343f7873 Also perform resize requests using the run loop 2022-04-20 19:52:02 +02:00
Robbert van der Helm 98924a5728 Use the host's run loop to handle VST3 tasks 2022-04-20 19:51:26 +02:00
Robbert van der Helm 37b62e4278 Add an IRunLoop event runner on Linux 2022-04-20 19:44:03 +02:00
Robbert van der Helm 4fa54ceabe Add an object for implementing IEventLoop
We can't do this directly on WrapperView because of vst3-sys
limitations.
2022-04-20 17:18:41 +02:00
Robbert van der Helm f3bb552cfe Get a reference to the host's IRunLoop 2022-04-20 17:03:15 +02:00
Robbert van der Helm 55aabcea31 Add a note for PolyPressure + MPE 2022-04-20 16:48:37 +02:00
Robbert van der Helm 8eaecb6e5c Add a way to completely exclude the vst3-sys dep
Because technically you might still include GPL'd symbols even if you
wouldn't use the `nih_export_vst3!()` macro.
2022-04-15 16:14:42 +02:00
Robbert van der Helm 0fd9a68146 Move u16strlcpy to the VST3 wrapper utils module 2022-04-15 16:13:14 +02:00
Robbert van der Helm 7b24dea719 Clarify param_map() docstring 2022-04-13 20:20:27 +02:00
Robbert van der Helm 877eeadc7f Add a todo for implementing FTZ for AArch64 2022-04-12 02:08:41 +02:00
Robbert van der Helm 54db43f48d Fix c_char usage on AArch64
Apparently char is unsigned on AArch64.
2022-04-12 02:06:29 +02:00
Robbert van der Helm 3c69fb72cf Make parameter names owned
That way you can generate parameters with custom `Params`
implementations.
2022-04-11 23:27:36 +02:00
Robbert van der Helm ad50852aeb Fix CLAP event output struct sizes 2022-04-11 20:53:25 +02:00
Robbert van der Helm 5e486ab3d9 Explicitly handle 0 channel IO
Instead of treating it as a flush. This is needed for note effect
plugins.
2022-04-11 20:46:51 +02:00
Robbert van der Helm e0c5a3f5e4 Fix default accepts_bus_config implementation
This should use the constants.
2022-04-11 20:46:51 +02:00
Robbert van der Helm 65d87f87ed Add a way to output note events
This supports all note events supported by NIH-plug, and both CLAP and
VST3.
2022-04-11 20:46:51 +02:00
Robbert van der Helm 1f8db9d9c2 Mention NoteEvents being zero indexed 2022-04-11 19:48:07 +02:00
Robbert van der Helm 8219d5f2b8 Add an example for next_event() 2022-04-11 18:25:01 +02:00
Robbert van der Helm e4606918e7 Rename next_midi_event() to next_event() 2022-04-11 18:15:14 +02:00
Robbert van der Helm 329d1a63ab Use $crate in the macros to refer to other macros
So you don't need to import all of them for them to work.
2022-04-11 17:44:54 +02:00
Robbert van der Helm 4e5afc152a Add a basic docstring to the Params module 2022-04-11 17:38:20 +02:00
Robbert van der Helm 1e12fbe3f5 Add a feature flag to enable doc_auto_cfg 2022-04-11 16:41:09 +02:00
Robbert van der Helm c3b1ded35b Fix links in docs 2022-04-11 16:23:34 +02:00
Robbert van der Helm 84d91d8826 Update dependencies for CLAP
The signature for this function was incorrect.
2022-04-11 16:18:39 +02:00
Robbert van der Helm 5b5bbf19f7 Prefix all polyphonic expressions with Poly
Makes it much more obvious that they're polyphonic at a glance.
2022-04-11 15:57:27 +02:00
Robbert van der Helm 63ad2b2cb8 Parse redundant CLAP MIDI events just in case 2022-04-11 15:56:33 +02:00
Robbert van der Helm 476dfb9f81 Fix compilation failure from f0303fe 2022-04-09 12:12:34 +02:00
Robbert van der Helm 33c2d8288b Don't warn on parameter hash overflow
But do mention overflows in the duplicate parameter warning.
2022-04-09 11:47:23 +02:00
Robbert van der Helm f0303fed4b Remove now unnecessary input events sort
This was added in anticipation of having to merge the parameter change
MIDI CC events into the events stream, but VST3 threw a curveball and
now we need to do the sorting one step earlier.
2022-04-09 11:32:20 +02:00
Robbert van der Helm 52d7b47a24 Improve block splitting transport information
Don't do any recomputations at the start of the buffer, and also
recompute the bar positions and numbers.
2022-04-08 23:10:38 +02:00
Robbert van der Helm 8db35aaf9d Remove notes about VST3 support for events 2022-04-08 20:59:46 +02:00
Robbert van der Helm c082085711 Remove todo about adding more event types 2022-04-08 20:57:52 +02:00
Robbert van der Helm 1a8f81e4c0 Support MIDI CCs, aftertouch, pitch bend for VST3
This required rewriting the way events and parameter changes are handled
for VST3 by putting them all in a single sorted array, because we can
now no longer read directly from the host's events list because we also
need to mix these new generated MIDI CC events in with it.
2022-04-08 20:53:32 +02:00
Robbert van der Helm 059c733b78 Handle predefined VST3 note expressions 2022-04-08 17:49:13 +02:00
Robbert van der Helm 2a4a61947f Update reasoning for clearing last param ID bit 2022-04-08 00:02:28 +02:00
Robbert van der Helm 9740246d0a Always sort VST3 note events in prep for CCs
So we won't forget to add this then. CC messages come from the parameter
change queues while regular note event messages come from another queue,
so they need to be merged into one sorted queue.
2022-04-07 23:57:56 +02:00
Robbert van der Helm 4abefe23cf Mention lack of VST3 support for new note events 2022-04-07 23:37:49 +02:00
Robbert van der Helm 24837d1552 Implement full MIDI support for CLAP 2022-04-07 23:28:31 +02:00
Robbert van der Helm 0b3a5cd297 Support all of the CLAP expression types
These aren't supported for VST3 yet, we'll need to register note
expression controllers for that.
2022-04-07 21:17:31 +02:00
Robbert van der Helm b9a10455bb Add polyphonic aftertouch support 2022-04-07 20:55:31 +02:00
Robbert van der Helm 1141616466 Replace ACCEPTS_MIDI bool with new enum
So we can gate future MIDI CC support behind an additional option since
this involves more work on the VST3 side.
2022-04-07 20:27:37 +02:00
Robbert van der Helm 8f359feadb Store velocity as a float
Instead of converting this to a 0-127 value. We may be throwing away
precision otherwise.
2022-04-07 20:12:30 +02:00
Robbert van der Helm 2af3f84416 Rename State to PluginState
Now that it is part of the public API.
2022-04-07 17:39:34 +02:00
Robbert van der Helm 84bac0a47c Spool param rescan call to the GUI thread
Otherwise the CLAP example host std::terminates, and we can also reuse
the existing restart task for the VST3 wrapper.
2022-04-07 17:25:12 +02:00
Robbert van der Helm d0064f87d6 Add state saving and restoring through GuiContext
While preventing any possible data races.
2022-04-07 17:19:24 +02:00
Robbert van der Helm 7ca855b3fc Make State cloneable
This is needed for user preset support.
2022-04-07 16:50:02 +02:00
Robbert van der Helm 083885a40c Rework Params trait API with Arc instead of Pin
This is a breaking change requiring a small change to plugin
implementations.

The reason why `Pin<&dyn Params>` was used was more as a hint to
indicate that the object must last for the plugin's lifetime, but `Pin`
doesn't enforce that. It also makes the APIs a lot more awkward.
Requiring the use of `Arc` fixes the following problems:

- When storing the params object in the wrapper, the `ParamPtr`s are
  guaranteed to be stable.
- This makes it possible to access the `Params` object without acquiring
  a lock on the plugin, this is very important for implementing
  plugin-side preset management.
- It enforces immutability on the `Params` object.
- And of course the API is much nicer without a bunch of unsafe code to
  work around Pin's limitations.
2022-04-07 15:31:46 +02:00
Robbert van der Helm 7cc05fce9a Use crate instead of super for prelude reexports 2022-04-07 14:13:03 +02:00
Robbert van der Helm 54371fb488 Expose the State object
So we can later allow plugins to save and restore state from their GUI
this way.
2022-04-07 14:12:53 +02:00
Robbert van der Helm b1c34146ee Get rid of automatically generated bypass params
I thought these were mandatory in VST3, they are not.
2022-04-06 13:34:32 +02:00
Robbert van der Helm a49393f863 Update for CLAP 0.24 2022-04-05 16:32:00 +02:00
Robbert van der Helm 98d725d24f Add an Iterator implementation for smoothers 2022-04-04 17:58:25 +02:00
Robbert van der Helm 6f01097b03 Add mapped next_block() functions for smoothers 2022-04-04 17:44:49 +02:00
Robbert van der Helm f301726f37 Fix sample accurate automation for VST3 2022-03-29 00:56:04 +02:00
Robbert van der Helm 7b9eff456c Update for new vizia resize patch
This version uses a property on the context instead of events. This gets
rid of all of the problems and complexity of the previous
implementation.
2022-03-29 00:02:11 +02:00
Robbert van der Helm c568e5d3be Don't wait for the request resize result
We'll need to find a workaround for this, but this makes resizing in the
CLAP example host way too slow.
2022-03-28 00:50:08 +02:00
Robbert van der Helm f3330aee86 Implement the resize request callback for CLAP 2022-03-27 23:11:04 +02:00
Robbert van der Helm f9db59f4bc Add a resize request callback to VST3 GuiContext
With some more work in baseview this can be used to resize windows from
the plugin.
2022-03-27 19:23:43 +02:00
Robbert van der Helm 8d71369b2e Rename .is_bypass() to .make_bypass()
Because just like `.bypass()` sounds like a getter, so does
`.is_bypass()`.
2022-03-27 03:45:06 +02:00
Robbert van der Helm f37974448d Change naming convention for formatters
This still isn't idea, but at least it's less ambiguous than it was
before this.
2022-03-27 03:43:39 +02:00
Robbert van der Helm 47a96ee02b Fix broken rustdoc links 2022-03-27 03:32:45 +02:00
Robbert van der Helm 7f365d1113 Update dependencies 2022-03-25 21:04:48 +01:00
Robbert van der Helm 9c608c77f9 Add formatters for bypass parameters 2022-03-23 17:42:48 +01:00
Robbert van der Helm 8090d0ae41 Add explicit bypass parameter handling
Plugins can mark a `BoolParam` with `.is_bypass()`. Hosts can then link
use that parameter directly in their own UI.
2022-03-23 17:42:48 +01:00
Robbert van der Helm 3d7a23c812 Expose steps_left on the smoothers 2022-03-23 16:50:09 +01:00
Robbert van der Helm 0cb26b5b4c Don't process audio for bypassed plugins 2022-03-23 15:49:34 +01:00
Robbert van der Helm c6a34a63c4 Hide non-automatable parameters 2022-03-23 13:52:23 +01:00
Robbert van der Helm e9983cf71c Use ParamFlags::NON_AUTOMATABLE in the wrappers
Setting this will cause the parameter to be hidden from the host's
generic UI and automation lanes.
2022-03-23 13:11:00 +01:00
Robbert van der Helm a1be942d6d Add flags to control parameter visibility
For the host and in generic UIs. These aren't wired up to anything yet.
2022-03-23 13:04:14 +01:00
Robbert van der Helm 9e3149b931 Move ParamPtr to the prelude 2022-03-23 12:46:46 +01:00
Robbert van der Helm b0ba815514 Fix -inf in gain to Db conversion 2022-03-21 19:17:41 +01:00
Robbert van der Helm a1cb362dda Fix subtract with overflow in Hz->kHz formatter
When supplying a short input value without a unit.
2022-03-21 15:00:03 +01:00
Robbert van der Helm 2911efaa79 Don't treat invalid inputs as center panning 2022-03-21 14:56:50 +01:00
Robbert van der Helm b516e5341e Fix the f32_hz_then_khz formatter 2022-03-21 14:47:30 +01:00
Robbert van der Helm 0f60ce9609 Clean up i32 note formatters 2022-03-21 14:40:17 +01:00
Robbert van der Helm e90bfecc0b Add a matching from_f32_hz_then_khz function 2022-03-21 14:28:28 +01:00
Robbert van der Helm 44aa3dd564 Clean up the f32_hz_then_khz formatter 2022-03-21 14:17:16 +01:00
Robbert van der Helm 2af93436a6 Clean up panning formatters 2022-03-21 14:14:24 +01:00
Robbert van der Helm 8344645523 Rename lin_to_db formatter to gain_to_db
And use the existing functions from the util module.
2022-03-21 13:59:31 +01:00
Robbert van der Helm 71dba0fbed
Merge pull request #5 from Fredemus/feature/more-formatters
a few more formatters
2022-03-21 13:54:32 +01:00
Robbert van der Helm 30b913e159 Don't use direct Param initialization in exmaples
Since you now also need to specify the default field you probably
shouldn't use this anymore.
2022-03-21 13:29:03 +01:00
Robbert van der Helm 40d99a5cb3 Automatically implement Param::set_normalized_value() 2022-03-21 13:28:59 +01:00
Robbert van der Helm 021d175264 Use a default implementation for Param::normalized_value() 2022-03-21 13:28:59 +01:00
Robbert van der Helm f084f14095 Refactor GUIs to use param's own default value
This removes the need to pass a lot of these `ParamSetter`s and
`GuiContext`s around. We also don't need explicit events to reset a
parameter anymore since you can get this information from the parameter
itself.
2022-03-21 13:11:36 +01:00
Robbert van der Helm a844051054 Store defaults on Param objects
And add methods for querying them.
2022-03-21 12:49:59 +01:00
Fredemus 8bbcb1a093 add panning formatter 2022-03-20 21:37:50 +01:00