Commit graph

98 commits

Author SHA1 Message Date
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
Paul Davis
4b87c3a6b1 complete removal of Session::_transport_speed, _default_transport_speed and takeover of transport state mgmt by TransportFSM
The TransportFSM is now responsible for deciding what to do at all transport state transitions. The Session (via the TransportAPI) merely
provides mechanism (locate, start, stop, set_speed). Default and most recent speed requests are managed by the TransportFSM too
2021-05-03 17:40:41 -06:00
Robin Gareus
94d79a3809
Count xruns during realtime export 2021-04-29 17:50:28 +02:00
Paul Davis
180f333cd7 export needs to start transport, not just set speed 2021-04-19 16:14:09 -06:00
Paul Davis
c65daaa3d6 libardour: change API for Session::set_transport_speed()
We no longer need the abort/clear_state arguments because this method only controls speed,
not transport state
2021-04-19 16:14:08 -06:00
Robin Gareus
861417c07c
Disable rec-arm on export
Previously this wasn't the case when latched-record-enable
preference was enabled.
2021-04-16 04:29:12 +02:00
Robin Gareus
32c7b18f6d
Relax export preparation timeout
This increases timeout granularity and ensure that
rt (TSFM) and butler thread can run to prepare exports.

This may fix an issue some windows users reported
"Cannot prepare transport for export", and increasing
the buffersize to 1024 or 2048 works around the isssue.

This also fixes an edge-case usecs_per_cycle() may return -1
(sleep forever) when the engine dies.
2021-03-25 21:15:13 +01:00
Robin Gareus
f8b5424d9f
Fix deadlock during export
When using the export-tool, the very first callback may already be
freewheeling. In this case the first call to the butler also happens
directly from the freewheel process-callback and initial session events
are handled there. Setting PostTransportAdjustPlaybackBuffering
took the process-lock, which caused a deadlock:


Glib::Threads::Mutex::Lock::Lock(Glib::Threads::Mutex&) at /usr/include/glibmm-2.4/glibmm/threads.h:687
ARDOUR::Session::butler_transport_work() at ../libs/ardour/session_transport.cc:1157
ARDOUR::Session::process_export_fw(unsigned int) at ../libs/ardour/session_export.cc:303
ARDOUR::AudioEngine::process_callback(unsigned int) at ../libs/ardour/audioengine.cc:486
ARDOUR::DummyAudioBackend::main_process_thread() at ../libs/backends/dummy/dummy_audiobackend.cc:951
2020-12-08 01:09:57 +01:00
Robin Gareus
5f3626d46f
Increase timeout for export-preparation
In some rare cases the butler may be busy for a long time
(e.g. seek in a large session may still be active when
export is started).

8 second timeout seems reasonable to prevent the app from hanging
without desktops showing a "unresponsive" popup in case the
timeout is reached for some reason (e.g the engine dies, and
no TFSM transition can happen).
2020-07-21 22:54:05 +02:00
Paul Davis
8aae77b0eb somewhat change the condition used to identify when butler transport is done pre-export 2020-04-10 13:25:24 -06:00
Paul Davis
b953490bac fix typo/thinko in code that checks for result of waiting for butler transport work 2020-04-10 13:24:55 -06:00
Robin Gareus
78b29c55d3
Hotfix more export woes, prevent possible endless loop
This apparently happens on some Windows systems when exporting
a range starting at 00:00:00:00

I'm still hoping there's a better fix for these race-condition
issues, perhaps by kicking the TFSM...
2020-04-10 03:29:16 +02:00
Robin Gareus
4f3a95a1da
Cont'd work on fixing export ranges
This picks up where cfd95340b1 left off.

The goal is to ensure that the butler has completed all
PostTransportStop related tasks and won't meddle with transport
after exporting has started.

Previously this could happen, because realtime_stop() queues
PostTransportStop and the butler is sommoned after every
export process cycle.

Since  61e7f3176b the butler keeps calling non_realtime_stop()
every time it is woken up, until TFSM comes around and unsets the
flag in the process callback.
2020-04-09 19:07:33 +02:00
Robin Gareus
57118c2370
Prevent FX from producing sound after export
This cuts reverb tails and synth sounds after export.
Disabling freewheeling, continues normal processing where
export left off. This previously kept notes ringing, or reverbs
audible.
2020-04-09 01:28:04 +02:00
Robin Gareus
a6afb31245
Safeguard against libaudiographer exceptions 2020-04-09 00:01:44 +02:00
Robin Gareus
b8ce25fdab
Fix export-alignment with JACK -- #7916 2020-04-09 00:01:44 +02:00
Robin Gareus
cfd95340b1
Fix exporting multiple range (MacOS)
The actual issue was introduced in 61e7f3176b:
Session::non_realtime_stop() no longer unsets PostTransportStop
(other changes from that commit are not relevant).

The real issue however is a race-condition.
So far this only seems to happen on MacOS, Coreaudio.

It seems that non_realtime_stop() is called in the butler-thread
after exporting has started, even though the butler has been
paused in wait_until_finished().

Perhaps Coreaudio thread switches causes TransportFSM to
reinitialize and scheduling the butler?

The use of `usleep()` makes this rather a workaround.
However it's sufficient for the coreaudio rt thread to run
at least once.
2020-04-08 15:59:30 +02:00
Robin Gareus
751f9f9654
Fix export alignment (#7916)
Ardour's playback is aligned to master-out:
 "When the playback clock reads 01:00:00:00, the sample corresponding
  to 01:00:00:00 is audible at the speaker(s)"

When exporting, and grabbing data from output ports, the signal
is offset by the master-bus physical playback latency. This was
compensated for, but lead to initial silence in the exported file.

New approach is to start capturing export data during pre-roll,
at the time when playback is written to the output buffers.

To also shaves off a common offset to make this work with
realtime export. Effectively this emulates processing with
disconnected master-output port, while still keeping any
latency of effects on the master-bus itself.

Last but not least: jack updates latencies when freewheeling,
(setting HW latency to zero). The callback arrives asynchronously
some time after enabling freewheeling, but after Export
Ports have been configured. Those callbacks are ignored.
2020-03-06 01:49:48 +01:00
Robin Gareus
1851440863
Fix realtime export of multiple time-spans
After exporting a time-span, the next time-span was started
directly from the rt-callback. This had various issues.
In particular with realtime export.

Post-processing of a realtime-export enables freewheeling
and is driven by freewheel callbacks. Freewheeling needs to be
safely disabled for an upcoming realtime export.

A similar issues existed when mixing realtime and non-realtime exports.
2020-03-06 01:49:44 +01:00
Paul Davis
4b10beec08 change transport API, session API, transportFSM API to move reverse management and motion state (partially) into TFSM 2020-02-20 00:25:25 -07:00
Paul Davis
ad402e76af remove "destination_sample" from API for Session::set_transport_speed()
This was a leftover from changes made for Tracks Live, related to
the concept of an auto-return preference. We don't use this anywhere in Ardour
or Mixbus, and the concept should eventually be removed entirely.
2020-02-19 15:07:42 -07:00
Paul Davis
3c00048b0c Session::request_locate() takes a tri-valued second argument for "roll-after-locate"
This allows callers to defer logic about auto-play/current rolling state and more to TransportFSM where it
can be cnentralized and is less ambiguous
2020-01-18 08:49:18 -07:00
Paul Davis
ed67f465fb fix JACK transport sync
key change: to sync with JACK always locate jack-position PLUS buffer-sized-rounded-worst_latency_preroll() ahead
2019-12-27 21:18:12 -07:00
Paul Davis
bd229936ec add finite state machine to control/manage transport state 2019-09-17 18:26:03 -06:00
Robin Gareus
a22f918d9d
Update libardour GPL boilerplate and (C) from git log 2019-08-03 15:53:16 +02:00
Robin Gareus
81857a947c
Consolidate ambiguous engine API calls
available(), connected(), running() were ill-defined and
used interchangeably.
2018-11-28 15:24:47 +01:00
Robin Gareus
24ec0b974d Properly aligned export (Stem + Session)
Delay ports being exported by their playback latency.
2017-09-29 05:03:48 +02:00
Robin Gareus
d98f87d542 No more disk-reader roll-delay
It was not working in sdio/6.0-pre anyway and with upcoming changes to
latency compensation the concept of per disk[stream/reader] will go away.
2017-09-29 05:03:48 +02:00
Robin Gareus
b137a2982f Export needs to offset buffers when processing partial cycle 2017-09-26 17:52:43 +02:00
Robin Gareus
10b76ae631 Various updates and fixes for Latency Compensation
* centralize signal_latency_at_***_position to processors
* update initial-delay/roll-delay when processor order changes
* consolidate signal-latency calculation: use the same method
  for processor-changes and session's post_playback_latency.
* include relative output-delay in roll-delay
* fix capture processor position & optimize stem-export latency

(roll-delay fixes pending Route:roll() update)
2017-09-19 02:11:22 +02:00
Paul Davis
30b087ab3d globally change all use of "frame" to refer to audio into "sample".
Generated by tools/f2s. Some hand-editing will be required in a few places to fix up comments related to timecode
and video in order to keep the legible
2017-09-18 12:39:17 -04:00
Robin Gareus
0e65852901 Desperate hack to align master-bus on export.
Another 90% solution which hopefully gives us another year :(
see comments Session::start_audio_export() for explanation.
2016-10-25 22:33:37 +02:00
Robin Gareus
3e32a00a52 fast region export -- don't call process() 2016-10-17 21:35:00 +02:00
Robin Gareus
77687519b6 Refactor TmpFile into an abstract base class
This allows a TmpFile pointer to be either a Sync or Async (Threaded)
writer. As result we must be able to handle both RT and non RT processing.

Still, post-processing (normalization and encoding) should always
happen faster than realtime (freewheeling).

Since jack does not allow a client to change to freewheeling from within
the process-callback, the async-writer disk-thread FileFlushed is used
to initiate post-processing.
2016-07-16 02:14:13 +02:00
Paul Davis
cf52d6e4b4 enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h 2016-07-14 14:45:23 -04:00
Robin Gareus
e55ef88ee9 refactoring to prepare for real-time export
* add a threaded TmpFile Writer
* update API calls to that process_export_fw() can be used as
  process_function

The idea is to re-use export infrastructure from normalization:
export to a tmp-file and then encode target formats after that.
2016-07-14 04:35:48 +02:00
Robin Gareus
a4a246b41d towards export latency compensation 2016-07-10 03:21:29 +02:00
Robin Gareus
8741a5885b configurable export preroll 2016-02-29 15:13:06 +01:00
Robin Gareus
33545e552b pre-process (silence) before export to flush reverb tails etc. 2016-02-29 13:50:56 +01:00
Robin Gareus
1ec78d26ee Fix crash when aborting export.
The "Stop" button results in ExportHandlerPtr being destroyed.
This must not happen while it's in use -- in particular during
ExportHandler::start_timespan() and ExportHandler::finish_timespan()
2016-02-09 21:36:49 +01:00
Robin Gareus
22b07e0233 NOOP, remove trailing tabs/whitespace. 2015-10-05 16:17:49 +02:00
Paul Davis
fa9780ba67 subtle changes to accomplish two goals (1) playhead should stop where the user pressed stopped (2) captured regions should end where the playhead ends 2014-10-10 13:22:50 -04:00
Paul Davis
1c49138e00 move MidiPortManager from AudioEngine to Session
This makes the responsibilities and ownership of non-Route related MIDI ports
more clear, and removes a few wierd bits of code. It also ensures that open/close/open
on the same session will retain connections for those MIDI ports
2013-09-05 13:22:34 -04:00
Paul Davis
1ab61b8564 major redesign of MIDI port heirarchy and management (part 2) 2013-08-07 22:22:11 -04:00
Paul Davis
682ebad62b full compilation and linking (coding not finished, will not run) 2013-08-01 14:43:12 -04:00
Paul Davis
20b1a7d9d8 most of libardour now actually compiles 2013-07-25 12:36:54 -04:00
Sakari Bergen
ca8360020a Fix problem with multiple timespan export. Most probably originated in r13305.
git-svn-id: svn://localhost/ardour2/branches/3.0@14048 d708f5d6-7413-0410-9779-e7cbd77b26cf
2013-02-04 19:56:20 +00:00
Paul Davis
9884773eea various fixes for exporting, including correct handling of errors during export which previously would hang when using jack1 because jack_set_freewheel() was called from inside a process() callback; use shared_ptr<Route> in parts of export code that weren't using them before; fix up generation of export filenames so that Glib::build_filename() is used and non-existent folders are ignored
git-svn-id: svn://localhost/ardour2/branches/3.0@13610 d708f5d6-7413-0410-9779-e7cbd77b26cf
2012-12-06 19:56:33 +00:00
Paul Davis
aa3fe77d7f patch from robin to fix where the transport start occurs when exporting (#4098)
git-svn-id: svn://localhost/ardour2/branches/3.0@13305 d708f5d6-7413-0410-9779-e7cbd77b26cf
2012-10-17 22:33:02 +00:00
Paul Davis
3cd8138a41 convert from Glib:: to Glib::Threads for all thread-related API
git-svn-id: svn://localhost/ardour2/branches/3.0@13084 d708f5d6-7413-0410-9779-e7cbd77b26cf
2012-07-25 17:48:55 +00:00