Commit Graph

31782 Commits

Author SHA1 Message Date
Paul Davis
1a9df476c2 waveview: now that _quit is protected by a mutex, it doesn't need to be atomic
No reason to have two memory fences when we only need one
2021-05-11 07:57:31 -06:00
John Emmas
952416c596 Accommodate some changes to 'ssize_t' in VS2019
In more recent versions of MSVC, ssize_t equates to 'long' (for a 32-bit build) or '__int64' (for 64-bit)
2021-05-11 14:06:25 +01:00
Paul Davis
166ac63924 waveview: redesign thread exit strategy
The previous design had a race condition. When WaveViewThreads::stop_threads() was called, it would
first acquire the mutex, then set _quit, then call condition.broadcast(). But worker threads would
check _quit without holding the mutex. It was therefore for a thread to be delayed in its
own lock acquisition by the ::stop_threads() caller, then end up back in cond.wait() AFTER
the cond.broadcast() was done. Such a thread would sleep forever and never wake up.

This new design removes WaveViewDrawRequestQueue, which was a clean encapsulation of the
queueing aspects of WaveViewThreads, but unfortunately made correct mutex acquisition
and condition signalling/waiting needlessly complex. THe mutex, condition variable
and actual queue were moved into WaveViewThreads, and all worker threads execute a method
of the class which gives the appropriate code easy access to the mutex and condition var,
which must always be used together.
2021-05-10 21:41:26 -06:00
Alexandre Prokoudine
e64e140809 Update Russian translation 2021-05-11 02:21:15 +02:00
Paul Davis
5343d00382 when adding locations with empty names, generate one (related to 1c753a7f38) 2021-05-09 17:52:29 -06:00
Paul Davis
c45be2266e support SMF markers without labels 2021-05-09 17:52:29 -06:00
Robin Gareus
bfb5bfcd2d Fix builds (float, double ambiguity)
```
gtk2_ardour/ardour_ui.cc:2060: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
/usr/include/architecture/i386/math.h:343: note: candidate 1: double pow(double, double)
/usr/include/c++/4.2.1/cmath:357: note: candidate 2: float std::pow(float, float)

```
2021-05-09 05:59:29 +02:00
Robin Gareus
292547b264 Use RWLock for Locations
This replaces a Mutex and adds additional read-locks.

This is needed to address some threading issues with rt-threads
calling auto_loop_location() while the GUI changes locations.

Since locations are C-pointers this is still not entirely safe!
Locations::remove() may delete a location while a pointer
to it is being used in another thread.
2021-05-09 03:20:14 +02:00
Paul Davis
600e959db5 set a boolean flag as needed to break out of MIDI tempo map import 2021-05-08 18:38:39 -06:00
Paul Davis
78d56daf0a fix position of imported MIDI markers
Note: this fix may imply that the same change needed when importing a tempo map
2021-05-08 18:38:19 -06:00
Paul Davis
8b1df3e083 fix bad transition problem in transportFSM when slowing to a stop that is then reversed 2021-05-08 17:58:46 -06:00
Paul Davis
66bc15f8c5 add stderr output for TransportFSM bad transitions, and remove stacktrace 2021-05-08 17:58:46 -06:00
Paul Davis
ad14077587 rearrange transportFSM code to be more explicit about a speed-reset-after-stop 2021-05-08 17:58:46 -06:00
Paul Davis
e588fe2057 avoid crash when stopping with "abort" set to true, but after _last_roll_location was reset to -1 2021-05-08 17:58:46 -06:00
Paul Davis
05ef7f2647 come to a complete stop if rewind/ffwd steps past -40 semitones slower 2021-05-08 17:58:46 -06:00
Robin Gareus
8803b55f45 Remove invalid assertion
There are some valid cases to call no-roll with non-zero
transport speed. e.g. export pre_roll/fail_roll when
exporting multiple timespans.
2021-05-08 23:46:10 +02:00
Robin Gareus
79bf025862 Fix export race condition (and crash)
Previously the freewheel export thread directly called
Session::butler_transport_work(). The butler thread
may concurrently call the same function. This can lead
double free or memory corruption (see below)

Now export thread summons the butler and does nothing
until it completed its work.

```
Export Thread:
3   XMLNode::~XMLNode
4   ARDOUR::AutomationList::snapshot_history
5   ARDOUR::AutomationList::start_write_pass
6   ARDOUR::Automatable::non_realtime_locate
7   ARDOUR::Route::non_realtime_locate
8   ARDOUR::Session::non_realtime_locate
9   ARDOUR::Session::butler_transport_work
10  ARDOUR::Session::process_export_fw

Butler thread:
7   XMLNode::~XMLNode
8   ARDOUR::AutomationList::snapshot_history
9   ARDOUR::AutomationList::start_write_pass
10  ARDOUR::Automatable::non_realtime_locate
11  ARDOUR::Route::non_realtime_locate
12  ARDOUR::Session::non_realtime_locate
13  ARDOUR::Session::butler_transport_work
14  ARDOUR::Butler::thread_work
15  ARDOUR::Butler::_thread_work
```
2021-05-08 23:29:49 +02:00
Robin Gareus
cc83cdd9df Config isn't editable 2021-05-08 19:19:16 +02:00
Paul Davis
1c47f0adbe use 4 semitone steps whenever rewind/ffwd is adjusting in the range below 1 octave slower 2021-05-08 09:43:04 -06:00
Paul Davis
57b3df8b22 copy over (boo!) transport control changes to BasicUI (control surfaces) 2021-05-08 09:20:21 -06:00
Paul Davis
6b98e56da2 const-ification tweak 2021-05-08 09:19:50 -06:00
Paul Davis
6ca18bfcfd tweak gradual rewind/ffwd action to move in 4 semitone steps once the speed is below "one octave down"
This avoids taking forever to get to -40st, where we reverse direction
2021-05-08 09:13:32 -06:00
Paul Davis
9d7ded8bfe allow rewind/ffwd to incrementally move between speeds of zero and 1/-1
It's a little slow in getting all the way to zero, so this may need some tweaking
2021-05-08 08:16:28 -06:00
Robin Gareus
d88e0c6673 Fix windows builds (declare class binding)
see also 2ff8f5a5de
2021-05-08 14:38:43 +02:00
Robin Gareus
08092d22b4 Prevent invalid frame/child size allocation 2021-05-08 14:36:43 +02:00
Robin Gareus
ce1e05fc3d Update DnD min. movement threshold -- #8686
Previously x-axis threshold was in samples. This is
useless unless zoomed in to the max. So in most cases
the first-move was always in x-direction, making constrained
y-axis drags near impossible.

Furthermore the threshold for copy-drags was increased
as per #8686
2021-05-08 04:28:36 +02:00
Todd Naugle
4d815554dd Various Control Surfaces: Fix one off in calculation of fader position
MIDI pitch bend holds 14 bits (16384) which gives values of 0 to 16383.
2021-05-07 18:02:44 -05:00
Carlo Stemberger
67cce59f4e Avoid regex convention in script documentation 2021-05-08 00:35:31 +02:00
Edgar Aichinger
a103a89f4f also install desktop icon files 2021-05-08 00:27:33 +02:00
Edgar Aichinger
433d7dc8a0 freedesktop: install (not only build) desktop, mimeinfo and appdata files 2021-05-08 00:27:33 +02:00
Tiefseetauchner
720a7eed77 Update compile.sh
cd in line 4 would not work if path has blank as it would have two arguments
./compile.sh: line 4: cd: too many arguments
2021-05-07 16:25:21 -06:00
Paul Davis
e2a28ec776 avoid playhead jumping while we locate from a control surface 2021-05-07 16:24:53 -06:00
Robin Gareus
b0d4f77d92 Optimize RegionList redisplay for batch changes 2021-05-07 23:29:25 +02:00
Robin Gareus
f6c011cb65 Remove old RegionPropertyChanged signal (3/3) 2021-05-07 23:29:25 +02:00
Robin Gareus
283cade057 Update GUI Region[s]PropertyChanged signal handlers (2/3) 2021-05-07 23:29:25 +02:00
Robin Gareus
2ff8f5a5de Consolidate RegionsPropertyChanged signal emission (1/3)
This prepares to combine multiple RegionPropertyChanged signals
(potentially thousands) into a single signal.
2021-05-07 23:29:25 +02:00
Robin Gareus
5af480083c MIDI List Editor, subscribe to region's signal (not all regions) 2021-05-07 23:29:25 +02:00
Paul Davis
bb7f919a07 fix import file Lua script to follow new API to PublicEditor::do_import() 2021-05-07 14:58:16 -06:00
Paul Davis
3e47057609 import process now allows optional import of MIDI markers/cues 2021-05-07 14:58:16 -06:00
Paul Davis
f689e9ecab Evoral: add methods to SMF to load and access markers/cues in SMF files 2021-05-07 14:58:16 -06:00
Robin Gareus
4db1c02bd1 Fix crashes when rippling many regions
Region positions were updated in the GUI, before the playlist
was catching up.

The butler thread reads a region using the region's new position,
but the playlist's old range.


Thread 1 (GUI)
```
#22 ARDOUR::Playlist::notify_layering_changed()
#26 ARDOUR::AudioPlaylist::region_changed
#27 ARDOUR::Playlist::region_changed_proxy
#35 ARDOUR::Region::send_change
#36 ARDOUR::Region::set_position
#37 RegionRippleDrag::remove_unselected_from_views
#38 RegionRippleDrag::finished
```

LayeringChanged() also triggers DiskIOProcessor::playlist_modified
which schedules a pending-override and summons the butler.
Note that when moving only a few regions the butler starts after all
updates have been completed.

Butler thread:
```
#4  ARDOUR::AudioRegion::read_at
#5  ARDOUR::AudioPlaylist::read
#6  ARDOUR::DiskReader::audio_read
#7  ARDOUR::DiskReader::overwrite_existing_audio
#8  ARDOUR::DiskReader::overwrite_existing_buffers
#9  ARDOUR::Track::overwrite_existing_buffers
#10 ARDOUR::Session::non_realtime_overwrite
```

Region read fails:
```
 libs/ardour/audioregion.cc:503  assert (position >= _position);
(gdb) p position
$1 = 1312000
(gdb) p _position
$2 = {<PBD::PropertyTemplate<long>> = {_have_old = true,
    _current = 1336000, _old = 1312000} }
```
2021-05-07 21:56:09 +02:00
Robin Gareus
11719144b3 Update split-benchmark script with new transport API 2021-05-07 21:56:09 +02:00
Robin Gareus
49e1380417 Add missing Lua binding (see also 48e5607f7c) 2021-05-07 21:56:09 +02:00
Todd Naugle
d2ba90b2c1 Fallback to the default export path when the saved export path is not found.
Previously we would end up with an export path of top level session
directory.
2021-05-07 12:25:42 -05:00
Todd Naugle
9e6b85f330 Don't save a leading slash when storing a relative export path.
It is not needed in the relative case and causes issues when taking
sessions between platforms.

On windows, the default path would be "\export". When that is used
on linux the resulting fullpath would end up as

/your/session/path/\export

which is then not found on the file system.

This change is consistent with how relative paths are normally written and
does cure the default path when moved across platforms.

It does not solve the larger issue of mixed directory separators.
A relative path of "export\myMixV1" will still fail when moving between
platforms.
2021-05-07 12:25:42 -05:00
Alexandre Prokoudine
a18d9b9cb4 Update Russian translation 2021-05-07 05:38:57 +02:00
Robin Gareus
98f5224d4c Fix incorrect port lists due to custom sort
Previously the following were treated as equal
 "MIDI_foo" == "MIDI bar"
So std::map<> PortManager::_ports and PortEngineSharedImpl:_ports
could only have either. This resulted in missing ports
and missing calls to existing ports in cycle_start().

This mainly affected MIDI tracks with imported files, since there
is "MIDI Clock in", and imported files result in tracks
"MIDI_file-name".

This issue was introduced in 6.6-200-g60ff3ef764
2021-05-07 04:24:32 +02:00
Paul Davis
bfd52fd94d TransportFSM: do not enter Reversing state too early
We do need to know that a reversal is intended before we do a locate, but we should
not enter Reversing before the declick is finished. So instead, we add a new
member, _reverse_after_declick to keep track, and enter Reversing just before
we start the locate
2021-05-06 19:40:08 -06:00
Robin Gareus
97167ed927 Fix harvid bind address on BigSur 2021-05-07 01:45:00 +02:00
Robin Gareus
7dc21fdc96 PortList debug methods (to be called from gdb) 2021-05-07 01:43:19 +02:00