Commit graph

20439 commits

Author SHA1 Message Date
Paul Davis
2aa7dd42ea lv2: plugins get an iterator to (sometimes|often) speed up ::get_grid() calls 2023-07-15 11:30:40 -06:00
Paul Davis
ea2d2b4760 temporal: rename ::get_grid_with_iterator()
Because I like polymorphism
2023-07-15 11:23:45 -06:00
Paul Davis
b2a57108c3 actually reserve space for click grid points, to void RT memory allocation 2023-07-15 11:08:45 -06:00
Paul Davis
422fa7255b temporal: further extensions to GridIterator API to handle bar_mod/beat_div parameters
Also try to comment class definition to add a little clarity
2023-07-15 11:08:45 -06:00
Paul Davis
cbaa335946 temporal: some cleanup of the GridIterator API 2023-07-14 21:32:40 -06:00
Robin Gareus
a857a0af4d
Update Luabindings for new TempoMap API 2023-07-14 23:48:13 +02:00
Paul Davis
509efdb290 temporal: refactor ::get_grid() for performance reasons
the API now provides the option to call ::get_grid() with an iterator which may
be re-used on subsequent calls. This avoids unbounded O(N) "walks" from the
marker preceding the start point of the grid to the start point.

This commit also includes "fast-path" code for the common case of a single
tempo and single meter
2023-07-14 13:03:36 -06:00
Paul Davis
81384537ef temporal: remove useless _floating member and API from TempoMapPoint 2023-07-14 13:03:36 -06:00
Paul Davis
ed43ac3a28 remova Lua version of count_bars() since it is not longer in TempoMap 2023-07-14 13:03:36 -06:00
Paul Davis
039f2d5d0e remove TempoMap::count_bars()
It's the only place in libtemporal that would require
a TempoMapPoints allocation, and there's no reason to do
this inside the library.
2023-07-14 13:03:36 -06:00
Paul Davis
52f1b88749 temporal: remove ill-conceived lookup tables from tempo map (never publically visible)
These were not thread safe, and could not be: to be useful, a thread looking up a time
conversion could cache the result, but it would be using the global (shared) copy
of the map (because lookup is read-only, and so no write-copy is required). But
inserting into the lookup table wasn't lock protected (and shouldn't be because otherwise
that defeats the point of RCU).

So just drop it.
2023-07-14 13:03:26 -06:00
Robin Gareus
f2c5f9da25
Lua: allow to reserve STL vector size 2023-07-12 18:23:51 +02:00
Robin Gareus
72522dd05d
Lua bindings for TempoMap::get_grid 2023-07-11 23:01:09 +02:00
Robin Gareus
fd6d88583f
LV2 MIDI synths: only tx tempo-map if plugin asks for it
This is a slight improvement on 8d97db101 to further mitigate
excessive overhead introduce in a591fb64a.
2023-07-11 21:52:58 +02:00
Robin Gareus
8d97db101e
LV2Plugin: do not unconditionally call TempoMap::get_grid 2023-07-11 19:15:40 +02:00
Paul Davis
459659d229 ControlList: do not handle mis-ordered OrderedPoints 2023-07-10 14:23:17 -06:00
Paul Davis
9c590c1ed1 syntactic tweak 2023-07-10 14:17:10 -06:00
Paul Davis
64dc7557cf automation drawing: some code cleanup and thinko fixes for ::editor_add_ordered() 2023-07-10 14:05:27 -06:00
Paul Davis
45b02538e6 Evoral: extend ControlList API with ::editor_ordered_points()
Much more efficient than adding points 1 by 1
2023-07-10 11:20:47 -06:00
Robin Gareus
76ba032d3c
Fix creating session from template
bug was introduced in a36ddb72dd
2023-07-10 16:47:00 +02:00
Paul Davis
de67226c90 provide PolyItem::pop_back() 2023-07-09 20:41:36 -06:00
Paul Davis
1c54f0e4c0 handle MidiVelocityAutomation in the event type map code 2023-07-08 16:36:50 -06:00
Paul Davis
3b1d4d8fa6 midi: fix playback of notes the start at playhead position (#9398/#9410)
The diskreader uses the route's monitoring state when deciding whether or not
to fetch MIDI data for playback. Route::monitoring_state() would determine
whether or not we were already rolling to affect its return value. However,
using Session::transport_rolling() is affected by pre-roll and consequently
returns the wrong value during transport startup. Instead, we now use
::transport_state_rolling() which ignores preroll conditions. This leads to the
DR actually reading MIDI data from the initial playback position, which fixes
this issue.

Note that the bug only occured if the track or the session was rec-enabled. The
monitoring state value was always correct for non-rec-enabled conditions.
2023-07-08 15:25:32 -06:00
Robin Gareus
920a6a46c3
VST3: work around UADx crash when in mono configuration
When using a UADx plugin on a Mono track in Ardour, the plugin
is configured to be Mono. by calling `setBusArrangements`.
The call succeeds and querying the Bus layout via `getBusArrangement`
as suggested by https://steinbergmedia.github.io/vst3_doc/vstinterfaces/classSteinberg_1_1Vst_1_1IAudioProcessor.html#ad3bc7bac3fd3b194122669be2a1ecc42
confirms this. The plugin acknowledges the speaker layout
for both input and output (Vst::SpeakerArr::kMono = 0x80000)

```
  Input BusArrangements: 0 chan: 1 bits: 80000
  Output BusArrangements: 0 chan: 1 bits: 80000
```

but UADx plugins crash later during process() if any of the lower
bits are unset and the bus is enabled.

PS. The plugin does NOT crash as long as a lower bit
(Vst::SpeakerArr::kSpeakerL or ::kSpeakerR) remains set
in addition to kMono.
2023-07-07 21:32:59 +02:00
Robin Gareus
883a83aca2
Fix windows builds (Lua signal bitset 9b8040a9f4) 2023-07-05 19:36:25 +02:00
Robin Gareus
d01dbcba83 Update minimp3
based on afb604c06b/minimp3.h
This reapplies be4bdb5365.
2023-07-05 18:05:33 +02:00
Robin Gareus
efed61af44
Amend d899441df1, fix duplicate device map entries 2023-07-03 19:57:55 +02:00
Robin Gareus
771cc4581e
LuaProc: use effective sample-rate, like other plugin instances 2023-07-03 00:31:21 +02:00
Robin Gareus
a36ddb72dd
Correctly set sample-rate of plugins when loading a different session
Directly loading a new session (Session > Recent) stops the engine
when the sample-rate mismatches. All is fine.

When closing a session (Session > Close), the engine is kept running.
Loading a different session with different sample-rate shows
the "SR mismatch" dialog. Reconfiguring the engine then does not call
`Session::immediately_post_engine` again.
2023-07-03 00:13:20 +02:00
Paul Davis
3be6ae57ba gtkmm2ext: provide an additional ink extents method to get descender 2023-07-01 21:07:25 -06:00
Robin Gareus
d899441df1
ALSA: disambiguate multiple soundcards with the same name 2023-07-02 00:17:58 +02:00
Paul Davis
20e1b6b287 temporal: add API to clear tempos in various ways 2023-06-30 15:50:25 -06:00
Paul Davis
a8c2585cdc remove AudioEngine::destroy() calls from various test/util code
ARDOUR::cleanup() does this, and the engine must exist during port deregistration.
2023-06-30 12:58:43 -06:00
Paul Davis
3307dcfcb2 temporal: reference time for BBT_Argument is always superclocks 2023-06-30 12:10:50 -06:00
Paul Davis
16c9d91641 temporal: remove impossible get_tempo_and_meter (..., bbt, ...) method 2023-06-30 12:10:50 -06:00
Paul Davis
a591fb64a3 temporal: rework ::get_grid() to avoid get_tempo_and_meter (..., bbt, ...) 2023-06-30 12:10:50 -06:00
Paul Davis
3513debba8 temporal: NO-OP (tiny variable rename) 2023-06-30 12:10:50 -06:00
Paul Davis
d94382f8a3 another autofication 2023-06-30 12:10:50 -06:00
Robin Gareus
d0fe0993a7
LV2: allow to split cycles w/MIDI
See also 64e2f16e06
2023-06-30 17:46:05 +02:00
Robin Gareus
be3d3a6d00
LuaProc: allow plugin to prefer a regular block length
This equivalent to http://lv2plug.in/ns/ext/buf-size#coarseBlockLength
2023-06-30 17:21:49 +02:00
Robin Gareus
45b2791341
MidiStateTracker micro-optimization
This replaces 128 multiplications in each inner loop with
a single bit-shift.
2023-06-30 17:12:16 +02:00
Robin Gareus
b51cf0ed95
Plugin: fix additive note resolution
When stopping transport in the middle of a note, each plugin
will resolve the note, resulting in multiple duplicate note-off
events.
2023-06-30 17:12:16 +02:00
Robin Gareus
71d45286f4
LuaProc: sort MIDI events
This allows plugins to produce an unsorted list of events.
see also https://discourse.ardour.org/t/lua-arpeggiator-plugin-anyone/108862/64?u=x42
2023-06-30 17:12:16 +02:00
Robin Gareus
c5511040ec
MidiBuffer: allow for partial processing with offset
AudioBuffer::read_from() only replaces data within the given
range (offset .. n_samples + offset) leaving the rest of the
buffer untouched.

With in-place processing, where the same MIDI buffer is used
for input and output, each sub-cycle must only clear the
processed range, while leaving the rest of the buffer
untouched.
2023-06-30 17:12:16 +02:00
Robin Gareus
64e2f16e06
LV2: apply offset to MIDI events 2023-06-30 17:12:16 +02:00
Robin Gareus
8558b1f99e
AudioUnit: apply offset to MIDI events 2023-06-30 17:12:16 +02:00
Robin Gareus
c352347eaa
LuaProc: offset MIDI events when splitting cycles 2023-06-30 17:12:16 +02:00
Robin Gareus
9242e615ce
Plugin: track only events for current cycle 2023-06-30 17:12:15 +02:00
Robin Gareus
e6bed9330f
CoreMIDI: fix capture/playback alignment
MIDI playback used samples instead of usec.
MIDI capture used time-stamp from previous cycle.
buffer-size changes were not applied to MIDI port latency
2023-06-29 00:32:46 +02:00
Robin Gareus
bef4596dd1
NO-OP: whitespace 2023-06-29 00:32:46 +02:00